Internet de les coses amb ESP32 i ESP8266

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

Termòstat

Programa del grup 2 - Termòstat PMC

En aquest cas el microcontrolador funciona com a client i es comunica amb dues taules de Google. En una de les taules es van guardant periòdicament els valors reals de temperatura i humitat. En l'altra s'hi guarda la temperatura de consigna i el mode de funcionament triat. El programa del microcontrolador és el següent:

#include <SPI.h>
#include <WiFiNINA.h>  
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22
#include <Adafruit_NeoPixel.h>
const char idXarxa[] = "xarxa-wifi";    // Nom del punt d'accés 
const char contrasenya[] = "contrasenya-wifi";    // Contrasenya de connexió 
const char formulari[] = "1FAIpQLScD6RU2aSCCVDn6B7myYl3A4NmqKo1DMiTEIj-moDFjsR8J4Q";
const char adrePost[] = "/forms/d/e/1FAIpQLScD6RU2aSCCVDn6B7myYl3A4NmqKo1DMiTEIj-moDFjsR8J4Q/formResponse";
char server[] = "docs.google.com";
char pagina[] = "/spreadsheets/d/1sYC_082KCrNROOBlMXoNmngyIRQ5bx-nyCz4OzNnjXk/export?format=csv";
String camp1 = "entry.1767992783";
String camp2 = "entry.1499112241";
String length();
unsigned long darreraConnexio = 0;
const unsigned long periodeConnexio = 10000UL;
bool pendent;
String Tinf;
String peticio = "";    // Aquí guardarem una línia de la petició del client
String peticioAux = "";    // i la petició anterior (també ho farem servir de reserva)
bool llegir;
String hum, temp;
String data;
int status = WL_IDLE_STATUS;
Adafruit_NeoPixel cadena = Adafruit_NeoPixel(3, 1, NEO_GRB + NEO_KHZ800);
WiFiSSLClient client;
DHT dht(DHTPIN, DHTTYPE);
void setup() {    // Inicialització
    Serial.begin(9600);    // Monitor sèrie
    dht.begin();
    if (WiFi.status() == WL_NO_MODULE) {
        Serial.println("No s'ha trobat el dispositiu Wi-Fi");
        while (true);    // Bloquegem el programa
    }
    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);    // Ho tornarem a intentar passats 10 s
    }
    llegir = true;
    dht.begin();
    Serial.begin(9600);
    cadena.begin();   
    cadena.setPixelColor(0, 55,0, 0);     
    cadena.show();
}
void loop() {    // Programa que es repeteix indefinidament
    if (status != WiFi.status()) {    // Mirem si ha canviat l'estat de la connexió
        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");
        }
    }
    data = "";
    hum = dht.readHumidity();
    temp = dht.readTemperature();
    data += camp1;
    data += "=";
    data += temp;
    data += "&";
    data += camp2;
    data += "=";
    data += hum;
    data += "&submit=Submit";
    if (llegir == true){
        while (client.available()) {
            char c = client.read();    // Rebem caràcters del servidor
            if (c == '\n') {    // Mirem si és un salt de línia
                peticioAux = peticio;    // Guardem la petició anterior
                peticio = "";    // Ens preparem per a la línia següent
                pendent = true;    // Preparat per escriure-ho
            } else {
                peticio += c;    // Afegim el caràcter rebut
            }
        }
        llegir = false;
    }
    if (llegir == false){
        if (client.connect(server, 443)) {
            Serial.println("Connectat");
            client.print("POST ");
            client.print(adrePost);
            client.print("?formkey=");
            client.print(formulari);
            client.println("&ifq HTTP/1.1");
            client.print("Host: ");
            client.println(server);
            client.println("Content-Type: application/x-www-form-urlencoded");
            client.println("Connection: close");
            client.print("Content-Length: ");
            client.println(data.length());
            client.println();
            client.print(data);
            client.println();
            Serial.print("Enviat     T = ");
            Serial.print(temp);
            Serial.print("     H = ");
            Serial.println(hum);
        }
        llegir = true;
    }
    delay(1000);
    if (pendent) {
        pendent = false;
        if (peticio == ""){    // Si està buit
            peticio = peticioAux;    // Agafem l'anterior
        }
        Serial.println();
        Serial.println(peticio);
        peticio = peticio.substring(peticio.indexOf(",") +1);
        Tinf = peticio.substring(0, peticio.indexOf(","));
        if (Tinf.length() == 1){
            Tinf = '0'+Tinf ;
        }
        Serial.print("Tinf =");
        Serial.println(Tinf);
    }
    if (millis() - darreraConnexio > periodeConnexio) {
        client.stop();
        if (client.connect(server, 443)) {
            Serial.println("S'ha fet la connexió al servidor");
            client.print("GET ");
            client.print(pagina);
            client.println(" HTTP/1.1");
            client.print("Host: ");
            client.println(server);
            client.println("Connection: close");
            client.println();
            // Guardem quan hem fet la connexió
            darreraConnexio = millis();
        } else {
            Serial.println("connection failed");
        }
    }
    if (temp < Tinf ) {
       cadena.setPixelColor(0, 0, 55, 0);  // fiquem el valor 
       cadena.show(); // Actualitza
    }
    if (temp > Tinf + 1 )  {
       cadena.setPixelColor(0, 55,0, 0); 
       cadena.show(); // Actualitza
    }
    if (!client.connected()) {
        Serial.println();
        Serial.println("Desconnectant");
        client.stop();
    }
    delay(10000);
}

Aquest grup va fer una aplicació amb App Inventor que constava de dues pantalles.

En el cas de la primera pantalla, la disposició d'elements és com es mostra a les tres imatges següents:

Pantalla         Pantalla
Pantalla

El programa d'aquesta pantalla és el següent:

Programa
Programa
Programa
Programa
Programa
Programa
Programa

La disposició d'elements de la segona pantalla és la següent:

Pantalla

El programa de la segona pantalla és el següent:

Programa
Programa
Programa

 

 

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