Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2021:avaduva:basic_smart_home [2021/05/15 23:18]
petru.mateescu
pm:prj2021:avaduva:basic_smart_home [2021/05/25 23:05] (current)
petru.mateescu
Line 23: Line 23:
  
 ==Schema bloc ==  ==Schema bloc == 
-{{ :​pm:​prj2021:​avaduva:​wifi_central_heating_schema.png?700 |}}+{{:​pm:​prj2021:​avaduva:​wifi_central_heating_schema.jpg?700}}
  
  
Line 34: Line 34:
   * [[https://​www.optimusdigital.ro/​ro/​componente-electronice-rezistoare/​859-rezistor-025w-1k.html|Rezistor 1kΩ]]   * [[https://​www.optimusdigital.ro/​ro/​componente-electronice-rezistoare/​859-rezistor-025w-1k.html|Rezistor 1kΩ]]
   * [[https://​www.optimusdigital.ro/​ro/​componente-electronice-rezistoare/​853-rezistor-025w-51k.html|4 Rezistori de 5k1Ω]]   * [[https://​www.optimusdigital.ro/​ro/​componente-electronice-rezistoare/​853-rezistor-025w-51k.html|4 Rezistori de 5k1Ω]]
 +  * [[https://​www.optimusdigital.ro/​ro/​componente-electronice-tranzistoare/​935-tranzistor-s9013-npn-50-pcs-set.html?​search_query=tranzistor+&​results=104|Tranzistor NPN]]
   * [[https://​www.optimusdigital.ro/​ro/​electronica-de-putere-module-cu-releu/​874-modul-releu-cu-un-canal-comandat-cu-5-v.html?​search_query=releu&​results=98|Releu]]   * [[https://​www.optimusdigital.ro/​ro/​electronica-de-putere-module-cu-releu/​874-modul-releu-cu-un-canal-comandat-cu-5-v.html?​search_query=releu&​results=98|Releu]]
   * [[https://​www.optimusdigital.ro/​ro/​senzori-senzori-de-temperatura/​584-senzor-de-temperatura-dht11.html?​search_query=dht11&​results=19|Senzor DHT11]]   * [[https://​www.optimusdigital.ro/​ro/​senzori-senzori-de-temperatura/​584-senzor-de-temperatura-dht11.html?​search_query=dht11&​results=19|Senzor DHT11]]
Line 41: Line 42:
   ​   ​
 ==Schema electrică== ==Schema electrică==
 +{{:​pm:​prj2021:​avaduva:​wifi_central_heating_electric.jpg?​700}}
  
  
 ===Software Design=== ===Software Design===
 +Mediul de programare ales este platforma [[https://​www.arduino.cc/​en/​software|Arduino IDE]] cu setările aferente microcontroller-ului NodeMCU ESP8266.
  
 +{{:​pm:​prj2021:​avaduva:​wifi_central_heating_setari.jpg?​400}}
 +
 +Aplicația aleasă pentru comunicarea dintre µc și smartphone este [[https://​blynk.io/​|Blynk]],​ disponibilă atât pe [[https://​play.google.com/​store/​apps/​details?​id=cc.blynk&​hl=en_US|Android]] cât și pe [[https://​apps.apple.com/​us/​app/​blynk-iot-for-arduino-esp32/​id808760481|iOS]]. Aceasta are o interfață simplă și este ușor de folosit. În cadrul proiectului,​ aplicația conține trei elemente:
 +  * un ecran pe care sunt afișate temperatura și umiditatea ambientale, stadiul de funcționare al centralei termice (ON / OFF), temperatura dorită și un martor ce semnifică funcționarea automată a termostatului;​
 +  * un buton de comandă ce pornește sau oprește centrala termică în modul manual;
 +  * un slider pentru ajustarea temperaturii dorite.
 +{{:​pm:​prj2021:​avaduva:​wifi_central_heating_aplicatie_tel.jpg?​200}}
 +{{:​pm:​prj2021:​avaduva:​wifi_central_heating_display.jpg?​200}}
 +
 +{{:​pm:​prj2021:​avaduva:​wifi_central_heating_buton.jpg?​200}}
 +{{:​pm:​prj2021:​avaduva:​wifi_central_heating_slider.jpeg?​200}}
 +
 +Imaginile anterioare descriu setarile aferente fiecărui element:
 +  * ecranul este setat pe modul advanced, pinul de comunicare cu µc este pinul virtual V3 (folosit și în codul sursă), culoarea de fundal este albastru deschis, iar culoarea textului este albă;
 +  * butonul este denumit „Comandă centrala termică”,​ pinul de comunicare este GPIO14 (D5), modul de tip push, denumirea „Trimite comanda” este afișată cât timp acesta nu este apăsat, iar denumirea „Comandă trimisă” este afișată cât timp este apăsat, dimensiunea fontului este medie și culoarea acestuia este neagră;
 +  * sliderul este denumit „Temperatura dorită”, are culoarea neagră, pinul de comunicare este pinul virtual V4, valorile exprimate sunt de tip întreg (fără zecimale) cuprinse în intervalul 15-30 (°C), funcția send on release este dezactivată (se trimit valorile la interval de 100ms) și valoarea setată este afișată.
 +
 +Pentru comunicarea dintre NodeMCU și aplicația Blynk folosesc bibliotecile ''​Blynk.h'',​ ''​ESP8266WiFi.h'',​ ''​BlynkSimpleEsp8266.h'',​ dar și un cod de autorizare (același și în codul sursă și în aplicația software) și elementele de conectare ale µc cu adresa wifi (id-ul și parola):
 +
 +  #include <​Blynk.h>​
 +  #include <​ESP8266WiFi.h>​
 +  #include <​BlynkSimpleEsp8266.h>​
 +  ​
 +  char auth[] = "​Introdu_tokenul_de_autorizare";​
 +  char ssid[] = "​Introdu_ssid-ul_wifi-ului";​
 +  char password[] = "​Introdu_parola";​
 +  ​
 +  Blynk.begin(auth,​ ssid, password); ​ // inițializare
 +  Blynk.run(); ​ // menținere conexiune
 +
 +Pentru a exclude necesitatea folosirii unui modul hardware RTC am folosit biblioteca ''​NTPtimeESP.h''​. Aceasta declară o structură (strDateTime) ce stochează datele obținute printr-o cerere de tip GET pe un server ce se ocupă cu un RTC rezervat pentru Romania. Efectul obținut este că se afișează ora exactă în orice moment:
 +
 +  #include <​NTPtimeESP.h>​
 +  NTPtime NTPro("​ro.pool.ntp.org"​);​
 +  strDateTime dateTime;
 +  dateTime = NTPro.getNTPtime(1.0,​ 1);
 +  ​
 +  struct strDateTime {
 +      byte hour;
 +      byte minute;
 +      byte second;
 +      int year;
 +      byte month;
 +      byte day;
 +      byte dayofWeek;
 +      boolean valid;
 +  }
 +
 +Pentru declararea și utilizarea senzorului DHT11 am folosit biblioteca ''​SimpleDHT.h'':​
 +
 +  #include <​SimpleDHT.h>​
 +  SimpleDHT11 dht11; ​ // strunctura necesară comunicării cu senzorul
 +  const int dht_pin = D3;  // declar pinul pe care se primesc datele
 +  dht11.read(dht_pin,​ &​temperature,​ &​humidity,​ NULL);
 +
 +Pentru utilizarea ecranelor LCD (fizic și virtual din aplicația mobilă) și a portului serial (comunicarea dintre µc și calculator) am folosit bibliotecile ''​Wire.h''​ si ''​LiquidCrystal_I2C.h''​. Tot aici îmi creez un caracter special sub formă de lacăt pe care îl afișez când modul automat este în funcțiune:
 +
 +  #include <​Wire.h>​
 +  #include <​LiquidCrystal_I2C.h>​
 +  #define BLYNK_PRINT Serial
 +  ​
 +  WidgetLCD blynk_lcd(V3); ​ // folosesc pinul virtual V3 pentru ecran
 +  LiquidCrystal_I2C lcd (0x27, 16, 2);  // adresa ecranului fizic este 0x27
 +  Serial.begin(115200);​
 +  ​
 +  Wire.begin(D2,​ D1);  // declar pinii pentru protocolul I2C
 +  lcd.begin();​
 +  lcd.createChar(0,​ locked); ​ // creez un caracter de forma unui lacăt
 +
 +{{:​pm:​prj2021:​avaduva:​wifi_central_heating_lock.jpg?​250}}
 +
 +Pentru afișarea informaților pe ecrane și monitorul serial mă folosesc de următoarele funcții:
 +
 +  lcd.clear(); ​                   blynk_lcd.clear();​
 +  lcd.home();
 +  lcd.setCursor(int x, int y);
 +  lcd.print(char *string); ​       blynk_lcd.print(int x, int y, char *string);
 +
 +Majoritatea funcțiilor din coodul sursă sunt pentru afișarea diverselor date către ecranul LCD fizic, ecranul LCD virtual al aplicației și către monitorul serial al calculatorului (când acesta este conectat):
 +  * ''​void printWelcomeMsgToLcd()''​ afișează un mesaj de bun venit, doar după ce µc NodeMCU s-a conectat cu succes la rețeaua de internet furnizată, atât pe ecranul fizic cât și pe cel virtual;
 +  * ''​void setup()''​ se ocupă de conectarea µc la rețeaua de internet, afișând mesaje de confirmare către monitorul serial, inițiază comunicarea dintre µc și aplicația mobilă, setează pinii (intrare/​ieșire) și citește primele valori ale temperaturii și umidității ambientale:
 +
 +  Serial.println("​Booted"​); ​ // se afișează la pornire/​reset
 +  Serial.println("​Connecting to Wi-Fi"​); ​ // se afișează la pornire/​reset
 +  ​
 +  WiFi.mode(WIFI_STA);​
 +  WiFi.begin(ssid,​ password);
 +  while (WiFi.status() != WL_CONNECTED) {
 +      // încerc conectarea microcontrolerului la wifi
 +      Serial.print("​."​);​
 +      delay(500);
 +  }
 +  ​
 +  Serial.println("​WiFi connected"​);​
 +  ​
 +  Blynk.begin(auth,​ ssid, password);
 +
 +  * ''​BLYNK_WRITE(V4)''​ este o funcție ce se apelează automat (doar) atunci când sliderul din aplicația mobilă (de pe pinul V4) și-a modificat valoarea. Funcția actualizează valoarea temperaturii dorite și o afișează pe ambele ecrane:
 +
 +  desired_temp = param.asInt();​ // transform valoarea citită în întreg
 +  ​
 +  blynk_lcd.print(0,​ 1, "Set to");
 +  blynk_lcd.print(7,​ 1, desired_temp);​
 +  blynk_lcd.print(9,​ 1, "​°C"​);​
 +  ​
 +  if (!printSeconds) {
 +      // afișez temperatura dorită doar când nu afișez secundele
 +      lcd.setCursor(12,​ 0);
 +      lcd.print(desired_temp);​
 +      lcd.print((char)223); ​ // simbolul pentru grade °
 +      lcd.print("​C"​);​
 +  }
 +
 +  * ''​void printDesiredTempToLcd()''​ afișează temperatura dorită pe ecrane (similar cu funcția anterioară),​ doar că aceasta se apelează constant în funcția ''​loop()'';​
 +  * ''​void printTimeToLcd(strDateTime dateTime)''​ afișează data și ora pe ecranul fizic într-un format ușor de citit pentru utilizator. Pe ecranul virtual al aplicației mobile am optat pentru neafișarea acestor informații întrucât sunt afișate mereu pe smartphone;
 +  * ''​void printStateToLcd()''​ este funcția în care am implementat comandarea centralei termice atât în modul manual cât și în cel automat. Se afișează mesaje corespunzătoare,​ se aprinde/​stinge martorul LED și se cuplează/​decuplează releul. Funcționalitatea manuală pornește/​oprește centrala în funcție de apăsarea butonului ''​OK''​ și de stadiul curent al centralei termice doar dacă temperatura ambientală se află în intervalul de temperaturi dorite (temperatura dorită/​setată ± histerezis/​threshold). Funcționalitatea automată a termostatului pornește dacă temperatura ambientală nu se regăsește în intervalul anterior, iar atunci termostatul va acționa corespunzător pentru a readuce temperatura ambientală în acest interval după cum urmează:  ​
 +  -  dacă temperatura ambientală este sub limita inferioară a intervalului atunci termostatul pornește centrala termică și o blochează în aceast stadiu până ce temperatura ambientală reintră în intervalul dorit sau până ce se micșorează intervalul dorit;
 +   - dacă temperatura ambientală este peste limita superioară a intervalului atunci termostatul oprește centrala termică și o blochează în aceast stadiu până ce temperatura ambientală reintră în intervalul dorit sau până ce se mărește intervalul dorit.
 +
 +{{:​pm:​prj2021:​avaduva:​wifi_central_heating_interval.jpg?​600}}
 +
 +  * ''​void printTempToSerialMonitor()''​ afișează temperatura și umiditatea ambientale și temperatura dorită către monitorul serial;
 +  * ''​void printTempToLcd()''​ afișează temperatura și umiditatea ambientale către cele două ecrane;
 +  * ''​void loop()''​ menține conexiunea cu aplicația Blynk, citește data și ora de la server cu comanda ''​NTPro.getNTPtime(1.0,​ 1);''​ și le afișează la monitorul serial și pe LCD-ul fizic, verifică dacă butoanele sunt apăsate (dacă da atunci fie pornește/​oprește centrala termică, fie crește/​scade temperatura dorită și citește și afișează temperatura și umiditatea de la senzorul DHT11.
  
  
 ===Rezultate Obținute=== ===Rezultate Obținute===
 +Poze:
 +  * Componentele folosite (similare cu cele din pozele furnizorului):​
  
 +{{:​pm:​prj2021:​avaduva:​wifi_central_heating_curent.jpg?​400}}
 +
 +Sursa de alimentare furnizează 1000mA la 8,4V curent continuu ce este transformat ulterior la 5V de către sursa de breadboard și distribuit către esp8266, ecran și releu. Restul componentelor funcționează la 3,3V.
 +
 +{{:​pm:​prj2021:​avaduva:​wifi_central_heating_componente.jpg?​400}}
 +{{:​pm:​prj2021:​avaduva:​wifi_central_heating_esp8266.jpg?​400}}
 +
 +{{:​pm:​prj2021:​avaduva:​wifi_central_heating_releu.jpg?​400}}
 +
 +Releul folosit este diferit de cel inițial. Am optat ulterior pentru un releu ce dispune și de optocuplor. La momentul comandării pieselor am găsit doar modul cu două relee, dar voi utiliza doar unul. După ce am testat releul am concluzionat că acesta cuplează pe un semnal LOW, iar microcontrolerul furnizează un semnal HIGH pentru cuplare (în mod normal pe pinul releului se furnizează un semnal LOW pentru că dacă se resetează microcontrolerul,​ acesta să nu cupleze releul și să pornească centrala termică accidental). Pentru rezolvarea acestei probleme am folosit un tranzistor ce lasă să treacă semnalul de GND/LOW către releu doar când baza acestuia este pe semnalul HIGH.
 +
 +{{:​pm:​prj2021:​avaduva:​wifi_central_heating_ecran_1.jpg?​400}}
 +{{:​pm:​prj2021:​avaduva:​wifi_central_heating_ecran_2.jpg?​400}}
 +
 +Ecranul are deja lipit adaptorul I2C, fiind necesară doar ajustarea luminozității acestuia (se folosește o șurubelniță în cruce ce ajustează potențiometrul albastru de pe spate).
 +
 +  * Ansamblul dispozitivului:​
 +
 +{{:​pm:​prj2021:​avaduva:​wifi_central_heating_ansamblu.jpg?​700}}
 +
 +  * Cele două mesaje de bun venit:
 +
 +{{:​pm:​prj2021:​avaduva:​wifi_central_heating_mesaj_1.jpg?​400}}
 +{{:​pm:​prj2021:​avaduva:​wifi_central_heating_mesaj_2.jpg?​400}}
 +
 +Mesajele sunt afișate și pe ecranul aplicației de pe smartphone.
 +
 +Video ce arată funcționalitatea dispozitivului comandat atât de pe smartphone cât și de la postul de comandă local: [[https://​ctipub-my.sharepoint.com/:​v:/​g/​personal/​petru_mateescu_stud_acs_upb_ro/​ES5Sf8gWu11OkqQyL5aZiLUBDV_lJ3W0eNMrhilFwZ-9_g?​e=4WZjME|wifi_central_heating_video]].
  
  
 ===Concluzii=== ===Concluzii===
 +Proiectul a fost dificil și îl recomand preponderent celor care doresc să accepte o provocare. Am învățat numeroasele lucruri: crearea unei scheme bloc, alcătuirea listei de componente, comandarea componentelor,​ ajustarea comenzii și a proiectului pentru că furnizorul de componente nu are pe stoc toate elementele necesare, asamblarea componentelor,​ implementarea de cod sursă atât pe microcontroler cât și pe aplicația de smartphone și altele. După cum spuneam anterior, releul mi-a dat puțin de furcă pentru că în mod firesc acesta trebuia sa cupleze pe semnalul HIGH și să decupleze pe semnalul LOW, lucru ce nu se întâmplă.
 +
 +Pentru cei neînfricați:​ //Spor la proiect!//
 +
  
 ===Download=== ===Download===
 +Documentația procesorului esp8266: {{:​pm:​prj2021:​avaduva:​esp8266-nodemcu-datasheet.pdf}}.
  
 +Fișierele obținute (codul sursă, schema eagle, biblioteci folosite, schema bloc, intervalul de temperatură dorită): {{:​pm:​prj2021:​avaduva:​wifi_thermostat_files.zip}}.
  
  
 ===Jurnal=== ===Jurnal===
-  * 12 aprilie - achiziție componente hardware +  * 12 aprilie - achiziție componente hardware; 
-  * 15 - 18 aprilie - finalizare conectare componente+  * 15 - 18 aprilie - finalizare conectare componente
 +  * 22 - 23 aprilie - testare funcționalitate componente, începere cod sursă; 
 +  * 30 aprilie - finalizare cod sursă, realizare aplicație smartphone;​ 
 +  * 5 - 6 mai - realizare schemă bloc, schemă electrică;​ 
 +  * 14 - 16 mai - completare pagină documentație;​ 
 +  * 24 - 26 mai - finalizare pagină documentație proiect.
  
  
 ===Bibliografie/​Resurse=== ===Bibliografie/​Resurse===
 +Resurse Software:
 +  * [[https://​docs.blynk.cc/#​hardware-set-ups-nodemcu|Aplicația Blynk cu NodeMCU]]
 +  * [[https://​arduino-esp8266.readthedocs.io/​en/​latest/​esp8266wifi/​readme.html|Biblioteca ESP8266WiFi]]
 +  * [[https://​www.arduino.cc/​reference/​en/​libraries/​simpledht/​|Biblioteca SimpleDHT]]
 +  * [[https://​www.arduino.cc/​en/​Reference/​Wire|Biblioteca Wire]]
 +  * [[https://​www.arduino.cc/​en/​Reference/​LiquidCrystal|Biblioteca LiquidCrystal]]
 +  * [[https://​github.com/​SensorsIot/​NTPtimeESP|Biblioteca NTPtimeESP]]
 +  * [[https://​maxpromer.github.io/​LCD-Character-Creator/​|Generator de caractere speciale pentru ecran LCD]]
  
 +Resurse Hardware:
 +  * [[https://​nodemcu.readthedocs.io/​en/​release/​|Documentația NodeMCU ESP8266]]
 +  * [[https://​github.com/​nodemcu/​nodemcu-firmware|Update de firmware NodeMCU]]
 +  * [[https://​components101.com/​displays/​16x2-lcd-pinout-datasheet|Documentație ecran LCD 16x2]]
 +  * [[https://​www.homemade-circuits.com/​introduction-i2c-lcd-adapter-module/​|Documentație modul I2C pentru ecran]]
 +  * [[https://​components101.com/​switches/​5v-dual-channel-relay-module-pinout-features-applications-working-datasheet|Documentație modul releu]]
 +  * [[https://​components101.com/​sensors/​dht11-temperature-sensor|Documentație DHT11]]
 +  * [[https://​components101.com/​modules/​5v-mb102-breadboard-power-supply-module|Documentație sursă pentru breadboard]]
  
 +Documentația proiectului în format pdf: <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​wifi_thermostat_for_central_heating.pdf</​a></​html>​.
pm/prj2021/avaduva/basic_smart_home.1621109919.txt.gz · Last modified: 2021/05/15 23:18 by petru.mateescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0