This shows you the differences between two versions of the page.
pm:prj2021:avaduva:basic_smart_home [2021/05/25 20:51] 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 42: | Line 42: | ||
| | ||
==Schema electrică== | ==Schema electrică== | ||
- | {{:pm:prj2021:avaduva:wifi_central_heating_electric.png?700}} | + | {{:pm:prj2021:avaduva:wifi_central_heating_electric.jpg?700}} |
Line 48: | Line 48: | ||
Mediul de programare ales este platforma [[https://www.arduino.cc/en/software|Arduino IDE]] cu setările aferente microcontroller-ului NodeMCU ESP8266. | 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.png?400}} | + | {{: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: | 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: | ||
Line 67: | Line 67: | ||
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): | 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): | ||
- | {{:pm:prj2021:avaduva:wifi_central_heating_auth.png?300}} | + | #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: | 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: | ||
- | {{:pm:prj2021:avaduva:wifi_central_heating_ntptime.png?250}} | + | #include <NTPtimeESP.h> |
- | {{:pm:prj2021:avaduva:wifi_central_heating_ntp.png?150}} | + | 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'': | Pentru declararea și utilizarea senzorului DHT11 am folosit biblioteca ''SimpleDHT.h'': | ||
- | {{:pm:prj2021:avaduva:wifi_central_heating_dht11.png?400}} | + | #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: | 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: | ||
- | {{:pm:prj2021:avaduva:wifi_central_heating_ecrane.png?450}} | + | #include <Wire.h> |
- | {{:pm:prj2021:avaduva:wifi_central_heating_lock.png?250}} | + | #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: | Pentru afișarea informaților pe ecrane și monitorul serial mă folosesc de următoarele funcții: | ||
- | {{:pm:prj2021:avaduva:wifi_central_heating_lcd.png?400}} | + | 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): | 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): | ||
Line 91: | Line 130: | ||
* ''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: | * ''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: | ||
- | {{:pm:prj2021:avaduva:wifi_central_heating_setup.png?250}} | + | 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: | * ''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: | ||
- | {{:pm:prj2021:avaduva:wifi_central_heating_write_v4.png?300}} | + | 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 printDesiredTempToLcd()'' afișează temperatura dorită pe ecrane (similar cu funcția anterioară), doar că aceasta se apelează constant în funcția ''loop()''; | ||
Line 103: | Line 167: | ||
- 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. | - 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_new_interval.png?600}} | + | {{: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 printTempToSerialMonitor()'' afișează temperatura și umiditatea ambientale și temperatura dorită către monitorul serial; | ||
Line 154: | Line 218: | ||
Fișierele obținute (codul sursă, schema eagle, biblioteci folosite, schema bloc, intervalul de temperatură dorită): {{:pm:prj2021:avaduva:wifi_thermostat_files.zip}}. | Fișierele obținute (codul sursă, schema eagle, biblioteci folosite, schema bloc, intervalul de temperatură dorită): {{:pm:prj2021:avaduva:wifi_thermostat_files.zip}}. | ||
- | |||
- | 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>. | ||
Line 187: | Line 249: | ||
* [[https://components101.com/modules/5v-mb102-breadboard-power-supply-module|Documentație sursă pentru breadboard]] | * [[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>. |