
このプロジェクトは、精密な農業用途向けの独立した農業気象太陽光発電所を建設することを目的としています。デバイスは、気温と湿度のために超音波風速計と抵抗性土壌センサー、DHT22を備えたラズベリーPI&Arduinoに基づいています。 Farmosは、1つのプラットフォームですべての農場センサーとレポートを監視しながら、大きなセンサーデータを簡単に管理するのに役立ちます。また、他のアプリケーションのDAAとして機能することもあります。この製品は、FarmTopia IOF(インターネットのインターネット)ラインの最初のものであり、簡単でオープンな農業データのためにGoDanミッションをサポートするためにオープンソーリングされています。
| 測定データ | どうやって |
|---|---|
| 3次元方向の風速と頻度 | 超音波誤差を計算します |
| 気温と湿度 | AM2301センサー |
| GPSの場所 | USB GBSドングル |
| 土壌水分 | 抵抗性土壌センサー |
| オプションのアドオン | / |
Raspberry Piセット:Raspberry OSとPinoirカメラ(オプション)6xultrasonic AnemoterをプリロードしたSDを備えたRPコンピューターです。ドングル:GPSドングル(オプション/GPS座標を手動で入力できます)、WiFiカバレッジソーラーシステムがない場合は4Gドングル(オプション):MPPTソーラー充電器を介してMPPTソーラー充電器を充電するメインスーパーポリマーバッテリーを充電する基本的な30Wソーラーパネル。 Configurationは、RPI電源ファームの安定化を目的としています。これは、センサーデータを表示および分析するためのシステムへのインターフェイスとして機能する農業オープンソース管理システムです。
| 番号 | デバイス |
|---|---|
| 1 | Raspberry Pi 4、8GBバージョン |
| 1 | SDカード128 |
| 1 | Arduino Mega 2560 |
| 1 | Arduino USBケーブル |
| 6 | JSNR04T Ultrasonics(40 cm離れて配置) |
| 1 | AM2301温度および湿度センサー |
| 1 | Arduino土壌水分センサーモジュール |
| 1 | Raspberry Pi 4バッテリーパックアップ |
| 1 | Mini-USBからUSBケーブル |
| 1 | MPPTソーラー充電器コントローラー20A 12/24VDC USB出力 |
| 1 | 12VスーパーポリマーLi-ion Battery-6800 MAH |
| 1 | ソーラーパネル18V 30W |
| 1 | ウェザーステーションフレーム3Dプリントまたはスタンルステルエンクロージャー |
| 番号 | デバイス |
|---|---|
| 1 | タッチスクリーン |
| 1 | Raspberry Pinoir 2カメラ |
| 1 | Raspberry USB GPSドングル |
| 1 | MLX9046 IRセンサー |

| ファイル名 | 説明 |
|---|---|
| readme.md | プロジェクトの紹介 |
| arduino_weather.ino | 主要な気象センシングArduinoアプリケーション |
| dht.cpp | AM2301のDHTドライバーおよびクラス機能 |
| dht.h | DHTクラスおよび関数ドキュメント用のヘッダーファイル |
| Special_debug_functions.ino | デバッグプログラムとしてのユニットテストケース |
| wind_auto.cpp | 気象測定機能 |
| wind_auto.h | Wind Class&Functionドキュメント用のヘッダーファイル |
| Aggregator.sh | Arduinoのシリアルと集計JSONパッケージをFarmosサーバーにキャッチするためのRPIバッシュスクリプト |
-firstインストールRPI OS(フルバージョン)128GB SDカードに、PIの全体的なパフォーマンスを向上させるために、SDができるだけ速くなることをお勧めします。ヘッドレスPIを使用している場合は、構成ファイルでSSHを有効にしてください。ブートパーティションで見つけることができます
- この依存関係のほとんどはプリインストールされる場合がありますが、それらを再確認することをお勧めします。
sudo apt-get update && sudo apt-get upgrade
sudo apt-get install libffi-dev libssl-dev
sudo apt install python3-dev
sudo apt-get install -y python3 python3-pip
sudo apt-get install php5 -y
sudo apt install php-gd php-xml php-xmlrpc
sudo apt install mariadb-server
sudo apt-get install apache2 -y
sudo apt-get install gpsd gpsd-clients python-gps
sudo apt-get install arduino
git clone https://github.com/tbird20d/grabserial
-CLIでDockerをインストールします
sudo curl -sSL https://get.docker.com | sudo sh
sudo pip3 install docker-compose
sudo systemctl enable docker
-dockerに地元でFarmosをインストールします
Farmosは、農場管理、計画、および記録保持のためのWebベースのアプリケーションです。農業データの収集と管理のための標準的なプラットフォームを提供することを目的として、農家、開発者、研究者、および組織のコミュニティによって開発されています。
Farmosを使用して、センサーと迅速にインターフェースし、ビッグデータを分析します
git clone https://github.com/farmOS/farmOS.git
cd farmOS
sudo docker build -t farmos .
sudo docker run -p 80:80 -v ${PWD}/.data/www:/var/www/html farmos
詳細については、Farmosの公式Webサイトでこのガイドを参照してください
このオンラインガイドを参照して、Farmosのインストールの構成を支援できます
まず、FarmOSのセンサーモジュールが有効になっていることを確認してください。ホスティングサービスを使用している場合は、センサーモジュールを有効にするように依頼してください。
スケッチにArduinoライブラリマネージャーと一緒に次のライブラリをインストールします> Libraryを含める>ライブラリの管理...ソフトウェア
DHTの疑いのためにAdafruit DHTライブラリを参照できますが、何らかの理由で温度と湿度を読み取らないため、Dht.Read関数を使用してDht.Read_Temp_Hu(DHT、FLOAT*、FLOAT*)と呼ばれる新しい関数でバッファーを使用します。
2つのクラスに基づいて構築されたJSNR04Tは、自動モードでJSNR04T超音波チップのインスタンスを提供するインターフェイスクラスであり、空気温度と湿度から計算された自己修正音速での超音波速度を読む際に発散することにより、デバイスを風測定ツールとして使用する必要がある関数が必要です。記録されたデータの数学的論理を事前に形成する風のクラスは、必要な天気の詳細を出力します。
| 関数名 | 入力 | 戻る | 説明 |
|---|---|---|---|
| JSNR04T(コンストラクター) | uint8_t enpin、uint8_t rxpin、uint8_tタイプ、uint16_t max_range) | 空所 | グラウンドエニブル用のEnpinを使用して超音波ドライバーのインスタンスとして動作するタイプJSNR0RTの新しいオブジェクトを構築し、操作タイプのEcho&Typeのrxpinを構築します。 |
| jsnr04t.begin | 空所 | 空所 | Ultrasonicを有効に(トリガー)し、それを識別して新しいシリアル通信を開始します。 |
| jsnr04t.virtual_trigger | 空所 | 空所 | 超音波のグラウンドピンを設定して、通常の動作を開始します。 |
| jsnr04t.resettimeout | uint8_tタイムアウト | 空所 | 超音波測定のミリ秒タイムアウトを変更して、範囲を変更します。 |
| jsnr04t.normalize | 空所 | 空所 | nowind_distanceを更新するために、風のない状態で2つのウルトラソニクス間の距離を削除します。 |
| jsnr04t.readjsnr04tserial | 空所 | int | Ultrasonicのシリアルエコー出力を読み取り、無効な読み取りの場合にINT/NANに変換します。 |
| jsnr04t.get_selfecho | 空所 | uint16_t | タイムアウトをリセットして範囲を変更して、センサーがエコーのみを読み取るようにします。 |
| jsnr04t.get_selfwindspeed | 空所 | int | Ultrasonicが独自のエコー(往復)を読むために必要な時間を読み、それを風速に変換します。 |
| jsnr04t.transform_read | uint16_t x | フロート | 測定された距離をMMから風速まで(音速と比較して)変換します。 |
| 風(コンストラクター) | jsnr04t*、jsnr04t* | 空所 | 超音波を使用してそれらの間の風速を測定するタイプの風のオブジェクトを構築します。 |
| wind.update | 空所 | 空所 | 新しい読み取りを取得することにより、風速のクラス値を更新し、風速の変化率も計算します。 |
| wind.get_avergewind | 空所 | フロート | 作業モードに応じて、超音波ペア間の4つの測定値の平均を計算します。 |
| wind.get_echofromahead | 空所 | uint16_t | 向きのセンサーのエコーを読み取ります。 |
| RENEW_TEMP_HU | dht、float* temp、float* hum | 空所 | 特定のDHTセンサーの温度と湿度の値を更新します |
| get_speedofsound | フロートTC、フロートRH | フロート | 特定の気温と湿度の音の速度を推定します |
| set_windsensor | DHT | 空所 | DHTのポインターを風力クラスに渡します |
| get_echofromahead | JSNR04T U1、JSNR04T U2 | int | また、向きのセンサーのエコー(テスト用)のエコーも読み取るIndpedAndt関数。 |
| wind_cycle | Wind* Windx、Wind* Windy、Wind* Windz | 空所 | 3Dの風を表す3つの風物体の風速と平均(50測定平均)風速を計算して更新します。 |
必要なピン値と構成を定義し、ピン構成とセンサーのタイプに従ってサイクルオブジェクトを構築し、サイクル変数を識別します
#define DHTPIN 53
#define mutual 0
#define soil_analog A0
#define soil_max 550
#define soil_min 10
#define Cycle_offset 10
#define DHTTYPE DHT21
DHT dht(DHTPIN, DHTTYPE);
JSNR04T Ux1(45,10,mutual,2000) ,Ux2(37,13,mutual,2000),Uy1(47,50,mutual,2000),Uy2(31,10,mutual,2000) ,Uz1(41,12,mutual,2000),Uz2(39,11,mutual,2000);
Wind WindX(&Ux1,&Ux2), WindY(&Uy1,&Uy2) ,WindZ(&Uz1,&Uz2);
float CycTemp , CycHum , _CSS=340 , winspeed;
wind_cycleに電話してすべての値を更新します
wind_cycle(&WindX ,&WindY, &WindZ);
または、wind.updateに電話して、任意の寸法の瞬間速度を更新する
Windx.update();
値をJSONとしてシリアルポートに印刷します。
「パラメーター」:「値」、
Serial.print(""Wind_Speed_x": ");Serial.print(""");Serial.print(WindX.avgwind);Serial.print(""");Serial.print(" , ");
Serial.print(""Maximum_Speed_x": ");Serial.print(""");Serial.print(WindX.maxwind);Serial.print(" , ");
Serial.print(""Minmimum_Speed_x": ");Serial.print(""");Serial.print(WindX.minwind);Serial.print(""");Serial.print(" , ");
Serial.print(""Wind_frequencyofchange_x": ");Serial.print(""");Serial.print(WindX.gust);Serial.print(""");Serial.print(" , ");
AllMissを使用して、次のようにサイクル遅延を測定エラーに適応させる
cycledelay=19000; // or as you preferred settings depending on power consumption
allmiss=(WindX._selfmiss+WindY._selfmiss+WindZ._selfmiss)*selfecho_timeout; // adobt self cycle delay into main delay
allmiss+=(WindX._aheadmiss+WindY._aheadmiss+WindZ._aheadmiss)*headecho_timeout;
allmiss+= _tempmiss;
_tempmiss=0;
cycledelay-=allmiss;
delay(cycledelay);
Special_debug_functions.inoを使用して、段階的なユニットテストでアプリケーションを診断します。
if(dht.working) //doesn't update before 2 seconds
delay(10);
ultradis=Uz1.get_selfecho();
Serial.print("ultrasonic z1 is ");Serial.println(ultradis);
winspeed=Uz1.transform_read(ultradis);
Serial.print("ultrasonic z1 windspeed "); Serial.println(winspeed);
ultradis=Uz2.get_selfecho();
Serial.print("ultrasonic z2 is ");Serial.println(ultradis);
winspeed=Uz2.transform_read(ultradis);
Serial.print("average is");Serial.println(winspeed);
delay(1000);
winspeed=WindZ.get_avergewind();
Serial.print("average wind is ");Serial.println(winspeed);
wind_cycle(&WindX ,&WindY, &WindZ);
allmiss=(WindX._selfmiss+WindY._selfmiss+WindZ._selfmiss)*selfecho_timeout;
allmiss+=(WindX._aheadmiss+WindY._aheadmiss+WindZ._aheadmiss)*headecho_timeout;
allmiss+= _tempmiss;
//build the diagnostic or unit test according to your needs
Cronジョブは10分ごとにスクリプトをアクティブにします。スクリプトはGrabSerialを使用してArduinoシリアルを30秒間キャッチし、JSONパケットブラケットをキャッチし、Arduino 10秒(サンプル平均100サンプル平均)がかかると閉鎖ブラケットが表示されたときにカウントを再起動します。スクリプトの使用(交換!public_key&!private_keyがセンサーの構成を備えています
python3 /home/pi/grabserial/grabserial -d /dev/ttyACM0 -b 9600 -o /home/pi/serialtest.json -e 30 -m "^{.*" -q "}"
curl -H "Content-Type: application/json" -X POST -d "@/home/pi/serialtest.json" https://farmtopia.farmos.net/farm/sensor/listener/!public_key?private_key=!private_key --verbose
このOpenSourceプロジェクトとそのすべてのコンポーネントは、その開発者の唯一の責任であり、FarmTopiaは同様のデバイスを使用してこの気象観測所の商用バージョンを構築しますが、必ずしも同じSourcodeまたはLogicまたはHardwareコンポーネントを使用するわけではなく、このOpenSourceプロジェクトの有効性や適用の責任はありません。
MITライセンス