Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Estufa Domótica

Componentes e suprimentos

Arduino MKR1000
× 1
Arduino UNO
× 1
Sensor de temperatura DHT22
× 1
Arduino Wifi Shield 101
× 1
Dispositivo Android
× 1
Blindagem de controle do motor DC com BTN8982 para Arduino Infineon
× 1

Aplicativos e serviços online

Arduino IDE
Eclipse

Sobre este projeto





Visão geral


As condições ambientais da estufa mudam continuamente, por isso precisamos de um monitoramento eficiente.

Existem muitos benefícios em usar um sistema automático, por exemplo, menos trabalho ou o mais importante, os usuários podem verificar seus próprios investimentos de sua casa pelo PC ou smartphone.

Outra vantagem importante é a possibilidade de armazenar dados em um DataBase. Isso pode fazer a diferença entre ganhar ou perder dinheiro.

Além disso, graças a um sistema de controle em tempo real, podemos intervir imediatamente, evitando problemas para o cultivo.

O sistema de monitoramento automático em estufas é composto por sensores que fazem a leitura dos dados ambientais e atuadores, chamados de “escravos”. Eles se comunicam via Wireless com um dispositivo central, denominado “Master”. Este último envia possíveis alterações para escravos (como alteração de limiares) e dados via WiFi para o servidor da web também.





1. Como funciona?


Podemos dividir este projeto em três partes diferentes:
  • Mestre
  • Escravo
  • Servidor da web

Usamos um Arduino / Genuino MKR1000 para o Master, um Arduino / Genuino Uno para o Slave.

O Master se comunica com um Web Server via WiFi (WINC1500 integrado), o Slave adquire a temperatura e a umidade com o sensor DHT22, e então envia esses dados para o Master via WiFi (WiFi shield WINC1500).






2. Mestre


O Master está em “modo Access Point” e aguarda a conexão Slave para receber a temperatura e a umidade que são elaboradas e enviadas ao Web Server.

O Mestre verifica se há dados disponíveis, neste caso cria um pacote UDP formado por novos limiares e CRC. De fato, ele calcula o CRC que será utilizado pelo Slave para validar a configuração recebida.

Após o Master sair do “modo Access Point”, ele se conecta ao WiFi, a fim de enviar os dados para o WebServer onde serão colocados em um gráfico.





3. Escravo


O Escravo adquire temperatura e umidade pelo sensor DHT22 e após 5 minutos envia dados para o Mestre. Ele também cria um pacote UDP, ele se conecta ao mestre e, em seguida, envia os dados.

Posteriormente, ele espera se houver alguns dados disponíveis, como novos limites. Neste caso, o Slave recebe novas configurações e calcula o CRC usando as fórmulas Dallas-Maxim.

Posteriormente, o CRC calculado é comparado com o CRC recebido do Comandante. Se os dois CRC forem iguais, o Slave salva a nova configuração na EEPROM.





4. Servidor Web


O Web Server salva todos os dados que posteriormente podem ser armazenados em um histórico.

Para fazer isso, usamos um script PHP que se conecta ao banco de dados e mostra os dados de duas maneiras diferentes
  • em um gráfico, usando outro script PHP
  • em um aplicativo Android, no formato JSON usando outro script PHP





5. APP


O App permite consultar os dados em uma Base de Dados.

Na primeira tela, podemos selecionar o intervalo de tempo a mostrar e com o botão "GRÁFICO", ele entra em contato com o serviço web e obtém os dados.

O aplicativo mostra os dados em gráficos.



Código

  • Crie um gráfico
  • Conexão do site do Script
  • Criar mesa
  • Greenhouse Domotic Master
  • Greenhouse Domotic Slave
  • getdati
Criar gráfico PHP
Usamos isso para criar um gráfico
  SetScale ("textlin"); $ theme_class =new UniversalTheme; $ graph-> SetTheme ($ theme_class); $ graph-> img-> SetAntiAliasing ( falso); $ gráfico-> título-> Set ('Título'); $ gráfico-> SetBox (falso); $ gráfico-> img-> SetAntiAliasing (); $ gráfico-> yaxis-> HideZeroLabel (); $ gráfico -> yaxis-> HideLine (falso); $ gráfico-> yaxis-> HideTicks (falso, falso); $ gráfico-> xgrid-> Mostrar (); $ gráfico-> xgrid-> SetLineStyle ("sólido"); $ gráfico-> xaxis-> SetTickLabels ($ time_axis); $ gráfico-> xgrid-> SetColor ('# E3E3E3'); $ gráfico-> xaxis-> SetLabelAngle (90); $ gráfico-> legenda-> SetPos (0,5, 0,08, 'center', 'top'); // Cria a primeira linha $ p1 =new LinePlot ($ parameter1); $ graph-> Add ($ p1); $ p1-> SetColor ("# 6495ED"); $ p1-> SetLegend ('your_parameter1'); $ graph-> yscale-> SetGrace (0); // Cria a segunda linha $ p2 =new LinePlot ($ parameter2); $ graph-> Add ($ p2); $ p2 -> SetColor ("# B22222"); $ p2-> SetLegend ('your_parameter2'); $ graph-> yscale-> SetGrace (0); $ graph-> legend-> SetFrameWeight (1); // Linha de saída $ gráfico-> Stroke ();?> 
Site de script conectar PHP
Usamos isso para salvar dados no banco de dados
 "; echo "parâmetro1". $ _GET ['parâmetro1']. "
"; echo "parâmetro2". $ _GET ['parâmetro2']. "
"; // Criar conexão $ conn =mysqli_connect ($ servername, $ username, $ password, $ dbname); // Verificar conexãoif (! $ conn) {die ("Connection failed:". mysqli_connect_error () );} $ sql ="INSERT INTO estufa (nome, parâmetro1, parâmetro2) VALORES ('". $ nome. "', '". $ parâmetro1. "', '". $ parâmetro2. "')"; if ( mysqli_query ($ conn, $ sql)) {echo "Novo registro criado com sucesso";} else {echo "Erro:". $ sql. "
". mysqli_error ($ conn);} mysqli_close ($ conn);?>
Criar tabela SQL
Usamos este script para criar a tabela
 CREATE TABLE IF NOT EXISTS `estufa` (` id` int (11) NOT NULL, `data` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,` temp` float NOT NULL, `umid` flutuante NOT NULL) ENGINE =MyISAM DEFAULT CHARSET =utf8; 
Greenhouse Domotic Master C / C ++
Este é o código do Mestre
 / * Projeto Estufa Automação * // * Autores:Antonio La Mura, Umberto Festa * // * Data:03/03/2016 * // * Nossa ideia é permitir que usuários, que comprem frutas e hortaliças cultivadas em estufas, para saber exatamente todas as etapas do plantio que os produtos já tiveram, como o uso de fertilizantes químicos e outros produtos semelhantes. Um código QR será colocado nos produtos vendidos que serão lidos por um aplicativo específico para smartphone. Ele fornece informações sobre as condições ambientais onde os produtos foram cultivados e os produtos químicos usados. O sistema de monitoramento automático em estufas é composto por sensores que fazem a leitura dos dados do ambiente e atuadores, chamados de escravos. Eles se comunicam via Wireless com um dispositivo central, denominado Master. Este último envia possíveis alterações para escravos (como alteração de limiares) e dados via WiFi para o servidor da web também. Quando o produto está pronto para ser vendido, a geração do código QR é solicitada ao webservice e ele será colocado na embalagem. A última parte do sistema é o aplicativo móvel responsável pela leitura dos códigos QR e mostra as informações relativas ao usuário. * // * Mestre * // * DEVO AGGIUNGERE SOLO LA PARTE CHE MI SERVE PER RICEVERE LE NUOVE SOGLIE CHE VENGONO INVIATE DALL'APP * // * Bibliotecas usadas * / # incluem  #include  #include  #include  #include  / * Variáveis ​​para conexão * / char ssid [] ="SSID"; / * SSID da sua rede (nome) * / char pass [] ="pass"; / * Sua senha de rede (use para WPA, ou use como chave para WEP) * / int keyIndex =0; / * Seu número de índice de chave de rede (necessário apenas para WEP) * / char ssid_ap [] ="Arduino"; / * Nome do AP criado * / char pass_ap [] =""; / * (Ainda sem suporte) * / int status =WL_IDLE_STATUS; unsigned int localPort =2390; / * Porta local para escutar * / char server [] ="www.cormaz.altervista.org"; / * Endereço de nome para Google (usando DNS) * / WiFiServer server_ap (80); WiFiClient client_ap; WiFiUDP Udp; RTCZero rtc; WiFiClient client; char packetBuffer [255]; / * Buffer para conter o pacote de entrada * / char ReplyBuffer [255]; / * Uma string para enviar de volta * // * Variáveis ​​para novos limites * / float humax =0; float humin =0; float tumax =0; float tumin =0; / * Funciona como ponto de acesso (flag =false), conecta to WebServer (flag =true) * / boolean flag =false; boolean threeshold_available =false; void setup () {/ * Inicializar serial e esperar a porta abrir:* / Serial.begin (9600); while (! Serial) {; / * Aguarde a conexão da porta serial. Necessário apenas para porta USB nativa * /} Serial.println ();} void loop () {int packetSize; temperatura dupla; zumbido duplo; int id; byte crc; String strURL; // Verifique a presença do escudo:/ *************************************** ***********************************************/ E se ( WiFi.status () ==WL_NO_SHIELD) {Serial.println ("Proteção WiFi não presente"); / * Não continue:* / while (true); } / ************************************************ *****************************************/ // Tentativa de conexão à rede WiFi:/ * *************************************************** ************************************ / while (status! =WL_CONNECTED) {Serial.print ("Criando Rede chamada:"); Serial.println (ssid_ap); / * Conecte-se à rede WPA / WPA2. Altere esta linha se estiver usando rede aberta ou WEP:* / status =WiFi.beginAP (ssid_ap); / * Aguarde 10 segundos pela conexão:* / delay (10000); server_ap.begin (); } Serial.println ("Conectado a wi-fi"); / ************************************************** ************************************** / // Iniciar comunicação UDP / ****** *************************************************** ******************************** / Udp.begin (localPort); printWifiStatus (); client_ap =server_ap.available (); if (client_ap) {/ * Se você obtiver um cliente * / / * Estou aguardando algumas informações * / Serial.println ("novo cliente"); / * Imprimir uma mensagem pela porta serial * / / * Se houver dados disponíveis, leia um pacote * / packetSize =Udp.parsePacket (); if (packetSize) {Serial.print ("Tamanho de pacote recebido"); Serial.println (packetSize); Serial.print ("De"); IPAddress remoteIp =Udp.remoteIP (); Serial.print (remoteIp); Serial.print (", porta"); Serial.println (Udp.remotePort ()); / * Ler o pacote em packetBuffer * / int len ​​=Udp.read (packetBuffer, 255); if (len> 0) packetBuffer [len] =0; Serial.println ("Conteúdo:"); Serial.println (packetBuffer); comando char * =strtok ((char *) packetBuffer, ";"); contagem interna =0; while (command! =0) {/ * Divide as informações * / switch (count) {case 0:id =atoi (command); pausa; caso 1:temp =atof (comando) / 10; pausa; caso 2:hum =atof (comando) / 10; pausa; } comando =strtok (0, ";"); contagem ++; } Serial.print ("Pacote recebido de"); Serial.print (id); Serial.print ("T:"); Serial.print (temp, 1); Serial.print ("H:"); Serial.println (hum, 1); / ************************************************** ************************************** / atraso (20); / * Calcule o CRC-8, então crie a matriz de bytes * / / *********************************** *********************************************** / byte bhmax =( byte) humax; byte bhmin =(byte) humina; 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) humina, (int) tumax, (int) tumin, (int) crc); / * Envia uma resposta, para o endereço IP e porta que nos enviou o pacote que recebemos * / Udp.beginPacket (Udp.remoteIP (), Udp.remotePort ()); Udp.write (ReplyBuffer); Udp.endPacket (); }} / * Imprima no monitor serial * / / * Feche a conexão:* / client_ap.stop (); Serial.println ("cliente desconectado"); flag =true; } / * Fine AP * / / ****************************************** ********************************************* // * Conecte-se ao servidor e envie dados para o DataBase * / / *********************************************** ********************************** / if (flag ==true) {/ * Tentativa de conexão à rede Wifi :* / while (status! =WL_CONNECTED) {Serial.print ("Tentando conectar ao SSID:"); Serial.println (ssid); / * Conecte-se à rede WPA / WPA2. Altere esta linha se estiver usando rede aberta ou WEP:* / status =WiFi.begin (ssid, pass); / * Aguarde 10 segundos pela conexão:* / delay (10000); } Serial.println ("Conectado a wi-fi"); printWifiStatus (); strURL ="GET /YourAddress.php?id="; strURL + =id; strURL + ="&parâmetro1 ="; strURL + =temp; strURL + ="&parâmetro2 ="; strURL + =zumbido; strURL + ="HTTP / 1.1"; Serial.println ("\ nIniciando conexão com o servidor ..."); // se você obtiver uma conexão, reporte via serial:if (client.connect (server, 80)) {Serial.println ("conectado ao servidor"); // Faça uma solicitação HTTP:client.println (strURL); client.println ("Host:www.cormaz.altervista.org"); client.println ("Conexão:fechar"); client.println (); client.stop (); Serial.println ("Ok!"); } / * Se o servidor estiver desconectado, pare o cliente:* / if (! Client.connected ()) {Serial.println (); Serial.println ("Desconectando do servidor."); client.stop (); / * Não fazer nada para sempre:* / while (true); } flag =false; } / ************************************************ ********************************** /} / * Calcule o algoritmo CRC-8 - baseado nas fórmulas Dallas / Maxim * / byte CRC8 (const byte * data) {byte crc =0x00; while (* dados) {extrato de byte =* dados ++; para (byte tempI =8; tempI; tempI--) {byte soma =(crc ^ extrair) &0x01; crc>> =1; if (soma) {crc ^ =0x8C; } extrair>> =1; }} return crc;} void printWifiStatus () {/ * Imprime o SSID da rede à qual você está conectado:* / Serial.print ("SSID:"); Serial.println (WiFi.SSID ()); / * Imprime o endereço IP do seu escudo WiFi:* / IPAddress ip =WiFi.localIP (); Serial.print ("Endereço IP:"); Serial.println (ip); / * Imprime a intensidade do sinal recebido:* / long rssi =WiFi.RSSI (); Serial.print ("intensidade do sinal (RSSI):"); Serial.print (rssi); Serial.println ("dBm");} 
Greenhouse Domotic Slave C / C ++
Este é o código do Slave
 / * Projeto Estufa de automação * // * Autores:Antonio La Mura, Umberto Festa * // * Data:21/03/2016 * // * Nossa ideia é permitir que usuários, que comprem frutas e hortaliças cultivadas em estufas, para saber exatamente todas as etapas do plantio que os produtos já tiveram, como o uso de fertilizantes químicos e outros produtos semelhantes. Um código QR será colocado nos produtos vendidos que serão lidos por um aplicativo específico para smartphone. Ele fornece informações sobre as condições ambientais onde os produtos foram cultivados e os produtos químicos usados. O sistema de monitoramento automático em estufas é composto por sensores que fazem a leitura dos dados do ambiente e atuadores, chamados de escravos. Eles se comunicam via Wireless com um dispositivo central, denominado Master. Este último envia possíveis alterações para escravos (como alteração de limiares) e dados via WiFi para o servidor da web também. Quando o produto está pronto para ser vendido, a geração do código QR é solicitada ao webservice e ele será colocado na embalagem. A última parte do sistema é o aplicativo móvel responsável pela leitura dos códigos QR e mostra as informações relativas ao usuário. * // * Slave * // * Bibliotecas utilizadas * / # include  #include  #include  #include  #include  // Definir todos os PINs # 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 // Tempo de retardo entre etapas // Variável para redefinir millis () extern unsigned long timer0_millis; int status =WL_IDLE_STATUS; char ssid [] ="Arduino"; // SSID da sua rede (nome) char pass [] =""; // sua senha de rede (use para WPA, ou use como chave para WEP) int keyIndex =0; // o número do índice da sua chave de rede (necessário apenas para WEP) unsigned int localPort =2390; // porta local para escutar onchar packetBuffer [255]; // buffer para conter packetWiFiUDP Udp; // Definir DHT22DHT22 myDHT22 (DHT22_PIN); // Variável para enviarfloat hmin =0; float hmax =0; float tmin =0; float tmax =0; int duty_motor =0; float umidade; temperatura flutuante; // Variável a enviar a cada 10 segundosintervalo longo sem sinal =600000; void setup () {Serial.begin (9600); while (! Serial) {; // aguarde a conexão da porta serial. Necessário apenas para a porta USB nativa} // Inicializar PIN (INPUT - OUTPUT) pinMode (HEATER, OUTPUT); digitalWrite (HEATER, LOW); pinMode (HUMIDIFIER, OUTPUT); digitalWrite (HUMIDIFICADOR, BAIXO); // Configura o PIN para o pinMode do ventilador (IN_1, OUTPUT); pinMode (IN_2, OUTPUT); pinMode (INH_1, SAÍDA); pinMode (INH_2, SAÍDA); // Reset reset_ports (); digitalWrite (INH_1, 1); digitalWrite (INH_2, 1); Serial.println ("Começando ..."); delay (2000);} void loop () {// se houver dados disponíveis, leia um pacote int packetSize =Udp.parsePacket (); longo tempo sem sinal =milis (); currentMillis longo sem sinal =millis (); DHT22_ERROR_t errorCode; int i =0; nome do char [] ="clie1"; umidade =myDHT22.getHumidity () * 10; temperatura =myDHT22.getTemperatureC () * 10; char toSend [32]; errorCode =myDHT22.readData (); byte crc; int crc_ric; // Verifique os erros do sensor de umidade e temperatura DHT22 / ***************************************** ***************************************** / switch (errorCode) {case DHT_ERROR_NONE:char buf [128]; sprintf (buf, "Leitura somente de número inteiro:Temperatura% hi.% 01hi C, Umidade% i.% 01i %% RH", myDHT22.getTemperatureCInt () / 10, abs (myDHT22.getTemperatureCInt ()% 10), myDHT22. getHumidityInt () / 10, myDHT22.getHumidityInt ()% 10); pausa; case DHT_ERROR_CHECKSUM:break; case DHT_BUS_HUNG:break; caso DHT_ERROR_NOT_PRESENT:quebra; caso DHT_ERROR_ACK_TOO_LONG:quebra; case DHT_ERROR_SYNC_TIMEOUT:break; case DHT_ERROR_DATA_TIMEOUT:break; case DHT_ERROR_TOOQUICK:break; } / ************************************************ ********************************* / // Imprime os valores, quando muda / ******* *************************************************** ************************* / if (umidade! =myDHT22.getHumidity () * 10 || temperatura! =myDHT22.getTemperatureC () * 10) { Serial.print ("T:"); Serial.print (myDHT22.getTemperatureC (), 1); Serial.print ("C"); Serial.print ("H:"); Serial.print (myDHT22.getHumidity (), 1); Serial.println ("%"); } / ************************************************ ********************************* / // Enviar os parâmetros a cada 10 minutos / ******** *************************************************** *********************** / if (millis ()> intervalo) {// Conexão com AP / ************ *************************************************** ****************** / // verificar a presença do escudo:if (WiFi.status () ==WL_NO_SHIELD) {Serial.println ("escudo WiFi não presente "); // não continue:while (true); } // tentativa de conexão à rede Wifi:while (status! =WL_CONNECTED) {Serial.print ("Tentando conectar ao SSID:"); Serial.println (ssid); // Conecte-se à rede WPA / WPA2. Altere esta linha se estiver usando rede aberta ou WEP:status =WiFi.begin (ssid); // aguarde 10 segundos pela conexão:delay (10000); } Serial.println ("Conectado a wi-fi"); / ************************************************** ********************************* / Serial.println ("\ n Iniciando conexão com o servidor ..."); // se você obtiver uma conexão, reporte via serial:Udp.begin (localPort); snprintf (toSend, sizeof (toSend), "% s;% d;% d", nome, umidade (int), temperatura (int)); // envia uma resposta, para o endereço IP e porta que nos enviou o pacote que recebemos Udp.beginPacket (Udp.remoteIP (), Udp.remotePort ()); Udp.write (toSend); Udp.endPacket (); Serial.println ("Envio concluído"); resetMillis (); enquanto (millis () <10000) {packetSize =Udp.parsePacket (); if (packetSize) {/ * Ler o pacote em packetBuffer * / int len ​​=Udp.read (packetBuffer, 255); if (len> 0) packetBuffer [len] =0; Serial.println ("Conteúdo:"); Serial.println (packetBuffer); comando char * =strtok ((char *) packetBuffer, ";"); contagem interna =0; while (command! =0) {/ * Divida as informações * / switch (count) {case 0:snprintf (name, sizeof (name), "% s", command); pausa; caso 1:hmax =atof (comando) / 10; // atof (char *) mi converte un tipo char * in double break; caso 2:hmin =atof (comando) / 10; pausa; caso 3:tmax =atof (comando) / 10; pausa; caso 4:tmin =atof (comando) / 10; pausa; caso 5:crc_ric =atoi (comando); pausa; } comando =strtok (0, ";"); contagem ++; } Serial.print ("Resposta:"); Serial.print (nome); 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 recebido:"); Serial.println (crc_ric); // calculo CRC-8, e obtenho a matriz de 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) {// Salvar na EEPROM EEPROM_writeDouble (0, tmax); EEPROM_writeDouble (4, tmin); EEPROM_writeInt (8, hmax); EEPROM_writeInt (10, hmin); }}} atraso (10); } / ************************************************ ********************************** / WiFi.disconnect (); // Gerencia o HUMIDIFICADOR, AQUECEDOR e o ventilador de acordo com o valor do sensor / ************************************ *************************************************** * / // HEATER if (myDHT22.getTemperatureC ()> =tmax) {digitalWrite (HEATER, HIGH); } if (myDHT22.getTemperatureC () <=tmin + 1) {digitalWrite (HEATER, LOW); } // HUMIDIFICADOR if ((int) myDHT22.getHumidity ()> =hmax) {digitalWrite (HUMIDIFIER, HIGH); } if ((int) myDHT22.getHumidity () <=hmin + 1) {digitalWrite (HUMIDIFIER, LOW); } // Ventilador, motor sem escova if (myDHT22.getTemperatureC ()> =tmax + 4) {// Rotação do motor de acordo com a temperatura, serviço -> 0 por t =tmax + 4 e serviço -> 100 por t> tmax + 10 // Rotação do motor na variação da temperatura, dever -> 0 por t =tmax + 4 e dever -> 100 por 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); atraso (TCONST); } if (myDHT22.getTemperatureC () <=(tmax + tmin) / 2) {reset_ports (); // Rotação do motor de acordo com a temperatura, regime -> 0 por t =tmax + 4 e regime -> 255 por t> tmax + 10 duty_motor =0; analogWrite (IN_2, duty_motor); atraso (TCONST); } / ************************************************ *************************************** / delay (1000);} // Salvar o dobro em EEPROMvoid EEPROM_writeDouble (int ee, valor duplo) {byte * p =(byte *) (vazio *) &valor; for (int i =0; i > =1; if (soma) {crc ^ =0x8C; } extrair>> =1; }} return crc;} // Ele usa para redefinir millis () void resetMillis () {cli (); timer0_millis =0; sei ();} 
getdati PHP
Usamos isso para conectar nosso aplicativo com o banco de dados
 "; // selecione um banco de dados para trabalhar com $ selected =mysql_select_db ("serra", $ dbhandle) ou die ("Não foi possível selecionar exemplos"); $ datada =$ _GET ["datada"]; $ dataa =$ _GET ["dataa"]; // executa a consulta SQL e retorna os registros $ result =mysql_query ("SELECT hum, temp, date FROM registro WHERE date> =' ". $ datada." 'and date <=' ". $ dataa." '"); $ records =array (); // busca os dados do banco de dados enquanto ($ row =mysql_fetch_array ($ result)) {$ tmp =array ("hum" => $ row {'hum'}, "temp" => $ row {'temp'}, "data" => $ row {'data'}); array_push ($ registros, $ tmp); // echo "HUM:". $ row {'hum'}. "TEMP:". $ row {'temp'}. "Date:". // exibe os resultados $ row {'date'}. "
";} echo json_encode ($ records); // fecha o connectionmysql_close ($ dbhandle);?>
App GrenHouse
Na primeira página você deve definir a data usando dois DatePicker. Ao pressionar o botão "GRAPHIC", ele faz uma chamada HTTP GET para o script PHP "getdati" enviando os parâmetros e a data que você escolheu. Em seguida, ele recebe o JSON e o decodifica, após criar o gráfico usando a biblioteca GraphViewhttps://github.com/cormaz/app_greenhouse.git

Esquemas

Conexão:Arduino UNO - DHT22 - Relé

Processo de manufatura

  1. Animação de bitmap em ILI9341 TFT Touchscreen Display Shield
  2. Controlador DMX operado pela web
  3. Arduino Spybot
  4. FlickMote
  5. TV B-Gone caseiro
  6. Relógio mestre
  7. HSVClock
  8. Brinquedo controlado pelo Android usando Raspberry Motor Shield
  9. Encontre-me
  10. Arduino Power