Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Domotisches Gewächshaus

Komponenten und Verbrauchsmaterialien

Arduino MKR1000
× 1
Arduino UNO
× 1
DHT22-Temperatursensor
× 1
Arduino Wifi Shield 101
× 1
Android-Gerät
× 1
DC Motor Control Shield mit BTN8982 für Arduino Infineon
× 1

Apps und Onlinedienste

Arduino-IDE
Eclipse

Über dieses Projekt

Übersicht

Die Umweltbedingungen im Gewächshaus ändern sich ständig, aus diesem Grund brauchen wir ein effizientes Monitoring.

Die Verwendung eines automatischen Systems hat viele Vorteile, zum Beispiel weniger Arbeit oder vor allem die Benutzer können ihre eigenen Investitionen von zu Hause aus per PC oder Smartphone überprüfen.

Ein weiterer wichtiger Vorteil ist die Möglichkeit, Daten in einer Datenbank zu speichern. Dies kann den Unterschied zwischen Geldgewinnen oder -verlusten ausmachen.

Darüber hinaus können wir dank einer Echtzeit-Systemsteuerung sofort eingreifen und Probleme beim Anbau vermeiden.

Das automatische Überwachungssystem in Gewächshäusern besteht aus Sensoren, die Umgebungsdaten lesen, und Aktoren, die als „Slaves“ bezeichnet werden. Sie kommunizieren über Wireless mit einem zentralen Gerät, dem sogenannten „Master“. Letzteres sendet eventuelle Änderungen an Slaves (zB Änderung von Schwellenwerten) und Daten über WLAN auch an den Webserver.

1. Wie funktioniert es?

Wir können dieses Projekt in drei verschiedene Teile aufteilen:

  • Meister
  • Sklave
  • Webserver

Wir haben einen Arduino/Genuino MKR1000 für den Master verwendet, einen Arduino/Genuino Uno für den Slave.

Der Master kommuniziert mit einem Webserver über WiFi (WINC1500 integriert), der Slave erfasst Temperatur und Luftfeuchtigkeit mit dem DHT22 Sensor und sendet diese Daten dann über WiFi an den Master (WiFi Shield WINC1500).

2. Meister

Der Master befindet sich im „Access Point-Modus“ und wartet darauf, dass die Slave-Verbindung die Temperatur und Luftfeuchtigkeit empfängt, die ermittelt und an den Webserver gesendet werden.

Der Master prüft, ob Daten verfügbar sind, in diesem Fall erstellt er ein UDP-Paket, das aus neuen Schwellenwerten und CRC gebildet wird. Tatsächlich berechnet es den CRC, der vom Slave verwendet wird, um die empfangene Einstellung zu validieren.

Nachdem der Master den „Access Point-Modus“ verlassen hat, verbindet er sich mit dem WiFi, um Daten an den Webserver zu senden, wo sie in einem Diagramm dargestellt werden.

3. Sklave

Der Slave erfasst Temperatur und Luftfeuchtigkeit über den DHT22-Sensor und sendet nach 5 Minuten Daten an den Master. Es erstellt auch ein UDP-Paket, verbindet sich mit dem Master und sendet dann die Daten.

Später wartet es, ob Daten verfügbar sind, beispielsweise neue Schwellenwerte. In diesem Fall erhält der Slave neue Einstellungen und berechnet den CRC anhand der Dallas-Maxim-Formeln.

Anschließend wird der berechnete CRC mit dem vom Master empfangenen CRC verglichen. Sind die beiden CRC gleich, speichert der Slave die neue Einstellung im EEPROM.

4. Webserver

Der Webserver speichert alle Daten, die später in einem Verlauf gespeichert werden können.

Dazu haben wir ein PHP-Skript verwendet, das eine Verbindung zur Datenbank herstellt und Daten auf zwei verschiedene Arten anzeigt

  • in einem Diagramm mit einem anderen PHP-Skript
  • in einer Android-App im JSON-Format mit einem anderen PHP-Skript

5. APP

Die App ermöglicht es uns, die Daten in einer Datenbank abzurufen.

Im ersten Bildschirm können wir den anzuzeigenden Zeitbereich auswählen und mit der Schaltfläche "GRAPHIC" kontaktiert er den Webservice und ruft die Daten ab.

Die App zeigt Daten in einer Grafik an.


Code

  • Grafik erstellen
  • Website-Verbindung skripten
  • Tabelle erstellen
  • Gewächshaus Domotic Master
  • Gewächshaus Domotic Sklave
  • getdati
Grafik erstellenPHP
Damit haben wir eine Grafik erstellt
SetScale("textlin");$theme_class=new UniversalTheme;$graph->SetTheme($theme_class);$graph->img->SetAntiAliasing( false);$graph->title->Set('Title');$graph->SetBox(false);$graph->img->SetAntiAliasing();$graph->yaxis->HideZeroLabel();$graph ->yaxis->HideLine(false);$graph->yaxis->HideTicks(false,false);$graph->xgrid->Show();$graph->xgrid->SetLineStyle("solid");$ graph->xaxis->SetTickLabels($time_axis);$graph->xgrid->SetColor('#E3E3E3');$graph->xaxis->SetLabelAngle(90);$graph->legend->SetPos(0.5, 0.08,'center','top');// Erstellen Sie die erste Zeile$p1 =new LinePlot($parameter1);$graph->Add($p1);$p1->SetColor("#6495ED");$ p1->SetLegend('your_parameter1');$graph->yscale->SetGrace(0);// Zweite Zeile erstellen$p2 =new LinePlot($parameter2);$graph->Add($p2);$p2 ->SetColor("#B22222");$p2->SetLegend('your_parameter2');$graph->yscale->SetGrace(0);$graph->legend->SetFrameWeight(1);// Ausgabezeile$ graph->Stroke();?>
Skript-Website-VerbindungPHP
Wir haben dies verwendet, um Daten in DB zu speichern
";echo "parameter1 ". $_GET['parameter1']. "
";echo "parameter2 ". $_GET['parameter2']. "
";// Verbindung erstellen$conn =mysqli_connect($servername, $username, $password, $dbname);// Verbindung prüfenif (!$conn) { die("Verbindung fehlgeschlagen:" . mysqli_connect_error() );}$sql ="INSERT INTO Gewächshaus (name, parameter1, parameter2)VALUES ('".$name."', '".$parameter1."', '".$parameter2."')";if ( mysqli_query($conn, $sql)) { echo "Neuer Datensatz erfolgreich erstellt";} else { echo "Fehler:" . $sql. "
" . mysqli_error($conn);}mysqli_close($conn);?>
Tabelle erstellenSQL
Wir haben dieses Skript verwendet, um die Tabelle zu erstellen
CREATE TABLE IF NOT EXISTS `greenhouse` ( `id` int(11) NOT NULL, `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `temp` float NOT NULL, `umid` float NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Gewächshaus Domotic MasterC/C++
Dies ist der Code des Masters
/*Automation-Gewächshausprojekt*//*Autoren:Antonio La Mura, Umberto Festa*//*Datum:03.03.2016*//*Unsere Idee ist es Benutzern zu ermöglichen, die Früchte kaufen und Gemüse, das in Gewächshäusern angebaut wird, um alle Plantagenschritte, die die Produkte durchlaufen haben, wie die Verwendung von chemischen Düngemitteln und ähnlichen Produkten, genau zu kennen. Auf den verkauften Produkten wird ein QR-Code angebracht, der von einer bestimmten Smartphone-App gelesen wird. Es liefert Informationen über die Umgebungsbedingungen, in denen Produkte angebaut wurden, und die verwendeten chemischen Produkte. Das automatische Überwachungssystem in Gewächshäusern besteht aus Sensoren, die Umgebungsdaten und Aktoren, sogenannten Slaves, lesen. Sie kommunizieren über Wireless mit einem zentralen Gerät, dem sogenannten Master. Letzteres sendet eventuelle Änderungen an Slaves (zB Änderung von Schwellwerten) und Daten über WLAN auch an den Webserver. Wenn das Produkt verkaufsfertig ist, wird die QR-Code-Generierung beim Webservice angefordert und auf die Verpackung gelegt. Der letzte Teil des Systems ist die mobile App, die für das Scannen der QR-Codes verantwortlich ist und dem Benutzer die entsprechenden Informationen anzeigt.*//*Master*//*DEVO AGGIUNGERE SOLO LA PARTE CHE MI SERVE PER RICEVERE LE NUOVE SOGLIE CHE VENGONO INVIATE DALL'APP*//*Verwendete Bibliotheken*/#include #include #include #include #include /* Variablen für Verbindung*/char ssid[] ="SSID"; /*Ihre Netzwerk-SSID (Name)*/char pass[] ="pass"; /*Ihr Netzwerkkennwort (für WPA oder als Schlüssel für WEP verwenden)*/int keyIndex =0; /* Ihr Netzwerkschlüssel Indexnummer (wird nur für WEP benötigt)*/char ssid_ap[] ="Arduino"; /*Erstellter AP-Name*/char pass_ap[] =""; /*(Noch nicht unterstützt)*/int status =WL_IDLE_STATUS;unsigned int localPort =2390; /*Lokaler Port zum Abhören*/char server[] ="www.cormaz.altervista.org"; /*Namensadresse für Google (unter Verwendung von DNS)*/WiFiServer server_ap(80);WiFiClient client_ap;WiFiUDP Udp;RTCZero rtc;WiFiClient client;char packetBuffer[255]; /*Puffer zum Halten des eingehenden Pakets*/char ReplyBuffer[255]; /*Ein String zum Zurücksenden*//*Variablen für neue Schwellenwerte*/float humax =0;float humin =0;float tumax =0;float tumin =0;/*Funktioniert wie Access Point (Flag =false), verbindet zum WebServer (flag =true)*/boolean flag =false;boolean threeshold_available =false;void setup() {/*Seriell initialisieren und warten, bis der Port geöffnet wird:*/ Serial.begin(9600); while (!Seriell) {; /*Warten Sie, bis die serielle Schnittstelle eine Verbindung hergestellt hat. Nur für nativen USB-Port benötigt*/} Serial.println();}void loop() { int packetSize; doppelte Temperatur; Doppelbrummen; int-ID; Byte-CRC; String strURL; //Überprüfe das Vorhandensein des Schildes:/**************************************** ***********************************************/ wenn ( WiFi.status () ==WL_NO_SHIELD) { Serial.println ( "WiFi-Schild nicht vorhanden"); /*Nicht fortfahren:*/ while (true); } /**************************************************** *************************************/ //Versuch, eine Verbindung zum WLAN-Netzwerk herzustellen:/* ************************************************* ********************************** / while (status !=WL_CONNECTED) {Serial.print("Creating Netzwerkname:"); Serial.println (ssid_ap); /*Mit WPA/WPA2-Netzwerk verbinden. Ändern Sie diese Zeile, wenn Sie ein offenes oder WEP-Netzwerk verwenden:*/ status =WiFi.beginAP(ssid_ap); /*Warten Sie 10 Sekunden auf die Verbindung:*/ delay(10000); server_ap.begin(); } Serial.println ("Mit WLAN verbunden"); /************************************************ ************************************/ // UDP-Kommunikation starten /***** ************************************************* *****************************/ Udp.begin (localPort); printWifiStatus(); client_ap =server_ap.available(); if (client_ap) { /*Wenn Sie einen Client bekommen*/ /*Ich warte auf Informationen*/ Serial.println("neuer Client"); /*Eine Nachricht über den seriellen Port ausgeben*/ /*Wenn Daten verfügbar sind, ein Paket lesen*/ packetSize =Udp.parsePacket(); if (packetSize) {Serial.print ( "Empfangenes Paket der Größe"); Serial.println (Paketgröße); Serial.print ("Von"); IPAddress remoteIp =Udp.remoteIP(); Serial.print (remoteIp); Serial.print (, Port "); Serial.println (Udp.remotePort ()); /*Paket in packetBuffer einlesen*/ int len ​​=Udp.read(packetBuffer, 255); if (len> 0) packetBuffer[len] =0; Serial.println("Inhalt:"); Serial.println (Paketpuffer); char* Befehl =strtok((char *)packetBuffer, ";"); int-Zählung =0; while (Befehl !=0) { /*Informationen aufteilen*/ switch (count) { case 0:id =atoi(Befehl); brechen; Fall 1:temp =atof(Befehl) / 10; brechen; Fall 2:Brummen =atof(Befehl) / 10; brechen; } Befehl =strtok(0, ";"); zählen++; } Serial.print ( "Paket erhalten von "); Serial.print (id); Serial.print ( " T:"); Serial.print (temp, 1); Serial.print ( " H:"); Serial.println (hum, 1); /************************************************ ************************************/ Verzögerung (20); /*Berechnen Sie den CRC-8, erstellen Sie also ein Byte-Array*/ /************************************ ********************************************/Byte bhmax =( Byte)humax; Byte bhmin =(Byte)humin; Byte btmax =(Byte)tumax; Byte btmin =(Byte)tumin; Byte crc32_str[4] ={bhmax, bhmin, btmax, btmin}; crc =CRC8(crc32_str); Serial.println("CRC:"); Serial.println(crc); /************************************************ ******************************/ if (threeshold_available ==true) { snprintf(ReplyBuffer, sizeof(ReplyBuffer), " %d;%d;%d;%d;%d;%d", id, (int)humax, (int)humin, (int)tumax, (int)tumin, (int)crc); /*Sende eine Antwort an die IP-Adresse und den Port, der uns das Paket gesendet hat, das wir erhalten haben*/ Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); Udp.write (ReplyBuffer); Udp.endPacket(); } } /*Drucken Sie den seriellen Monitor aus*/ /*Schließen Sie die Verbindung:*/ client_ap.stop(); Serial.println ("Client getrennt"); Flag =wahr; }/*Fein AP*/ /******************************************** *************************************/ /*Mit dem Server verbinden und Daten an die Datenbank senden */ /************************************************ ********************************/ if (flag ==true) {/*Versuch, eine Verbindung zum Wifi-Netzwerk herzustellen :*/ while (status !=WL_CONNECTED) {Serial.print("Versuch, eine Verbindung zur SSID herzustellen:"); Serial.println (ssid); /*Mit WPA/WPA2-Netzwerk verbinden. Ändern Sie diese Zeile, wenn Sie ein offenes oder WEP-Netzwerk verwenden:*/ status =WiFi.begin(ssid, pass); /*Warten Sie 10 Sekunden auf die Verbindung:*/ delay(10000); } Serial.println ("Mit WLAN verbunden"); printWifiStatus(); strURL ="GET /IhreAdresse.php?id="; strURL +=ID; strURL +="¶meter1="; strURL +=temp; strURL +="¶meter2="; strURL +=Brummen; strURL +="HTTP/1.1"; Serial.println("\nVerbindung zum Server wird gestartet..."); // Wenn Sie eine Verbindung erhalten, melden Sie sich per Serial zurück:if (client.connect (server, 80)) { Serial.println ( "mit Server verbunden"); // Stellen Sie eine HTTP-Anfrage:client.println(strURL); client.println("Host:www.cormaz.altervista.org"); client.println("Verbindung:schließen"); client.println(); client.stop(); Serial.println ("Ok!"); } /*Wenn die Verbindung zum Server getrennt ist, stoppen Sie den Client:*/ if (!client.connected()) { Serial.println(); Serial.println ( "Verbindung vom Server trennen."); client.stop(); /*Für immer nichts tun:*/ while (true); } Flag =falsch; } /**************************************************** ******************************/}/*Algorithmus CRC-8 berechnen - basierend auf Dallas/Maxim-Formeln*/ byte CRC8 (const byte * data) { byte crc =0x00; while (*data) { Byte-Extrakt =*data++; for (byte tempI =8; tempI; tempI--) { byte sum =(crc ^ extrahieren) &0x01; crc>>=1; wenn (Summe) { crc ^ =0x8C; } extrahieren>>=1; } } return crc;}void printWifiStatus() {/*Drucken Sie die SSID des Netzwerks, mit dem Sie verbunden sind:*/ Serial.print("SSID:"); Serial.println (WiFi.SSID()); /*Drucken Sie die IP-Adresse Ihres WiFi-Shields:*/ IPAddress ip =WiFi.localIP(); Serial.print ("IP-Adresse:"); Serial.println (ip); /*Druckt die empfangene Signalstärke:*/ long rssi =WiFi.RSSI(); Serial.print ("Signalstärke (RSSI):"); Serial.print (rssi); Serial.println(" dBm");}
Gewächshaus Domotic SlaveC/C++
Dies ist der Code des Slave
/*Automation-Gewächshausprojekt*//*Autoren:Antonio La Mura, Umberto Festa*//*Datum:21.03.2016*//*Unsere Idee ist es Benutzern zu ermöglichen, die Früchte kaufen und Gemüse, das in Gewächshäusern angebaut wird, um alle Plantagenschritte, die die Produkte durchlaufen haben, wie die Verwendung von chemischen Düngemitteln und ähnlichen Produkten, genau zu kennen. Auf den verkauften Produkten wird ein QR-Code angebracht, der von einer bestimmten Smartphone-App gelesen wird. Es liefert Informationen über die Umgebungsbedingungen, in denen Produkte angebaut wurden, und die verwendeten chemischen Produkte. Das automatische Überwachungssystem in Gewächshäusern besteht aus Sensoren, die Umgebungsdaten und Aktoren, sogenannten Slaves, lesen. Sie kommunizieren über Wireless mit einem zentralen Gerät, dem sogenannten Master. Letzteres sendet eventuelle Änderungen an Slaves (zB Änderung von Schwellwerten) und Daten über WLAN auch an den Webserver. Wenn das Produkt verkaufsfertig ist, wird die QR-Code-Generierung beim Webservice angefordert und auf die Verpackung gelegt. Der letzte Teil des Systems ist die mobile App, die für das Scannen der QR-Codes verantwortlich ist und dem Benutzer die entsprechenden Informationen anzeigt.*//*Slave*//*Verwendete Bibliotheken*/#include #include #include #include #include //Define all PIN#define BEFEUCHTER A4#define HEATER A5#define DHT22_PIN 4//Define motor#define IS_1 0 #define IS_2 1#define IN_1 3#define IN_2 11#define INH_1 12#define INH_2 13#define TCONST 100 //Verzögerungszeit zwischen den Schritten //Variable zum Zurücksetzen millis()extern unsigned long timer0_millis;int status =WL_IDLE_STATUS;char ssid [] ="Arduino"; // Ihre Netzwerk-SSID (Name)char pass[] =""; // Ihr Netzwerk-Passwort (für WPA oder als Schlüssel für WEP verwenden)int keyIndex =0; // Ihr Netzwerkschlüssel Indexnummer (wird nur für WEP benötigt)unsigned int localPort =2390; // lokaler Port zum Abhören von onchar packetBuffer[255]; //Puffer zum Halten des eingehenden PaketsWiFiUDP Udp; //Define DHT22DHT22 myDHT22(DHT22_PIN); //Variable für sendfloat hmin =0;float hmax =0;float tmin =0;float tmax =0;int duty_motor =0;float Feuchte; Float-Temperatur; // Variable zum Senden alle 10 Sekundenunsigned long interval =600000;void setup () { Serial.begin (9600); while (!Seriell) {; // Warten Sie, bis der serielle Port eine Verbindung herstellt. Nur für nativen USB-Port erforderlich} // Initialisieren PIN (INPUT - OUTPUT) pinMode (HEATER, OUTPUT); digitalWrite (HEIZUNG, NIEDRIG); pinMode (BEFEUCHTER, AUSGANG); digitalWrite (BEFEUCHTER, NIEDRIG); // Setzen Sie die PIN für den Lüfter pinMode (IN_1, OUTPUT); pinMode (IN_2, OUTPUT); pinMode (INH_1, AUSGANG); pinMode (INH_2, AUSGANG); //Reset_ports () zurücksetzen; digitalWrite(INH_1, 1); digitalWrite(INH_2, 1); Serial.println ( "Anfang ... "); delay(2000);}void loop() { // Wenn Daten verfügbar sind, ein Paket lesen int packetSize =Udp.parsePacket(); lange Zeit ohne Vorzeichen =millis(); unsigned long currentMillis =millis(); DHT22_ERROR_t errorCode; int i =0; Zeichenname[] ="clie1"; Feuchtigkeit =myDHT22.getHumidity() * 10; Temperatur =myDHT22.getTemperatureC() * 10; char toSend[32]; errorCode =myDHT22.readData(); Byte-CRC; int crc_ric; // Überprüfen Sie die Sensorfeuchtigkeit und -temperatur DHT22-Fehler /**************************************** **************************************/ switch (errorCode) { case DHT_ERROR_NONE:char buf[128]; sprintf(buf, "Nur ganze Zahlen lesen:Temperatur %hi.%01hi C, Feuchtigkeit %i.%01i %% RH", myDHT22.getTemperatureCInt() / 10, abs(myDHT22.getTemperatureCInt() % 10), myDHT22. getHumidityInt() / 10, myDHT22.getHumidityInt() % 10); brechen; Fall DHT_ERROR_CHECKSUM:Pause; Fall DHT_BUS_HUNG:Pause; Fall DHT_ERROR_NOT_PRESENT:Pause; Fall DHT_ERROR_ACK_TOO_LONG:Pause; Fall DHT_ERROR_SYNC_TIMEOUT:Pause; Fall DHT_ERROR_DATA_TIMEOUT:Pause; Fall DHT_ERROR_TOOQUICK:Pause; } /**************************************************** ********************************/ //Drucke die Werte, wenn sie sich ändern /******* ************************************************* **********************/ if (Luftfeuchtigkeit !=myDHT22.getHumidity() * 10 || Temperatur !=myDHT22.getTemperatureC() * 10) { Serial.print("T:"); Serial.print (myDHT22.getTemperatureC(), 1); Serial.print ("C"); Serial.print ( " H:"); Serial.print (myDHT22.getHumidity(), 1); Serial.println("%"); } /**************************************************** ********************************/ // Parameter alle 10 Minuten senden /******** ************************************************* *********************/ if (millis ()> Intervall) {//Verbindung zum AP /************ ************************************************* ******************/ // Auf Vorhandensein des Schilds prüfen:if (WiFi.status () ==WL_NO_SHIELD) { Serial.println ("WiFi-Schild nicht vorhanden") "); // nicht fortfahren:while (true); } // Versuch, eine Verbindung zum Wifi-Netzwerk herzustellen:while ( status !=WL_CONNECTED) { Serial.print ( "Versuch, eine Verbindung zu SSID herzustellen:"); Serial.println (ssid); // Verbindung zum WPA/WPA2-Netzwerk herstellen. Ändern Sie diese Zeile, wenn Sie ein offenes oder WEP-Netzwerk verwenden:status =WiFi.begin(ssid); // 10 Sekunden auf Verbindung warten:delay(10000); } Serial.println ("Mit WLAN verbunden"); /************************************************ ******************************/ Serial.println("\nVerbindung zum Server wird gestartet..."); // Wenn Sie eine Verbindung erhalten, melden Sie sich über die serielle Schnittstelle:Udp.begin(localPort); snprintf(toSend, sizeof(toSend), "%s;%d;%d", Name, (int)Luftfeuchtigkeit, (int)Temperatur); // Senden Sie eine Antwort an die IP-Adresse und den Port, der uns das Paket gesendet hat, das wir erhalten haben Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); Udp.write(toSend); Udp.endPacket(); Serial.println ("Fertig gesendet"); resetMillis(); while (millis() <10000) {packetSize =Udp.parsePacket(); if (packetSize) {/*Lesen Sie das Paket in den packetBuffer*/ int len ​​=Udp.read(packetBuffer, 255); if (len> 0) packetBuffer[len] =0; Serial.println("Inhalt:"); Serial.println (Paketpuffer); char* Befehl =strtok((char *)packetBuffer, ";"); int-Zählung =0; while (Befehl !=0) { /*Informationen teilen*/ switch (count) { case 0:snprintf(name, sizeof(name), "%s", Befehl); brechen; Fall 1:hmax =atof(Befehl) / 10; //atof(char*) mi converte un tipo char* in double break; Fall 2:hmin =atof(Befehl) / 10; brechen; Fall 3:tmax =atof(Befehl) / 10; brechen; Fall 4:tmin =atof(Befehl) / 10; brechen; Fall 5:crc_ric =atoi(Befehl); brechen; } Befehl =strtok(0, ";"); zählen++; } Serial.print ( "Antwort:"); Serial.print (Name); Serial.print(";"); Serial.print (hmax, 1); Serial.print(";"); Serial.print (hmin, 1); Serial.print(";"); Serial.print (tmax, 1); Serial.print(";"); Serial.println (tmin, 1); Serial.print ( "CRC erhalten:"); Serial.println (crc_ric); // CRC-8 berechnen und ich erhalte das Array des Bytes /************************************ ********************************************/Byte bhmax =(Byte )hmax; Byte bhmin =(Byte)hmin; Byte btmax =(Byte)tmax; Byte btmin =(Byte)tmin; Byte crc32_str[4] ={bhmax, bhmin, btmax, btmin}; crc =CRC8(crc32_str); Serial.println("CRC:"); Serial.println(crc); /************************************************ ******************************/ if (crc_ric ==(int)crc) { // Im EEPROM speichern EEPROM_writeDouble (0, tmax); EEPROM_writeDouble(4, tmin); EEPROM_writeInt(8, hmax); EEPROM_writeInt(10, hmin); } } } Verzögerung(10); } /**************************************************** ******************************/WiFi.disconnect(); //Verwalten Sie den BEFEUCHTER, HEIZUNG und Lüfter entsprechend dem Wert des Sensors /************************************ ************************************************* */ // HEATER if (myDHT22.getTemperatureC()>=tmax) { digitalWrite (HEATER, HIGH); } if (myDHT22.getTemperatureC() <=tmin + 1) { digitalWrite (HEATER, LOW); } // BEFEUCHTER if ((int)myDHT22.getHumidity()>=hmax) { DigitalWrite (BEFEUCHTER, HOCH); } if ((int)myDHT22.getHumidity() <=hmin + 1) { digitalWrite (HUMIDIFIER, LOW); } //Lüfter, bürstenloser Motor if (myDHT22.getTemperatureC()>=tmax + 4) { //Drehung des Motors entsprechend der Temperatur, Einschaltdauer -> 0 pro t =tmax+4 und Einschaltdauer -> 100 pro t> tmax+10 //Rotazione del motore al variare della temperatura, duty -> 0 pro t =tmax+4 e duty -> 100 pro t> tmax+10 duty_motor =map(i , tmax + 4, tmax + 10, 0, 100); if (tmax> tmax + 10) { duty_motor =100; } analogWrite (IN_2, Duty_motor); Verzögerung (TCONST); } if (myDHT22.getTemperatureC() <=(tmax + tmin) / 2) { reset_ports(); //Drehung des Motors gemäß Temperatur, Duty -> 0 pro t =tmax+4 und Duty -> 255 pro t> tmax+10 Duty_motor =0; analogWrite (IN_2, Duty_motor); Verzögerung (TCONST); } /**************************************************** *************************************/ delay(1000);}//Doppelt speichern EEPROMvoid EEPROM_writeDouble(int ee, double value) { byte* p =(byte*)(void*)&value; for (int i =0; i >=1; wenn (Summe) { crc ^ =0x8C; } extrahieren>>=1; } } return crc;} // Es wird verwendet, um millis () zurückzusetzen. timer0_millis =0; sei();}
getdatiPHP
Wir haben dies verwendet, um unsere App mit der Datenbank zu verbinden
";//wählen Sie eine Datenbank aus, um work with$selected =mysql_select_db("serra",$dbhandle) or die("Beispiele konnten nicht ausgewählt werden"); $datada =$_GET["datada"];$dataa =$_GET["dataa"];//SQL-Abfrage ausführen und Datensätze zurückgeben$result =mysql_query("SELECT hum,temp,date FROM record WHERE date>=' ".$datada."' and date <='".$dataa."'");$records=array();//die Daten aus der Datenbank holen while ($row =mysql_fetch_array($result)) { $ tmp =array("hum"=>$row{'hum'}, "temp"=>$row{'temp'}, "date"=>$row{'date'}); array_push($records,$tmp); //echo "HUM:".$row{'hum'}." TEMP:".$row{'temp'}."Datum:". //Ergebnisse anzeigen $row{'date'}."
";}echo json_encode($records);//Verbindung schließenmysql_close($dbhandle);?>
App GrenHouse
Auf der ersten Seite müssen Sie das Datum mit zwei DatePickern einstellen. Wenn Sie die Schaltfläche "GRAPHIC" drücken, wird ein HTTP-GET-Aufruf an das PHP-Skript "getdati" gesendet, das die von Ihnen ausgewählten Parameter und das Datum sendet. Dann empfängt es das JSON und decodiert es, nachdem es die Grafik mit der Bibliothek GraphView erstellt hathttps://github.com/cormaz/app_greenhouse.git

Schaltpläne

Anschluss:Arduino UNO - DHT22 - Relais

Herstellungsprozess

  1. Bitmap-Animation auf dem ILI9341 TFT-Touchscreen-Displayschild
  2. Webbetriebener DMX-Controller
  3. Arduino Spybot
  4. FlickMote
  5. Selbstgemachter Fernseher B-Gone
  6. Hauptuhr
  7. HSVClock
  8. Android-gesteuertes Spielzeug mit Raspberry Motor Shield
  9. Finde mich
  10. Arduino-Power