O modelo de interface para a "casa inteligente" no Arduino - a terceira parte

imagem




Para entender, você deve ler o tópico anterior .

Olá.

Nesta parte, a aparência será ligeiramente alterada e um sensor de temperatura (e umidade) será adicionado, de modo que, dependendo da temperatura, o fogão ou o ar-condicionado esteja ligado, além de outra função muito útil ser implementada ...
Como nossa interface da Web solicita continuamente dados de arduinos, Não é supérfluo enviá-lo para o "modo de suspensão" para não interferir com outros clientes.

Onlain ... DHT22

medirá temperatura e umidade.

imagem

Arduin


Código do firmware:
#include <EEPROM.h>
#define MAXMILLIS 4294967295
#include "DHT.h"
#define DHTPIN 9 //    
#define DHTTYPE DHT22  
DHT dht(DHTPIN, DHTTYPE);

int hum = 110; // 
int thum = 110; // 

byte d2 = EEPROM.read(2);     //  ( )   EEPROM,  
byte d3 = EEPROM.read(3);
byte d4 = EEPROM.read(4);
int shim1 = EEPROM.read(5); //     EEPROM,  
int shim2 = EEPROM.read(6);
byte d7 = 0; 
byte d8 = 0;
byte d11 = EEPROM.read(11);
byte d12 = EEPROM.read(12);
byte d13 = EEPROM.read(13);

int oxlagdenie = EEPROM.read(14); //     
int toxl = EEPROM.read(15); //  

int podogrev = EEPROM.read(16); //     
int tpod = EEPROM.read(17); //  

byte descript[5]; // 

unsigned long   time; // 

long timelapsed = 0;

byte count=0; //  

void setup() 
{
  Serial.begin(57600);
  pinMode(2, OUTPUT); 
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT); // 
  pinMode(6, OUTPUT); // 
  pinMode(7, OUTPUT); // 
  pinMode(8, OUTPUT); //  
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  
  thum = dht.readTemperature(); //  ,     ,        
  hum = dht.readHumidity(); //  
  
  if(d2) digitalWrite(2, HIGH); else digitalWrite(2, LOW); //    d2  ,  ,  ,   
  delay(500); //     ,  
  if(d3) digitalWrite(3, HIGH); else digitalWrite(3, LOW);
  delay(500);
  if(d4) digitalWrite(4, HIGH); else digitalWrite(4, LOW);
  delay(500);
  analogWrite(5, shim1 * 2.55); //   d5
  delay(500);
  analogWrite(6, shim2 * 2.55); //   d6
  delay(500);
  if(d11) digitalWrite(11, HIGH); else digitalWrite(11, LOW);
  delay(500);
  if(d12) digitalWrite(12, HIGH); else digitalWrite(12, LOW);
  delay(500);
  if(d13) digitalWrite(13, HIGH); else digitalWrite(13, LOW);
}
  
void loop() 
{  
  if (Serial.available()>4) //     
   {
    if (Serial.read()=='Y') //   ,   'Y',   ,  ,     
     {
      for (byte i=0; i < 5; i++)
        {
           descript[i] = Serial.read(); //       
        } 
        
    if((descript[0] =='+') && (descript[1] =='=') && (descript[2] =='Z')) //  
     {
      switch (descript[3])
       {
         case 'o': // 
         glavnaia(); //  
         break;
         
         //////////////  ///////////////////
         case 'A': // d2 
         digitalWrite(2, HIGH); //  d2
         d2 = 1; //     ()
         EEPROM.write(2, d2); //   d2   №2 EEPROM 
         glavnaia(); //  
         break;
         
         case 'a': // d2 
         digitalWrite(2, LOW); //  d2
         d2 = 0; //     ()
         EEPROM.write(2, d2); //   d2   №2 EEPROM 
         glavnaia(); //  
         break; 
 
         case 'B': // d3
         digitalWrite(3, HIGH);
         d3 = 1;
         EEPROM.write(3, d3);
         glavnaia();
         break;
         
         case 'b': // d3
         digitalWrite(3, LOW);
         d3 = 0;
         EEPROM.write(3, d3);
         glavnaia();
         break;          
  
         case 'C': // d4
         digitalWrite(4, HIGH);
         d4 = 1;
         EEPROM.write(4, d4);
         glavnaia();
         break;
         
         case 'c': // d4
         digitalWrite(4, LOW);
         d4 = 0;
         EEPROM.write(4, d4);
         glavnaia();
         break;   
         
         ///////////////  ///////////////
         case 'D': // d5  shim1
         shim1++;
         if(shim1 > 100) shim1 = 100;
         EEPROM.write(5, shim1);
         analogWrite(5, shim1 * 2.55);
         glavnaia();
         break;
         
         case 'd': // d5  shim1
         shim1--;
         if(shim1 < 1) shim1 = 0;
         EEPROM.write(5, shim1);
         analogWrite(5, shim1 * 2.55);
         glavnaia();
         break; 
  
         case 'E': // d6  shim2
         shim2++;
         if(shim2 > 100) shim2 = 100;
         EEPROM.write(6, shim2);
         analogWrite(6, shim2 * 2.55);
         glavnaia();
         break;
         
         case 'e': // d6  shim2
         shim2--;
         if(shim2 < 1) shim2 = 0;
         EEPROM.write(6, shim2);
         analogWrite(6, shim2 * 2.55);
         glavnaia();
         break;   
  
         case 'F': //     D5
         shim1 = EEPROM.read(5); //     EEPROM
         analogWrite(5, shim1 * 2.55); //   D5
         glavnaia();
         break;
         
         case 'f': //     D5
         shim1 = 0;
         analogWrite(5, shim1); //   D5,     EEPROM
         glavnaia();
         break;  
 
         case 'G': //     D6
         shim2 = EEPROM.read(6); //     EEPROM
         analogWrite(6, shim2 * 2.55); //   D6
         glavnaia();
         break;
         
         case 'g': //     D6
         shim2 = 0;
         analogWrite(6, shim2); //   D6,     EEPROM
         glavnaia();
         break;  
         
         //////////////// //////////////////
         case 'J': // d11
         digitalWrite(11, HIGH);
         d11 = 1;
         EEPROM.write(11, d11);
         glavnaia();
         break;
         
         case 'j': // d11
         digitalWrite(11, LOW);
         d11 = 0;
         EEPROM.write(11, d11);
         glavnaia();
         break;  
        
         case 'K': // d12
         digitalWrite(12, HIGH);
         d12 = 1;
         EEPROM.write(12, d12);
         glavnaia();
         break;
         
         case 'k': // d12
         digitalWrite(12, LOW);
         d12 = 0;
         EEPROM.write(12, d12);
         glavnaia();
         break;         
      
         case 'M': // d13
         digitalWrite(13, HIGH);
         d13 = 1;
         EEPROM.write(13, d13);
         glavnaia();
         break;
         
         case 'm': // d13
         digitalWrite(13, LOW);
         d13 = 0;
         EEPROM.write(13, d13);
         glavnaia();
         break;
         
         //////////////  /////////////////
         case 'N': //  "  "
         oxlagdenie++; //  "  "  ,       
         EEPROM.write(14, oxlagdenie); //    
         toxl = 1; //  
         EEPROM.write(15, toxl); //    
         glavnaia();
         break;
         
         case 'n': //  "  "
         oxlagdenie--;
         if(oxlagdenie < 1) //  "  " = 0,   
            {
               oxlagdenie = 0; //  ,    
               toxl = 0; //  
               EEPROM.write(14, oxlagdenie); //    
               EEPROM.write(15, toxl); //    
               digitalWrite(7, LOW); // 
               d7 = 0; 
            }
         glavnaia();
         break;  
  
         //////////////  /////////////////
         case 'P': //  "  "
         podogrev++; //  "  "  ,       
         EEPROM.write(16, podogrev); //    
         tpod = 1; //  
         EEPROM.write(17, tpod); //    
         glavnaia();
         break;
         
         case 'p': //  "  "
         podogrev--;
         if(podogrev < 1) //  "  " = 0,   
            {
               podogrev = 0; //  ,    
               tpod = 0; //  
               EEPROM.write(16, podogrev); //    
               EEPROM.write(17, tpod); //    
               digitalWrite(8, LOW); // 
               d8 = 0; 
            }
         glavnaia();
         break;  
  
         default:
         glavnaia();
       }
     }
   
    else //   ,   
      {
        for(byte i=0; i < 255; i++) 
         {
           Serial.read();    
         } 
      } 
     }    //  if (Serial.read()=='Y')
   }    //   
 
 
 unsigned long currtime = millis(); 
 
 if(currtime > time) timelapsed = (currtime - time); 
 
 else timelapsed = (MAXMILLIS - time + currtime);

 if(timelapsed >= 120000)  //      2 
   { 
     time = currtime;
     count++;
     //      ~ 250  (    ),      ,     
     if(count == 1)  thum = dht.readTemperature(); //  .   = 250 .
     if(count == 2)  hum = dht.readHumidity(); //  ,   ,   .   = 250 
     if(count > 1) count=0;
 
   ///////////////////////  ///////////////////////   
       if((thum > oxlagdenie) && (toxl == 1)) //        = 1,    (  = 0,    )
         {                                  
           digitalWrite(7, HIGH); //                          
           d7 = 1;                          
         }
   
       else if(toxl == 1) //      = 1,                                      
         {
           digitalWrite(7, LOW); //    
           d7 = 0;
         }  
        
   ///////////////////////  ////////////////////////
       if((thum < podogrev) && (tpod == 1)) //        = 1,    (  = 0,    )  
         {                                
           digitalWrite(8, HIGH); //                        
           d8 = 1;                       
         }
   
       else if(tpod == 1) //      = 1,   
         {
           digitalWrite(8, LOW); //   
           d8 = 0;
         }
         
   } //    
   
 } //  loop

void glavnaia() //  
 {
      Serial.print(d2);//0
      Serial.print(",");
      Serial.print(d3);//1
      Serial.print(",");
      Serial.print(d4);//2
      Serial.print(",");
      Serial.print(0);//3  //   ,   
      Serial.print(",");
      Serial.print(0);//4  //   ,   
      Serial.print(",");
      Serial.print(d7);//5 
      Serial.print(",");
      Serial.print(d8);//6 
      Serial.print(",");
      Serial.print(0);//7  //   ,   
      Serial.print(",");
      Serial.print(0);//8 //   ,   
      Serial.print(",");
      Serial.print(d11);//9
      Serial.print(",");
      Serial.print(d12);//10
      Serial.print(",");
      Serial.print(d13);//11 
      Serial.print(",");
      Serial.print(shim1); // 12 
      Serial.print(",");
      Serial.print(shim2); // 13 
      Serial.print(",");
      Serial.print(thum); // 14 //
      Serial.print(",");
      Serial.print(hum); // 15 // 
      Serial.print(",");
      Serial.print(oxlagdenie);//16 
      Serial.print(",");
      Serial.println(podogrev);//17 ,  18   
 }





Biblioteca DHTsensor .

Pesquisa DHT22

Dentro do DHT22 existem dois sensores, temperatura e umidade. Cada tempo de leitura é de 250 ms, ou seja, durante a pesquisa (dht.readTemperature), todo o programa é "desligado" e a troca de dados com o arduino é impossível.
Com base nisso, interrogaremos os sensores por vez, com um intervalo de 2 minutos.

...
 if(timelapsed >= 120000) //      2 
   {  
     time = currtime;
     count++;
     //      ~ 250  (    ),      ,     
     if(count == 1)  thum = dht.readTemperature(); //  .   = 250 .
     if(count == 2)  hum = dht.readHumidity(); //  ,   ,   .   = 250 
     if(count > 1) count=0;
... 


Os sensores serão pesquisados ​​apenas dois minutos após o início do programa, portanto, é necessário obter dados pela primeira vez na função de configuração nula ()

...
  thum = dht.readTemperature(); //  ,     ,         
  hum = dht.readHumidity(); //  
...  


Ligar os dispositivos de acordo com a temperatura do

Arduin liga o ar condicionado (ou ventilador) se a temperatura ambiente subir acima da temperatura definida e também liga o aquecedor se a temperatura cair abaixo da temperatura definida.

A verificação da necessidade de ativar / desativar ocorre (também uma vez a cada dois minutos) imediatamente após a pesquisa do sensor.

...
 if(timelapsed >= 120000) //      2 
   {  
     time = currtime;
     count++;
     //      ~ 250  (    ),      ,     
     if(count == 1)  thum = dht.readTemperature(); //  .   = 250 .
     if(count == 2)  hum = dht.readHumidity(); //  ,   ,   .   = 250 
     if(count > 1) count=0;
 
   ///////////////////////  ///////////////////////   
       if((thum > oxlagdenie) && (toxl == 1)) //        = 1,    (  = 0,    )
         {                                  
           digitalWrite(7, HIGH); //                          
           d7 = 1;                          
         }
   
       else if(toxl == 1) //      = 1,                                      
         {
           digitalWrite(7, LOW); //    
           d7 = 0;
         }  
        
   ///////////////////////  /////////////////////////
       if((thum < podogrev) && (tpod == 1)) //        = 1,    (  = 0,    )  
         {                                
           digitalWrite(8, HIGH); //                        
           d8 = 1;                       
         }
   
       else if(tpod == 1) //      = 1,   
         {
           digitalWrite(8, LOW); //   
           d8 = 0;
         }
         
   } //      


Se a temperatura ambiente (thum) subir acima da temperatura definida (oxlagdenie), o ar condicionado ligará e, quando cair abaixo, será desligado.

A temperatura para ligar o ar condicionado é definida nestes blocos:


         //////////////  /////////////////
         case 'N': //  "  "
         oxlagdenie++; //  "  "  ,       
         EEPROM.write(14, oxlagdenie); //    
         toxl = 1; //  
         EEPROM.write(15, toxl); //    
         glavnaia();
         break;
         
         case 'n': //  "  "
         oxlagdenie--;
         if(oxlagdenie < 1) //  "  " = 0,   
            {
               oxlagdenie = 0; //  ,    
               toxl = 0; //  
               EEPROM.write(14, oxlagdenie); //    
               EEPROM.write(15, toxl); //    
               digitalWrite(7, LOW); // 
               d7 = 0; 
            }
         glavnaia();
         break;  


Ao receber o símbolo N , arduina aumenta o valor de oxlagdenie em um, define a bandeira do trabalho toxl = 1; e grava essas informações na EEPROM.
Após desenergizar e subsequente ligação, o sistema retornará à condição de trabalho.

Após o recebimento do símbolo n , arduina diminui o valor de oxlagdenie em um.
Se oxlagdenie for igual a zero, o sinalizador de toxinas será redefinido e a operação automática do ar condicionado será desligada.

O aquecimento é organizado da mesma maneira.

Gerenciamento

Baixe o arquivo ( github ) e descompacte-o na pasta de trabalho do servidor -/ var / www / knoppolztemp /

Para maior clareza, abra o arquivo index.html do arquivo:

Pressionando “Buttons”, “Dimmer” e “Temp” abre / fecha os painéis correspondentes com os controles.

imagem


Vá para o seu_ router / knoppolztemp / e clique no botão " Tempo ".

imagem


Os botões esquerdo + e - são responsáveis ​​pelo “resfriamento”, os botões direito pelo “aquecimento”.

Defina a temperatura de “início de resfriamento” (19`C) abaixo da temperatura ambiente (20`C) e aguarde.
Quando a função funciona:

if(timelapsed >= 120000) //      2   


O resfriamento será ativado e o sinal de mais no botão ficará vermelho.

Com o aquecimento, tudo é igual, apenas a temperatura de “aquecimento ligado” (17`C) deve ser ajustada mais alta.

O modo de hibernação A

página solicita constantemente dados dos arduins e a conexão paralela de outros clientes leva ao fato de que eles interferem entre si. Para evitar isso, desativaremos a atualização após algum tempo.

No arquivo index.html, no final da função de atualização ( função show () ), existem linhas:

...
slmode++;
if(slmode > 60) { /*   */
$(".pansl").show();
$("st").hide();
flagobnov = 0;
slmode = 0;
...  


Cada vez que a função show () é acionada , a variável slmode é incrementada em um. Ao atingir o valor especificado se (slmode> 60), a atualização será desativada e a tela fechará com um painel translúcido com o botão "INICIAR".

imagem


Clicar em Iniciar ativará a atualização e a contagem regressiva começará novamente.


$(".slip").click(function(){ /*    */

        $(".pansl").hide();
        flagobnov = 1;
        show();
}); 


Por enquanto é tudo, esse modelo pode ser usado para controlar uma casa de verão ou uma estufa.

Fonte adicionada no github .

All Articles