Am incercat sa transmit datele altfel, intr-un singur mesaj, de data asta cu numar fix de caractere, nu variabil ca in articolul precedent, dar am folosit aceeasi schema
Am folosit informatiile din articolul How to Send Data to Thingspeak Using ESP8266.
Pentru acelasi tip de mesaj, adica temperatura, stare senzor si procent, voi transmite, de datat asta, intai un caracter de control(*), la starsit altul (#), temperatura multiplicata cu 10, apoi de zece ori semnul minus plus stare senzor si apoi procentul, dar, cu numar fix de caractere, astfel:
- temperatura -23,4 grade Celsius, senzor activat si 23% apa, voi transmite: *23411023#
- temperatura -5,7 grade Celsius, senzor dezactivat si 100% apa, voi transmite *05710100#
- temperatura 2,9 grade Celsius, senzor dezactivat si 34% apa, voi transmite *02900034#
- temperatura 29,4 grade Celsius, senzor dezactivat si 34% apa, voi transmite *29400034#
Pentru a vedea utilitatea celor prezentate in articolul anterior am modificat programele sa transmit intr-un singur mesaj 3 valori alese aleator: o temperatura de genul -23.50C sau +23.50C, starea unui senzor (0 sau 1) si un procent (0 la 100).
Schema de conectare este aceeasi
Deoarece nu pot transmite decat valori intregi, ma voi folosi de un artificiu, voi trimite prima valoare un numar de 10 ori mai mare ca temperatura, a doua valoare va fi de un numar format din semnul temperaturii (1 pentru minus si zero pentru plus) inmultit cu 10 si starea vibratiei (0 sau 1) si procentul.
De exemplu, daca am temperatura de +2,40C, starea senzorului activata (1) si procentul de 17%, voi transmite asa:
- primul numar va fi 24
- al doilea numar va fi 1, deoarece semnul temperaturii e plus si starea senzorului 1, deci 10*0+1=1
- al treilea numar 17.
Daca al doilea Arduino primeste: 119,11,39, vom obtine:
- temperatura este -11,90C deoarece al doilea numar este 11 = 1*10 + 1, deci semn negativ, iar primul numar e 119 = 11,9*10;
- starea senzorului e activa 1, fiind cifra unitatilor de la al doilea numar
- procentul de umplere bazin e 39%, fiind chiar la treilea numar.
Testul l-am realizat, ca si data trecuta, cu trimiterea datelor de o placa Arduino Uno, care are un shield pe care este fixata o placa Arduino Nano:
Programul pentru codare si transmitere este tx_2.ino, iar pentru receptie si decodare rx_2.ino !
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.
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.
Pentru a transmite unidirectional (adica doar de al un Arduino catre altul), dar si oarecum securizat (adica fara sa apara erori de comunicare), se pot folosi mai multe metode, una find prin legare directa folosind comunicarea seriala (de fapt doar o parte din ea, TX de la cel care trimite si pinul RX de la cel ce primeste si firul de masa GND); alta metoda e cea prin transmisie radio (emitator RF -> receptor RF), comunicatii prin Wi-Fi, etc.
Am testat, pentru simplitate, varianta cu legarea pe 2 fire (comunicatie unidirectionala) si masa (GND), schema de conectare este extrem de simpla:
Pentru un exemplu de utilizare a unor transmissi simple dintre cel din stanga catre cel din dreapta, vedeti articolul Tech Thurday #005: Arduino to Arduino Serial Communication.
Pentru a fi un experiment ce poate fi folosit la ceva practic, am ales sa folosesc pentru placa Arduino, ce trimite comenzi, un shield cu afisaj LCD1602 si 5 butoane conectate intr-un divizor rezisistiv, cum e cel prezentat la https://www.dfrobot.com si cel folosit de mine sa realizez un termistat; este cel prezentat in articolul Termostat cu control umiditate (higrostat) - partea a 3-a
Divizorul rezisitiv poate avea valorile astea, dar exista versiuni cu alte valori:
Shiled-ul care l-am gasit eu primul este cel cu versiunea 1.0, asa ca am activat partea aceea:
Am montat pini pentru a putea lega fire si am realizat un mic montaj la al 2-lea Arduino cu 5 led-uri (LED1 la D4, LED2 la D5, LED3 la D6, LED4 la D7 si LED5 la D8) la masa (GND, cu o rezistenta de limitare a curentului prin leduri de 220 ohmi (100 ohmi ... 1kohm) catre masa (GND).
Pentru partea de codificare si transmitere a informatiei am folosit programul transmiter_v0.ino, iar pentru receptor si decodificator programul receiver_v0.ino.
Starile sunt:
- nici un buton apasat