Sari la conținut
ELFORUM - Forumul electronistilor

Termostat WiFi centrala termica cu ESP8266/NodeMcu


Untold

Postări Recomandate

@Untold Cel cu deep sleep adica modulul UM nu prea e ok din mai multe motive:

  • Intra in sleep cu WIFI activ, da suna ciudat dar ESPul e capabil sa intre in deep sleep si sa lase perifericul de WIFI activ, deci nu prea faci economie la consum.
  • Butonul nu e setat sa poata trezii ESPul din sleep, degeaba o sa-l apesi ca nu va face mai nimic.
  • Iar intratul in sleep mi se pare a fi intr-un loc tare ciudat, adica o data apasat butonul ( dupa ce e configurat corect sa poata trezii ESPul ) o sa intre in functia loop si nu va mai putea intra in sleep nici o data.

 

Ma gandesc ca nu asta era scopul tau ci a dat-o Gepeto cam pe langa destul de grav. Daca explici putin cum ai vrut sa mearga incerc sa te ajut. 

Editat de Bandi Szasz
Link spre comentariu
  • Răspunsuri 39
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Imagini postate

M-a zapacit de tot Gepeto asta, mi-a dat sapte mii de coduri, si tot nu era cum voiam eu.

UF sa aiba display care ar putea sta  aprins incontinuu, ca acolo nu e problema de consum, fiind pe alimentator.

UM sa doarma 5 min, dupa care sa se trezeazsca si sa-si faca verificarile, apoi sa adoarma iar,  dar sa se trezeasca si la apasarea oricarui buton de pe UM. (centrala pornita/centrala oprita sau temp+/temp-)si dupa 5-10 secunde sa adoarma la loc.

Displayul de la UM sa se aprinda doar cand setez temperatura din butoane sau opresc/pornesc centrala si asta doar pentru 20 sec, cam cum e lumina la display-ul telefonului.

Modificarile de pe UM, sa apara pe display-ul UM dar si pe display-ul UF, iar pagina web sa fie pe UF, UM sa se conecteze la AP-ul UF si sa aiba pe ea doar display-ul si cele 4 butoane.

Am notat cu UM - Unitatea Mobila si cu UF - Unitatea Fixa (cea de pe centrala).

 

Scuze pentru atatea explicatii, dar nu stiu daca m-am facut inteles, eu nefiind priceput in ale programarii arduino. Multumesc frumos pentru orice ajutor.

 

P.S. Sau, daca implica mai multa munca si pentru implementarea display-ului si pe UF, sa se renunte la el si sa ramana doar UM cu display.

Editat de Untold
Link spre comentariu

In sfarsit, mi-a facut doua coduri care nu dau erori la compilare, atat pentru UF, cat si pentru UM. Pentru UF am testat, e ok, functioneaza. Atasez aici ambele coduri, daca considerati ca mai trebuie modificari sau imbunatatiri..

P.S. Ambele unitati sunt cu display, UM are butoane fizice de + si - pentru setarea temperaturii si buton de wake-up. E nu stiu cum a facut el functia de nani, dar...daca va uitati peste cod, o sa va dati seama cu siguranta.

UF_FInal.ino UM_FInal_2.ino

Link spre comentariu

UM e si mai varza decat ce a fost, butonul tot nu e configurat pentru iesire din sleep, peste asta ti-a pus si un delay de 10s in loop care efectiv o sa blocheze tot, vei putea apasa butoanele alea de dimineata pana seara ca uC e blocat in delay. O sa ne ia job-urile de ITisti AIul asta de ne sar capacele :rade:.

O sa incerc sa imi fac ceva timp zilele urmatoare si fac un soft pe bune bazat pe cerintele de mai sus.

Link spre comentariu
1 hour ago, Bandi Szasz said:

ti-a pus si un delay de 10s in loop care efectiv o sa blocheze tot, vei putea apasa butoanele alea de dimineata pana seara ca uC e blocat in delay.

Scrie si GPT din ce a invatat in perioada când a fost antrenat, educat.
Și, din moment ce multe softuri scrise de oameni contin "delay" , are si AI dreptate cand tot propune delay-uri. Asa a fost educat.
Nu știu alții cum sunt, dar eu când văd un delay() intr-un program, mă întristez.

Link spre comentariu
Acum 12 ore, Bandi Szasz a spus:

O sa incerc sa imi fac ceva timp zilele urmatoare si fac un soft pe bune bazat pe cerintele de mai sus.

Multumesc frumos!

Acum 17 ore, teomishu a spus:

Codul pentru Unitatea Fixa nu este ok. Nu este un WiFi AP cu pagina web.
Este tot un client WiFi.

Mie asa imi apare ca e.

Untitled.jpg

Link spre comentariu
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <EEPROM.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// Datele WiFi
const char* ssid = "your_SSID"; // Numele rețelei
const char* password = "your_PASSWORD"; // Parola rețelei

// Variabile globale
float temperaturaSetata = 21.0;
bool centralaPornita = false;

// Crearea serverului
ESP8266WebServer server(80);

void setup() {
    Serial.begin(115200);
    EEPROM.begin(512); // Initializare EEPROM
    WiFi.softAP(ssid, password); // Crearea unui AP
    Serial.println("AP creat");

    // Initializează ecranul OLED
    display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);
    display.println("Centrala Termica");
    display.display();

    // Configurarea serverului
    server.on("/", HTTP_GET, []() {
        String html = "<html><head><style>";
        // CSS pentru a centra conținutul și a stiliza butoanele și LED-urile
        html += "body { text-align: center; font-family: Arial; }";
        html += ".container { display: inline-block; }";
        html += ".btn { font-size: 20px; padding: 10px; margin: 10px; border-radius: 10px; }";
        html += ".btn-on { background-color: green; color: white; }";
        html += ".btn-off { background-color: red; color: white; }";
        html += ".btn-temp-up { background-color: blue; color: white; }";
        html += ".btn-temp-down { background-color: orange; color: white; }";
        html += ".led { display: inline-block; width: 20px; height: 20px; margin-left: 10px; border-radius: 50%; }";
        html += ".led-on { background-color: green; }";
        html += ".led-off { background-color: red; }";
        html += "</style></head><body>";
        
        html += "<h1>Setare temperatura centrala</h1>";
        html += "<p>Temperatura actuala: " + String(temperaturaSetata) + "C</p>";

        html += "<div class='container'>";
        // Butoanele pentru ajustarea temperaturii
        html += "<form action=\"/setTemperature\" method=\"get\">";
        html += "<button class='btn btn-temp-up' name=\"temp\" value=\"" + String(temperaturaSetata + 0.5) + "\">Temp+</button>";
        html += "<button class='btn btn-temp-down' name=\"temp\" value=\"" + String(temperaturaSetata - 0.5) + "\">Temp-</button>";
        html += "</form>";

        // Buton pentru pornirea centralei, cu LED verde doar când e pornită
        html += "<form action=\"/turnOn\" method=\"get\"><button class='btn btn-on'>Centrala Pornit</button>";
        if (centralaPornita) {
            html += "<div class='led led-on'></div>"; // LED verde când centrala e pornită
        }
        html += "</form>";

        // Buton pentru oprirea centralei, cu LED roșu doar când e oprită
        html += "<form action=\"/turnOff\" method=\"get\"><button class='btn btn-off'>Centrala Oprit</button>";
        if (!centralaPornita) {
            html += "<div class='led led-off'></div>"; // LED roșu când centrala e oprită
        }
        html += "</form>";

        html += "</div>";
        html += "</body></html>";
        server.send(200, "text/html", html);
    });

    server.on("/setTemperature", HTTP_GET, []() {
        if (server.hasArg("temp")) {
            temperaturaSetata = server.arg("temp").toFloat();
            Serial.println("Temperatura setata: " + String(temperaturaSetata));
            EEPROM.put(0, temperaturaSetata); // Salvează temperatura în EEPROM
            EEPROM.commit();
        }
        server.sendHeader("Location", "/");
        server.send(302, "text/plain", "");
    });

    server.on("/turnOn", HTTP_GET, []() {
        centralaPornita = true;
        Serial.println("Centrala pornita!");
        server.sendHeader("Location", "/");
        server.send(302, "text/plain", "");
    });

    server.on("/turnOff", HTTP_GET, []() {
        centralaPornita = false;
        Serial.println("Centrala oprita!");
        server.sendHeader("Location", "/");
        server.send(302, "text/plain", "");
    });

    server.begin();
    Serial.println("Server pornit");
}

void loop() {
    server.handleClient(); // Gestionează cererile clientului
}

 Asta e pentru unitatea fixa

 

 

 

 

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <EEPROM.h>
#include <DHT.h>

// Configurații OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// Configurații WiFi
const char* ssid = "your_SSID"; // Numele rețelei
const char* password = "your_PASSWORD"; // Parola rețelei
const char* serverURL = "http://192.168.4.1"; // Adresa IP a unității fixe (UF)

// Pin pentru butonul de wake-up
#define WAKEUP_BUTTON_PIN 4  // Pinul la care este conectat butonul de trezire

// Configurații pentru senzorul de temperatură (exemplu folosind un senzor DHT)
#define DHTPIN 2  // Pinul la care este conectat senzorul DHT
#define DHTTYPE DHT11  // Tipul senzorului (DHT11 sau DHT22)
DHT dht(DHTPIN, DHTTYPE);

// Pinuri pentru butoane fizice de temperatură
#define TEMP_PLUS_PIN 5  // Buton pentru creștere temperatură
#define TEMP_MINUS_PIN 12 // Buton pentru scădere temperatură

// Variabile globale
float temperaturaSetata = 21.0;

WiFiClient wifiClient;  // Creează un obiect WiFiClient

void setup() {
    Serial.begin(115200);
    dht.begin();

    // Configurare pini pentru butoane
    pinMode(WAKEUP_BUTTON_PIN, INPUT_PULLUP);
    pinMode(TEMP_PLUS_PIN, INPUT_PULLUP);
    pinMode(TEMP_MINUS_PIN, INPUT_PULLUP);

    // Initializează display-ul OLED
    if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
        Serial.println(F("Eroare la initializarea OLED"));
        for(;;);
    }

    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);
    display.println("Unitate Mobila");
    display.display();

    // Conectare la WiFi
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    Serial.println("Conectat la WiFi");

    // Verifică dacă butonul de wake-up este apăsat
    if (digitalRead(WAKEUP_BUTTON_PIN) == LOW) {
        Serial.println("Unitatea a fost trezită de buton!");
    } else {
        // Dacă butonul nu este apăsat, intră în deep sleep
        Serial.println("Intrare in deep sleep pentru 5 minute...");
        ESP.deepSleep(5 * 60 * 1000000); // 5 minute în microsecunde
    }
}

void loop() {
    // Citirea temperaturii de la senzor
    float temperatura = dht.readTemperature();
    if (isnan(temperatura)) {
        Serial.println("Eroare la citirea senzorului de temperatură!");
        return;
    }

    // Verifică apăsările pe butoanele de modificare a temperaturii
    if (digitalRead(TEMP_PLUS_PIN) == LOW) {
        temperaturaSetata += 0.5;
        delay(200); // Debouncing pentru buton
    }
    if (digitalRead(TEMP_MINUS_PIN) == LOW) {
        temperaturaSetata -= 0.5;
        delay(200); // Debouncing pentru buton
    }

    // Afișează temperatura setată pe display
    display.clearDisplay();
    display.setCursor(0, 0);
    display.print("Temp Setata: ");
    display.print(temperaturaSetata);
    display.println(" C");
    display.print("Temp Actuala: ");
    display.print(temperatura);
    display.println(" C");
    display.display();

    // Trimite datele către unitatea fixă (UF)
    if (WiFi.status() == WL_CONNECTED) {
        HTTPClient http;
        http.begin(wifiClient, String(serverURL) + "/updateTemperature?temp=" + String(temperatura));
        int httpResponseCode = http.GET();
        if (httpResponseCode > 0) {
            Serial.printf("Răspuns: %s\n", http.getString().c_str());
        } else {
            Serial.printf("Eroare HTTP: %s\n", http.errorToString(httpResponseCode).c_str());
        }
        http.end();
    }

    // Intră din nou în deep sleep după 10 secunde
    delay(10000);
    ESP.deepSleep(5 * 60 * 1000000); // 5 minute în microsecunde
}

Iar asta pentru unitatea mobila.

Editat de Untold
Link spre comentariu
  • 3 săptămâni mai târziu...

Am primit senzorii de temperatura si afisajele OLED, le-am asamblat, am scris sketch-ul si...nu merge. UM se conecteaza la UF, dar UF nu primeste nimic de la UM si nici UM nu raspunde la comenzile de temp+/temp- si nici la wake-up. Dupa conectare, la 5 min, intra in deep sleep si nu se poate trezi decat cu butonul de reset de pe placa lui esp8266. Pana UM se conecteaza la UF, pe display scrie Unitate Mobila Termostat. Dupa ce se conecteaza, scrie temperatura setata 21.00 gr. Pe displayul de la UF scrie doar Centrala Termica si atat. Si nici daca in website (192.168.4.1) dau o comanda de +/- temp sau centrala oprita/centrala pornita, pe UF si UM nu se intampla nimic, nici pe display si nici in serial monitor. 

Atasez cele doua sketchuri, ultimele cu care au fost scrise esp-urile si poate ma puteti ajuta sa-i dau de cap. Nu vreau sa renunt la acest proiect, mi se pare interesant, desi e o versiune simpla, fara programari pe zile, nopti, temperaturi, etc.

1.jpg

2.jpg

UF_Last.ino UM_Last.ino

Editat de Untold
Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări