joi, 30 mai 2019

Mesaje complexe intre placi Arduino pe comunicatie seriala

     Avand nevoie sa transmit mai multe variabile (numere intregi si cu virgula) pe comunicatia seriala dintre 2 placi de dezvoltare Arduino, m-am lovit de decodarea corecta a mesajelor transmise, de exemplu vreau sa trimit o temperatura de genul +23,40C sau -23,40C, o stare (0 sau 1) si un numar (procent de la 0 la 100)... lungimea unui sir ar fi fost variabila, daca nu luam masuri de corectie (sa transmit, de exemplu 023 in loc de 23)... dupa mai teste impreuna cu 2 prieteni, utilizatori de Arduino (Alex si Mihai, pentru proiecte total diferite) am utilizat informatiile din articolul Chapter 4. Serial Communications (partea de trimitere din subcapitolul 4.4, iar partea de decodare din subcapitolul 4.5).
     Am folosit comunicarea seriala prin utilizarea librariei SoftwareSerial (am folosit pinii 2 si 3). Partea de trimitere a fost incarcata pe o placa Arduino Uno si partea de receptor si decodificare pe Arduino Nano, in special pentru a nu scrie programele gresit...
   Schema de conectare, pentru aceste teste, este foarte simpla:
    Pentru trimitere am folosit intial programul tx_1.ino pentru a transmite un mesaj cu 3 numere: 10, 100, 1000, apoi am trimis valori alese aleator folosind programul tx_1a.ino. Pentru receptor am adaptat programul rx_1.ino.
    Am facut s 2 filmulete, pentru a intelege mai usor cu am scris mai sus:
Mesaje complexe intre placi Arduino pe comunicatie seriala
Multiple Text Fields in Single Message using Arduino
   De mentionat ca se trimit doar numere intregi, pentru a trimite numere cu virgula sau cu semn, se inmultesc numerele cu 10 sau 100, respectiv se mai foloseste un numar pentru semnul minus sau plus, etc, dar astea le voi prezenta intr-un alt articol.


miercuri, 22 mai 2019

Masurare tensiune si curent cu ESP8266 pentru monitorizare panou solar

    Microcontrolelere ESP8266 si, implicit, placile de dezvoltare echipate cu ele, gen WeMos, NodeMCU au doar o intrare de masura analogica, care are maxim 1,0V in cazul microcontrolerului si 3,3V pentru placile de dezvoltare datorita unui divizor (uzual 220k/100k). A se vedea ce am scris in articolul Ceas matriceal animat cu ESP8266 si RTC (DS3231) cu informatii despre temperatura si umiditate (3)
   Aceste informatii sunt din articolul NodeMCU ADC with Arduino IDE
   Pentru a monitoriza, de exemplu, un panou solar de cca 300W, vom folosi un divizor rezistiv R2 = 43k cu R1 = 1k1, respectiv un senzor de curent cu ACS712-20 (sau ACS712-30)... in caz extrem se poate folosi si un senzor ACS712-05B, deoarece senzorul permite un supracurent de pana la 12-13A. De asemenea, vom folosi un divizor rezistiv R4 = 3k3 cu R3 = 1k1.
   Dupa cum se observa, sunt 2 iesiri, care nu se pot masura direct cu ESP8266, asa ca vom folosi un comutator CMOS, eu alegand comutatorul cvadruplu CD4066,
 
din care voi folosi 2 comutatoare (A si B)
   Deoarece placile de dezvoltare cu ESP8266 lucreaza cu tensiunea de 3,3V se alimenteza integratul cu aceea tensiune. Cand se masoara tensiunea de pe A'0 se comanda pinul 13 pentru a coneca pinul 1 cu 2, iar daca se masoara tensiunea de la iesirea senzorului ACS712 se comanda pinul 5 pentru a conecta pinul 3 cu 4. Pinii 2 si 4 sunt conectati impreuna, deci acolo vom lega pinul de masura analogic ADC0 sau AN0 (A0) al placii.
   Senzorii de curent ACS712 i-am prezentat in articolele Senzorul de curent ACS712 (I) si Senzorul de curent ACS712 (II)
care au in repaus pe ieisire 2,5V crescand aceasta tensiune (sau scazand, functie de sensul de conectare) cu 0,185V/A pentru sensorul de 5A, 0,1V/A pentru senzorul de 20A, respectiv 0.066V/A la cel de 30A
   Folosind divizorul nostru, vom avea pentru 3,3V la intrarea lui
   De test, daca nu s-ar conecta senzorul de curent si am lega iesirea divizorului R4-R3 la un voltmetru, am avea urmatoarele valori:
   Daca am conecta un pinul ce ar corespunde ieisirii senzorui de curent de 5A (ACS712-05B) pentru tensiunile de test (3,3V si 0V) am avea corespondenta curentilor
asta trebuie sa obtinem daca incarcam un sketch de test.
    Pentru a testa functionarea partii de masura curent, ne folosim de informatiile din articolul The ACS712 Current Sensor with an Arduino doar ca am adaptat ptrogramul pentru cazul meu, cand am acel divizor 3k3-1k1 si tensiunea de referinta de 3,3V (de fapt e tensiunea maxima pe intrarea placilor cu ESP8266). Programul de test este test_ACS712_esp8266.ino si in ecranul de monitorizare seriala vom observa ceva de genul (test cu 4,9V la intrare)
   Cu valorile din schema, pentru conectarea pinului de masura la 3,3V vom obtine la intrarea pinului A0 de pe placa de dezvoltare cu ESP8266:
    De test, daca am lega iesirea divizorului R2-R1 la un voltmetru, am avea urmatoarele valori:
    Pentru testarea partii de divizor la partea  de masura tensiune, se folosesc informatiile din articolul Arduino 25V Voltage Sensor Module User Manual, programul de test fiind test_voltagedivider_esp8266.ino.
   In ecranul de monitorizare seriala, vom gasi ceva de genul
   Pentru teste reale, impreuna cu amicul Alex, incepem si niste teste reale...
   Pasul urmator este cel de testare a masuratorilor de tensiune si curent conform schemei indicate la inceputul articolului si pentru asta am adaugat comanda pe rand a comutatoarelor din CD4066, dupa cum se vede in programul test_VA_esp8266.ino.
   Pentru valorile lui si o calibrare bruta, Alex a obtinut:
23.05.2019
    Deoarece initial ma gandisem sa testeam pe un ESP8266 "chior", am dimensionat divizoarele pentru tensiunea maxima pe intrarea analogica de 1,0V, apoi testele au fost facute pe placa cu ESP8266 cu tensiune maxima de 3,3V, asa ca tensiunile maxime sunt

sâmbătă, 4 mai 2019

Ceas matriceal animat cu ESP8266 si RTC (DS3231) cu informatii despre temperatura si umiditate (3a)

   Deoarece nu am facut mari modificari fata de ce prezentasem in articolul anterior, am pus partea 3a 😁...
   Am montat o fotorezistenta si o rezistenta de 10k alimentand-o din 3,3V pentru a proteja intrarea analogica, dupa cum am prezentat anterior, pastrand si schema
  Am schimbat ca citirea intensitatii luminoase  din mediul ambiant sa se faca la 2 secunde si daca nivelul citit e diferit de cel anterior sa schimbe luminozitatea afisajului. Programul actualizat este MatrixClock_ESP8266_DHT_3e1.ino, care pastreaza facilitatea de pornirea a ceasului chiar daca nu exista retea wi-fi si se reconecteaza daca s-a pierdut legatura, incearca sa se conecteze la un server NTP din ora in ora pentru a compara ora de acolo cu cea a cesului RTC, etc.
  Am facut 2 filmulte, in care am desscris modul de functionare:
Ceas matriceal animat cu higrometru si termometru (4)
LED Matrix Clock with ESP8266 (4)