Sari la conținut
ELFORUM - Forumul electronistilor

Termostat WiFi centrala termica cu ESP8266/NodeMcu


Untold

Postări Recomandate

@teomishu Ei nu merge ESP pe baterii, este ceva de munca la PCB si soft dar e perfect realizabil, am nenumarate device-uri facute care merg pe 1 sau 2 celule 18650 si trebuie incarcate 1 data la 2-3 luni. In cazul de fata se poate citii temperatura la 10-15minute ca nu e cuptor sa fie schimbari majore de temperatura sau se poate folosii senzor de temperatura cu alarma setabila care sa scoata ESPul din sleep cand se ajunge la temperatura setata combinat cu un ePaper se pot obtine consumuri extrem de mici. Totul tine de proiectarea circuitelor auxiliare astfel incat ESPul sa stea in sleep cat de mult posibil. 

Link spre comentariu
  • Răspunsuri 39
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Imagini postate

2 hours ago, Bandi Szasz said:

Ei nu merge ESP pe baterii

Nu am spus ca ESP nu se poate alimenta din baterii.
Doar ca sunt aplicatii gen termostate Wifi unde nu este indicat de folosit. Sunt alte posibilitati mult mai eficiente energetic.

Orice ce ai face, un ESP (WiFi) consuma prea mult atunci cand porneste, pentru a fi folosit.

Editat de teomishu
Link spre comentariu

Cum am zis, pe PCB custom este foarte ok si pentru termostat. Un senzor temperatura cu functie de alarma (sunt unele care consuma 10uA), un Epaper care consuma practic nimic si un ESP32C3 ( consuma <30mA fara Wifi). Setezi senzorul sa trezeasca Esp-ul cand detecteaza o schimbare de 0.5grade ai un consum sub 30uA, cand e trezit ESP face update in cateva zeci de ms la Epaper si verifica daca s-au atins pragurile setate, daca au fost atinse porneste Wifi si da comanda catre releu sau brokerul de mesaje totul dureaza +/- 2s. Consum final mediu sub 1mA, te tine celula ala li-ion bine mersii, probabil o sa-l incarci o singura data pe timpul sezonului rece, nu trebuie cel putin din punctul meu de vedere sa tina 5ani, nici macar nu e sanatos pentru celula sa stea asa mt fara a fi ciclat.

 

Da sunt si alternative mai bune dar pierzi avantajul wifi si comanda de la distanta. Am destule jucarii facute pt casa, toate pe ESPuri cu broker mesaje, backend pe java ( ruleaza pe rpi) si applicatie android. Unele trebuie incarcate la 2-3 luni, altele mai nici o data folosind un panou solar micut de 100mm si acel device are zeci de senzori pt calitate aer. Este mai greu si complex cu ESP wifi dar este mult mai des folosit si in deviceuri comerciale decat ai crede.

Editat de Bandi Szasz
Link spre comentariu

Nu mi-a mers codul de pe pagina precedenta ; a trebuit (avand un display SH1106) sa il adaptez.

#include <U8g2lib.h>
#include <Wire.h>
#include <DallasTemperature.h>
#include <OneWire.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

#define ONE_WIRE_BUS D2  // Pinul pentru senzorul de temperatură

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

ESP8266WebServer server(80);

// Inițializare display SH1106 cu U8g2
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

float temperaturaActuala = 0.0;
float temperaturaTinta = 22.0;
bool centralaPornita = false;

// Prototipurile funcțiilor
void handleRoot();
void handleChangeTemp();
void handleToggleCentrala();
void handleTemperatureData();
void updateDisplay();

void setup() {
  Serial.begin(115200);
  sensors.begin();  // Inițializăm senzorul de temperatură
  
  // Inițializăm display-ul SH1106
  u8g2.begin();
  
  WiFi.softAP("Termostat_AP", "12345678");

  server.on("/", handleRoot);
  server.on("/changeTemp", handleChangeTemp);
  server.on("/toggleCentrala", handleToggleCentrala);
  server.on("/temperatureData", handleTemperatureData);

  server.begin();
  Serial.println("Serverul a pornit!");

  updateDisplay();
}

void updateDisplay() {
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_ncenB08_tr);

  u8g2.drawStr(0, 10, "Temp. curenta:");
  u8g2.setCursor(0, 20);
  u8g2.print(temperaturaActuala);
  u8g2.drawStr(0, 50, "Temp. setata:");
  u8g2.setCursor(0, 60);
  u8g2.print(temperaturaTinta);

  u8g2.sendBuffer();
}

void handleRoot() {
  String pagina = "<html><head><style>";
  pagina += "body { text-align: center; font-family: Arial; }";  // Aliniere pe centru
  pagina += ".buton {font-size: 20px; padding: 10px 20px; margin: 20px; border: none; cursor: pointer;}";
  pagina += ".verde {background-color: #90EE90; color: black;}";  // Verde deschis pentru "Pornit"
  pagina += ".rosu {background-color: #FFCCCB; color: black;}";  // Roșu deschis pentru "Oprit"
  
  // Stil pentru LED-uri
  pagina += ".led {width: 20px; height: 20px; border-radius: 50%; display: inline-block; margin-bottom: 10px;}"; // LED-uri rotunde, inline
  pagina += ".led-verde {background-color: green;}";  // LED verde
  pagina += ".led-rosu {background-color: red;}";     // LED roșu
  
  pagina += "</style></head><body>";

  pagina += "<h1>Setare temperatura centrala</h1>";
  pagina += "<p>Temperatura actuala: " + String(temperaturaActuala) + "C</p>";
  pagina += "<p>Temperatura tinta: " + String(temperaturaTinta) + "C</p>";

  // Butoane pentru controlul temperaturii
  pagina += "<form action=\"/changeTemp\" method=\"get\">";
  pagina += "<input type=\"submit\" name=\"action\" value=\"+Temp\" class=\"buton rosu\">";  // Buton +Temp roșu
  pagina += "<input type=\"submit\" name=\"action\" value=\"-Temp\" class=\"buton verde\">";  // Buton -Temp verde
  pagina += "</form>";

  // LED verde în stânga butonului "Pornit" și LED roșu în dreapta butonului "Oprit"
  pagina += "<form action=\"/toggleCentrala\" method=\"get\">";
  pagina += "<div style='display: flex; justify-content: center;'>";  // Flexbox pentru a aranja LED-urile și butoanele
  pagina += "<div style='display: flex; align-items: center; justify-content: center;'>";  // Aranjare flex pentru "Pornit"
  
  if (centralaPornita) {
    pagina += "<div class='led led-verde' style='margin-right: 10px;'></div>";  // LED verde aprins în stânga butonului Pornit
  } else {
    pagina += "<div class='led led-verde' style='display:none;'></div>";  // LED verde ascuns
  }
  
  pagina += "<input type=\"submit\" value=\"Pornit\" class=\"buton verde\">";  // Buton verde pentru "Pornit"
  
  pagina += "</div>";
  pagina += "<div style='display: flex; align-items: center; justify-content: center; margin-left: 20px;'>";  // Aranjare flex pentru "Oprit"
  
  pagina += "<input type=\"submit\" value=\"Oprit\" class=\"buton rosu\">";  // Buton roșu pentru "Oprit"
  if (!centralaPornita) {
    pagina += "<div class='led led-rosu' style='margin-left: 10px;'></div>";  // LED roșu aprins în dreapta butonului Oprit
  } else {
    pagina += "<div class='led led-rosu' style='display:none;'></div>";  // LED roșu ascuns
  }
  
  pagina += "</div>";
  pagina += "</div>";
  pagina += "</form>";

  pagina += "</body></html>";

  server.send(200, "text/html", pagina);  // Trimiterea paginii HTML către client
}

void handleChangeTemp() {
  String action = server.arg("action");
  
  // Modificarea temperaturii țintă în funcție de acțiune
  if (action == "+Temp") {
    temperaturaTinta += 0.5;
  } else if (action == "-Temp") {
    temperaturaTinta -= 0.5;
  }

  updateDisplay();  // Actualizăm OLED-ul cu noile valori
  handleRoot();     // Reîncărcăm pagina cu valorile actualizate
}

void handleToggleCentrala() {
  centralaPornita = !centralaPornita;  // Comutăm starea centralei
  updateDisplay();  // Actualizăm OLED-ul cu noile valori
  handleRoot();     // Reîncărcăm pagina cu valorile actualizate
}

void handleTemperatureData() {
  sensors.requestTemperatures();  // Solicităm citirea temperaturii
  temperaturaActuala = sensors.getTempCByIndex(0);

  // Dacă senzorul este deconectat sau nefuncțional, returnăm o eroare
  if (temperaturaActuala == DEVICE_DISCONNECTED_C) {
    server.send(200, "text/plain", "Eroare: Senzor deconectat!");
  } else {
    // Trimiterea temperaturii actuale și țintei către unitatea fixă
    String data = "Temperatura: " + String(temperaturaActuala) + "\n";
    data += "Tinta: " + String(temperaturaTinta);
    server.send(200, "text/plain", data);
  }
}

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

 

Rezultatul (preliminar) se vede mai jos.

disp.jpg

Editat de fratello
Link spre comentariu
Acum 2 ore, fratello a spus:

 Iti multumesc pt ca ne-ai impartasit proiectul !

Cu drag! Ca si voi ma ajutati cand am nevoie!

Am gasit o carcasa de la un alimentator mai vechi, de care am prins cu suruburi un incarcator de telefon (cubuletul ala) de 5V/1A si am bagat esp-ul, releul si tranzistorul in interior. Mai ramane sa-i mai pun si un led verde de power si cablul ce vine la centrala si unitatea fixa este gata. Va rog sa nu radeti de "opera" mea, am facut si eu cu ce-am gasit la indemana. Acum astept afisajul si senzorul ca sa fac si unitatea mobila.

 

@fratello, pana la urma pagina web arata ca cea din pozele atasate de mine mai sus?

20241002_101046.jpg

20241002_101054.jpg

20241002_101156.jpg

Editat de Untold
Link spre comentariu
On 10/1/2024 at 3:25 PM, Bandi Szasz said:

Cum am zis, pe PCB custom este foarte ok si pentru termostat. Un senzor temperatura cu functie de alarma

Intr-adevăr, daca se concepe un PCB cu consum minim , si daca se folosesc senzori  care pot scoate ESP din sleep doar daca este cazul, se poate reduce mult consumul.

 

Link spre comentariu

Dar cip-ul asta nu are modul de RTC cu alimentare separata și quartz de 32768hz? Ar trebui sa aibă și atunci se poate seta sa se trezească la un anumit interval (1-3-5 min), sa citească temperatura și sa transmită comanda necesara și apoi sa între înapoi în sleep.

Un aparat conceput sa funcționeze exclusiv din baterii trebuie sa aibă un consum mic. 

Link spre comentariu

@sesebe Are ( chiar integrat tot ce trebuie, WDT-ul poate tine in sleep pana peste o ora parca ) dar cum zicea si colegu 'teomishu' ESP este destul de costisitor de scos din sleep, sa consumi 40-50mA pentru a citii un senzor de temperatura nu e chiar ideal, pe cand un senzor de temperatura cu functie de alarma care consuma  10 - 20uA cu un update rate de 1-2s si poate trezii ESP-ul doar cand s-a modificat efectiv temperatura si ESPul are de facut si altceva decat sa verifice din nou si sa vada ca a verificat degeaba pentru ca nu s-a schimbat si nu are nimic de facut. Acum depinde si ce date vrei prin WIFI pe telefon si cat de real time sa fie, de exemplu eu la device-urile mele avand un intreg ecosistem ( backend, baza de date, coada de mesaje, etc.. ) modific o setare pe telefon ( applicatie android ) se comunica la backend, se persista in baza de date si se genereaza un eveniment pe coada de mesaje mai apoi cu prima ocazie cand iese ESP-ul din sleep o sa fie notificat prin coada de mesaje ca exista un eveniment de prelucat asa ca un update de setari la un dispozitiv de al meu pe baterii poate dura de la cateva minute pana la cateva ore sa fie efectuat cap coada insa doar asa poti obtine durata de viata cat mai lunga pe baterii + WIFI.

Editat de Bandi Szasz
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