5.12 APP Besturing Slimme Boerderij

Let op: Laat geen water uit plastic bakken overlopen tijdens experimenten. Morsen van water op andere sensoren kan kortsluiting veroorzaken of modules buiten werking stellen. Als batterijen nat worden, kan er zelfs een explosie optreden. Wees extra voorzichtig! Voor jongere gebruikers, gelieve onder toezicht van uw ouders te werken. Gebruik batterijen voor de stroomvoorziening in plaats van alleen USB.

Open de 5.12.1APP-Smart-Farm code met Arduino IDE.

#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>

//Weer te geven
#define DHT11PIN 17         //Pin temperatuur- en vochtigheidssensor
#define RAINWATERPIN 35     //Pin stoom sensor
#define LIGHTPIN 34         //Pin fotoweerstand
#define WATERLEVELPIN 33    //Pin waterniveausensor
#define SOILHUMIDITYPIN 32  //Pin bodemvochtigheidssensor
//Te bedienen
#define LEDPIN 27     //LED pin
#define RELAYPIN 25   //Relais pin (om waterpomp te bedienen)
#define SERVOPIN 26   //Servo pin
#define FANPIN1 19    //Ventilator IN+ pin
#define FANPIN2 18    //Ventilator IN- pin
#define BUZZERPIN 16  //Buzzer pin

const char* ssid = "your_SSID";
const char* pwd = "your_PASSWORD";

//Initialiseer LCD1602, 0x27 is I2C adres
LiquidCrystal_I2C lcd(0x27, 16, 2);
WiFiServer server(80);  //Initialiseer wifi server
dht11 DHT11;            //Initialiseer temperatuur- en vochtigheidssensor
Servo myservo;          // maak servo object aan om een servo te bedienen
                        // 16 servo objecten kunnen worden aangemaakt op de ESP32

//Definieer variabele als gedetecteerde waarden
String request;
String dataBuffer;
int Temperature;   //Temperatuur
int Humidity;      //Vochtigheid
int SoilHumidity;  //Bodemvochtigheid
int Light;         //Helderheid
int WaterLevel;    //Waterniveau
int Rainwater;     //Regenval

void setup() {
  Serial.begin(9600);
  //Verbinden met wifi
  WiFi.begin(ssid, pwd);
  //Bepaal of verbonden
  Serial.println("Verbinden met WiFi...");
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  delay(1000);
  //Seriële monitor print wifi naam en IP-adres
  Serial.println("Verbonden met WiFi");
  Serial.print("WiFi NAAM:");
  Serial.println(ssid);
  Serial.print("IP:");
  Serial.println(WiFi.localIP());

  //Initialiseer LCD
  lcd.init();
  // Schakel de (optionele) achtergrondverlichting uit/aan
  lcd.backlight();
  //lcd.noBacklight();
  lcd.clear();
  //Stel de positie van de cursor in
  lcd.setCursor(0, 0);
  //LCD prints
  lcd.print("IP:");
  //Stel de positie van de cursor in
  lcd.setCursor(0, 1);
  //LCD prints
  lcd.print(WiFi.localIP());

  //stel pinmodi in
  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);

  // koppelt de servo op pin 26 aan het servo object
  myservo.attach(SERVOPIN);
  myservo.write(160);

  //Start server
  server.begin();

  // Configureer LEDC kanaal
  ledcAttachChannel(BUZZERPIN, 1000, 8, 4);
}

c
void loop() {
  //Controleren of een client is verbonden met de webserver
  //Wanneer de client is verbonden met de server, retourneert "server.available()" een WiFiClient-object voor communicatie aan clientzijde.
  WiFiClient client = server.available();
  if (client) {
    Serial.println("Nieuwe client verbonden");
    while (client.connected()) {
      //Bepalen of de server gegevens verzendt
      if (client.available()) {
        request = client.readStringUntil('s');
        Serial.print("Ontvangen bericht: ");
        Serial.println(request);
      }
      //Alle sensorgegevens verkrijgen
      getSensorsData();
      //Alle gegevens in "dataBuffer" plaatsen
      dataBuffer = "";
      dataBuffer += String(Temperature, HEX);
      dataBuffer += String(Humidity, HEX);
      dataBuffer += dataHandle(SoilHumidity);
      dataBuffer += dataHandle(Light);
      dataBuffer += dataHandle(WaterLevel);
      dataBuffer += dataHandle(Rainwater);
      //Gegevens naar server verzenden, doorsturen naar APP
      client.print(dataBuffer);
      delay(500);

      //LED
      if (request == "a") {
        digitalWrite(LEDPIN, HIGH);
      } else if (request == "A") {
        digitalWrite(LEDPIN, LOW);
      }
      //Irrigatie
      else if (request == "b") {
        digitalWrite(RELAYPIN, HIGH);
        delay(400);  //Irrigatievertraging
        digitalWrite(RELAYPIN, LOW);
        delay(650);
      }
      //Ventilator
      else if (request == "c") {
        delay(800);
        digitalWrite(FANPIN1, HIGH);
        digitalWrite(FANPIN2, LOW);
        delay(200);
      } else if (request == "C") {
        digitalWrite(FANPIN1, LOW);
        digitalWrite(FANPIN2, LOW);
      }
      //Voerdoos
      else if (request == "d") {
        //Servo draait naar 80°, open voerdoos
        myservo.write(80);
        delay(500);
      } else if (request == "D") {
        //Servo draait naar 160°, sluit voerdoos
        myservo.write(160);
      }
      //Buzzer
      else if (request == "e") {
        ledcWriteTone(BUZZERPIN, 262);
        delay(800);
        ledcWriteTone(BUZZERPIN, 0);
        delay(100);
      }
      request = "";
    }
    Serial.println("Client ontkoppeld");
  }
}

void getSensorsData() {
  //Gegevens verkrijgen
  int chk = DHT11.read(DHT11PIN);
  //Stoom sensor
  Rainwater = analogRead(RAINWATERPIN);
  //Fotoweerstand
  Light = analogRead(LIGHTPIN);
  //Bodemvochtigheidssensor
  SoilHumidity = analogRead(SOILHUMIDITYPIN) * 1.8;
  //Waterniveausensor
  WaterLevel = analogRead(WATERLEVELPIN) * 1.8;
  //Temperatuur
  Temperature = DHT11.temperature;
  //Vochtigheid
  Humidity = DHT11.humidity;
}


//Gegevens omzetten naar percentage
String dataHandle(int data) {
  // Analoge waarden omzetten naar percentage
  int percentage = (data / 4095.0) * 100;
  // Als het omgerekende percentage groter is dan 100, uitvoer 100.
  percentage = percentage > 100 ? 100 : percentage;
  // Zes karakters slaan hexadecimale strings op, één karakter is als terminator
  char hexString[3];
  // Hexadecimale waarden omzetten naar 6-cijferige hexadecimale strings, voorloopnullen toevoegen: 0 is 00, 1 is 01...
  sprintf(hexString, "%02X", percentage);

  return hexString;
}

Wijzig your_SSID in de code naar de naam van je wifi, en your_PASSWORD naar het wifi-wachtwoord. Upload vervolgens de code.

const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";

Kies het ESP32 Dev Module bord en de COM poort, en upload de code.

5458448

Download APP

Voor Android:

Methode 1: Zoek “IOT Farm” in Google Play en download het.

couapp2

Voor iOS:

Zoek IOT farm in de APP Store en tik om te downloaden.

image-20250417162032912

De startpagina van de APP

cou124

APP Functiebeschrijving

  1. Nadat u de code heeft geüpload, verbindt u de telefoon met dezelfde WIFI als de ESP32. U hoeft alleen het IP-adres in de rechterbovenhoek in te voeren om verbinding te maken. Opmerking: Vereist 2.4 GHz WIFI, geen 5G.

img

  1. Geeft de temperatuurwaarde van de boerderij in realtime weer.

img

  1. Geeft de luchtvochtigheidswaarde van de boerderij in realtime weer.

img

  1. Geeft de bodemvochtigheidswaarde van de boerderij in realtime weer.

img

  1. Geeft de zonlichtintensiteit van de boerderij in realtime weer.

img

  1. Geeft het waterpeil van de boerderij in realtime weer.

img

  1. Geeft de analoge regenvalwaarde van de boerderij in realtime weer.

img

  1. Bedien LED.

img

  1. Regel irrigatie via waterpomp.

img

  1. Bedien de ventilator om de temperatuur aan te passen.

img

  1. Bedien de servo om de voerbak te openen of te sluiten.

img

  1. Bedien de zoemer om geluid te maken.

img