工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

都市植物散水ソリューション

コンポーネントと消耗品

土壌水分センサー
アナログ出力の任意の土壌水分センサーを使用できます。 2つの電極と分圧器も使用できます。これらはオプションです。
× 2
レインセンサー
× 1
ミルクジャグ
水を保持し、切断し、表面に固定できる任意のコンテナで問題ありません。これは、高い面に取り付けます。
× 1
柔らかいプラスチック製の柔軟な中空チューブ
どのような種類のチューブでもかまいません。非常に柔軟性があり、中央が中空であるため、端を切り取った縄跳びを使用しました。
× 1
ジャンパー線(汎用)
多かれ少なかれ。
× 37
Arduino101用のSparkFunInventorキット
Arduino 101、サーボ、ブレッドボード、ポテンショメータ、LCDを使用しました。
× 1
モデリングクレイ
× 1
短いプラスチックロッド
または柔軟性のないロッド。これは、水タンクの出口パイプをサポートするために使用されます。
× 1
抵抗330オーム
× 1

必要なツールとマシン

はさみ
プラスドライバー
電気テープ
そして通常のテープ。

アプリとオンラインサービス

>
Nordic Semiconductor nRF Connect SDK
Arduino IDE

このプロジェクトについて

<図>

この装置は、都市環境における植物の灌漑を改善します。 Arduino 101を搭載し、搭載ツールといくつかの外部センサーを使用して、独自の環境で植物に水をまくための最適な条件を計算し、計算された時間に植物自体に水をまきます。

これは、次の概念に基づいています。

重力と圧力

この装置は、私がミルクジャグ、プラスチックチューブ、チューブのシーラント用の粘土、およびサーボを使用して作成した貯水池から水源を利用します。このコンテナは、上昇するだけでなく、デバイスの上から雨水を集めることができるように配置されています。

<図>

水差しは主に家庭用水で満たされていますが(雨が常に利用できるとは限らないため)、雨水で補われています。水差しに水が存在する場合、重力の引力が水差し内の地球に向かって水を引き寄せます。水差しの底に穴を開けて、出口パイプを挿入できるようにします。したがって、重力により、この出口パイプから水が引き込まれます。サーボは、水がパイプから完全に出ることができるタイミングを調整します。通常の状況では、サーボアームは直立位置にあり、水がパイプから流出するのを防ぎます。ただし、植物に水をやるときは、アームが135度下がり、パイプから水が流れ出て植物を灌漑できるようになります。これが完了すると、腕が元に戻ります。

水差しに対する水の圧力は、水差しの安定性を助けるだけでなく、水の出口にも役立ち、灌漑中の水の継続的な流れを可能にします。

TMP36温度センサーとIntelCurieパターンマッチングエンジン

この概念の組み合わせは、植物に水をやるのに最適な時間を決定する計算を推進するのに役立ちます。 TMP36は、温度計のように動作する温度センサーですが、電子アナログ出力を備えています。この出力は、マイクロコントローラーなどのデバイスで読み取り、温度に変換することができます。このプロジェクトでは、デバイスは、摂氏25度に最も近い植物に水をまくための最適な時間を計算しようとします。 2分間隔で1時間あたり30レコードを作成し、各期間の終わりにこれらの平均29を計算します(通常は不正確であるため、最初のレコードを除く)。これがパターンマッチングエンジンの出番です。

<図>

Intel Curie PME、またはパターンマッチングエンジンは、Arduino101に組み込まれた人工ニューラルネットワークです。そのライブラリはGitHubで入手できます。 128個のニューロンで構成されており、既存のデータに基づいてベクトルに保存されたデータ、またはカテゴリに分類されたベクトルを学習および分類できます。利用可能なカテゴリが多いほど、PMEは分類のオプションを増やすことができます。

このプロジェクトでは、PMEは1日の温度データを記録し、このデータの中から最適な条件である摂氏25度を分類しようとします。その結果、翌日の植物に水をやる時間になります。

データは、午前8時から午後9時まで1時間ごとに記録されます。これが初めて行われるとき、データはオンボードシリアルフラッシュに保存されます 。これにより、デバイスがオフになっている場合でも、デバイスをデータセットから起動できます。データセットを取得した後、最適な条件を分類しようとします。それが可能な場合、選択されたカテゴリは次のラウンドに使用される時間になります。そうでない場合、デバイスは毎月の定数、または温度が最も高い毎月の時刻を使用します。 これらは必ずしも植物に水をやるのに最適な温度ではないことに注意してください 、それが私がPMEを利用した理由です。

最初の学習セッションの後、データはクリアされ、翌日に再学習され、選択された時間に植物に水が与えられます。このサイクルは無限に繰り返されるか、デバイスの電源が切断されるまで繰り返されます。電源が再びオンになると、保存されたパラメータが選択された時間として使用され、続行されます。

IntelCurieリアルタイムクロックとBluetoothLow Energy

Intel Curie RTC、またはリアルタイムクロックは、このデバイスの重要なコンポーネントです。 RTCは、デバイス上のすべてが発生するタイミングを制御します。このプロジェクトでは、RTCは、プラントへの散水に使用される時間とデータの記録に使用される時間、およびバックアップのピーク温度定数を決定するために使用される月を追跡する上で特に重要です。ただし、このRTCの正確な日付は、コードまたはユーザー入力のいずれかで手動で設定する必要があります。これはBLEで解決されました。

<図>

Bluetooth Low Energyは、低電力デバイス向けに設計されたBluetoothの新しいバージョンです。セントラルペリフェラルシステムで動作し、セントラルまたは入力がペリフェラルに書き込み、または出力します。これは、中央がすべての周辺機器が読み取れるように掲示板にデータを配置する掲示板システムのように機能します。この場合、モバイルデバイスでNordicSemiconductorのnRFConnectを中央として使用し、Arduino101を周辺として使用しました。モバイルデバイスには、Arduinoに接続してデータを送信する機能があります。この場合、モバイルデバイスは、必要な入力フィールドごとに1回ずつ、合計4回データを送信する必要があります。

モバイルデバイスに入力されるデータは16進数で入力されます。これは基数10からの変換はかなり簡単ですが、オンラインコンバーターを使用できます。

構築方法

この灌漑ソリューションを構築するには、回路に関する知識が少し必要ですが、それほど多くは必要ありません。また、仕上げにはいくつかの非電気部品が必要です。完全なパーツリストは次のとおりです。

電気部品

  • Arduino 101
  • 400タイブレッドボード、+-レール付き
  • 回転式ポテンショメータ
  • 16x2 LCD
  • 330オーム抵抗
  • TMP36温度センサー
  • 180度サーボ、サーボホーン付き
  • 雨センサーと制御盤
  • 土壌水分センサーと制御ボード(オプション、参照としてハードウェアが含まれています)
  • かなりの量のジャンパー線。フリッツの図を参照してください

バッテリーで動作させるには(長すぎないかもしれません;私が使用したセットアップ):

  • オン/オフスイッチとリード線付きの2X4xAAバッテリーボックス
  • 8X AA 1.2VNiMH充電式電池

ACアダプタまたはラップトップからUSB電源で実行するには:

  • USBオスA-オスBケーブル、長さはニーズによって異なります

非電気ハードウェアコンポーネント

  • ミルクジャグ
  • 柔軟なプラスチックチューブ、長さ約20〜30 cm
  • 彫像粘土、ホットグルー、またはシーラントとして使用できるものなら何でも
  • プラスチックロッド、チューブアームをサポートします
  • デバイスを保持するためのクラフトバスケット
  • 水差しを保持するための高い面、つまり小さなベンチやテーブル
  • 植物

ツール

  • 通常および電気の両方のテープ
  • はさみ
  • サーボホーンをサーボに取り付けるためのプラスドライバー

手順

1.下のフリッツ図に従って回路を構築します。土壌水分センサーはオプションであり、雨センサーとサーボは、目的の場所に到達するためにより長いワイヤーを必要とする場合があることに注意してください。回路の最終的な配置については、下の2番目の写真を参照してください。

<図>

<図>

2.(USB電源を使用している場合は、手順5に進みます)。 2つのバッテリーボックスにバッテリーを挿入し、一方のボックスのプラスのリード線ともう一方のボックスのマイナスのリード線を結びます。

<図>

3.電気テープを使用してボックスを一緒にテープで固定します。両方のカバーが取り付けられ、両方のケースが取り付けられるようにボックスを固定し、カバーは一体として取り外し可能です。電源スイッチ用のスロットは開いたままにしておきます。

4.バッテリーボックスのデュアルカバーをArduino101とブレッドボードの下側にテープで固定します。これにより、バッテリーをボードの下からスライドさせて簡単に交換できます。

<図>

5.デバイスをクラフトバスケットに挿入し、デバイスの片側に2つのスロットを切ります。最初のスロットはプログラミング(または選択した場合はUSB電源)用で、2番目のスロットはデバイスに配置されていないセンサーとアクチュエーター用のコンセントになります。このコンセントで緩んだワイヤーを一緒に固定するために、電気テープを自由に使用してください。

<図>

6.ミルクジャグを取り、上部を切り取ります。ジャグには、水を集めるのに十分な大きさの開口部と、信頼できる十分な大きさの容量があります。ハンドルの付け根に近いところにカットすることをお勧めします。

7.水差しの上部にある開口部の最大部分の真下にある水差しの底に小さな穴を開けます。プラスチックチューブの一端をこの穴に挿入します。穴がパイプを所定の位置にとどまるのに十分小さいが、パイプを圧迫しないように十分に大きいことを確認してください。

<図>

8.粘土を使用して、穴のパイプの周りの上部と下部の領域をシールします。粘土がパイプ自体に入らないようにしてください。

9.粘土と電気テープを使用して、サーボをミルクジャグの底にできるだけ低く固定します。チューブの中央とプラスチックロッドをサーボホーンにテープで固定します。プラスチックロッドもチューブの上端にテープで固定されていることを確認してください。 下の図を手順8〜10の参照として使用してください。

10.水差しを高い面に固定します。必要に応じてテープを使用してください。

<図>

11.下げた位置にあるとき、チューブ出口のすぐ下に植物を置きます。水分センサーを使用している場合は、土壌に貼り付け、雨センサーを床に沿って植物の近くに配置します。センサーとサーボをデバイスに接続し、デバイスを水差しとプラントから少し離して配置します。

プログラミング

添付のコードを使用してArduino101をプログラムします。 ArduinoIDEとCurieCore 2.0.2以降(利用可能な場合)を使用してアップロードします。コードには多くの役立つコメントが含まれています。

デバイスの操作

デバイスの電源を最初にオンにすると、モバイルデバイスが接続されるのを待ちます。 nRF Connectを使用してデバイスを接続すると、時間の入力を待ちます。これを行うには、下の図に示すように、基数10時間、分、日、月の16進コードをnRFConnectに順番に入力します。

時刻を入力する前に、ID入力または任意の数値を入力して送信する必要があります。

<図>

時刻を入力した後、101はモバイルデバイスが切断されるのを待ちます。その後、当日または翌日の午前8時まで待機します。

午前8時に達すると、ボードはフラッシュメモリストレージに何かが保存されているかどうかを確認します。そうでない場合は、前述のように14時間の収集プロセスを経て、データを分類し、最適な時間を決定します。その時点で、収集サイクルが繰り返されます。何かが保存されている場合、そのデータは時間定数として使用され、サイクルは通常どおり続行されます。

ボードが植物に水をやる間、雨や過剰な土壌水分(オプション)があると、植物に水をやることができなくなります。その後、その日の散水をスキップして、次の日を待ちます。

<図>

このソリューションは、自動セットアップを採用してこれを処理することにより、都市の植物灌漑をより簡単かつ最適化するように設計されています。また、貯水池を利用することで、既存の家財道具とともに雨水を節約し、植物に向けられていない雨を有効に活用します。

うまくいけば、このプロジェクトが私たちの絶え間なく変化する世界を少し良い場所にするでしょう!

コード

  • Arduino101灌漑システム
Arduino101灌漑システム Arduino
Arduino101灌漑システムを操作するためのコード。 Curieコア2.0.2および1.8.x以降のIDEを使用してアップロードします。 CuriePMEはGitHubにあります。
 / *これは都市灌漑ソリューションのスケッチです。CuriePMEを使用して温度データを学習し、それに対する最適な植物の散水条件を分類します。次に、その時点で植物に散水し、データを再学習し、無限に循環します。このスケッチは、デバイスを起動するために、ターゲット日の午前8時前に実行する必要があることに注意してください。データソース:「WeatherSpark.com」。カナダ、バンクーバーの年間平均天気-天気の火花。 N.p.、n.d。ウェブ。 2017年7月4日。。「Just4Growers:GlobalGardenCommunity」。栽培者のためだけに。 N.p.、n.d。ウェブ。 2017年7月10日。。 * ///このコードで使用するライブラリ。 CuriePMEを除くすべてがideにあります。 CuriePMEはGitHubリポジトリからダウンロードできます。#include "CuriePME.h" #include  #include  #include  #include  #include  #include  // Servo pinout code.Servo waterPipe; // LCD pinout code.LiquidCrystal lcd(12、11、5、4、3、2); //グローバル定数/変数。#definethermometer A3 #define rainSensor 1#define Hydraulic1 A4#define Hydraulic2 A1int tm1; int tm2; int tm3; int tm4; int tm5; int tm6; int tm7; int tm8; int tm9; int tm10; int tm11; int tm12; int tm13; int tm14; int tm15; int tm16; int tm17; int tm18; int tm19; int tm20; int tm21; int tm22; int tm23; int tm24; int tm25; int tm26; int tm27; int tm28; int tm29; int tm30; int average; int progav; float Voltage; floattemperatureC; int tm; int hourTime =-1; int minutesTime =-1; int dayTime =-1; int monthTime =-1; intfirmTime =-1; // BLEサービスdata.BLEService plantService( "19B10000-E8F2-537E-4F6C-D104768A1214"); // BLE特性、central.BLEUnsignedCharCharacteristictimによって読み取り/書き込み可能eCharacteristic( "19B10001-E8F2-537E-4F6C-D104768A1214"、BLERead | BLEWrite); void setup(){//これは1回実行されます。 waterPipe.attach(9); waterPipe.write(0); pinMode(rainSensor、INPUT); lcd.begin(16、2); // LCDを開始してクリアします。 lcd.clear(); if(!SerialFlash.begin(ONBOARD_FLASH_SPI_PORT、ONBOARD_FLASH_CS_PIN)); lcd.setCursor(0、0); lcd.print( "入力時間:BLE"); //名前、サービス、特性、および特性値を使用してBLEサービスを初期化します。 BLE.begin(); BLE.setLocalName( "Arduino 101"); BLE.setAdvertisedService(plantService); plantService.addCharacteristic(timeCharacteristic); BLE.addService(plantService); timeCharacteristic.setValue(0); //セントラルによって書き込まれるまで0。 BLE.advertise(); lcd.setCursor(0、1); lcd.print( "待機中"); // connect.xの準備ができました:BLEDevice center =BLE.central(); if(central){//デバイスがボードにリンクしている場合。 lcd.setCursor(8、1); lcd.print( "完了"); delay(3000); while(central.connected()){//デバイスがまだ接続されている間。 if(timeCharacteristic.written()){//各バイトがデバイスから送信された後、すべての時間変数スロットを順番に埋めるコード。データは4回送信され、さらにリンクの確認用に1回送信されます。 if(confirmTime ==-1){confirmTime =timeCharacteristic.value(); } else if(hourTime ==-1){hourTime =timeCharacteristic.value(); } else if(minuteTime ==-1){minuteTime =timeCharacteristic.value(); } else if(dayTime ==-1){dayTime =timeCharacteristic.value(); } else if(monthTime ==-1){monthTime =timeCharacteristic.value(); lcd.clear(); lcd.setCursor(0、0); lcd.print( "Time set。"); lcd.setCursor(0、1); lcd.print( "デバイスを切断します。"); }}}} else {goto x; //デバイスがまだ接続されていない場合は、ループバックします。 } //収集された変数で時間を設定します。このシステムでは、秒と年は関係ありません。 setTime(hourTime、minuteTime、00、dayTime、monthTime、2017); // PMEを初期化します。 lcd.clear(); CuriePME.begin(); lcd.setCursor(0、0); lcd.print( "保存を確認しています。"); delay(3000); const char * filename ="NeurData.dat"; if(check_if_exists(filename)==true){restoreNetworkKnowledge(); lcd.setCursor(0、1); lcd.print( "Found!"); delay(3000); lcd.clear(); goto z; } else {lcd.setCursor(0、1); lcd.print( "見つかりません!"); delay(3000); lcd.clear(); } / *セットアップの残りの部分は、1日を通して温度データを収集します。 2分間隔で1時間あたり30回のチェックを行い、1時間の終わりに、最初のスキャンを除くすべてのデータの算術平均を見つけることにより、1時間のデータの平均を取ります。次に、この平均値がPMEに入力され、学習されます。これは午前8時から午後9時まで繰り返され、その時点で、PMEによって学習された完全なデータセットが、デバイスの電源が切れた場合や再起動が必要な場合のデフォルトとしてCurieFlashメモリに保存されます。 * / lcd.clear(); lcd.setCursor(0、0); lcd.print( "学習"); for(int i =8; i <22; i ++)//これを14回繰り返し、それぞれが異なるカテゴリで保存します。 {// 30個の温度データを収集し、0から255の間にマップされたintとして保存します。voltage=analogRead(thermometer)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm1 =Constraint(tm、0、255); delay(114000); //上記のチェック遅延を補正します。電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm2 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm3 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm4 =制約(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm5 =制約(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm6 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm7 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm8 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm9 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm10 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm11 =制約(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm12 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm13 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm14 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm15 =制約(tm、0、255); //最初の学習期間中、植物の散水はその月の気温のピーク時に行われます。 if((month()==1 || month()==2 || month()==11 || month()==12)&&hour()==12){lcd.clear(); lcd.setCursor(0、0); lcd.print( "実行中..."); //雨が降っていなく、土壌水分が十分に低い場合は、植物に水をやります。 int readRain =digitalRead(rainSensor); if(readRain ==HIGH){lcd.setCursor(0、1); lcd.print( "今すぐ雨が降っています。"); goto a2; } //水分センサーの使用をコメント解除します。 // else if(analogRead(humidity1)> 400 || analogRead(humidity2)> 400)//土壌に合わせてこれらを調整します。 // {//lcd.setCursor(0、1); //lcd.print( "土壌が湿りすぎています。"); // goto a2; //} else {waterPipe.write(135); delay(7000); // 7秒間水をまきます。 waterPipe.write(0); } lcd.setCursor(0、1); lcd.print( "Done"); a2:delay(3000); lcd.clear(); lcd.setCursor(0、0); lcd.print( "学習"); } else if((month()==3 || month()==4 || month()==10)&&hour()==14){lcd.clear(); lcd.setCursor(0、0); lcd.print( "実行中..."); lcd.clear(); lcd.setCursor(0、0); lcd.print( "実行中..."); //雨が降っていなく、土壌水分が十分に低い場合は、植物に水をやります。 int readRain =digitalRead(rainSensor); if(readRain ==HIGH){lcd.setCursor(0、1); lcd.print( "今すぐ雨が降っています。"); goto a31; } //水分センサーの使用をコメント解除します。 // else if(analogRead(humidity1)> 400 || analogRead(humidity2)> 400)//土壌に合わせてこれらを調整します。 // {//lcd.setCursor(0、1); //lcd.print( "土壌が湿りすぎています。"); // goto a31; //} else {waterPipe.write(135); delay(7000); // 7秒間水をまきます。 waterPipe.write(0); } lcd.setCursor(0、1); lcd.print( "Done"); a31:delay(3000); lcd.clear(); lcd.setCursor(0、0); lcd.print( "学習"); lcd.clear(); lcd.setCursor(0、0); lcd.print( "学習"); } else if((month()==5 || month()==6 || month()==9)&&hour()==15){lcd.clear(); lcd.setCursor(0、0); lcd.print( "実行中..."); lcd.clear(); lcd.setCursor(0、0); lcd.print( "実行中..."); //雨が降っていなく、土壌水分が十分に低い場合は、植物に水をやります。 int readRain =digitalRead(rainSensor); if(readRain ==HIGH){lcd.setCursor(0、1); lcd.print( "今すぐ雨が降っています。"); goto a3; } //水分センサーの使用をコメント解除します。 // else if(analogRead(humidity1)> 400 || analogRead(humidity2)> 400)//土壌に合わせてこれらを調整します。 // {//lcd.setCursor(0、1); //lcd.print( "土壌が湿りすぎています。"); // goto a3; //} else {waterPipe.write(135); delay(7000); // 7秒間水をまきます。 waterPipe.write(0); } lcd.setCursor(0、1); lcd.print( "Done"); a3:delay(3000); lcd.clear(); lcd.setCursor(0、0); lcd.print( "学習"); } else if((month()==7 || month()==8)&&hour()==16){lcd.clear(); lcd.setCursor(0、0); lcd.print( "実行中..."); lcd.clear(); lcd.setCursor(0、0); lcd.print( "実行中..."); //雨が降っていなく、土壌水分が十分に低い場合は、植物に水をやります。 int readRain =digitalRead(rainSensor); if(readRain ==HIGH){lcd.setCursor(0、1); lcd.print( "今すぐ雨が降っています。"); goto a4; } //水分センサーの使用をコメント解除します。 // else if(analogRead(humidity1)> 400 || analogRead(humidity2)> 400)//土壌に合わせてこれらを調整します。 // {//lcd.setCursor(0、1); //lcd.print( "土壌が湿りすぎています。"); // goto a4; //} else {waterPipe.write(135); delay(7000); // 7秒間水をまきます。 waterPipe.write(0); } lcd.setCursor(0、1); lcd.print( "Done"); a4:delay(3000); lcd.clear(); lcd.setCursor(0、0); lcd.print( "学習"); } delay(110000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm16 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm17 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm18 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm19 =制約(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm20 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm21 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm22 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm23 =制約(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm24 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm25 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm26 =制約(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm27 =制約(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm28 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm29 =制約(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm30 =制約(tm、0、255); delay(120000); //データを温度センサーの仕様に再変換します。 tm1 =map(tm1、0、255、-40、125); tm1 =制約(tm1、-40、125); tm2 =map(tm2、0、255、-40、125); tm2 =Constraint(tm2、-40、125); tm3 =map(tm3、0、255、-40、125); tm3 =Constraint(tm3、-40、125); tm4 =map(tm4、0、255、-40、125); tm4 =Constraint(tm4、-40、125); tm5 =map(tm5、0、255、-40、125); tm5 =Constraint(tm5、-40、125); tm6 =map(tm6、0、255、-40、125); tm6 =Constraint(tm6、-40、125); tm7 =map(tm7、0、255、-40、125); tm7 =Constraint(tm7、-40、125); tm8 =map(tm8、0、255、-40、125); tm8 =Constraint(tm8、-40、125); tm9 =map(tm9、0、255、-40、125); tm9 =Constraint(tm9、-40、125); tm10 =map(tm10、0、255、-40、125); tm10 =制約(tm10、-40、125); tm11 =map(tm11、0、255、-40、125); tm11 =制約(tm11、-40、125); tm12 =map(tm12、0、255、-40、125); tm12 =Constraint(tm12、-40、125); tm13 =map(tm13、0、255、-40、125); tm13 =制約(tm13、-40、125); tm14 =map(tm14、0、255、-40、125); tm14 =制約(tm14、-40、125); tm15 =map(tm15、0、255、-40、125); tm15 =制約(tm15、-40、125); tm16 =map(tm16、0、255、-40、125); tm16 =制約(tm16、-40、125); tm17 =map(tm17、0、255、-40、125); tm17 =制約(tm17、-40、125); tm18 =map(tm18、0、255、-40、125); tm18 =制約(tm18、-40、125); tm19 =map(tm19、0、255、-40、125); tm19 =制約(tm19、-40、125); tm20 =map(tm20、0、255、-40、125); tm20 =制約(tm20、-40、125); tm21 =map(tm21、0、255、-40、125); tm21 =制約(tm21、-40、125); tm22 =map(tm22、0、255、-40、125); tm22 =制約(tm22、-40、125); tm23 =map(tm23、0、255、-40、125); tm23 =制約(tm23、-40、125); tm24 =map(tm24、0、255、-40、125); tm24 =Constraint(tm24、-40、125); tm25 =map(tm25、0、255、-40、125); tm25 =Constraint(tm25、-40、125); tm26 =map(tm26、0、255、-40、125); tm26 =制約(tm26、-40、125); tm27 =map(tm27、0、255、-40、125); tm27 =制約(tm27、-40、125); tm28 =map(tm28、0、255、-40、125); tm28 =制約(tm28、-40、125); tm29 =map(tm29、0、255、-40、125); tm29 =制約(tm29、-40、125); tm30 =map(tm30、0、255、-40、125); tm30 =制約(tm30、-40、125); //算術平均を見つけて、それをメモリにコミットします。平均=(tm2 + tm3 + tm4 + tm5 + tm6 + tm7 + tm8 + tm9 + tm10 + tm11 + tm12 + tm13 + tm14 + tm15 + tm16 + tm17 + tm18 + tm19 + tm20 + tm21 + tm22 + tm23 + tm24 + tm + tm26 + tm27 + tm28 + tm29 + tm30)/ 29; commitSample(i、平均); } saveNetworkKnowledge(); //この新しいデータをフラッシュメモリに保存します。z:delay(1);} void commitSample(int category、uint8_t s1){//時間を表すカテゴリとともに、単一のベクトル(平均)をメモリにコミットしますそのデータの。 uint8_t vector [1]; vector [0] =s1; CuriePME.learn(vector、1、category);} void loop(){//無限に繰り返されます。 / *このコードは、PMEによって学習されたデータの中から、植物に水をやるのに最適な温度である摂氏25度を分類しようとします。データを分類できる場合、返されるカテゴリは、植物に水をやる時間になります。その後、データは消去されて再学習され、無限に繰り返されます。データを分類できない場合は、スケッチの前半の月次デフォルトが使用されます。 * / uint8_t vector [1]; vector [0] =25; int answer =CuriePME.classify(vector、1); if(answer ==CuriePME.noMatch){lcd.clear(); lcd.setCursor(0、0); lcd.print( "一致しません!"); if(month()==1 || month()==2 || month()==11 || month()==12){回答=12; } else if(month()==3 || month()==4 || month()==10){回答=14; } else if(month()==5 || month()==6 || month()==9){回答=15; } else if(month()==7 || month()==8){回答=16; }} else {lcd.clear(); lcd.setCursor(0、0); lcd.print( "Category:"); lcd.setCursor(0、1); lcd.print(answer); } delay(3000); lcd.clear(); lcd.setCursor(0、0); lcd.print( "最適化が完了しました"); delay(3000); CuriePME.forget(); //消去して再学習します。フラッシュメモリは消去されません。 lcd.clear(); lcd.setCursor(0、0); lcd.print( "待機中"); while(hour()!=8); lcd.clear(); lcd.setCursor(0、0); lcd.print( "学習"); //データを再度学習します。 for(int i =8; i <22; i ++){電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm1 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm2 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm3 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm4 =制約(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm5 =制約(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm6 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm7 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm8 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm9 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm10 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm11 =制約(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm12 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm13 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm14 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm15 =制約(tm、0、255); // PMEによって決定された、植物に水をやる日の時間。 if(hour()==answer){lcd.clear(); lcd.setCursor(0、0); lcd.print( "実行中..."); //雨が降っていなく、土壌水分が十分に低い場合は、植物に水をやります。 int readRain =digitalRead(rainSensor); if(readRain ==HIGH){lcd.setCursor(0、1); lcd.print( "今すぐ雨が降っています。"); goto a5; } //水分センサーの使用をコメント解除します。 // else if(analogRead(humidity1)> 400 || analogRead(humidity2)> 400)//土壌に合わせてこれらを調整します。 // {// lcd.setCursor(0、1); // lcd.print( "土壌が湿りすぎています。"); // goto a5; //} else {waterPipe.write(135); delay(7000); // 7秒間水をまきます。 waterPipe.write(0); } lcd.setCursor(0、1); lcd.print( "Done"); a5:delay(3000); lcd.clear(); lcd.setCursor(0、0); lcd.print( "学習"); } delay(110000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm16 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm17 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm18 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm19 =制約(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm20 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm21 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm22 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm23 =制約(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm24 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm25 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm26 =制約(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm27 =制約(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm28 =Constraint(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm29 =制約(tm、0、255); delay(120000);電圧=analogRead(温度計)* 3.3;電圧/ =1024.0;温度C =(電圧-0.5)* 100; tm =map(temperatureC、-40、125、0、255); tm30 =制約(tm、0、255); delay(120000); tm1 =map(tm1、0、255、-40、125); tm1 =制約(tm1、-40、125); tm2 =map(tm2、0、255、-40、125); tm2 =Constraint(tm2、-40、125); tm3 =map(tm3、0、255、-40、125); tm3 =Constraint(tm3、-40、125); tm4 =map(tm4、0、255、-40、125); tm4 =Constraint(tm4、-40、125); tm5 =map(tm5、0、255、-40、125); tm5 =Constraint(tm5、-40、125); tm6 =map(tm6、0、255、-40、125); tm6 =Constraint(tm6、-40、125); tm7 =map(tm7、0、255、-40、125); tm7 =Constraint(tm7、-40、125); tm8 =map(tm8、0、255、-40、125); tm8 =Constraint(tm8、-40、125); tm9 =map(tm9、0、255、-40、125); tm9 =Constraint(tm9、-40、125); tm10 =map(tm10、0、255、-40、125); tm10 =制約(tm10、-40、125); tm11 =map(tm11、0、255、-40、125); tm11 =制約(tm11、-40、125); tm12 =map(tm12、0、255、-40、125); tm12 =Constraint(tm12、-40、125); tm13 =map(tm13、0、255、-40、125); tm13 =制約(tm13、-40、125); tm14 =map(tm14、0、255、-40、125); tm14 =制約(tm14、-40、125); tm15 =map(tm15、0、255、-40、125); tm15 =制約(tm15、-40、125); tm16 =map(tm16、0、255、-40、125); tm16 =制約(tm16、-40、125); tm17 =map(tm17、0、255、-40、125); tm17 =制約(tm17、-40、125); tm18 =map(tm18、0、255、-40、125); tm18 =制約(tm18、-40、125); tm19 =map(tm19、0、255、-40、125); tm19 =制約(tm19、-40、125); tm20 =map(tm20、0、255、-40、125); tm20 =制約(tm20、-40、125); tm21 =map(tm21、0、255、-40、125); tm21 =制約(tm21、-40、125); tm22 =map(tm22、0、255、-40、125); tm22 =制約(tm22、-40、125); tm23 =map(tm23、0、255、-40、125); tm23 =制約(tm23、-40、125); tm24 =map(tm24、0、255、-40、125); tm24 =Constraint(tm24、-40、125); tm25 =map(tm25、0、255、-40、125); tm25 =Constraint(tm25、-40、125); tm26 =map(tm26、0、255、-40、125); tm26 =制約(tm26、-40、125); tm27 =map(tm27、0、255、-40、125); tm27 =制約(tm27、-40、125); tm28 =map(tm28、0、255、-40、125); tm28 =制約(tm28、-40、125); tm29 =map(tm29、0、255、-40、125); tm29 =制約(tm29、-40、125); tm30 =map(tm30、0、255、-40、125); tm30 =制約(tm30、-40、125);平均=(tm2 + tm3 + tm4 + tm5 + tm6 + tm7 + tm8 + tm9 + tm10 + tm11 + tm12 + tm13 + tm14 + tm15 + tm16 + tm17 + tm18 + tm19 + tm20 + tm21 + tm22 + tm23 + tm24 + tm + tm26 + tm27 + tm28 + tm29 + tm30)/ 29; progav =(tm30-tm2)/ 2; commitSample(i、平均); }} / *フラッシュメモリデータに関する簡単なメモ:データは一度だけ保存されます。つまり、このコードでは変更できません。その結果、デバイスの電源が切れた場合、月間平均が変更された場合でも、デバイスが再アクティブ化されたときに最初に使用されたときの設定がデフォルトになります。デバイスを1日余分に保持すると、ソフトウェアで新しい平均を取得できますが、フラッシュメモリは同じままです。フラッシュを完全に消去するには、IDEの「CurieSerialFlash」から「EraseEverything」をアップロードします。次に、このスケッチを再アップロードして、新しい平均をフラッシュメモリに保存します。* / void saveNetworkKnowledge()//フラッシュメモリに保存するためのコード....このファイルは切り捨てられています。ダウンロードして、完全な内容を確認してください。

回路図

回路のフリッツ図。バッテリーは左側に取り付けられることに注意してください。土壌水分センサーはオプションです。 rainpoweredsmartirrigationsystem_OHtd4bVfb3.fzz

製造プロセス

  1. チタン
  2. カスタネット
  3. のり
  4. アセチレン
  5. アスベスト
  6. サイコロ
  7. 合板
  8. ウェブサイトでラズベリーパイ自動植物散水
  9. Siemens、Bentley Launch Solution to Speed Speed Plant Digitalization