### 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. ```c #include #ifdef ESP32 #include #elif defined(ESP8266) #include #endif #include #include #include //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. ```c 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](../media/5458448.png) **Download APP** **Voor Android:** Methode 1: Zoek "**IOT Farm**" in Google Play en download het. ![couapp2](../media/couapp2.png) **Voor iOS:** Zoek **IOT farm** in de APP Store en tik om te downloaden. ![image-20250417162032912](../media/image-20250417162032912.png) **De startpagina van de APP** ![cou124](../media/cou124.png) **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](../media/cou126.png) 2. Geeft de temperatuurwaarde van de boerderij in realtime weer. ![img](../media/cou127.png) 3. Geeft de luchtvochtigheidswaarde van de boerderij in realtime weer. ![img](../media/cou128.png) 4. Geeft de bodemvochtigheidswaarde van de boerderij in realtime weer. ![img](../media/cou129.png) 5. Geeft de zonlichtintensiteit van de boerderij in realtime weer. ![img](../media/cou1210.png) 6. Geeft het waterpeil van de boerderij in realtime weer. ![img](../media/cou1211.png) 7. Geeft de analoge regenvalwaarde van de boerderij in realtime weer. ![img](../media/cou1212.png) 8. Bedien LED. ![img](../media/cou1213.png) 9. Regel irrigatie via waterpomp. ![img](../media/cou1214.png) 10. Bedien de ventilator om de temperatuur aan te passen. ![img](../media/cou1215.png) 11. Bedien de servo om de voerbak te openen of te sluiten. ![img](../media/cou1216.png) 12. Bedien de zoemer om geluid te maken. ![img](../media/cou1217.png)