Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Serre Domotique

Composants et fournitures

Arduino MKR1000
× 1
Arduino UNO
× 1
Capteur de température DHT22
× 1
Arduino Wifi Shield 101
× 1
Appareil Android
× 1
Bouclier de commande de moteur CC avec BTN8982 pour Arduino Infineon
× 1

Applications et services en ligne

Arduino IDE
Eclipse

À propos de ce projet

Présentation

Les conditions environnementales de la serre changent continuellement, c'est pourquoi nous avons besoin d'une surveillance efficace.

Il y a beaucoup d'avantages à utiliser un système automatique, par exemple moins de travail ou le plus important, les utilisateurs peuvent vérifier leurs propres investissements depuis leur maison par PC ou smartphone.

Un autre avantage important est la possibilité de stocker des données dans une base de données. Cela peut faire la différence entre gagner ou perdre de l'argent.

De plus, grâce à un système de contrôle en temps réel, nous pouvons intervenir immédiatement, évitant ainsi les problèmes de culture.

Le système de surveillance automatique dans les serres est composé de capteurs qui lisent les données environnementales et d'actionneurs, appelés « esclaves ». Ils communiquent via sans fil avec un appareil central, appelé « Maître ». Ce dernier envoie les changements possibles aux esclaves (comme le changement de seuils) et les données via WiFi au serveur Web également.

1. Comment ça marche ?

Nous pouvons diviser ce projet en trois parties différentes :

  • Maître
  • Esclave
  • Serveur Web

Nous avons utilisé un Arduino/Genuino MKR1000 pour le maître, un Arduino/Genuino Uno pour l'esclave.

Le maître communique avec un serveur Web via WiFi (WINC1500 intégré), l'esclave acquiert la température et l'humidité avec le capteur DHT22, puis il envoie ces données au maître via WiFi (WiFi shield WINC1500).

2. Maître

Le maître est en « mode point d'accès » et il attend que la connexion esclave reçoive la température et l'humidité qui sont élaborées et envoyées au serveur Web.

Le Maître vérifie si des données sont disponibles, dans ce cas il crée un paquet UDP formé de nouveaux seuils et CRC. En fait, il calcule le CRC qui sera utilisé par l'Esclave pour valider le réglage reçu.

Une fois que le maître est sorti du « mode point d'accès », il se connecte au WiFi, afin d'envoyer les données au serveur Web où elles seront mises dans un graphique.

3. Esclave

L'esclave acquiert la température et l'humidité par le capteur DHT22 et après 5 minutes, il envoie les données au maître. Il crée également un paquet UDP, il se connecte au maître puis envoie les données.

Plus tard, il attend si des données sont disponibles, telles que de nouveaux seuils. Dans ce cas, l'Esclave reçoit de nouveaux paramètres et calcule le CRC à l'aide des formules Dallas-Maxim.

Ensuite, le CRC calculé est comparé au CRC reçu du maître. Si les deux CRC sont identiques, l'esclave enregistre le nouveau réglage dans l'EEPROM.

4. Serveur Web

Le serveur Web enregistre toutes les données qui peuvent ensuite être stockées dans un historique.

Pour ce faire, nous avons utilisé un script PHP qui se connecte à la base de données et affiche les données de deux manières différentes

  • dans un graphique, en utilisant un autre script PHP
  • dans une application Android, au format JSON à l'aide d'un autre script PHP

5. APP

L'application nous permet de consulter les données dans une base de données.

Dans le premier écran, nous pouvons sélectionner la plage de temps à afficher et avec le bouton "GRAPHIQUE", il contacte le service Web et obtient les données.

L'application affiche les données dans un graphique.


Code

  • Créer un graphique
  • Script de connexion au site Web
  • Créer un tableau
  • Maître domotique des serres
  • Esclave domotique de serre
  • getdati
Créer un graphiquePHP
Nous l'avons utilisé pour créer un graphique
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');// Créer la première ligne$p1 =new LinePlot($parameter1);$graph->Add($p1);$p1->SetColor("#6495ED");$ p1->SetLegend('your_parameter1');$graph->yscale->SetGrace(0);// Créer la deuxième ligne$p2 =new LinePlot($parameter2);$graph->Add($p2);$p2 ->SetColor("#B22222");$p2->SetLegend('your_parameter2');$graph->yscale->SetGrace(0);$graph->legend->SetFrameWeight(1);// Ligne de sortie$ graph->Stroke();?>
Script de connexion au site WebPHP
Nous l'avons utilisé pour enregistrer les données dans la base de données
";écho "paramètre1 ". $_GET['paramètre1']. "
";écho "paramètre2 ". $_GET['paramètre2']. "
" ;// Créer une connexion$conn =mysqli_connect($servername, $username, $password, $dbname);// Vérifier connectionif (!$conn) { die("La connexion a échoué :" . mysqli_connect_error() );}$sql ="INSERT INTO serre (nom, paramètre1, paramètre2) VALEURS ('".$nom."', '".$paramètre1."', '".$paramètre2."')";if ( mysqli_query($conn, $sql)) { echo "Nouvel enregistrement créé avec succès";} else { echo "Erreur :" . $sql. "
" . mysqli_error($conn);}mysqli_close($conn);?>
Créer une tableSQL
Nous avons utilisé ce script pour créer la table
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 ;
Maître domotique de serreC/C++
Ceci est le code du Master/*Projet de serre d'automatisation*//*Auteurs :Antonio La Mura, Umberto Festa*//*Date :03/03/2016*//*Notre idée est de permettre aux utilisateurs, qui achètent des fruits et les légumes cultivés en serre, pour connaître exactement toutes les étapes de plantation que les produits ont eues, comme l'utilisation d'engrais chimiques et autres produits similaires. Un QR code sera apposé sur les produits vendus qui sera lu par une application smartphone spécifique. Il fournit des informations sur les conditions environnementales dans lesquelles les produits ont été cultivés et les produits chimiques utilisés. Le système de surveillance automatique dans les serres est composé de capteurs qui lisent les données environnementales et d'actionneurs, appelés esclaves. Ils communiquent via Wireless avec un appareil central, appelé Master. Ce dernier envoie également les changements possibles aux esclaves (comme le changement de seuils) et les données via WiFi au serveur Web. Lorsque le produit est prêt à être vendu, la génération du code QR est demandée au webservice et il sera mis sur l'emballage. La dernière partie du système est l'application mobile qui est responsable de la numérisation des codes QR et montre les informations relatives à l'utilisateur.*//*Master*//*DEVO AGGIUNGERE SOLO LA PARTE CHE MI SERVE PER RICEVERE LE NUOVE SOGLIE CHE VENGONO INVIATE DALL'APP*//*Bibliothèques utilisées*/#include #include #include #include #include /* Variables de connexion*/char ssid[] ="SSID" ; /*Votre réseau SSID (nom)*/char pass[] ="pass"; /*Uour mot de passe réseau (à utiliser pour WPA, ou comme clé pour WEP)*/int keyIndex =0; /* Votre numéro d'index de clé réseau (nécessaire uniquement pour WEP)*/char ssid_ap[] ="Arduino"; /*Nom du point d'accès créé*/char pass_ap[] =""; /*(Pas encore pris en charge)*/int status =WL_IDLE_STATUS;unsigned int localPort =2390; /*Port local sur lequel écouter*/char server[] ="www.cormaz.altervista.org"; /*Adresse de nom pour Google (en utilisant DNS)*/WiFiServer server_ap(80);WiFiClient client_ap;WiFiUDP Udp;RTCZero rtc;WiFiClient client;char packetBuffer[255]; /*Buffer pour contenir le paquet entrant*/char ReplyBuffer[255]; /*Une chaîne à renvoyer*//*Variables pour les nouveaux seuils*/float humin =0;float humin =0;float tumax =0;float tumin =0;/*Fonctionne comme Access Point (flag =false), se connecte to WebServer (flag =true)*/boolean flag =false;boolean threeshold_available =false;void setup() { /*Initialiser la série et attendre que le port s'ouvre :*/ Serial.begin(9600); while (!Série) {; /*Attendez que le port série se connecte. Nécessaire pour le port USB natif uniquement*/ } Serial.println();}void loop() { int packetSize; double température ; double bourdonnement ; ID entier ; octet crc; Chaîne strURL ; //Vérifier la présence du bouclier :/****************************************** ***********************************************/ si ( WiFi.status() ==WL_NO_SHIELD) { Serial.println("WiFi shield not present"); /*Ne pas continuer :*/ while (true); } /****************************************************** **************************************/ // Tentative de connexion au réseau WiFi :/* ******************************************************** *************************************/ while (status !=WL_CONNECTED) { Serial.print("Création Réseau nommé : " ); Serial.println(ssid_ap); /*Connectez-vous au réseau WPA/WPA2. Modifiez cette ligne si vous utilisez un réseau ouvert ou WEP :*/ status =WiFi.beginAP(ssid_ap); /*Attendez 10 secondes pour la connexion :*/ delay(10000) ; server_ap.begin(); } Serial.println("Connecté au wifi"); /****************************************************** *************************************/ //Démarrer la communication UDP /****** ******************************************************** ******************************/ Udp.begin(localPort); printWifiStatus(); client_ap =server_ap.available(); if (client_ap) { /*Si vous obtenez un client*/ /*J'attends des informations*/ Serial.println("nouveau client"); /*Imprime un message sur le port série*/ /*S'il y a des données disponibles, lit un paquet*/ packetSize =Udp.parsePacket(); if (packetSize) { Serial.print("Paquet reçu de taille "); Serial.println(packetSize); Serial.print("De "); IPAddress remoteIp =Udp.remoteIP(); Serial.print(remoteIp); Serial.print(", port "); Serial.println(Udp.remotePort()); /*Lire le paquet dans packetBuffer*/ int len ​​=Udp.read(packetBuffer, 255); if (len> 0) packetBuffer[len] =0; Serial.println("Contenu :"); Serial.println(packetBuffer); char* commande =strtok((char *)packetBuffer, ";"); nombre entier =0 ; while (commande !=0) { /*Diviser les informations*/ switch (count) { case 0 :id =atoi(commande); Pause; cas 1 :temp =atof(commande)/10 ; Pause; cas 2 :hum =atof(commande)/10 ; Pause; } commande =strtok(0, ";"); compte++ ; } Serial.print("Paquet reçu de "); Serial.print(id); Serial.print(" T:"); Serial.print(temp, 1); Serial.print(" H:"); Serial.println(hum, 1); /****************************************************** *************************************/ retard(20); /*Calculez le CRC-8, donc créez un tableau d'octets*/ /****************************************** *********************************************/ octet bhmax =( octet)humax ; octet bhmin =(octet)humin ; octet btmax =(octet)tumax ; octet btmin =(octet)tumin ; octet 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); /*Envoyer une réponse, à l'adresse IP et au port qui nous ont envoyé le paquet que nous avons reçu*/ Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); Udp.write(ReplyBuffer); Udp.endPacket(); } } /*Imprimez-le sur le moniteur série*/ /*Fermez la connexion :*/ client_ap.stop(); Serial.println("client déconnecté"); indicateur =vrai ; }/*Fine AP*/ /************************************************ **************************************/ /*Connectez-vous au serveur et envoyez les données à la base de données */ /****************************************************** *********************************/ if (flag ==true) { /*Tentative de connexion au réseau Wifi :*/ while (status !=WL_CONNECTED) { Serial.print("Tentative de connexion au SSID :"); Serial.println(ssid); /*Connectez-vous au réseau WPA/WPA2. Modifiez cette ligne si vous utilisez un réseau ouvert ou WEP :*/ status =WiFi.begin(ssid, pass); /*Attendez 10 secondes pour la connexion :*/ delay(10000) ; } Serial.println("Connecté au wifi"); printWifiStatus(); strURL ="GET /VotreAdresse.php?id="; strURL +=identifiant; strURL +="¶meter1="; strURL +=temp; strURL +="¶meter2="; strURL +=hum ; strURL +=" HTTP/1.1" ; Serial.println("\nDémarrage de la connexion au serveur..."); // si vous obtenez une connexion, faites un rapport via série :if (client.connect(server, 80)) { Serial.println("connected to server"); // Faire une requête HTTP :client.println(strURL); client.println("Hôte :www.cormaz.altervista.org" ); client.println("Connexion :fermer"); client.println(); client.stop(); Serial.println("Ok!"); } /*Si le serveur est déconnecté, arrêtez le client :*/ if (!client.connected()) { Serial.println(); Serial.println("Déconnexion du serveur."); client.stop(); /*Ne rien faire pour toujours :*/ while (true); } indicateur =faux; } /****************************************************** ********************************/}/*Calculer l'algorithme CRC-8 - basé sur les formules Dallas/Maxim*/ octet CRC8 (octet const * données) { octet crc =0x00 ; while (*données) { extrait d'octet =*données++; for (byte tempI =8; tempI; tempI--) { byte sum =(crc ^ extract) &0x01; crc>>=1; if (somme) { crc ^=0x8C; } extraire>>=1; } } return crc;}void printWifiStatus() { /*Imprime le SSID du réseau auquel vous êtes connecté :*/ Serial.print("SSID:"); Serial.println(WiFi.SSID()); /*Imprimez l'adresse IP de votre bouclier WiFi :*/ IPAddress ip =WiFi.localIP(); Serial.print("Adresse IP :"); Serial.println(ip); /*Imprime la force du signal reçu :*/ long rssi =WiFi.RSSI(); Serial.print("force du signal (RSSI):"); Serial.print(rssi); Serial.println(" dBm");}
Esclave domotique de serreC/C++
Ceci est le code de l'esclave/*Projet de serre d'automatisation*//*Auteurs :Antonio La Mura, Umberto Festa*//*Date :21/03/2016*//*Notre idée est de permettre aux utilisateurs, qui achètent des fruits et les légumes cultivés en serre, pour connaître exactement toutes les étapes de plantation que les produits ont eues, comme l'utilisation d'engrais chimiques et autres produits similaires. Un QR code sera apposé sur les produits vendus qui sera lu par une application smartphone spécifique. Il fournit des informations sur les conditions environnementales dans lesquelles les produits ont été cultivés et les produits chimiques utilisés. Le système de surveillance automatique dans les serres est composé de capteurs qui lisent les données environnementales et d'actionneurs, appelés esclaves. Ils communiquent via Wireless avec un appareil central, appelé Master. Ce dernier envoie également les changements possibles aux esclaves (comme le changement de seuils) et les données via WiFi au serveur Web. Lorsque le produit est prêt à être vendu, la génération du code QR est demandée au webservice et il sera mis sur l'emballage. La dernière partie du système est l'application mobile qui est responsable de la numérisation des codes QR et montre les informations relatives à l'utilisateur.*//*Slave*//*Bibliothèques utilisées*/#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 //Délai entre les étapes//Variable pour réinitialiser millis()extern unsigned long timer0_millis;int status =WL_IDLE_STATUS;char ssid [] ="Arduino" ; // votre réseau SSID (nom) char pass[] =""; // votre mot de passe réseau (à utiliser pour WPA ou comme clé pour WEP)int keyIndex =0; // votre numéro d'index de clé réseau (nécessaire uniquement pour WEP)unsigned int localPort =2390; // port local pour écouter onchar packetBuffer[255]; //tampon pour contenir le paquet entrantWiFiUDP Udp;//Définir DHT22DHT22 myDHT22(DHT22_PIN);//Variable à envoyerfloat hmin =0;float hmax =0;float tmin =0;float tmax =0;int duty_motor =0;float humidité; float temperature;//Variable à envoyer toutes les 10 secondes intervalle long non signé =600000;void setup() { Serial.begin(9600); while (!Série) {; // attend que le port série se connecte. Nécessaire pour le port USB natif uniquement } //Initialize PIN (INPUT - OUTPUT) pinMode (HEATER, OUTPUT); digitalWrite(CHAUFFAGE, BAS); pinMode(HUMIDIFICATEUR, SORTIE); digitalWrite(HUMIDIFICATEUR, BAS); //Définir le PIN pour le ventilateur pinMode(IN_1, OUTPUT); pinMode(IN_2, SORTIE); pinMode(INH_1, SORTIE); pinMode(INH_2, SORTIE); //Réinitialiser reset_ports(); écriture numérique(INH_1, 1); digitalWrite(INH_2, 1); Serial.println("Début ... "); delay(2000);}void loop() { // s'il y a des données disponibles, lit un paquet int packetSize =Udp.parsePacket(); non signé longtemps =millis(); non signé long currentMillis =millis(); Code d'erreur DHT22_ERROR_t ; entier je =0 ; nom de caractère[] ="clie1" ; humidité =myDHT22.getHumidity() * 10; température =monDHT22.getTemperatureC() * 10; char àEnvoyer[32]; errorCode =monDHT22.readData(); octet crc; int crc_ric; //Vérifier les erreurs du capteur d'humidité et de température DHT22 /****************************************** **************************************/ switch (errorCode) { case DHT_ERROR_NONE:char buf[128]; sprintf(buf, "Lecture d'entiers uniquement :température %hi.%01hi C, humidité %i.%01i %% RH", myDHT22.getTemperatureCInt() / 10, abs(myDHT22.getTemperatureCInt() % 10), myDHT22. getHumidityInt() / 10, myDHT22.getHumidityInt() % 10); Pause; cas DHT_ERROR_CHECKSUM :pause ; cas DHT_BUS_HUNG :pause; cas DHT_ERROR_NOT_PRESENT :pause ; cas DHT_ERROR_ACK_TOO_LONG :pause ; cas DHT_ERROR_SYNC_TIMEOUT :pause ; cas DHT_ERROR_DATA_TIMEOUT :pause ; cas DHT_ERROR_TOOQUICK :pause ; } /****************************************************** ********************************/ //Imprime les valeurs, quand ça change /******* ******************************************************** *************************/ if (humidité !=myDHT22.getHumidity() * 10 || température !=myDHT22.getTemperatureC() * 10) { Serial.print("T:"); Serial.print(myDHT22.getTemperatureC(), 1); Serial.print("C"); Serial.print(" H:"); Serial.print(myDHT22.getHumidity(), 1); Serial.println("%"); } /****************************************************** ********************************/ //Envoyer les paramètres toutes les 10 minutes /******** ******************************************************** ********************/ if (millis()> intervalle) { //Connexion à AP /************ ******************************************************** ******************/ // vérifier la présence du shield :if (WiFi.status() ==WL_NO_SHIELD) { Serial.println("WiFi shield not present "); // ne continue pas :while (true); } // tentative de connexion au réseau Wifi :while ( status !=WL_CONNECTED) { Serial.print("Tentative de connexion au SSID :"); Serial.println(ssid); // Connectez-vous au réseau WPA/WPA2. Modifiez cette ligne si vous utilisez un réseau ouvert ou WEP :status =WiFi.begin(ssid); // attend 10 secondes pour la connexion :delay(10000); } Serial.println("Connecté au wifi"); /****************************************************** *******************************/ Serial.println("\nDémarrage de la connexion au serveur..."); // si vous obtenez une connexion, faites un rapport via série :Udp.begin(localPort); snprintf(toSend, sizeof(toSend), "%s;%d;%d", nom, (int)humidité, (int)température); // envoyer une réponse, à l'adresse IP et au port qui nous ont envoyé le paquet que nous avons reçu Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); Udp.write(toSend); Udp.endPacket(); Serial.println("Envoi terminé"); réinitialiserMillis(); while (millis() <10000) { packetSize =Udp.parsePacket(); if (packetSize) { /*Lire le paquet dans packetBuffer*/ int len ​​=Udp.read(packetBuffer, 255); if (len> 0) packetBuffer[len] =0; Serial.println("Contenu :"); Serial.println(packetBuffer); char* commande =strtok((char *)packetBuffer, ";"); nombre entier =0 ; while (commande !=0) { /*Diviser les informations*/ switch (count) { case 0:snprintf(name, sizeof(name), "%s", command); Pause; cas 1 :hmax =atof(commande)/10 ; //atof(char* ) mi convertit un tipo char* en double break; cas 2 :hmin =atof(commande)/10 ; Pause; cas 3 :tmax =atof(commande) / 10 ; Pause; cas 4 :tmin =atof(commande)/10 ; Pause; cas 5:crc_ric =atoi(commande); Pause; } commande =strtok(0, ";"); compte++ ; } Serial.print("Réponse :"); Serial.print(nom); 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 reçu :"); Serial.println(crc_ric); //calcule le CRC-8, et j'obtiens le tableau d'octets /************************************ ********************************************/ octet bhmax =(octet )hmax; octet bhmin =(octet)hmin ; octet btmax =(octet)tmax ; octet btmin =(octet)tmin ; octet crc32_str[4] ={ bhmax, bhmin, btmax, btmin } ; crc =CRC8(crc32_str); Serial.println("CRC:"); Serial.println(crc); /****************************************************** *******************************/ if (crc_ric ==(int)crc) { //Enregistrer dans l'EEPROM EEPROM_writeDouble (0, tmax); EEPROM_writeDouble(4, tmin); EEPROM_writeInt(8, hmax); EEPROM_writeInt(10, hmin); } } } délai(10); } /****************************************************** ********************************/ WiFi.disconnect(); //Gérer l'HUMIDIFICATEUR, le CHAUFFAGE et le ventilateur en fonction de la valeur du capteur /****************************************** ******************************************************** */ //HEATER if (myDHT22.getTemperatureC()>=tmax) { digitalWrite(HEATER, HIGH); } if (myDHT22.getTemperatureC() <=tmin + 1) { digitalWrite(HEATER, LOW); } //HUMIDIFICATEUR if ((int)myDHT22.getHumidity()>=hmax) { digitalWrite(HUMIDIFIER, HIGH); } if ((int)myDHT22.getHumidity() <=hmin + 1) { digitalWrite(HUMIDIFIER, LOW); } //Ventilateur, moteur Brushless if (myDHT22.getTemperatureC()>=tmax + 4) { //Rotation du moteur en fonction de la température, service -> 0 par t =tmax+4 et service -> 100 par t> tmax+10 //Rotazione del motore al variare della temperature, duty -> 0 par t =tmax+4 e duty -> 100 par t> tmax+10 duty_motor =map(i , tmax + 4, tmax + 10, 0, 100); if (tmax> tmax + 10) { duty_motor =100 ; } analogWrite(IN_2, devoir_moteur); retard (TCONST); } if (myDHT22.getTemperatureC() <=(tmax + tmin) / 2) { reset_ports(); //Rotation du moteur selon avec température, service -> 0 par t =tmax+4 et service -> 255 par t> tmax+10 devoir_moteur =0; analogWrite(IN_2, devoir_moteur); retard (TCONST); } /****************************************************** **************************************/ delay(1000);}//Sauvegarder en double EEPROMvoid EEPROM_writeDouble(int ee, valeur double) { byte* p =(byte*)(void*)&value; for (int i =0; i >=1; if (somme) { crc ^=0x8C; } extraire>>=1; } } return crc;}//Il utilise pour réinitialiser millis() void resetMillis() { cli(); timer0_millis =0; sei();}
getdatiPHP
Nous l'avons utilisé pour connecter notre application à la base de données
";//select a database to work with$selected =mysql_select_db("serra",$dbhandle) ou die("Impossible de sélectionner des exemples"); $datada =$_GET["datada"];$dataa =$_GET["dataa"];//exécute la requête SQL et renvoie records$result =mysql_query("SELECT hum,temp,date FROM record WHERE date>=' ".$datada."' et date <='".$dataa."'");$records=array();//récupérer les données de la base de données while ($row =mysql_fetch_array($result)) { $ tmp =array("hum"=>$row{'hum'}, "temp"=>$row{'temp'}, "date"=>$row{'date'}); array_push($records,$tmp); //écho "HUM : ".$row{'hum'}." TEMP : ".$row{'temp'}."Date :". //afficher les résultats $row{'date'}."
";}echo json_encode($records);//fermer la connexionmysql_close($dbhandle);?>
App GrenHouse
Dans la première page vous devez régler la date à l'aide de deux DatePicker. Lorsque vous appuyez sur le bouton "GRAPHIC", il effectue un appel HTTP GET au script PHP "getdati" en envoyant les paramètres et la date que vous avez choisis. Ensuite, il reçoit le JSON et le décode, après avoir créé le graphique à l'aide de la bibliothèque GraphViewhttps://github.com/cormaz/app_greenhouse.git

Schémas

Connexion :Arduino UNO - DHT22 - Relais

Processus de fabrication

  1. Animation bitmap sur le bouclier d'affichage à écran tactile TFT ILI9341
  2. Contrôleur DMX Web
  3. Arduino Spybot
  4. FlickMote
  5. Téléviseur maison B-Gone
  6. horloge maîtresse
  7. HSVClock
  8. Jouet contrôlé par Android utilisant un bouclier de moteur Raspberry
  9. Trouvez-moi