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 ポートを選択し、コードをアップロードします。

5458448

APPをダウンロード

Androidの場合:

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

couapp2

iOSの場合:

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

image-20250417162032912

APPのホームページ

cou124

APP機能説明

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

img

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

img

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

img

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

img

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

img

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

img

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

img

  1. LEDを制御します。

img

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

img

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

img

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

img

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

img