5. Trzeci program – transmisja temperatury z czujnika DS18B20
Ten program będzie swego rodzaju zwieńczeniem ostatnich 2 części kursu o obsłudze wyświetlacza, czujnika DS18B20 oraz dzisiejszego o modułach RF. Będzie on również pełnić funkcję utrwalenia dzisiejszej lekcji.
Schemat nadajnika:
Schemat odbiornika:

Kod nadajnika:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include <OneWire.h> //dodaj biblitekę OneWire.h #include <DallasTemperature.h> //dodaj biblitekę DallasTemperature.h #include <VirtualWire.h> //dodaj biblitekę VirtualWire.h int one_wire = 10; //Transmisja 1-Wire na pinie 10 OneWire oneWire(one_wire); //wywołujemy transmisję 1-Wire na pinie 10 DallasTemperature sensors(&oneWire); //informujemy Arduino, ze przy pomocy 1-Wire char pomiar[6]; //utwórz 6 znakową tablicę void setup() { vw_set_tx_pin(11); // nadajnik RF podłączamy do pinu 12 vw_setup(2000); // ustawiamy prędkość transmisji sensors.begin(); // rozpocznij odczyt z czujnika Serial.begin(9600); //rozpocznij transmisję UART o prędkości 9600 baud } void loop() { sensors.requestTemperatures(); //wywołaj odczyt z czujnika float temperatura = sensors.getTempCByIndex(0); //utwórz zmienną float do przechowywania wartości odczytanej temperatury dtostrf(temperatura, 6, 2, pomiar); //przekonwertuj zmienną przecinkową float na pojedyńcze znaki ASCII i umieść je w zmiennej pomiar vw_send((uint8_t *)pomiar, strlen(pomiar)); //wyślij zawartość zmiennej pomaiar vw_wait_tx(); //poczekaj aż całość zostanie wysłana delay(500); //poczekaj 0,5sekundy } |
Pozwolę sobie od razu przejść do pętli głównej programu. Na początku wywołujemy odczyt z czujnika DS18B20. Następnie tworzymy zmienną typu float (liczba zmiennoprzecinkowa) i przypisujemy jej dane z czujnika DS18B20. Musimy to zrobić za pomocą float, ponieważ chcemy poznać wartości temperatury po przecinku. Przykład: czujnik odczytał temperaturę 27,58 stopnia Celsjusza. Gdybyśmy przypisali zmienną int to byśmy otrzymywali wartość 27 stopni Celsjusza. Dlatego wykorzystujemy zmienną float, aby poznać wartość temperatury po przecinku. Następnie przy pomocy funkcji dtostrf() rozbijamy zmienną float na pojedyncze znaki. Ilość znaków 6 (zakładając, że uzyskamy temperaturę powyżej 100.00 stopni Celsujsza), ilość znaków po przecinku 2. Rozbite znaki przenieś do zmiennej tablicowej pomiar[6]. Następnie wyślij wartość zmiennej tablicowej o długości równej tablicy. Następnie poczekaj do zakończenia transmisji i odczekaj dodatkowo 0,5 sekundy.
Kod odbiornika:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
#include <VirtualWire.h> // dodaj bibliotekę VirtualWire.h #include <LiquidCrystal.h> // dodaj bibliotekę LiquidCrystal.h LiquidCrystal lcd(3,4,5,6,7,8,9); void setup() { lcd.begin(20,4); //ustaw rozdzielczość ekranu 20x4 lcd.clear(); //wyczysc ekran Serial.begin(9600); // rozpocznij transmisję UART o prędkości 9600 baud vw_setup(2000); // ustal prędkość odbioru RF na 2000 baud vw_rx_start(); // rozpocznij transmisję RF vw_set_rx_pin(11); // odbiornik RF podłączony do pinu 11 } void loop() { lcd.clear(); uint8_t buf[VW_MAX_MESSAGE_LEN]; // definicja buforu odbioru danych uint8_t buflen = VW_MAX_MESSAGE_LEN; // oraz dlugości otrzymanych danych if (vw_get_message(buf, &buflen)) // jeżeli do buforu danych dotarły dane oraz // transmisja została zakończona i długość danych nie przekracza 8-bitów { int i; // utwórz zmienną i String pomiar; // utwórz zmienną string dane for (i = 0; i < buflen; i++) // jeżeli wartość i < 0 to odbieraj znaki { pomiar +=char(buf[i]); // do zmiennej string wprowadź wszystkie otrzymane znaki i je połącz } lcd.setCursor(0,0); lcd.print("Temperatura:"); lcd.print(pomiar); // wyświetl wartość temperatury lcd.print((char)223); // znak stopnia lcd.print("C"); delay(1000); } } |
Tutaj sytuacja wygląda podobnie jak w programie 2. Po weryfikacji danych utwórz zmienną „i” oraz String pomiar. Następnie do zmiennej String wstaw i połącz znaki znajdujące się buforze odbioru. Ustawiamy kursor wyświetlacza w lewym górnym rogu i wyświetl: „Temperatura: ” wartość temperatury (zmienna pomiar), znak stopnia oraz „C”. Odczekaj sekundę. Jak widać obsługa tych modułów nie jest taka trudna jak mogłoby się zdawać. Co prawda trzeba trochę pokombinować, jak przesyłać zmienne dane, ale gdy już to się opanuje to będzie znaczenie łatwiej w przyszłości ;)
Efekt naszego programu:
Materiały do tej części kursu:
Jeżeli chcesz być informowany na bieżąco o nowych częściach kursu to kliknij „Lubię to!” bądź subskrybuj naszą stronę, aby otrzymywać na adres e-mail nowości ze strony. Jeżeli masz jakieś pytania to śmiało zadawaj je na forum ; )