Internet de les coses amb ESP32 i ESP8266

Exemples Referència Plaques   Recursos CITCEA
Projectes Programació Perifèrics   Inici

Termòstat

Programa del grup 4

En aquest cas el microcontrolador funciona com a servidor. El programa del microcontrolador és el següent:

#include <Adafruit_NeoPixel.h>
#include <DHT.h>
#include <SPI.h>
#include <WiFiNINA.h>
#define LED 6 // pota on hem connectat el LED
#define DHTPIN 2
#define DHTTYPE DHT22
const char idXarxa[] = "xarxa-wifi";    // Nom del punt d'accés 
const char contrasenya[] = "contrasenya-wifi";    // Contrasenya de connexió 
float hum, temp, tempreal, tdeseada;
String temperatura, humitat, mode, pro, best, RESDO;
bool estat = LOW;
bool enviar = false;
int cont;
int intensidad = 20;
int status = WL_IDLE_STATUS;
WiFiServer server(80);
Adafruit_NeoPixel cadena = Adafruit_NeoPixel(3, 1, NEO_GRB + NEO_KHZ800);
DHT dht(DHTPIN, DHTTYPE);
void setup() {
    dht.begin();
    Serial.begin(9600);
    cadena.begin();
    cadena.show();
    pinMode(LED, OUTPUT);
    digitalWrite(LED, LOW);
    if (WiFi.status() == WL_NO_MODULE) {
        Serial.println("No s'ha trobat el dispositiu Wi-Fi");
        while (true);
    }
    String versio = WiFi.firmwareVersion();
    if (versio < "1.0.0") {
        Serial.println("Convindria actualitzar el firmware");
    }
    while (status != WL_CONNECTED) {
        Serial.print("Connectant a la xarxa ");
        Serial.println(idXarxa);
        status = WiFi.begin(idXarxa, contrasenya);
        delay(10000);
    }
    server.begin();
    Serial.print("Connectat a ");
    Serial.println(WiFi.SSID());
    Serial.print("Estat de la connexió: ");
    Serial.println(WiFi.status());
    Serial.print("Adreça IP del dispositiu: ");
    Serial.println(WiFi.localIP());
    Serial.print("Intensitat del senyal: ");
    Serial.print(WiFi.RSSI());
    Serial.println(" dBm");
    Serial.println();
    Serial.print("Ja pots fer la teva connexió al dispositiu ");
    Serial.println(WiFi.localIP());
}
void loop() {
    float hum = dht.readHumidity();
    float temp = dht.readTemperature();
    tempreal = temp;
    if (estat==HIGH){
        temp=temp-1;  //HISTERESIS   
    }
    if (mode == "confort") {
        if (temp <19) {
            estat = HIGH;
            digitalWrite(LED, estat);
        } else{
            estat=LOW;
            digitalWrite(LED, estat);
        }
    }
    if (mode == "noche") {
        if (temp < 15) {
            estat = HIGH;
            digitalWrite(LED, estat);                        
        } else {
            estat=LOW;
            digitalWrite(LED, estat);
        }
    }
    if (mode == "invierno") {
        if (temp < 5) {
            estat = HIGH;
            digitalWrite(LED, estat);
        } else {
            estat = LOW;
            digitalWrite(LED, estat);
        }
    }
    if (mode == "perso") {
        if (temp < tdeseada) {
            estat = HIGH;
            digitalWrite(LED, estat);
        } else {
            estat = LOW;
            digitalWrite(LED, estat);
        }
    }
    if ((mode == "invierno") ||(mode== "noche")){ //apagar neopixel en modo noche y invierno
        cadena.setPixelColor(0, 0, 0, 0);
        cadena.show();
    }
    if ((mode == "")||(mode == "confort")||(mode =="perso")){
        int a = 0, v = 0, r = 0;
        byte p;
        if (tempreal < 19) {
            a = intensidad-((intensidad*4/5)/19)*tempreal;
            r = 0;
            v = 0;
        }
        if ((19 <= tempreal) && (tempreal <= 26)) {
            a = 0;
            v = intensidad - abs(((intensidad*4/5)/3.5)*(tempreal-22.5));
            r = 0;
        }
        if (tempreal > 26) {
            a = 0;
            v = 0;
            r = (intensidad/5) + ((intensidad*4/5)/9)*(tempreal-26);
        }
        cadena.setPixelColor(0, r, v, a); // R G B
        cadena.show();
        delay(1000);
    }
    if (status != WiFi.status()) {
        status = WiFi.status();
        if (status == WL_AP_CONNECTED) {
            Serial.println("Dispositiu connectat al punt d'accés");
        } else {
            Serial.println("El dispositiu s'ha desconnectat del punt d'accés");
        }
    }
    WiFiClient client = server.available();
    if (client) {
        Serial.println("Nou client");
        String peticio = "";
        while (client.connected()) {
            if (client.available()) {
                char c = client.read();
                Serial.write(c);
                if (c == '\n') {
                    if (peticio.length() == 0) {
                        enviar = true;
                        break;
                    } else {
                        if (peticio.indexOf("GET") != -1) {
                            if (peticio.indexOf("action_page") != -1) {
                                best = "";
                                for (int x = 0; x < peticio.length(); x++) {
                                    if (peticio[x] == '=') {
                                        best += peticio[x+1];
                                        if (peticio[x+2] != ' ') {
                                            best += peticio[x+2];
                                            if (peticio[x+3] != ' ') {
                                                best += peticio[x+3];
                                            }
                                        }    
                                    }
                                }
                                intensidad = best.toInt();
                            }
                            if (peticio.indexOf("LED=1") != -1) {
                                pro = "";
                                cont = 0;
                                for (int x = 0; x < peticio.length(); x++) {
                                    if (peticio[x] == '/') {cont++;}
                                    if (cont == 2 && peticio[x] != '/'){
                                        pro += peticio[x];
                                    }
                                }
                                tdeseada = pro.toFloat();
                                if (tdeseada < 1) {
                                    tdeseada = 1;
                                }
                                if (tdeseada > 26) {
                                    tdeseada = 26;
                                }
                                mode = "perso";
                                if (temp < tdeseada) {
                                    estat = HIGH;
                                    digitalWrite(LED, estat);
                                } else {
                                    estat = LOW;
                                    digitalWrite(LED, estat);
                                }
                            }
                            if (peticio.indexOf("actualizar") != -1){
                                mode = mode;
                            }
                            if (peticio.indexOf("LED=0") != -1){
                                estat = LOW;
                                digitalWrite(LED, estat);
                                mode = "";
                                cont = 0;
                            }
                            if (peticio.indexOf("invierno") != -1){
                                mode = "invierno";
                                cont = 0;
                                if (temp < 5) {
                                    estat = HIGH;
                                    digitalWrite(LED, estat);
                                } else {
                                    estat = LOW;
                                    digitalWrite(LED, estat);
                                }
                            }
                            if (peticio.indexOf("confort") != -1){
                                mode = "confort";
                                cont = 0;
                                if (temp <19) {
                                    estat = HIGH;
                                    digitalWrite(LED, estat);
                                } else{
                                    estat=LOW;
                                    digitalWrite(LED, estat);
                                }
                            }
                            if (peticio.indexOf("noche") != -1){
                                mode = "noche";
                                cont = 0;
                                if (temp < 15) {
                                    estat = HIGH;
                                    digitalWrite(LED, estat);                        
                                } else {
                                    estat=LOW;
                                    digitalWrite(LED, estat);
                                }
                            }
                        }
                        peticio = "";
                    }
                } else if (c != '\r') {
                    peticio += c;
                }
            }
        }
        if (enviar) {
            if (!(isnan(hum) || isnan(temp))) {
                temperatura = String(tempreal);
                humitat = String(hum);
                temperatura.replace('.', ',');
                humitat.replace('.', ',');
                RESDO = String(tdeseada);
                RESDO.replace('.', ',');
                client.println("HTTP/1.1 200 OK");
                client.println();
                client.println("<!DOCTYPE HTML>");
                client.println("<meta charset='UTF-8'>");
                client.println("<html>");
                client.println("<body style = 'text-align:center; background-color: lightblue'");
                client.println("<p></p>");
                client.println("<p></p>");
                client.println("<h1>Temperatura y humedad actuales</h1>");  // Bloque T y H
                client.println("<p></p>");
                client.println("<p></p>");
                client.print("<p>T = ");
                client.print(temperatura);
                client.println(" °C</p>");
                client.println("<p></p>");
                client.print("<p>H = ");
                client.print(humitat);
                client.println(" %</p>");
                client.println("<p></p>");
                client.println("<p></p>");
                client.print("<button type='button'>");
                client.println("<a href='/?actualizar'>Actualizar</a>");
                client.print("</button>");
                client.println("<p></p>");
                client.println("<p></p>");
                client.print("<h1>La calefacción está ");  // Estado calefacción            
                if(estat == HIGH) {
                    client.print("encendida</h1>");  
                }
                if(estat == LOW) {
                    client.print("apagada</h1>");
                }
                client.println("<p></p>");
                client.println("<p></p>");
                if (cont == 0){                 
                    client.print("<h1>Modo manual ");
                } else {
                    client.print("<h1>La caldera está encendida a ");
                    client.print(RESDO);
                    client.print("°C");
                }
                client.print("</h1>");
                client.println("<p></p>");
                client.println("<p></p>");
                client.print("<form>");
                client.print("<button type='button'>");
                client.print("<a onclick='myFunction()', id = 'url', href=''>Encender</a> ");
                client.print("</button> ");
                client.print("<input type = 'number', value = '19', id = 'T', max = '26', min = '1', ");
                client.print("step = '0.5', style = 'width:50px; height:15px; text-align:right'>");
                client.print(" °C  ");
                if (cont != 0){
                    if (pro.toFloat() > 26) {
                        client.print("<font color = 'red'>  *La máxima temperatura permitida es ");
                        client.print("de 26 °C.</font>");
                    }
                    if (pro.toFloat() < 1) {
                        client.print("<font color = 'red'>  *La mínima temperatura permitida es ");
                        client.print("de 1 °C.</font>");
                    }
                }
                client.print("</form>");
                client.println("<p></p>");
                client.print("<script>");
                client.print("function myFunction() {");
                client.print("var x = '/?LED=1/' + document.getElementById('T').value + '/';");
                client.print("document.getElementById('url').href = x;}");
                client.print("</script>");
                client.println("<p></p>");
                client.println("<p></p>");
                if (mode == "confort"){
                    client.print("<h1>Modo Confort activado ");
                } else if (mode == "invierno"){
                    client.print("<h1>Modo Invierno activado ");
                } else if (mode == "noche"){
                    client.print("<h1>Modo Noche activado ");
                } else {
                    client.print("<h1>Modos predefinidos");
                }
                client.println("</h1>"); // Botones Modos
                client.println("<p></p>");
                client.println("<p></p>");
                client.print("<button type='button'>");
                client.println("<a href='/?confort'>Confort</a>");
                client.print("</button>  ");
                client.print("<button type='button'>");
                client.println("<a href='/?noche'>Noche</a>");
                client.print("</button>  ");
                client.print("<button type='button'>");
                client.println("<a href='/?invierno'>Invierno</a>");
                client.print("</button>  ");
                client.println("<h1></h1>");
                client.println("<h1></h1>");
                client.print("<button type='button'>");
                client.println("<a href='/?LED=0'>Apagar/Desactivar</a>");
                client.print("</button>");
                client.println("<p></p>");
                client.println("<p></p>");
                client.print("<h1>Regulador LED</h1>");
                client.println("<p></p>");
                client.print("<form action='/action_page.php' method='get'>");
                client.print("0 <input type = 'range', name = 'intensidad' min='0' ");
                client.print("max='150' step = '5'> 150  ");
                client.print(" <input type='submit'>");
                client.print("</form>");
                client.println("<p></p>");
                client.println("<p></p>");
                client.print("<p>Intensidad actual: ");
                client.print(intensidad);
                client.print("</p>");
                client.println("<p></p>");
                client.println("<p></p>");
                client.print("<font color = 'grey', size = '2px'>*Para cuando esté en ");
                client.print("casa, el modo Confort está pensado para optimizar el uso de la ");
                client.print("calefacción minimizando el gasto energético. La calefacción ");
                client.print("se encenderá cuando la temperatura sea inferior a 19 °C.</font>");
                client.println("<p></p>");
                client.print("<font color = 'grey', size = '2px'>*A la hora de dormir no es necesaria una ");
                client.print("temperatura muy elevada. En este caso, el modo Noche mantendrá la temperatura ");
                client.print("por encima de los 15 °C.</font>");
                client.println("<p></p>");
                client.print("<font color = 'grey', size = '2px'>*Cuando no haya nadie en casa durante el ");
                client.print("invierno solo será necesario evitar posibles heladas en las tuberías. El modo ");
                client.print("Invierno mantendrá el hogar a una temperatura superior a los 5 °C.</font>");
                client.println("</body>");
                client.println("</html>");
                delay(1);
                enviar = false;
            }
            client.stop();
            Serial.println("Fi de la connexió amb el client");
        }
    }
}

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.