Kurs Arduino #10: Obsługa modułów RF 433MHz i 315MHz

4. Drugi program – transmisja wartości ADC

Schemat nadajnika:

kurs 10.2 nadajnik_bb
Schemat odbiornika:
kurs10.2odbiornik
Cały „myk” w tym programie polega na tym, aby przesłać zmienną wartość odczytu ADC, a następnie w odbiorniku zinterpretować ją jako „PWM”.

Program nadajnika:

Tworzymy zmienną, wartoscADC, która będzie przechowywać wartość z przetwornika A/C oraz trzyznakową tablicę adc. Następnie w pętli startowej- tak jak wcześniej- dodajemy informację do jakiego pinu podłączony jest nadajnik oraz z jaką prędkością odbywa się transmisja. W programie jak widać jest jeszcze zinterpretowana transmisja UART, w celu debugawania. Jeżeli chcesz to możesz ją zostawić, albo usunąć czy też skomentować te dwie linijki. Następnie w pętli głównej programu przypisujemy zmiennej wartoscADC odczyt z przetwornika A/C. Następnie dochodzimy do funkcji dtostrf(), która mówiąc w skrócie rozbija wartość liczby zmiennoprzecinkowej (typu float) lub liczby całkowitej (typu int) na pojedyncze znaki w systemie ASCII. Wartość ADC jest zwracana w liczbach całkowitych więc ta funkcja będzie dla nas przydatna. Aby ta funkcja zaistniała to musimy podać jej 4 argumenty:

Zatem jak widać, chcemy aby naszą zmienną wartoscADC rozbić na pojedyncze znaki ASCII. Maksymalna ilość znaków wynosi 3 (maksymalna wartość ADC 255), ilość znaków po przecinku 0. Po rozbiciu zapisz znaki do zmiennej tablicowej adc. Teraz nasze znaki musimy wysłać. Zatem robimy jak wcześniej czyli, wysyłamy tablicę znaków 8 bitową, ale o długości równej tej tablicy. Wiem, że może brzmi to dziwnie ale już tłumaczę. Funkcja strlen() zwraca długość łańcucha znaków, czyli naszej tablicy. Moglibyśmy oczywiście na stałe wpisać długość 3, jak to zrobiliśmy w przykładzie 1. tylko, że tam wysyłaliśmy jeden rodzaj danych, których długość się nie zmieniała, natomiast tutaj wartość zmienia się w zakresie od 1 do 3 znaków, zatem jest to swego rodzaju optymalizacja kodu. Pozostało nam zakończyć tutaj pętle główną oczekiwaniem na zakończenie transmisji. Na koniec pętli nie dałem żadnego opóźnienia, ponieważ chcemy aby jasność naszej diody zmieniała się z jak najmniejszym opóźnieniem i z jak największą płynnością.

Program odbiornika:

W odbiorniku robimy to samo co wcześniej, czyli ustalmy na jaki pin podłączamy odbiornik, z jaką prędkością ma się odbywać transmisja oraz sygnalizujemy gotowość do odbioru danych. W pętli głównej po sprawdzeniu, odebranych danych program przechodzi do utworzenia zmiennej „i” oraz zmiennej string odczytADC. W zmiennej odczytADC będą przechowywane odebrane wartości ADC z nadajnika. Następnie po połączeniu danych w jeden łańcuch znaków, tworzymy zmienną PWM (liczb całkowitych), której przypisujemy funkcję atoi():

Gdy już przekonwertujemy odczytADC na zmienną int to możemy przejść do zapalenia diody. W funkcji analogWrite() zapisujemy wartość PWM jako zmienną. Pewnie teraz się zastanawiacie czemu musieliśmy przekonwertować zmienną String na int. Jest to bardzo proste. Zmienna String zwraca nam ciąg znaków, czyli np. 200. Ale nie oznacza to że to jest liczba 200, tylko to są liczby 2, 0, 0 zapisane obok siebie. Natomiast zmienna int czyli liczby całkowite zwraca całą liczbę, czyli w tym przypadku liczbę 200. Więc ważnym było przekonwertować zmienną String na int. Po wgraniu programów powinniśmy otrzymać, taki efekt: