Inhoudsopgave:
- Stap 1: Sluit uw sensoren aan
- Stap 2: Coderen
- Stap 3: IBM Cloud
- Stap 4: Knooppunt-RED
- Stap 5: Node-RED Setup: Licht
- Stap 6: Node-RED Setup: Temperatuur
- Stap 7: Node-RED Setup: Vochtigheid
- Stap 8: Node-RED Setup: vocht
- Stap 9: Je bent klaar
Video: PINt@t10n: Smart Plant Monitoring System - Ajarnpa
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:17
Dit project is gemaakt als een test voor de ibm iot cloud. We gebruiken een esp-8266 om gegevens van en naar de ibm cloud te verzenden en te ontvangen. De communicatie tussen de esp en de ibm cloud verloopt via MQTT.
Om alle gegevens te verwerken en de gebruiker een gebruikersinterface te bieden, gebruiken we node-red. Het is erg beginnersvriendelijk.
Om te beginnen heb je nodig:
- Esp-8266
- dht 11/22 temp/vochtsensor
- lichtgevoelige diode (lichtmeting)
- zoemer
- bodemvochtsensor
- ibm cloud-account
Stap 1: Sluit uw sensoren aan
Zoals we eerder vermeldden, gaan we de esp8266 gebruiken om sensorgegevens te lezen en te verzenden. Voor deze tutorial gaan we ervan uit dat je weet hoe je je sensoren op je microcontroller moet aansluiten. Je moet ook al weten hoe je code uploadt naar een esp8266.
Ons esp-model heeft maar één analoge poort, dus we hebben ervoor gekozen om analoge informatie van onze lichtsensor te ontvangen, omdat we dan kunnen controleren hoeveel licht de plant krijgt.
Alle andere sensoren zijn digitaal aangesloten. Onze DHT11-sensor verzendt gegevens digitaal en we gebruiken de dht-bibliotheek om de sensorgegevens te interpreteren.
Hierboven vind je een schakelschema van de sensoren die we gebruikten. Houd er echter rekening mee dat de sensoren die we gebruikten vaak met een module worden geleverd, zodat u deze eenvoudig kunt aansluiten op uw microcontroller zonder alle extra weerstanden die we in het diagram hebben opgenomen.
Stap 2: Coderen
Dit is de Arduino-schets die we hebben gebruikt. U kunt leren hoe de code werkt als u de opmerkingen leest.
#include ArduinoJson.h#include DHT_U.h #include DHT.h #include ESP8266WiFi.h #include ESP8266WiFiMulti.h #include PubSubClient.h
#define STASSID "ucll-projectweek-IoT" #define STAPSK "Foo4aiHa" #define DHTPin 5 #define vochtPin 4 #define DHTType DHT11 DHT dht(DHTPin, DHTType); ESP8266WiFiMulti WiFiMulti; vlottertemperatuur = 0; vlottervochtigheid = 0; booleaanse vochtigheid = onwaar; int licht = 0; const char* ssid = STASSID; const char* wachtwoord = STAPSK; const char* mqtt_server = "cmfwqk.messaging.internetofthings.ibmcloud.com"; WiFiClient espClient; PubSubClient-client (espClient); lange laatsteMsg = 0; char bericht [50]; int-waarde = 0; #define MQTT_HOST "cmfwqk.messaging.internetofthings.ibmcloud.com" #define MQTT_PORT 1883 #define MQTT_DEVICEID "d:cmfwqk:ESP8266:ESP" #define MQTT_USER "use-token-auth" #define "UQTTll_TOKEN" iot-2/evt/status/fmt/json" #define MQTT_TOPIC_DISPLAY "iot-2/cmd/update/fmt/json" #include "pitches.h" // noten in de melodie: // nootduur: 4 = kwart noot, 8 = achtste noot, enz.: int shortTone = 80; int lange toon = 200; int standaardVertraging = 50; int delayBetweenBars = 50; void setup_wifi() {vertraging(10); // We beginnen door verbinding te maken met een WiFi-netwerk Serial.println(); Serial.print("Verbinding maken met "); Seriële.println(ssid); WiFi.begin(ssid, wachtwoord); while (WiFi.status() != WL_CONNECTED) {vertraging (500); Serieel.print("."); } Serieel.println(""); Serial.println("WiFi verbonden"); Serial.println("IP-adres: "); Serial.println(WiFi.localIP()); } void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Bericht aangekomen ["); Serial.print(onderwerp); Serieel.print("] "); for (int i = 0; i < lengte; i++) {Serial.print((char)payload); } Serieel.println(); StaticJsonDocument jsonBuffer; deserializeJson (jsonBuffer, lading); JsonObject root = jsonBuffer.as(); if(root["song"]=="darude"){ darude(); } if(root["song"]=="starwars"){ starwars(); } if(root["song"]=="jacques"){ Serial.println("jakakakakakkakaka"); jacques(); } } void reconnect() { // Loop totdat we opnieuw verbonden zijn while (!client.connected()) { Serial.print("Poging tot MQTT-verbinding…"); // Poging om verbinding te maken als (client.connect (MQTT_DEVICEID, MQTT_USER, MQTT_TOKEN)) { Serial.println ("verbonden"); cliënt.subscribe (MQTT_TOPIC_DISPLAY); } else { Serial.print("mislukt, rc="); Serial.print(client.state()); Serial.println ("probeer het over 5 seconden opnieuw"); // Wacht 5 seconden voordat u de vertraging opnieuw probeert (5000); } } } void setup() { Serial.begin(9600); pinMode (vochtPin, INPUT); dht.begin(); pinMode (0, UITGANG); setup_wifi(); client.setServer(mqtt_server, MQTT_PORT); client.setTerugbellen (terugbellen); vertraging(20); } void loop() { if (!client.connected()) { reconnect(); } cliënt.loop(); vocht = digitalRead (vochtPin); licht = analoog lezen (A0); temp = dht.readTemperature(); vochtigheid= dht.readHumidity(); Serial.println("Temperatuur =" + String(temp, 1) + "\nVochtigheid =" + String(vochtigheid, 1) + "\nVocht: "+String(vocht)+"\nLicht: "+String(licht)); String payload = "{"ts\":{"t\": "+String(temp, 1)+", \"h\": "+String(luchtvochtigheid, 1)+"}, \"ms \":{"m\": "+String(vocht)+"}, \"ls\":{"l\":"+String(licht)+"}}"; Serial.println(lading); if (client.publish(MQTT_TOPIC, (char*) payload.c_str())){ Serial.println("publish ok"); }else { Serial.println("publiceren mislukt"); } vertraging (2000); } void darude(){ tone(0, NOTE_B3, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, lange toon); vertraging (lange toon); geen toon(0); vertraging (vertragingTussenBars); toon (0, NOTE_B3, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, lange toon); vertraging (lange toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_E4, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_E4, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_E4, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_E4, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_E4, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_E4, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_E4, lange toon); vertraging (lange toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_D4, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_D4, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_D4, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_D4, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_D4, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_D4, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_D4, lange toon); vertraging (lange toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_A3, lange toon); vertraging (lange toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, lange toon); vertraging (lange toon); geen toon(0); vertraging (vertragingTussenBars); toon (0, NOTE_B3, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, lange toon); vertraging (lange toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_E4, lange toon); vertraging (lange toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, lange toon); vertraging (lange toon); geen toon(0); vertraging (vertragingTussenBars); toon (0, NOTE_B3, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, shortTone); vertraging (korte toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_B3, lange toon); vertraging (lange toon); geen toon(0); vertraging (standaardVertraging); toon (0, NOTE_E4, lange toon); vertraging (lange toon); geen toon(0); vertraging (standaardVertraging); } void starwars() { piep (NOTE_A4, 500); piep (NOTE_A4, 500); piep (NOTE_A4, 500); piep (NOTE_F4, 350); piep (NOTE_C5, 150); piep (NOTE_A4, 500); piep (NOTE_F4, 350); piep (NOTE_C5, 150); piep (NOTE_A4, 650); vertraging (500); piep (NOTE_E5, 500); piep (NOTE_E5, 500); piep (NOTE_E5, 500); piep (NOTE_F5, 350); piep (NOTE_C5, 150); piep (NOTE_GS4, 500); piep (NOTE_F4, 350); piep (NOTE_C5, 150); piep (NOTE_A4, 650); } void piep (int noot, int duur) {// Speel toon op zoemerPin toon (0, noot, duur); vertraging (duur); geen toon(0); vertraging (standaardVertraging); } void heartOfCourage(){ } void jacques(){ piep (NOTE_C4, 500); piep (OPMERKING_D4, 500); piep (NOTE_E4, 500); piep (NOTE_C4, 500); piep (NOTE_C4, 500); piep (OPMERKING_D4, 500); piep (NOTE_E4, 500); piep (NOTE_C4, 500); piep (NOTE_E4, 500); piep (NOTE_F4, 500); piep (NOTE_G4, 500); piep (NOTE_E4, 500); piep (NOTE_F4, 500); piep (NOTE_G4, 500); piep (NOTE_G4, 500); piep (NOTE_A4, 500); piep (NOTE_G4, 500); piep (NOTE_F4, 500); piep (NOTE_E4, 500); piep (NOTE_C4, 500); piep (NOTE_G4, 500); piep (NOTE_A4, 500); piep (NOTE_G4, 500); piep (NOTE_F4, 500); piep (NOTE_E4, 500); piep (NOTE_C4, 500); piep (NOTE_C4, 500); piep (NOTE_G4, 500); piep (NOTE_C4, 500); piep (NOTE_C4, 500); piep (NOTE_G4, 500); piep (NOTE_C4, 500); }
Stap 3: IBM Cloud
U moet een IBM-cloudinstance instellen. Informatie hierover vind je via deze link: github.
Stap 4: Knooppunt-RED
We gebruiken node-red voor het afhandelen van onze algemene bedrijfslogica en om deze gegevens te visualiseren in een intuïtieve gebruikersinterface.
Stap 5: Node-RED Setup: Licht
Importeer de volgende code in uw project.
[{"id":"deb0d57.1c46528", "type":"tab", "label":"Light", "disabled":false, "info":""}, {"id":"8a0fcaac. 4e54", "type":"ibmiot in", "z":"deb0d57.1c46528", "authentication":"boundService", "apiKey":"", "inputType":"evt", "logicalInterface":" ", "ruleId":"", "deviceId":"ESP", "applicationId":"", "deviceType":"ESP8266", "eventType":"+", "commandType":"", "format":"json", "name":"Gegevens ophalen van ESP", "service":"geregistreerd", "allDevices":false, "allApplications":"", "allDeviceTypes":false, "allLogicalInterfaces":"", "allEvents":true, "allCommands":"", "allFormats":"", "qos":0, "x":120, "y":62, "wires":
Stap 6: Node-RED Setup: Temperatuur
Importeer de volgende code in uw project.
[{"id":"fbad3799.f0e0e", "type":"tab", "label":"Temperatuur", "uitgeschakeld":false, "info":""}, {"id":"b8618eb9. 1c9288", "type":"ibmiot in", "z":"fbad3799.f0e0e", "authentication":"boundService", "apiKey":"", "inputType":"evt", "logicalInterface":" ", "ruleId":"", "deviceId":"ESP", "applicationId":"", "deviceType":"ESP8266", "eventType":"+", "commandType":"", "format":"json", "name":"Gegevens ophalen van ESP", "service":"geregistreerd", "allDevices":false, "allApplications":"", "allDeviceTypes":false, "allLogicalInterfaces":"", "allEvents":true, "allCommands":"", "allFormats":"", "qos":0, "x":145.5, "y":49, "wires":
Stap 7: Node-RED Setup: Vochtigheid
Importeer de volgende code in uw project.
[{"id":"144cd53b.c00473", "type":"tab", "label":"Vochtigheid", "uitgeschakeld":false, "info":""}, {"id":"d958f58b. 2678e", "type":"ibmiot in", "z":"144cd53b.c00473", "authentication":"boundService", "apiKey":"", "inputType":"evt", "logicalInterface":" ", "ruleId":"", "deviceId":"ESP", "applicationId":"", "deviceType":"ESP8266", "eventType":"+", "commandType":"", "format":"json", "name":"Gegevens ophalen van ESP", "service":"geregistreerd", "allDevices":false, "allApplications":"", "allDeviceTypes":false, "allLogicalInterfaces":"", "allEvents":true, "allCommands":"", "allFormats":"", "qos":0, "x":142, "y":87, "wires":
Stap 8: Node-RED Setup: vocht
Importeer de volgende code in uw project.
[{"id":"4ee73536.ec6fc4", "type":"tab", "label":"Vocht", "uitgeschakeld":false, "info":""}, {"id":"a6daac3e. 2d5268", "type":"ibmiot out", "z":"4ee73536.ec6fc4", "authentication":"boundService", "apiKey":"", "outputType":"cmd", "deviceId":" ESP", "deviceType":"ESP8266", "eventCommandType":"update", "format":"json", "data":"msg", "qos":0, "name":"Stuur opdracht naar ESP ", "service":"geregistreerd", "x":804.1944580078125, "y":383.0000305175781, "wires":}, {"id":"4134fdb7.18e9b4", "type":"ibmiot in", "z":"4ee73536.ec6fc4", "authentication":"boundService", "apiKey":"", "inputType":"evt", "logicalInterface":"", "ruleId":"", "deviceId":"ESP", "applicationId":"", "deviceType":"ESP8266", "eventType":"update", "commandType":"", "format":"json", "name":"Gegevens ophalen van ESP", "service":"geregistreerd", "allDevices":false, "allApplications":"", "allDeviceTypes":false, "allLogicalInterfaces":"", "allEvents":true, "allCommands":"", "allFormats":false, "qos":0, "x":115, "y":76, "draden":
Stap 9: Je bent klaar
Gefeliciteerd! je hebt nu een werkend plantobservatiesysteem.
Als u vragen heeft, aarzel dan niet om contact met ons op te nemen!