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

ドモティック温室

コンポーネントと消耗品

>
Arduino MKR1000
× 1
Arduino UNO
× 1
DHT22温度センサー
× 1
Arduino Wifi Shield 101
× 1
Androidデバイス
× 1
ArduinoInfineon用BTN8982を備えたDCモーター制御シールド
× 1

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

>
Arduino IDE
Eclipse

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

概要

温室の環境条件は絶えず変化しているため、効率的な監視が必要です。

自動システムを使用することには多くの利点があります。たとえば、作業が減ったり、ユーザーがPCやスマートフォンで家から自分の投資を確認できることが最も重要です。

もう1つの重要な利点は、データをデータベースに保存できることです。これはお金を稼ぐか失うかの違いを生む可能性があります。

さらに、リアルタイムのシステム制御により、すぐに介入できるため、栽培上の問題を防ぐことができます。

温室内の自動監視システムは、環境データを読み取るセンサーと「スレーブ」と呼ばれるアクチュエーターで構成されています。それらは、「マスター」と呼ばれる中央デバイスとワイヤレスを介して通信します。後者は、可能な変更(しきい値の変更など)とデータをWiFi経由でWebサーバーにも送信します。

1.どのように機能しますか?

このプロジェクトは3つの異なる部分に分割できます:

  • マスター
  • スレーブ
  • Webサーバー

マスターにはArduino / Genuino MKR1000を使用し、スレーブにはArduino / GenuinoUnoを使用しました。

マスターはWiFi(WINC1500統合)を介してWebサーバーと通信し、スレーブはDHT22センサーを使用して温度と湿度を取得し、WiFi(WiFiシールドWINC1500)を介してこれらのデータをマスターに送信します。

2.マスター

マスターは「アクセスポイントモード」にあり、スレーブ接続が詳細に記述されてWebサーバーに送信される温度と湿度を受信するのを待ちます。

マスターは、使用可能なデータがあるかどうかを確認します。この場合、マスターは新しいしきい値とCRCによって形成されたUDPパケットを作成します。実際、スレーブが受信した設定を検証するために使用するCRCを計算します。

マスターは「アクセスポイントモード」を終了すると、WiFiに接続して、データをWebServerに送信し、そこでグラフに配置します。

<図>

3.スレーブ

スレーブはDHT22センサーによって温度と湿度を取得し、5分後にマスターにデータを送信します。また、UDPパケットを作成し、マスターに接続してからデータを送信します。

後で、新しいしきい値など、使用可能なデータがあるかどうかを待機します。この場合、スレーブは新しい設定を受け取り、Dallas-Maximの式を使用してCRCを計算します。

続いて、計算されたCRCがマスターから受信したCRCと比較されます。 2つのCRCが同じである場合、スレーブは新しい設定をEEPROMに保存します。

<図>

4.Webサーバー

Webサーバーは、後で履歴に保存できるすべてのデータを保存します。

そのために、データベースに接続し、2つの異なる方法でデータを表示するPHPスクリプトを使用しました

  • グラフで、別のPHPスクリプトを使用
  • Androidアプリで、別のPHPスクリプトを使用したJSON形式で
<図>

5. APP

このアプリを使用すると、データをデータベースに取り込むことができます。

最初の画面では、表示するタイミング範囲を選択できます。[グラフィック]ボタンを使用すると、Webサービスに接続してデータを取得します。

アプリはデータをグラフィックに表示します。

<図> <図>


コード

  • グラフィックを作成する
  • スクリプトWebサイト接続
  • テーブルを作成する
  • 温室ドモティックマスター
  • 温室ドモティックスレーブ
  • getdati
グラフィックの作成 PHP
これを使用してグラフィックを作成しました
 <?php // content ="text / plain; charset =utf-8" define( '__ ROOT __'、dirname(dirname(__ FILE__))); require_once( '../ jpgraph.php'); require_once( '../ jpgraph_line.php'); require_once( '../ jpgraph_error.php'); $ parameter1 =array(); $ parameter2 =array(); $ time_axis =array(); $ i =0; $ con =mysqli_connect( "localhost"、 "user"、 "pass"、 "my_db"); //接続を確認しますif(mysqli_connect_errno()){echo "MySQLへの接続に失敗しました:"。 mysqli_connect_error();} $ result =mysqli_query($ con、 "SELECT your_parameter FROM your_raw"); while($ row =mysqli_fetch_array($ result)){$ parameter1 [$ i] =$ row ["parameter1"]; $ parameter2 [$ i] =$ row ["parameter2"]; $ time_axis [$ i] =$ row ["date"]; $ i ++;} mysqli_close($ con); //グラフを設定します$ graph =new Graph(300,250); $ graph-> SetScale( "textlin"); $ theme_class =new UniversalTheme; $ graph-> SetTheme($ theme_class); $ graph-> img-> SetAntiAliasing( false); $ graph-> title-> Set( 'Title'); $ graph-> SetBox(false); $ graph-> img-> SetAntiAliasing(); $ graph-> yaxis-> HideZeroLabel(); $ graph -> yaxis-> HideLine(false); $ graph-> yaxis-> HideTicks(false、false); $ graph-> xgrid-> Show(); $ graph-> xgrid-> SetLineStyle( "solid"); $グラフ-> xaxis-> SetTickLabels($ time_axis); $ graph-> xgrid-> SetColor( '#E3E3E3'); $ graph-> xaxis-> SetLabelAngle(90); $ graph->凡例-> SetPos(0.5、 0.08、 'center'、 'top'); //最初の行を作成$ p1 =new LinePlot($ parameter1); $ graph-> Add($ p1); $ p1-> SetColor( "#6495ED"); $ p1-> SetLegend( 'your_parameter1'); $ graph-> yscale-> SetGrace(0); // 2番目の行を作成$ p2 =new LinePlot($ parameter2); $ graph-> Add($ p2); $ p2 -> SetColor( "#B22222"); $ p2-> SetLegend( 'your_parameter2'); $ graph-> yscale-> SetGrace(0); $ graph->凡例-> SetFrameWeight(1); //出力行$グラフ-> Stroke();?> 
スクリプトWebサイト接続 PHP
これを使用してデータをDBに保存しました
 <?php $ servername ="localhost"; $ username ="user"; $ password ="pass"; $ dbname ="my_db"; $ id =$ _GET [" name "]; $ temp =$ _GET [" parameter1 "]; $ umid =$ _GET [" parameter2 "]; echo" name "。 $ _GET ['name']。 "
"; echo "parameter1"。 $ _GET ['parameter1']。 "
"; echo "parameter2"。 $ _GET ['parameter2']。 "
"; //接続を作成$ conn =mysqli_connect($ servername、$ username、$ password、$ dbname); //接続を確認if(!$ conn){die( "接続に失敗しました:"。mysqli_connect_error() );} $ sql ="INSERT INTO温室(name、parameter1、parameter2)VALUES( '"。$ name。 "'、 '"。$ parameter1。 "'、 '"。$ parameter2。 "')"; if( mysqli_query($ conn、$ sql)){echo "新しいレコードが正常に作成されました";} else {echo "エラー:"。 $ sql。 "
"。 mysqli_error($ conn);} mysqli_close($ conn);?>
テーブルの作成 SQL
このスクリプトを使用して、テーブルを作成しました
 CREATE TABLE IF NOT EXISTS `greenhouse`(` id` int(11)NOT NULL、 `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP、` temp` float NOT NULL、 `umid` float NOT NULL)ENGINE =MyISAM DEFAULT CHARSET =utf8; 
温室ドモティックマスター C / C ++
これはマスターのコードです
 / *自動温室プロジェクト* // *自動車:Antonio La Mura、Umberto Festa * // *日付:2016年3月3日* // *私たちのアイデアは、果物を購入するユーザーを許可することです化学肥料や他の同様の製品の使用など、製品が行ったすべてのプランテーションのステップを正確に知るために、温室で栽培された野菜。販売した商品にはQRコードが貼られ、特定のスマートフォンアプリで読み取られます。製品が栽培されている環境条件と使用されている化学製品に関する情報を提供します。温室内の自動監視システムは、環境データを読み取るセンサーとスレーブと呼ばれるアクチュエーターで構成されています。それらは、マスターと呼ばれる中央デバイスとワイヤレスを介して通信します。後者は、可能な変更(しきい値の変更など)とデータをWiFi経由でWebサーバーにも送信します。商品の販売準備が整うと、ウェブサービスにQRコードの生成を依頼し、パッケージに入れます。システムの最後の部分は、QRコードのスキャンを担当し、ユーザーに相対情報を表示するモバイルアプリです。* // *マスター* // * DEVOAGGIUNGERE SOLO LA PARTE CHE MI SERVE PER RICEVERE LE NUOVE SOGLIE CHE VENGONO INVIATE DALL'APP * // *使用されているライブラリ* /#include  #include  #include  #include  #include  / *接続用の変数* / char ssid [] ="SSID"; / *ネットワークSSID(名前)* / charpass [] ="pass"; / *ネットワークパスワード(WPAに使用、またはWEPのキーとして使用)* / int keyIndex =0; / *ネットワークキーのインデックス番号(WEPにのみ必要)* / char ssid_ap [] ="Arduino"; / *作成されたAP名* / charpass_ap [] =""; / *(まだサポートされていません)* / int status =WL_IDLE_STATUS; unsigned int localPort =2390; / *リッスンするローカルポート* / charserver [] ="www.cormaz.altervista.org"; / * Googleの名前アドレス(DNSを使用)* / WiFiServerserver_ap(80); WiFiClient client_ap; WiFiUDP Udp; RTCZero rtc; WiFiClient client; char packetBuffer [255]; / *着信パケットを保持するためのバッファ* / char ReplyBuffer [255]; / *返送する文字列* // *新しいしきい値の変数* / float humax =0; float humin =0; float tumax =0; float tumin =0; / *アクセスポイント(フラグ=false)のように機能し、接続しますWebサーバーへ(flag =true)* / boolean flag =false; boolean threeshold_available =false; void setup(){/ *シリアルを初期化し、ポートが開くのを待ちます:* / Serial.begin(9600); while(!Serial){; / *シリアルポートが接続するのを待ちます。ネイティブUSBポートにのみ必要* /} Serial.println();} void loop(){int packetSize;ダブルテンプ;ダブルハム; int id;バイトcrc;文字列strURL; //シールドの存在を確認します:/ *************************************** ***********************************************/ もしも ( WiFi.status()==WL_NO_SHIELD){Serial.println( "WiFiシールドが存在しません"); / *続行しない:* / while(true); } / ************************************************ ************************************** // // WiFiネットワークへの接続を試みます:/ * ************************************************** *********************************** / while(status!=WL_CONNECTED){Serial.print( "Creating名前の付いたネットワーク: "); Serial.println(ssid_ap); / * WPA / WPA2ネットワークに接続します。オープンネットワークまたはWEPネットワークを使用している場合は、この行を変更します。* / status =WiFi.beginAP(ssid_ap); / *接続を10秒待ちます:* / delay(10000); server_ap.begin(); } Serial.println( "Wi-Fiに接続"); / ************************************************* ************************************* // // UDP通信を開始します/ ****** ************************************************** ****************************** / Udp.begin(localPort); printWifiStatus(); client_ap =server_ap.available(); if(client_ap){/ *クライアントを取得した場合* / / *情報を待っています* / Serial.println( "new client"); / *シリアルポートからメッセージを出力します* // *利用可能なデータがある場合は、パケットを読み取ります* / packetSize =Udp.parsePacket(); if(packetSize){Serial.print( "受信したサイズのパケット"); Serial.println(packetSize); Serial.print( "From"); IPアドレスremoteIp =Udp.remoteIP(); Serial.print(remoteIp); Serial.print( "、ポート"); Serial.println(Udp.remotePort()); / *パケットをpacketBufferに読み込みます* / int len =Udp.read(packetBuffer、255); if(len> 0)packetBuffer [len] =0; Serial.println( "コンテンツ:"); Serial.println(packetBuffer); char *コマンド=strtok((char *)packetBuffer、 ";"); int count =0; while(command!=0){/ *情報を除算* / switch(count){case 0:id =atoi(command);壊す;ケース1:temp =atof(command)/ 10;壊す;ケース2:hum =atof(command)/ 10;壊す; }コマンド=strtok(0、 ";"); count ++; } Serial.print( "から受け取ったパッケージ"); Serial.print(id); Serial.print( "T:"); Serial.print(temp、1); Serial.print( "H:"); Serial.println(hum、1); / ************************************************* ************************************* / delay(20); / * CRC-8を計算するので、バイト配列を作成します* / / *********************************** ********************************************* /バイトbhmax =(バイト)humax;バイトbhmin =(バイト)ヒューミン;バイトbtmax =(byte)tumax;バイトbtmin =(バイト)tumin;バイトcrc32_str [4] ={bhmax、bhmin、btmax、btmin}; crc =CRC8(crc32_str); Serial.println( "CRC:"); Serial.println(crc); / ************************************************* ******************************* / if(threeshold_available ==true){snprintf(ReplyBuffer、sizeof(ReplyBuffer)、 " %d;%d;%d;%d;%d;%d "、id、(int)humax、(int)humin、(int)tumax、(int)tumin、(int)crc); / *受信したパケットを送信したIPアドレスとポートに応答を送信します* / Udp.beginPacket(Udp.remoteIP()、Udp.remotePort()); Udp.write(ReplyBuffer); Udp.endPacket(); }} / *シリアルモニターを印刷します* / / *接続を閉じます:* / client_ap.stop(); Serial.println( "クライアントが切断されました");フラグ=true; } / *ファインAP * / / ****************************************** ************************************** / / *サーバーに接続し、データベースにデータを送信します* / / ************************************************** ********************************* / if(flag ==true){/ * Wifiネットワークへの接続を試みます:* / while(status!=WL_CONNECTED){Serial.print( "SSIDに接続しようとしています:"); Serial.println(ssid); / * WPA / WPA2ネットワークに接続します。オープンネットワークまたはWEPネットワークを使用している場合は、この行を変更します。* / status =WiFi.begin(ssid、pass); / *接続を10秒待ちます:* / delay(10000); } Serial.println( "Wi-Fiに接続"); printWifiStatus(); strURL ="GET /YourAddress.php?id="; strURL + =id; strURL + ="&parameter1 ="; strURL + =temp; strURL + ="&parameter2 ="; strURL + =ハム; strURL + ="HTTP / 1.1"; Serial.println( "\ nサーバーへの接続を開始しています..."); //接続を取得した場合は、シリアル経由でレポートを返します。if(client.connect(server、80)){Serial.println( "サーバーに接続"); // HTTPリクエストを作成します:client.println(strURL); client.println( "ホスト:www.cormaz.altervista.org"); client.println( "接続:閉じる"); client.println(); client.stop(); Serial.println( "OK!"); } / *サーバーが切断されている場合は、クライアントを停止します:* / if(!client.connected()){Serial.println(); Serial.println( "サーバーから切断しています。"); client.stop(); / *永遠に何もしない:* / while(true); }フラグ=false; } / ************************************************ ******************************** /} / *アルゴリズムCRC-8を計算します-ダラス/マキシムの公式に基づいて* /バイトCRC8(const byte * data){byte crc =0x00; while(* data){byte extract =* data ++; for(byte tempI =8; tempI; tempI-){byte sum =(crc ^ extract)&0x01; crc>> =1; if(sum){crc ^ =0x8C; }抽出>> =1; }} return crc;} void printWifiStatus(){/ *接続しているネットワークのSSIDを出力します:* / Serial.print( "SSID:"); Serial.println(WiFi.SSID()); / * WiFiシールドのIPアドレスを出力します:* / IPAddress ip =WiFi.localIP(); Serial.print( "IPアドレス:"); Serial.println(ip); / *受信信号強度を出力します:* / long rssi =WiFi.RSSI(); Serial.print( "信号強度(RSSI):"); Serial.print(rssi); Serial.println( "dBm");} 
温室ドモティックスレーブ C / C ++
これは奴隷のコードです
 / *自動温室プロジェクト* // *自動車:Antonio La Mura、Umberto Festa * // *日付:2016年3月21日* // *私たちのアイデアは、果物を購入するユーザーを許可することです化学肥料や他の同様の製品の使用など、製品が行ったすべてのプランテーションのステップを正確に知るために、温室で栽培された野菜。販売した商品にはQRコードが貼られ、特定のスマートフォンアプリで読み取られます。製品が栽培されている環境条件と使用されている化学製品に関する情報を提供します。温室内の自動監視システムは、環境データを読み取るセンサーとスレーブと呼ばれるアクチュエーターで構成されています。それらは、マスターと呼ばれる中央デバイスとワイヤレスを介して通信します。後者は、可能な変更(しきい値の変更など)とデータをWiFi経由でWebサーバーにも送信します。商品の販売準備が整うと、ウェブサービスにQRコードの生成を依頼し、パッケージに入れます。システムの最後の部分は、QRコードのスキャンを担当し、ユーザーに相対情報を表示するモバイルアプリです。* // *スレーブ* // *使用されるライブラリ* /#include  #include  #include  #include  #include  //すべてのPINを定義#defineHUMIDIFIER A4#define HEATER A5#define DHT22_PIN 4 // Define motor#define IS_1 0 #define IS_2 1#define IN_1 3#define IN_2 11#define INH_1 12#define INH_2 13#define TCONST 100 //ステップ間の遅延時間//リセットする変数millis()extern unsigned long timer0_millis; int status =WL_IDLE_STATUS; char ssid [] ="Arduino"; //ネットワークSSID(name)char pass [] =""; //ネットワークパスワード(WPAに使用、またはWEPのキーとして使用)int keyIndex =0; //ネットワークキーのインデックス番号(WEPにのみ必要)unsigned int localPort =2390; // onchar packetBuffer [255]をリッスンするローカルポート; //着信パケットを保持するためのバッファWiFiUDPUdp; // DHT22DHT22 myDHT22(DHT22_PIN); //変数sendfloathmin =0; float hmax =0; float tmin =0; float tmax =0; int Duty_motor =0; float湿度;フロート温度; // 10秒ごとに送信する変数sunsignedlonginterval =600000; void setup(){Serial.begin(9600); while(!Serial){; //シリアルポートが接続するのを待ちます。ネイティブUSBポートにのみ必要} // PINを初期化(INPUT-OUTPUT)pinMode(HEATER、OUTPUT); digitalWrite(HEATER、LOW); pinMode(加湿器、出力); digitalWrite(加湿器、低); //ファンのPINを設定しますpinMode(IN_1、OUTPUT); pinMode(IN_2、OUTPUT); pinMode(INH_1、OUTPUT); pinMode(INH_2、OUTPUT); // reset_ports();をリセットしますdigitalWrite(INH_1、1); digitalWrite(INH_2、1); Serial.println( "Beginning ..."); delay(2000);} void loop(){//利用可能なデータがある場合は、パケットを読み取りますint packetSize =Udp.parsePacket(); unsigned long time =millis(); unsigned long currentMillis =millis(); DHT22_ERROR_t errorCode; int i =0; char name [] ="clie1";湿度=myDHT22.getHumidity()* 10;温度=myDHT22.getTemperatureC()* 10; char toSend [32]; errorCode =myDHT22.readData();バイトcrc; int crc_ric; //センサーの湿度と温度を確認するDHT22エラー/ **************************************** **************************************** / switch(errorCode){case DHT_ERROR_NONE:char buf [128]; sprintf(buf、 "整数のみの読み取り:温度%hi。%01hi C、湿度%i。%01i %% RH"、myDHT22.getTemperatureCInt()/ 10、abs(myDHT22.getTemperatureCInt()%10)、myDHT22。 getHumidityInt()/ 10、myDHT22.getHumidityInt()%10);壊す;ケースDHT_ERROR_CHECKSUM:ブレーク;ケースDHT_BUS_HUNG:ブレーク;ケースDHT_ERROR_NOT_PRESENT:ブレーク;ケースDHT_ERROR_ACK_TOO_LONG:ブレーク;ケースDHT_ERROR_SYNC_TIMEOUT:ブレーク;ケースDHT_ERROR_DATA_TIMEOUT:ブレーク;ケースDHT_ERROR_TOOQUICK:ブレーク; } / ************************************************ ******************************** ///値が変更されたときに値を出力します/ ******* ************************************************** *********************** / if(humidity!=myDHT22.getHumidity()* 10 || temperature!=myDHT22.getTemperatureC()* 10){ Serial.print( "T:"); Serial.print(myDHT22.getTemperatureC()、1); Serial.print( "C"); Serial.print( "H:"); Serial.print(myDHT22.getHumidity()、1); Serial.println( "%"); } / ************************************************ ******************************** /// 10分ごとにパラメータを送信します/ ******** ************************************************** ********************** / if(millis()> interval){// APへの接続/ ************ ************************************************** ****************** / //シールドの存在を確認します:if(WiFi.status()==WL_NO_SHIELD){Serial.println( "WiFiシールドが存在しません"); //続行しない:while(true); } // Wifiネットワークへの接続を試みます:while(status!=WL_CONNECTED){Serial.print( "SSIDへの接続を試みています:"); Serial.println(ssid); // WPA / WPA2ネットワークに接続します。オープンネットワークまたはWEPネットワークを使用している場合は、次の行を変更します。status=WiFi.begin(ssid); //接続を10秒待ちます:delay(10000); } Serial.println( "Wi-Fiに接続"); / ************************************************* ******************************* / Serial.println( "\ nサーバーへの接続を開始しています..."); //接続を取得した場合は、シリアル経由で報告してください:Udp.begin(localPort); snprintf(toSend、sizeof(toSend)、 "%s;%d;%d"、name、(int)humidity、(int)temperature); //受信したパケットを送信したIPアドレスとポートに応答を送信しますUdp.beginPacket(Udp.remoteIP()、Udp.remotePort()); Udp.write(toSend); Udp.endPacket(); Serial.println( "送信が終了しました"); resetMillis(); while(millis()<10000){packetSize =Udp.parsePacket(); if(packetSize){/ *パケットをpacketBufferに読み込む* / int len =Udp.read(packetBuffer、255); if(len> 0)packetBuffer [len] =0; Serial.println( "コンテンツ:"); Serial.println(packetBuffer); char *コマンド=strtok((char *)packetBuffer、 ";"); int count =0; while(command!=0){/ *情報を除算* / switch(count){case 0:snprintf(name、sizeof(name)、 "%s"、command);壊す;ケース1:hmax =atof(command)/ 10; // atof(char *)mi converte un tipo char * in double break;ケース2:hmin =atof(command)/ 10;壊す;ケース3:tmax =atof(command)/ 10;壊す;ケース4:tmin =atof(command)/ 10;壊す;ケース5:crc_ric =atoi(command);壊す; }コマンド=strtok(0、 ";"); count ++; } Serial.print( "回答:"); Serial.print(name); Serial.print( ";"); Serial.print(hmax、1); Serial.print( ";"); Serial.print(hmin、1); Serial.print( ";"); Serial.print(tmax、1); Serial.print( ";"); Serial.println(tmin、1); Serial.print( "CRC受信:"); Serial.println(crc_ric); // CRC-8を計算し、バイトの配列を取得します/ ************************************ ******************************************** /バイトbhmax =(バイト)hmax;バイトbhmin =(byte)hmin;バイトbtmax =(byte)tmax;バイトbtmin =(byte)tmin;バイトcrc32_str [4] ={bhmax、bhmin、btmax、btmin}; crc =CRC8(crc32_str); Serial.println( "CRC:"); Serial.println(crc); / ************************************************* ******************************* / if(crc_ric ==(int)crc){// EEPROMに保存EEPROM_writeDouble (0、tmax); EEPROM_writeDouble(4、tmin); EEPROM_writeInt(8、hmax); EEPROM_writeInt(10、hmin); }}} delay(10); } / ************************************************ ******************************** / WiFi.disconnect(); //センサーの値に従って加湿器、ヒーター、ファンを管理します/ *********************************** ************************************************** * / // HEATER if(myDHT22.getTemperatureC()> =tmax){digitalWrite(HEATER、HIGH); } if(myDHT22.getTemperatureC()<=tmin + 1){digitalWrite(HEATER、LOW); } // HUMIDIFIER if((int)myDHT22.getHumidity()> =hmax){digitalWrite(HUMIDIFIER、HIGH); } if((int)myDHT22.getHumidity()<=hmin + 1){digitalWrite(HUMIDIFIER、LOW); } //ファン、ブラシレスモーターif(myDHT22.getTemperatureC()> =tmax + 4){//温度に応じたモーターの回転、デューティ-> 0 per t =tmax +4およびデューティ-> 100 per t> tmax + 10 // Rotazione del motore al variare dellatemperatura、duty-> 0 per t =tmax + 4 e Duty-> 100 per t> tmax + 10 Duty_motor =map(i、tmax + 4、tmax + 10、0、 100); if(tmax> tmax + 10){duty_motor =100; } analogWrite(IN_2、duty_motor); delay(TCONST); } if(myDHT22.getTemperatureC()<=(tmax + tmin)/ 2){reset_ports(); //温度に応じたモーターの回転、デューティ-> 0 per t =tmax +4およびデューティ-> 255 per t> tmax + 10 Duty_motor =0; analogWrite(IN_2、duty_motor); delay(TCONST); } / ************************************************ ************************************** / delay(1000);} // doubleを保存しますEEPROMvoid EEPROM_writeDouble(int ee、double value){byte * p =(byte *)(void *)&value; for(int i =0; i > =1; if(sum){crc ^ =0x8C; }抽出>> =1; }} return crc;} //これは、millis()void resetMillis(){cli();をリセットするために使用します。 timer0_millis =0; sei();} 
getdati PHP
これを使用して、アプリをデータベースに接続しました
 <?php $ username ="root"; $ password =""; $ hostname ="localhost"; //データベースへの接続$ dbhandle =mysql_connect($ hostname、$ username、$ password)またはdie( "Unable to connect to MySQL"); // echo "Connected to MySQL 
"; //データベースを選択して$ selected =mysql_select_db( "serra"、$ dbhandle)またはdie( "例を選択できませんでした");で動作します。 $ datada =$ _GET ["datada"]; $ dataa =$ _GET ["dataa"]; // SQLクエリを実行してレコードを返す$ result =mysql_query( "SELECT hum、temp、date FROM record WHERE date> =' "。$ datada。" 'and date <=' "。$ dataa。" '"); $ records =array(); //データベースからデータをフェッチwhile($ row =mysql_fetch_array($ result)){$ tmp =array( "hum" => $ row {'hum'}、 "temp" => $ row {'temp'}、 "date" => $ row {'date'}); array_push($ records、$ tmp); // echo "HUM:"。$ row {'hum'}。 "TEMP:"。$ row {'temp'}。 "Date:"。 //結果を表示します$ row {'date'}。 "
";} echo json_encode($ records); // connectionmysql_close($ dbhandle);?>
を閉じます
App GrenHouse
最初のページでは、2つのDatePickerを使用して日付を設定する必要があります。「GRAPHIC」ボタンを押すと、PHPスクリプト「getdati」へのHTTP GET呼び出しが行われ、選択したパラメーターと日付が送信されます。次に、JSONを受信し、ライブラリGraphViewhttps://github.com/cormaz/app_greenhouse.git
を使用してグラフィックを作成した後、それをデコードします。

回路図

接続:ArduinoUNO-DHT22-リレー

製造プロセス

  1. ILI9341TFTタッチスクリーンディスプレイシールドのビットマップアニメーション
  2. Web操作のDMXコントローラー
  3. Arduino Spybot
  4. FlickMote
  5. 自家製テレビB-Gone
  6. マスタークロック
  7. HSVClock
  8. ラズベリーモーターシールドを使用したAndroid制御玩具
  9. Find Me
  10. Arduino Power
  11. BLUE_P:ワイヤレスArduinoプログラミングシールド