### 5.12 APP制御スマートファーム **注意:実験中にプラスチックプールから水を溢れさせないでください。他のセンサーに水をこぼすと、短絡したり、モジュールが動作しなくなる可能性があります。バッテリーが濡れると、爆発することさえあります。細心の注意を払ってください!年少のユーザーは、保護者と一緒に操作してください。電源にはUSBだけでなくバッテリーを使用してください。** Arduino IDEで**5.12.1APP-Smart-Farm**コードを開きます。 ```c #include #ifdef ESP32 #include #elif defined(ESP8266) #include #endif #include #include #include //表示用 #define DHT11PIN 17 //温湿度センサーピン #define RAINWATERPIN 35 //蒸気センサーピン #define LIGHTPIN 34 //フォトレジスターピン #define WATERLEVELPIN 33 //水位センサーピン #define SOILHUMIDITYPIN 32 //土壌湿度センサーピン //制御用 #define LEDPIN 27 //LEDピン #define RELAYPIN 25 //リレーピン(ウォーターポンプ制御用) #define SERVOPIN 26 //サーボピン #define FANPIN1 19 //ファンIN+ピン #define FANPIN2 18 //ファンIN-ピン #define BUZZERPIN 16 //ブザーピン const char* ssid = "your_SSID"; const char* pwd = "your_PASSWORD"; //LCD1602を初期化、0x27はI2Cアドレス LiquidCrystal_I2C lcd(0x27, 16, 2); WiFiServer server(80); //wifiサーバーを初期化 dht11 DHT11; //温湿度センサーを初期化 Servo myservo; //サーボを制御するためのサーボオブジェクトを作成 //ESP32では16個のサーボオブジェクトを作成可能 //検出された値として変数を定義 String request; String dataBuffer; int Temperature; //温度 int Humidity; //湿度 int SoilHumidity; //土壌湿度 int Light; //明るさ int WaterLevel; //水位 int Rainwater; //降水量 void setup() { Serial.begin(9600); //wifiに接続 WiFi.begin(ssid, pwd); //接続されたかどうかを判断 Serial.println("Connecting to WiFi..."); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } delay(1000); //シリアルモニターにwifi名とIPアドレスを表示 Serial.println("Connected to WiFi"); Serial.print("WiFi NAME:"); Serial.println(ssid); Serial.print("IP:"); Serial.println(WiFi.localIP()); //LCDを初期化 lcd.init(); // (オプションの)バックライトをオフ/オン lcd.backlight(); //lcd.noBacklight(); lcd.clear(); //カーソルの位置を設定 lcd.setCursor(0, 0); //LCDに表示 lcd.print("IP:"); //カーソルの位置を設定 lcd.setCursor(0, 1); //LCDに表示 lcd.print(WiFi.localIP()); //ピンモードを設定 pinMode(LEDPIN, OUTPUT); pinMode(RAINWATERPIN, INPUT); pinMode(LIGHTPIN, INPUT); pinMode(SOILHUMIDITYPIN, INPUT); pinMode(WATERLEVELPIN, INPUT); pinMode(RELAYPIN, OUTPUT); pinMode(FANPIN1, OUTPUT); pinMode(FANPIN2, OUTPUT); pinMode(BUZZERPIN, OUTPUT); delay(1000); //ピン26のサーボをサーボオブジェクトに接続 myservo.attach(SERVOPIN); myservo.write(160); //サーバーを開始 server.begin(); // LEDCチャンネルを設定 ledcAttachChannel(BUZZERPIN, 1000, 8, 4); } c void loop() { //Webサーバーにクライアントが接続されているか確認 //クライアントがサーバーに接続されている場合、"server.available()"はクライアント側の通信のためにWiFiClientオブジェクトを返します。 WiFiClient client = server.available(); if (client) { Serial.println("新しいクライアントが接続されました"); while (client.connected()) { //サーバーがデータを送信するかどうかを判断 if (client.available()) { request = client.readStringUntil('s'); Serial.print("受信メッセージ: "); Serial.println(request); } //すべてのセンサーデータを取得 getSensorsData(); //"dataBuffer"にすべてのデータを格納 dataBuffer = ""; dataBuffer += String(Temperature, HEX); dataBuffer += String(Humidity, HEX); dataBuffer += dataHandle(SoilHumidity); dataBuffer += dataHandle(Light); dataBuffer += dataHandle(WaterLevel); dataBuffer += dataHandle(Rainwater); //データをサーバーに送信し、APPに転送 client.print(dataBuffer); delay(500); //LED if (request == "a") { digitalWrite(LEDPIN, HIGH); } else if (request == "A") { digitalWrite(LEDPIN, LOW); } //灌漑 else if (request == "b") { digitalWrite(RELAYPIN, HIGH); delay(400); //灌漑遅延 digitalWrite(RELAYPIN, LOW); delay(650); } //ファン else if (request == "c") { delay(800); digitalWrite(FANPIN1, HIGH); digitalWrite(FANPIN2, LOW); delay(200); } else if (request == "C") { digitalWrite(FANPIN1, LOW); digitalWrite(FANPIN2, LOW); } //給餌ボックス else if (request == "d") { //サーボが80°回転し、給餌ボックスを開く myservo.write(80); delay(500); } else if (request == "D") { //サーボが160°回転し、給餌ボックスを閉じる myservo.write(160); } //ブザー else if (request == "e") { ledcWriteTone(BUZZERPIN, 262); delay(800); ledcWriteTone(BUZZERPIN, 0); delay(100); } request = ""; } Serial.println("クライアントが切断されました"); } } void getSensorsData() { //データを取得 int chk = DHT11.read(DHT11PIN); //蒸気センサー Rainwater = analogRead(RAINWATERPIN); //フォトレジスター Light = analogRead(LIGHTPIN); //土壌湿度センサー SoilHumidity = analogRead(SOILHUMIDITYPIN) * 1.8; //水位センサー WaterLevel = analogRead(WATERLEVELPIN) * 1.8; //温度 Temperature = DHT11.temperature; //湿度 Humidity = DHT11.humidity; } //データをパーセンテージに変換 String dataHandle(int data) { //アナログ値をパーセンテージに変換 int percentage = (data / 4095.0) * 100; //変換されたパーセンテージが100より大きい場合、100を出力する。 percentage = percentage > 100 ? 100 : percentage; //6文字で16進数文字列を格納し、1文字は終端文字として使用 char hexString[3]; //16進数値を6桁の16進数文字列に変換し、先行ゼロを追加: 0は00、1は01... sprintf(hexString, "%02X", percentage); return hexString; } ``` コード内の `your_SSID` をWi-Fiの名前に、`your_PASSWORD` をWi-Fiのパスワードに変更してください。その後、コードをアップロードします。 ```c const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; ``` **ESP32 Dev Module** ボードと **COM** ポートを選択し、コードをアップロードします。 ![5458448](../media/5458448.png) **APPをダウンロード** **Androidの場合:** 方法1:Google Playで「**IOT Farm**」を検索してダウンロードします。 ![couapp2](../media/couapp2.png) **iOSの場合:** APP Storeで**IOT farm**を検索し、タップしてダウンロードします。 ![image-20250417162032912](../media/image-20250417162032912.png) **APPのホームページ** ![cou124](../media/cou124.png) **APP機能説明** 1. コードをアップロードした後、スマートフォンをESP32と同じWIFIに接続し、右上隅にIPアドレスを入力するだけで接続できます。**注:**5Gではなく、**2.4 GHz** WIFIが必要です。 ![img](../media/cou126.png) 2. 農場の温度値をリアルタイムで表示します。 ![img](../media/cou127.png) 3. 農場の空気湿度値をリアルタイムで表示します。 ![img](../media/cou128.png) 4. 農場の土壌湿度値をリアルタイムで表示します。 ![img](../media/cou129.png) 5. 農場の日照輝度値をリアルタイムで表示します。 ![img](../media/cou1210.png) 6. 農場の水位をリアルタイムで表示します。 ![img](../media/cou1211.png) 7. 農場の降雨アナログ値をリアルタイムで表示します。 ![img](../media/cou1212.png) 8. LEDを制御します。 ![img](../media/cou1213.png) 9. ウォーターポンプを介して灌漑を制御します。 ![img](../media/cou1214.png) 10. ファンを制御して温度を調整します。 ![img](../media/cou1215.png) 11. サーボを制御して給餌ボックスを開閉します。 ![img](../media/cou1216.png) 12. ブザーを制御して音を鳴らします。 ![img](../media/cou1217.png)