Arduino og VirtualWire: Separering af modtaget data

Tags:    arduino wiring c++

Hej udviklere

Jeg er i gang med at forsøge og en vejrstation, der er baseret på to Arduinoer. Min setup er således: Uden for huset sidder der en mindre Arduino med nogle sensorer. Lige p.t. er det kun temperatur og fugtighed. Ideen er at denne Arduino trådløst sender sensorernes data ind til en anden Arduino, der er forbundet til et LCD display, hvor sensorernes data så bliver vist på. Forbindelsen mellem de to Arduino foregår med RF links og det library der hedder VirtualWire.

Jeg er kommet så langt, at jeg har formået at læse sensorerne, sende deres data trådløst til Arduino inden for. Jeg har også formået at få den modtager Arduinoen til at printe hvad den modtager i serial monitoren. Det ser ud til at være korrekt (22.1 er temperature, 46.0 er fugtighed:

Fold kodeboks ind/udC++ kode 


Mit problem er, at jeg gerne vil adskille de forskellige data, som den modtager, så jeg lettere kan printe dataerne på et LCD display. I dette tilfælde kunne ville det være, at adskille 22.1 og 46.0 og måske gemme dem i hver sin data type. (Float ville vel være det oplagte??)

Jeg håber i forstår mit problem og kan hjælpe mig med det! :-)

Transmitter kode:

Fold kodeboks ind/udC++ kode 


Receiver Data:

Fold kodeboks ind/udC++ kode 




Indlæg senest redigeret d. 23.09.2014 10:38 af Bruger #16553
1 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
Helt overordnet er du i gang med at definere en protokol og encoding af værdier. Der er ikke et 'korrekt' svar, det afhænger i sidste ende af behov og ambitioner.

Det jeg hører du siger, at du gerne vil er at protokollen er lidt pænere. Et forslag kunne være, at du sender:
* længde af besked (4 bytes)
* antal målinger (1 byte)
* måling #1 som TLV (? bytes)
* måling #2 som TLV (? bytes)
* ...

Hvor TLV er Tag-Length-Value, og kunne i dit tilfælde gøres simpelt:
* Tag (1 byte)
* Length (1 bytes)
* Value (length bytes)

Dine tags kunne være
* 0x01 = tempature integer (dvs hele grader)
* 0x02 = temperaure decimal (dvs decimal dele fra 0 til 100)
* 0x03 = humidity integer
* 0x04 = humidity decimal

Dvs en tempeatur på 23,4567 grader encodes som
0x01 0x01 0x17
0x02 0x01 0x2d

Det er et FORSLAG, men noget som er relativt simpelt både at encode og decode og som kan udvides løbende som du får behov for.


Bemærk at ovenstående er en simpel binær protokol, med en encoding som er simpel i c++. Havde du brugt java ville det være mere oplagt med noget XML og UTF-8 encoding




Indlæg senest redigeret d. 25.09.2014 12:59 af Bruger #14934
t