La plantilla de interfaz para el "hogar inteligente" en Arduino - la tercera parte

imagen




Para entender, debes leer el tema anterior .

Hola.

En esta parte, la apariencia cambiará ligeramente y se agregará un sensor de temperatura (y humedad), de modo que dependiendo de la temperatura se encienda la estufa o el aire acondicionado, así como se implemente otra función muy útil ...
Dado que nuestra interfaz web continuamente solicita datos de arduins, será No es superfluo enviarlo al "modo de suspensión" para no interferir con otros clientes.

Onlain ... DHT22

medirá la temperatura y la humedad.

imagen

Arduin


Código de 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 .

Encuesta DHT22

Dentro del DHT22 hay dos sensores, temperatura y humedad. Cada tiempo de lectura es de 250 ms, es decir, durante el sondeo (dht.readTemperature), todo el programa se "cuelga" y el intercambio de datos con el arduino es imposible.
En base a esto, interrogaremos a los sensores a su vez, con un 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;
... 


Los sensores se sondearán solo dos minutos después de que comience el programa, por lo que debe obtener datos por primera vez en la función de configuración vacía ()

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


Al

encender los dispositivos de acuerdo con la temperatura de Arduin , se encenderá el aire acondicionado (o el ventilador) si la temperatura ambiente sube por encima de la temperatura establecida, y también se encenderá el calentador si la temperatura cae por debajo de la temperatura establecida.

Se verifica la necesidad de habilitar / deshabilitar (también una vez cada dos minutos) inmediatamente después de sondear el 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;
         }
         
   } //      


Si la temperatura ambiente (thum) sube por encima de la temperatura establecida (oxlagdenie), el aire acondicionado se encenderá y, cuando baje, se apagará.

La temperatura para encender el aire acondicionado se establece en estos bloques:


         //////////////  /////////////////
         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;  


Al recibir el símbolo N , arduina aumenta el valor de oxlagdenie en uno, establece la bandera de trabajo toxl = 1; y escribe esta información en EEPROM.
Después de desenergizar y encender posteriormente, el sistema volverá a funcionar.

Al recibir el símbolo n , arduina disminuye el valor de oxlagdenie en uno.
Si oxlagdenie es igual a cero, la bandera de toxl se reiniciará y se apagará el funcionamiento automático del aire acondicionado.

La calefacción se organiza de la misma manera.

Gestión

Descargue el archivo ( github ) y descomprímalo en la carpeta de trabajo del servidor:/ var / www / knoppolztemp /

Para mayor claridad, abra el archivo index.html del archivo:

Al presionar los "Botones", "Atenuador" y "Temp" se abren / cierran los paneles correspondientes con controles.

imagen


Vaya a su_enrutador / knoppolztemp / y haga clic en el botón " Tempo ".

imagen


Los botones izquierdos + y - son responsables de "enfriamiento", los botones derechos para "calentamiento".

Ajuste la temperatura de "inicio de enfriamiento" (19`C) por debajo de la temperatura ambiente (20`C) y espere.
Cuando la función funciona:

if(timelapsed >= 120000) //      2   


El enfriamiento se encenderá y el signo más en el botón se volverá rojo.

Con la calefacción, todo es igual, solo la temperatura de "calefacción encendida" (17`C) debe ajustarse más alta.

El modo de hibernación La

página solicita constantemente datos de los arduins, y la conexión paralela de otros clientes conducirá al hecho de que interferirán entre sí. Para evitar esto, deshabilitaremos la actualización después de un tiempo.

En el archivo index.html, al final de la función de actualización ( función show () ) hay líneas:

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


Cada vez que se activa la función show () , la variable slmode se incrementa en uno. Al alcanzar el valor especificado if (slmode> 60), la actualización se apagará y la pantalla se cerrará con un panel translúcido con el botón "START".

imagen


Al hacer clic en Inicio, se habilitará la actualización y la cuenta regresiva comenzará nuevamente.


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

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


Eso es todo por ahora, esta plantilla se puede utilizar para controlar una casa de verano o un invernadero.

Fuente agregada en github .

All Articles