Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Domotica Kas

Componenten en benodigdheden

Arduino MKR1000
× 1
Arduino UNO
× 1
DHT22-temperatuursensor
× 1
Arduino Wifi Shield 101
× 1
Android-apparaat
× 1
DC Motor Control Shield met BTN8982 voor Arduino Infineon
× 1

Apps en online services

Arduino IDE
Eclipse

Over dit project

Overzicht

De omgevingsomstandigheden in de kas veranderen continu, daarom hebben we een efficiënte monitoring nodig.

Er zijn veel voordelen aan het gebruik van een automatisch systeem, bijvoorbeeld minder werk of het belangrijkste is dat de gebruikers hun eigen investeringen vanuit hun huis kunnen controleren via pc of smartphone.

Een ander belangrijk voordeel is de mogelijkheid om gegevens op te slaan in een DataBase. Dit kan het verschil maken tussen geld winnen of verliezen.

Bovendien kunnen we dankzij een realtime systeemcontrole onmiddellijk ingrijpen, waardoor problemen voor de teelt worden voorkomen.

Het automatische monitoringsysteem in kassen bestaat uit sensoren die omgevingsgegevens en actuatoren uitlezen, de zogenaamde “Slaven”. Ze communiceren draadloos met het centrale apparaat, genaamd "Master". Deze laatste stuurt eventuele wijzigingen naar slaves (zoals wijziging van drempels) en data ook via wifi naar de webserver.

1. Hoe werkt het?

We kunnen dit project in drie verschillende delen splitsen:

  • Meester
  • Slaaf
  • Webserver

We hebben een Arduino/Genuino MKR1000 gebruikt voor de Master, een Arduino/Genuino Uno voor de Slave.

De Master communiceert met een webserver via WiFi (WINC1500 geïntegreerd), de Slave verwerft temperatuur en vochtigheid met DHT22-sensor en stuurt deze gegevens vervolgens via WiFi naar de Master (WiFi-schild WINC1500).

2. Meester

De Master staat in "Access Point-modus" en wacht tot de Slave-verbinding de temperatuur en vochtigheid ontvangt die zijn uitgewerkt en naar de webserver zijn verzonden.

De Master controleert of er gegevens beschikbaar zijn, in dit geval creëert hij een UDP-pakket gevormd door nieuwe drempels en CRC. In feite berekent het de CRC die door de Slave zal worden gebruikt om de ontvangen instelling te valideren.

Nadat de Master de "Access Point-modus" heeft verlaten, maakt hij verbinding met wifi om gegevens naar de webserver te sturen, waar ze in een grafiek worden gezet.

3. Slaaf

De Slave verwerft temperatuur en vochtigheid door de DHT22-sensor en stuurt na 5 minuten gegevens naar de Master. Het creëert ook een UDP-pakket, maakt verbinding met de master en verzendt vervolgens de gegevens.

Later wacht het of er gegevens beschikbaar zijn, zoals nieuwe drempels. In dit geval ontvangt de Slave nieuwe instellingen en berekent hij de CRC met behulp van de Dallas-Maxim-formules.

Vervolgens wordt de berekende CRC vergeleken met de van de Master ontvangen CRC. Als de twee CRC's hetzelfde zijn, slaat de Slave de nieuwe instelling op in de EEPROM.

4. Webserver

De webserver slaat alle gegevens op die later in een geschiedenis kunnen worden opgeslagen.

Om dat te doen, hebben we een PHP-script gebruikt dat verbinding maakt met de database en gegevens op twee verschillende manieren toont

  • in een grafiek, met een ander PHP-script
  • in een Android-app, in JSON-indeling met een ander PHP-script

5. APP

Met de app kunnen we de gegevens raadplegen in een database.

In het eerste scherm kunnen we het timingbereik selecteren dat moet worden weergegeven en met de knop "GRAFISCH" neemt het contact op met de webservice en haalt het de gegevens op.

De app toont gegevens in afbeeldingen.


Code

  • Grafiek maken
  • Script website verbinden
  • Maak tabel
  • Kas Domotica Master
  • Greenhouse Domotic Slave
  • getdaten
Grafiek makenPHP
We hebben dit gebruikt om een ​​afbeelding te maken
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');// Maak de eerste regel$p1 =new LinePlot($parameter1);$graph->Add($p1);$p1->SetColor("#6495ED");$ p1->SetLegend('your_parameter1');$graph->yscale->SetGrace(0);// Maak de tweede regel$p2 =new LinePlot($parameter2);$graph->Add($p2);$p2 ->SetColor("#B22222");$p2->SetLegend('your_parameter2');$graph->yscale->SetGrace(0);$graph->legend->SetFrameWeight(1);// Uitvoerregel$ grafiek->Beroerte();?>
Scriptwebsite connectPHP
We hebben dit gebruikt om gegevens op te slaan in DB
";echo "parameter1". $_GET['parameter1']. "
";echo "parameter2 ". $_GET['parameter2']. "
";// Maak connectie$conn =mysqli_connect($servername, $username, $password, $dbname);// Controleer connectionif (!$conn) { die("Verbinding mislukt:". mysqli_connect_error() );}$sql ="INSERT INTO kas (naam, parameter1, parameter2)VALUES ('".$name."', '".$parameter1."', '".$parameter2."')";if ( mysqli_query($conn, $sql)) { echo "Nieuw record succesvol aangemaakt";} else { echo "Fout:" . $sql. "
" . mysqli_error($conn);}mysqli_close($conn);?>
Maak tabelSQL
We hebben dit script gebruikt om de tabel te maken
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;
Kas Domotica MasterC/C++
Dit is de mastercode
/*Automatisering kasproject*//*Autors:Antonio La Mura, Umberto Festa*//*Datum:03/03/2016*//*Ons idee is om gebruikers, die fruit kopen, toe te staan en groenten die in kassen worden verbouwd, om precies te weten welke plantagestappen de producten hebben ondergaan, zoals het gebruik van chemische meststoffen en andere soortgelijke producten. Op de verkochte producten wordt een QR-code geplaatst die door een specifieke smartphone-app wordt uitgelezen. Het geeft informatie over de omgevingsomstandigheden waar producten zijn verbouwd en de gebruikte chemische producten. Het automatische monitoringsysteem in kassen bestaat uit sensoren die omgevingsgegevens en actuatoren uitlezen, de zogenaamde Slaves. Ze communiceren via Wireless met het centrale apparaat, Master genaamd. Deze laatste stuurt eventuele wijzigingen naar slaves (zoals wijziging van drempels) en data ook via wifi naar de webserver. Wanneer het product klaar is om verkocht te worden, wordt er een QR-code aan de webservice gevraagd om deze op de verpakking te plaatsen. Het laatste deel van het systeem is de mobiele app die verantwoordelijk is voor het scannen van de QR-codes en de relatieve informatie aan de gebruiker toont.*//*Master*//*DEVO AGGIUNGERE SOLO LA PARTE CHE MI SERVE PER RICEVERE LE NUOVE SOGLIE CHE VENGONO INVIATE DALL'APP*//*Gebruikte bibliotheken*/#include #include #include #include #include /* Variabelen voor verbinding*/char ssid[] ="SSID"; /*Uw netwerk-SSID (naam)*/char pass[] ="pass"; /*Uw netwerkwachtwoord (gebruik voor WPA, of gebruik als sleutel voor WEP)*/int keyIndex =0; /* Uw netwerksleutel Indexnummer (alleen nodig voor WEP)*/char ssid_ap[] ="Arduino"; /*AP-naam gemaakt*/char pass_ap[] =""; /*(Nog niet ondersteund)*/int status =WL_IDLE_STATUS;unsigned int localPort =2390; /*Lokale poort om op te luisteren*/char server[] ="www.cormaz.altervista.org"; /*Naamadres voor Google (met DNS)*/WiFiServer server_ap(80);WiFiClient client_ap;WiFiUDP Udp;RTCZero rtc;WiFiClient-client;char packetBuffer[255]; /*Buffer om inkomend pakket vast te houden*/char ReplyBuffer[255]; /*Een string om terug te sturen*//*Variabelen voor nieuwe drempels*/float humax =0;float humin =0;float tumax =0;float tumin =0;/*Werkt als Access Point (flag =false), verbindt to WebServer (flag =true)*/boolean flag =false;boolean threeshold_available =false;void setup() { /*Initialiseer serieel en wacht tot de poort wordt geopend:*/ Serial.begin (9600); while (!Serial) {; /*Wacht tot de seriële poort is verbonden. Alleen nodig voor native USB-poort*/ } Serial.println();}void loop() { int packetSize; dubbele temperatuur; dubbele brom; int-ID; byte-crc; String strURL; //Controleer op de aanwezigheid van het schild:/**************************************** ***********************************************/ als ( WiFi.status() ==WL_NO_SHIELD) { Serial.println ("WiFi-schild niet aanwezig"); /*Ga niet verder:*/ while (true); } /************************************************** ************************************/ // Poging om verbinding te maken met wifi-netwerk:/* ********************************************** ***********************************/ while (status !=WL_CONNECTED) { Serial.print("Creating Netwerk met de naam:"); Serial.println(ssid_ap); /*Verbind met WPA/WPA2-netwerk. Wijzig deze regel als u een open of WEP-netwerk gebruikt:*/ status =WiFi.beginAP(ssid_ap); /*Wacht 10 seconden voor verbinding:*/ vertraging (10000); server_ap.begin(); } Serial.println("Verbonden met wifi"); /************************************************** ************************************/ // UDP-communicatie starten /***** ********************************************** ******************************/ Udp.begin(localPort); printWifiStatus(); client_ap =server_ap.available(); if (client_ap) { /*Als je een klant krijgt*/ /*Ik wacht op wat informatie*/ Serial.println ("nieuwe klant"); /*Druk een bericht af via de seriële poort*/ /*Als er gegevens beschikbaar zijn, lees een pakket*/ packetSize =Udp.parsePacket(); if (packetSize) { Serial.print("Ontvangen pakket van grootte"); Serial.println (pakketgrootte); Serial.print("Van "); IPAddress remoteIp =Udp.remoteIP(); Serial.print(remoteIp); Serial.print(", poort "); Serial.println(Udp.remotePort()); /*Lees het pakket in packetBuffer*/ int len ​​=Udp.read(packetBuffer, 255); if (len> 0) packetBuffer[len] =0; Serial.println("Inhoud:"); Serial.println(pakketbuffer); char* commando =strtok((char *)packetBuffer, ";"); aantal int =0; while (commando!=0) { /*Deel de informatie*/ switch (count) { case 0:id =atoi(command); pauze; geval 1:temp =atof(opdracht) / 10; pauze; geval 2:brom =atof(commando)/10; pauze; } opdracht =strtok(0, ";"); tellen++; } Serial.print("Pakket ontvangen van "); Seriële.print(id); Serial.print(" T:"); Serial.print(temp, 1); Serial.print(" H:"); Serial.println(hum, 1); /************************************************** ************************************/ vertraging(20); /*Bereken de CRC-8, dus maak een bytearray*/ /*********************************** *****************************************/ byte bhmax =( byte)humax; byte bhmin =(byte)humine; byte btmax =(byte)tumax; byte btmin =(byte)tumin; byte crc32_str[4] ={ bhmax, bhmin, btmax, btmin}; crc =CRC8(crc32_str); Serial.println("CRC:"); Serieel.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); /*Stuur een antwoord naar het IP-adres en de poort die ons het pakket hebben gestuurd dat we hebben ontvangen*/ Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); Udp.write(Antwoordbuffer); Udp.endPacket(); } } /*Print de seriële monitor*/ /*Sluit de verbinding:*/ client_ap.stop(); Serial.println ("client verbroken"); vlag =waar; }/*Fijne AP*/ /********************************************* ************************************/ /*Verbind met de server en stuur gegevens naar DataBase */ /************************************************** *******************************/ if (flag ==true) { /* Poging om verbinding te maken met wifi-netwerk :*/ while (status !=WL_CONNECTED) { Serial.print("Poging om verbinding te maken met SSID:"); Serieel.println(ssid); /*Verbind met WPA/WPA2-netwerk. Wijzig deze regel als u een open of WEP-netwerk gebruikt:*/ status =WiFi.begin(ssid, pass); /*Wacht 10 seconden voor verbinding:*/ vertraging (10000); } Serial.println("Verbonden met wifi"); printWifiStatus(); strURL ="KRIJG /UwAddress.php?id="; strURL +=id; strURL +="¶meter1="; strURL +=temp; strURL +="¶meter2="; strURL +=brom; strURL +=" HTTP/1.1"; Serial.println("\nVerbinding met server starten..."); // als je een verbinding krijgt, rapporteer dan via serieel:if (client.connect(server, 80)) { Serial.println("connected to server"); // Doe een HTTP-verzoek:client.println(strURL); client.println("Host:www.cormaz.altervista.org"); client.println("Verbinding:sluiten"); klant.println(); klant.stop(); Serial.println("Ok!"); } /*Als de verbinding met de server is verbroken, stop dan de client:*/ if (!client.connected()) { Serial.println(); Serial.println("Verbinding met server verbreken."); klant.stop(); /*Doe voor altijd niets meer:*/ while (true); } vlag =onwaar; } /************************************************** *******************************/}/*Bereken algoritme CRC-8 - gebaseerd op Dallas/Maxim formules*/ byte CRC8 (const byte * data) { byte crc =0x00; while (*data) { byte-extract =*data++; for (byte tempI =8; tempI; tempI--) { byte sum =(crc ^ extract) &0x01; crc>>=1; if (som) {crc ^=0x8C; } extraheren>>=1; } } return crc;}void printWifiStatus() { /*Druk de SSID af van het netwerk waarmee u verbonden bent:*/ Serial.print("SSID:"); Seriële.println(WiFi.SSID()); /*Print het IP-adres van uw WiFi-schild:*/ IPAddress ip =WiFi.localIP(); Serial.print("IP-adres:"); Serieel.println(ip); /*Print de ontvangen signaalsterkte:*/ long rssi =WiFi.RSSI(); Serial.print("signaalsterkte (RSSI):"); Seriële.print(rssi); Serial.println(" dBm");}
Greenhouse Domotic SlaveC/C++
Dit is de Slave's code
/*Automatisering kasproject*//*Autors:Antonio La Mura, Umberto Festa*//*Datum:21/03/2016*//*Ons idee is om gebruikers die fruit kopen toe te staan en groenten die in kassen worden verbouwd, om precies te weten welke plantagestappen de producten hebben ondergaan, zoals het gebruik van chemische meststoffen en andere soortgelijke producten. Op de verkochte producten wordt een QR-code geplaatst die door een specifieke smartphone-app wordt uitgelezen. Het geeft informatie over de omgevingsomstandigheden waar producten zijn verbouwd en de gebruikte chemische producten. Het automatische monitoringsysteem in kassen bestaat uit sensoren die omgevingsgegevens en actuatoren uitlezen, de zogenaamde Slaves. Ze communiceren via Wireless met het centrale apparaat, Master genaamd. Deze laatste stuurt eventuele wijzigingen naar slaves (zoals wijziging van drempels) en data ook via wifi naar de webserver. Wanneer het product klaar is om verkocht te worden, wordt er een QR-code aan de webservice gevraagd om deze op de verpakking te plaatsen. Het laatste deel van het systeem is de mobiele app die verantwoordelijk is voor het scannen van QR-codes en die de relatieve informatie aan de gebruiker toont.*//*Slave*//*Gebruikte bibliotheken*/#include #include #include #include #include //Define all PIN#define HUMIDIFIER 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 //Delay Time between Steps//Variable to reset millis()extern unsigned long timer0_millis;int status =WL_IDLE_STATUS;char ssid [] ="Arduino"; // uw netwerk-SSID (naam) char pass [] =""; // uw netwerkwachtwoord (gebruik voor WPA of gebruik als sleutel voor WEP) int keyIndex =0; // uw netwerksleutel Indexnummer (alleen nodig voor WEP) unsigned int localPort =2390; // lokale poort om te luisteren naar onchar packetBuffer [255]; //buffer om inkomend pakket vast te houdenWiFiUDP Udp;//Definieer DHT22DHT22 myDHT22(DHT22_PIN);//Variabele om float hmin =0;float hmax =0;float tmin =0;float tmax =0;int duty_motor =0;float vochtigheid; float-temperatuur;//Variabele om elke 10 seconden te verzenden zonder teken lang interval =600000; ongeldige setup () {Serial.begin (9600); while (!Serial) {; // wacht tot de seriële poort verbinding maakt. Alleen nodig voor native USB-poort} // Initialiseer PIN (INPUT - OUTPUT) pinMode (HEATER, OUTPUT); digitalWrite (VERWARMING, LAAG); pinMode (BEVOCHTIGER, UITGANG); digitalWrite (BEVOCHTIGER, LAAG); //Stel de pincode in voor de fan pinMode (IN_1, OUTPUT); pinMode (IN_2, UITGANG); pinMode(INH_1, UITGANG); pinMode (INH_2, UITGANG); // Reset reset_ports (); digitalWrite(INH_1, 1); digitalWrite(INH_2, 1); Serial.println("Begin ... "); delay(2000);}void loop() {// als er gegevens beschikbaar zijn, lees een pakket int packetSize =Udp.parsePacket(); niet-ondertekende lange tijd =millis(); unsigned long currentMillis =millis(); DHT22_ERROR_t foutcode; int ik =0; char naam [] ="clie1"; vochtigheid =myDHT22.getHumidity() * 10; temperatuur =mijnDHT22.getTemperatureC() * 10; char naarVerzenden[32]; errorCode =mijnDHT22.readData(); byte-crc; int crc_ric; //Controleer sensorvochtigheid en temperatuur DHT22-fouten /**************************************** ****************************************/ switch (errorCode) { case DHT_ERROR_NONE:char buf[128]; sprintf(buf, "Alleen integer lezen:Temperatuur %hi.%01hi C, Vochtigheid %i.%01i %% RH", myDHT22.getTemperatureCInt() / 10, abs(myDHT22.getTemperatureCInt() % 10), myDHT22. getHumidityInt()/10, myDHT22.getHumidityInt() % 10); pauze; geval DHT_ERROR_CHECKSUM:breken; geval DHT_BUS_HUNG:breken; geval DHT_ERROR_NOT_PRESENT:breken; geval DHT_ERROR_ACK_TOO_LONG:pauze; geval DHT_ERROR_SYNC_TIMEOUT:pauze; geval DHT_ERROR_DATA_TIMEOUT:pauze; geval DHT_ERROR_TOOQUICK:breken; } /************************************************** *******************************/ // Druk de waarden af, wanneer deze veranderen /****** ********************************************** *********************/ if (vochtigheid !=myDHT22.getHumidity() * 10 || temperatuur !=myDHT22.getTemperatureC() * 10) { Serial.print("T:"); Serial.print(myDHT22.getTemperatureC(), 1); Serial.print("C"); Serial.print(" H:"); Serial.print(myDHT22.getHumidity(), 1); Serieel.println("%"); } /************************************************** *******************************/ //Stuur de parameters elke 10 minuten /******** ********************************************** *********************/ if (millis()> interval) { //Verbinding met AP /*********** ********************************************** ****************/ // controleer op de aanwezigheid van het schild:if (WiFi.status() ==WL_NO_SHIELD) { Serial.println("WiFi-schild niet aanwezig "); // ga niet verder:while (true); } // probeer verbinding te maken met wifi-netwerk:while (status!=WL_CONNECTED) { Serial.print("Poging om verbinding te maken met SSID:"); Serieel.println(ssid); // Maak verbinding met het WPA/WPA2-netwerk. Wijzig deze regel als u een open of WEP-netwerk gebruikt:status =WiFi.begin(ssid); // wacht 10 seconden op verbinding:vertraging (10000); } Serial.println("Verbonden met wifi"); /************************************************** ******************************/ Serial.println("\nVerbinding met server starten..."); // als je verbinding krijgt, rapporteer dan via serieel:Udp.begin(localPort); snprintf(toSend, sizeof(toSend), "%s;%d;%d", naam, (int)vochtigheid, (int)temperatuur); // stuur een antwoord naar het IP-adres en de poort die ons het pakket hebben gestuurd dat we hebben ontvangen Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); Udp.write(naarSend); Udp.endPacket(); Serial.println("Klaar met verzenden"); resetMillis(); while (millis() <10000) { packetSize =Udp.parsePacket(); if (packetSize) {/*Lees het pakket in packetBuffer*/ int len ​​=Udp.read(packetBuffer, 255); if (len> 0) packetBuffer[len] =0; Serial.println("Inhoud:"); Serial.println(pakketbuffer); char* commando =strtok((char *)packetBuffer, ";"); aantal int =0; while (commando!=0) { /*Deel de informatie*/ switch (count) { case 0:snprintf(name, sizeof(name), "%s", command); pauze; geval 1:hmax =atof(opdracht) / 10; //atof(char*) mi converte un tipo char* in dubbele pauze; geval 2:hmin =atof(opdracht) / 10; pauze; geval 3:tmax =atof(opdracht) / 10; pauze; geval 4:tmin =atof(opdracht) / 10; pauze; geval 5:crc_ric =atoi(opdracht); pauze; } opdracht =strtok(0, ";"); tellen++; } Serial.print("Antwoord:"); Serial.print(naam); Serieel.print(";"); Serial.print(hmax, 1); Serieel.print(";"); Serial.print(hmin, 1); Serieel.print(";"); Serial.print(tmax, 1); Serieel.print(";"); Serial.println(tmin, 1); Serial.print("CRC ontvangen:"); Serieel.println(crc_ric); // bereken CRC-8 en ik verkrijg de byte-array /**************************************** *****************************************/ 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:"); Serieel.println(crc); /************************************************** *******************************/ if (crc_ric ==(int)crc) { // Opslaan in de EEPROM EEPROM_writeDouble (0, tmax); EEPROM_writeDouble (4, tmin); EEPROM_writeInt(8, hmax); EEPROM_writeInt(10, hmin); } } } vertraging(10); } /************************************************** *******************************/ WiFi.disconnect(); // Beheer de BEVOCHTIGER, VERWARMING en ventilator volgens de waarde van de sensor /*********************************** ********************************************** */ //HEATER if (myDHT22.getTemperatureC()>=tmax) {digitalWrite(HEATER, HIGH); } if (myDHT22.getTemperatureC() <=tmin + 1) { digitalWrite(HEATER, LOW); } //BEVOCHTIGER if ((int)myDHT22.getHumidity()>=hmax) {digitalWrite(BEVOCHTIGER, HOOG); } if ((int)myDHT22.getHumidity() <=hmin + 1) { digitalWrite (BEVOCHTIGER, LAAG); } // Ventilator, borstelloze motor if (myDHT22.getTemperatureC()>=tmax + 4) { // Rotatie van de motor volgens temperatuur, duty -> 0 per t =tmax+4 en duty -> 100 per t> tmax+10 //Rotazione del motore al variare della temperatura, duty -> 0 per t =tmax+4 e duty -> 100 per 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); vertraging (TCONST); } if (myDHT22.getTemperatureC() <=(tmax + tmin) / 2) { reset_ports(); // Rotatie van de motor volgens temperatuur, duty -> 0 per t =tmax+4 en duty -> 255 per t> tmax+10 duty_motor =0; analogWrite(IN_2, duty_motor); vertraging (TCONST); } /************************************************** ************************************/ delay(1000);}//Save double in EEPROMvoid EEPROM_writeDouble(int ee, dubbele waarde) { byte* p =(byte*)(void*)&value; for (int i =0; i >=1; if (som) {crc ^=0x8C; } extraheren>>=1; } } return crc;}//Het gebruikt om millis()void resetMillis() { cli(); timer0_millis =0; sei();}
getdatiPHP
We hebben dit gebruikt om onze app te verbinden met database
";//selecteer een database om work with$selected =mysql_select_db("serra",$dbhandle) or die("Kon voorbeelden niet selecteren"); $datada =$_GET["datada"];$dataa =$_GET["dataa"];//voer de SQL-query uit en retourneer records$result =mysql_query("SELECT hum,temp,date FROM record WHERE date>=' ".$datada."' en datum <='".$dataa."'");$records=array();//haal de gegevens uit de database terwijl ($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:". //toon de resultaten $row{'date'}."
";}echo json_encode($records);//sluit de connectiemysql_close($dbhandle);?>
App GrenHouse
Op de eerste pagina moet u de datum instellen met behulp van twee DatePicker. Wanneer u op de knop "GRAPHIC" drukt, maakt het een HTTP GET-aanroep naar het PHP-script "getdati" en verzendt de parameters en datum die u hebt gekozen. Vervolgens ontvangt het de JSON en decodeert dat, nadat het de afbeelding heeft gemaakt met behulp van de bibliotheek GraphViewhttps://github.com/cormaz/app_greenhouse.git

Schema's

Aansluiting:Arduino UNO - DHT22 - Relais

Productieproces

  1. Bitmap-animatie op ILI9341 TFT Touchscreen Display Shield
  2. Web-gestuurde DMX-controller
  3. Arduino Spybot
  4. FlickMote
  5. Zelfgemaakte tv B-Gone
  6. Hoofdklok
  7. HSVClock
  8. Android bestuurd speelgoed met Raspberry Motor Shield
  9. Vind mij
  10. Arduino Power
  11. BLUE_P:Wireless Arduino Programming Shield