5.12 APP制御スマートファーム
注意:実験中にプラスチックプールから水を溢れさせないでください。他のセンサーに水をこぼすと、短絡したり、モジュールが動作しなくなる可能性があります。バッテリーが濡れると、爆発することさえあります。細心の注意を払ってください!年少のユーザーは、保護者と一緒に操作してください。電源にはUSBだけでなくバッテリーを使用してください。
Arduino IDEで5.12.1APP-Smart-Farmコードを開きます。
#include <Arduino.h>
#ifdef ESP32
#include <WiFi.h>
#elif defined(ESP8266)
#include <ESP8266WiFi.h>
#endif
#include <dht11.h>
#include <ESP32Servo.h>
#include <LiquidCrystal_I2C.h>
//表示用
#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のパスワードに変更してください。その後、コードをアップロードします。
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
ESP32 Dev Module ボードと COM ポートを選択し、コードをアップロードします。

APPをダウンロード
Androidの場合:
方法1:Google Playで「IOT Farm」を検索してダウンロードします。

iOSの場合:
APP StoreでIOT farmを検索し、タップしてダウンロードします。

APPのホームページ

APP機能説明
コードをアップロードした後、スマートフォンをESP32と同じWIFIに接続し、右上隅にIPアドレスを入力するだけで接続できます。**注:**5Gではなく、2.4 GHz WIFIが必要です。

農場の温度値をリアルタイムで表示します。

農場の空気湿度値をリアルタイムで表示します。

農場の土壌湿度値をリアルタイムで表示します。

農場の日照輝度値をリアルタイムで表示します。

農場の水位をリアルタイムで表示します。

農場の降雨アナログ値をリアルタイムで表示します。

LEDを制御します。

ウォーターポンプを介して灌漑を制御します。

ファンを制御して温度を調整します。

サーボを制御して給餌ボックスを開閉します。

ブザーを制御して音を鳴らします。
