SStacja pogodowatacja pogodowa 33249249 EESP8266SP8266 … · 2019. 7. 9. · Projekty AVT 20...

4
Projekty AVT Elektronika dla Wszystkich Lipiec 2019 20 W artykule przedstawiono konstrukcję prostej stacji pogodowej mierzącej ciś- nienie, wilgotność i temperaturę z kilku czujników. Wyniki są prezentowane na wyświetlaczu OLED oraz wysyłane na serwer thingspeak. Trwający kurs Ardui- no i zakończony C niewątpliwie ułatwią zrozumienie zasady działania programu stacji pogodowej. Zadaniem stacji pogodowej jest pomiar temperatury przez maksymal- nie 10 czujników temperatury, ciśnie- nia i wilgotności. Wyniki na bieżąco są prezentowane na monochromatycznym wyświetlaczu OLED 128x64. Wyświet- lacz jest zamontowany na płytce modułu ESP-12F (fotografia 1), który można nabyć w sklepie AVT, kod towaru: ARD-9534 i link https://sklep.avt.pl/modul- -nodemcu-wifi-esp8266-esp- -12f-z-wyswietlaczem-oled-0- -96-cala-arduino.html, w skró- cie: https://bit.ly/2HSIriy. Ci śnienie mierzy czuj- nik BMP280, kod towaru ARD-7206, link – https:// sklep.avt.pl/product/ search?query=bmp280, w skró- cie: https://bit.ly/2HRLPtX. Wilgotność mierzy moduł z czujnikiem DHT11 ARD- 8608, link – https://sklep.avt. pl/czujnik-wilgotnosci-i-tempe- ratury-dht11-modul-arduino. html w skrócie: https://bit. ly/2EOuCQ8. Temperaturę mierzy popularny termometr cyfrowy DS18B20, link – https://sklep.avt.pl/pro- duct/search?query=ds18b20 w skrócie: https://bit.ly/2WJBXuB. Ze względu na to, że moduły te były opisywane na łamach EdW, nie ma sensu powielać tych informacji. Opis układu Schemat stacji pogodowej pokazany jest na rysunku 1a. Zasilanie układu czerpa- ne jest z dowolnego zasilacza z wtykiem mini USB. Złącze J5 łączy płytę bazową z modułem ESP8266. Na pły- cie bazowej znajdują się złącza J2, J3 dla zewnętrznych termo- metrów DS18B20. Na płytce jest miejsce dla jednego termometru (U1) oraz barometru BM280 (J4) i higrometru DH11 (J1). Układ U2 zabezpiecza mikrokontroler przed uszkodzeniem przez ładunki ESD i zakłócenia mogące pojawić się w przewodach łączących czuj- nik z mikrokontrolerem. Niestety ten element jest często pomijany w amatorskich konstrukcjach albo zastępowany przez diodę Zenera, która nie jest w stanie zapewnić dobrej ochrony, a wprowadza nie- potrzebnie dużą pojemność. Popularne i tanie moduły Wi-Fi z ESP8266 pozwalają łatwo i szyb- ko budować stosunkowo skom- plikowane konstrukcje. ESP8266 poza podstawową pierwotną funk- cją mostka Wi-Fi UART, po wgra- niu własnego programu do mo- dułu, może realizować przeróżne funkcje, np. bezprzewodowych czujników czy sterowników. Moż- liwość programowania z poziomu ArduinoIDE i bogactwo przykła- dów w Internecie ułatwiają budowę własnych urządzeń. Rys. 1a Fot. 1 Stacja pogodowa Stacja pogodowa ESP8266 ESP8266 z OLED z OLED 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 J5 ESP12-F EN D0 D3 D4 D5 D6 D7 D8 RX TX +5 GND 1 2 3 U1 DS18B20 VCC VCC GND 1 2 3 J3 DS18B20 1 2 3 J2 DS18B20 VCC F1 PCT 100mA R2 2k2 VCC 1 2 3 J1 DTH11 GND VCC R1 2k2 VCC C1 10uF GND SCL SDA D1 D2 R5 1k R6 1k D1 3V3 D2 5V GND GND VCC +5 VCC Vcc 1 D- 2 D+ 3 ID 4 GND 5 G 6 J6 USB-B_SMD GND GND 1 2 3 J7 USB GND +5 C2 10uF GND 1 2 3 4 5 6 J4 BM280 VCC GND R4 2k2 R3 2k2 SCL SDA VCC CSB SDO VCC 6 1 2 5 U2 DS9503 GND Fot. 2 3249 3249

Transcript of SStacja pogodowatacja pogodowa 33249249 EESP8266SP8266 … · 2019. 7. 9. · Projekty AVT 20...

Page 1: SStacja pogodowatacja pogodowa 33249249 EESP8266SP8266 … · 2019. 7. 9. · Projekty AVT 20 Lipiec 2019 Elektronika dla Wszystkich W artykule przedstawiono konstrukcję prostej

Projekty AVT

Elektronika dla WszystkichLipiec 201920

W artykule przedstawiono konstrukcję prostej stacji pogodowej mierzącej ciś-nienie, wilgotność i temperaturę z kilku czujników. Wyniki są prezentowane na wyświetlaczu OLED oraz wysyłane na serwer thingspeak. Trwający kurs Ardui-no i zakończony C niewątpliwie ułatwią zrozumienie zasady działania programu stacji pogodowej.

Zadaniem stacji pogodowej jest pomiar temperatury przez maksymal-nie 10 czujników temperatury, ciśnie-nia i wilgotności. Wyniki na bieżąco są prezentowane na monochromatycznym wyświetlaczu OLED 128x64. Wyświet-lacz jest zamontowany na płytce modułu

ESP-12F (fotografia 1), który

można nabyć w sklepie AVT, kod towaru: ARD-9534 i link – https://sklep.avt.pl/modul--nodemcu-wifi-esp8266-esp--12f-z-wyswietlaczem-oled-0--96-cala-arduino.html, w skró-cie: https://bit.ly/2HSIriy.Ciśnienie mierzy czuj-nik BMP280, kod towaru ARD-7206, link – https://s k l e p . a v t . p l / p r o d u c t /search?query=bmp280, w skró-cie: https://bit.ly/2HRLPtX.Wilgotność mierzy moduł z czujnikiem DHT11 ARD-8608, link – https://sklep.avt.pl/czujnik-wilgotnosci-i-tempe-ratury-dht11-modul-arduino.html w skrócie: https://bit.ly/2EOuCQ8.Temperaturę mierzy popularny termometr cyfrowy DS18B20, link – https://sklep.avt.pl/pro-duct/search?query=ds18b20 w skrócie: https://bit.ly/2WJBXuB.

Ze względu na to, że moduły te były opisywane na łamach EdW, nie ma sensu powielać tych informacji.

Opis układuSchemat stacji pogodowej pokazany jest na rysunku 1a. Zasilanie układu czerpa-ne jest z dowolnego zasilacza z wtykiem mini USB. Złącze J5 łączy płytę bazową

z modułem ESP8266. Na pły-cie bazowej znajdują się złącza J2, J3 dla zewnętrznych termo-metrów DS18B20. Na płytce jest miejsce dla jednego termometru (U1) oraz barometru BM280 (J4) i higrometru DH11 (J1). Układ U2 zabezpiecza mikrokontroler przed uszkodzeniem przez ładunki ESD i zakłócenia mogące pojawić się w przewodach łączących czuj-nik z mikrokontrolerem. Niestety ten element jest często pomijany w amatorskich konstrukcjach albo zastępowany przez diodę Zenera, która nie jest w stanie zapewnić dobrej ochrony, a wprowadza nie-potrzebnie dużą pojemność.

Popularne i tanie moduły Wi-Fi z ESP8266 pozwalają łatwo i szyb-ko budować stosunkowo skom-plikowane konstrukcje. ESP8266 poza podstawową pierwotną funk-cją mostka Wi-Fi UART, po wgra-niu własnego programu do mo-dułu, może realizować przeróżne funkcje, np. bezprzewodowych czujników czy sterowników. Moż-liwość programowania z poziomu ArduinoIDE i bogactwo przykła-dów w Internecie ułatwiają budowę

własnych urządzeń.

Rys. 1a

Fot. 1

Stacja pogodowaStacja pogodowaESP8266ESP8266z OLEDz OLED

12345678910111213141516

J5ESP12-F

END0

D3

D4

D5

D6

D7

D8

RX

TX+5

GND

123

U1

DS18B20

VCC

VCC

GND

123J3

DS18B20

123J2

DS18B20

VCC

F1PCT100mA

R2

2k2VCC

123

J1

DTH11GND

VCC R12k2

VCC

C1

10uF

GND

SCL

SDA

D1

D2

R51k

R61k

D13V3

D25V

GNDGND

VCC +5

VCC

Vcc

1D

-2

D+

3ID

4G

ND

5

G6

J6USB-B_SMD

GND

GND

1 2 3

J7USB

GND

+5C2

10uF

GND 123456

J4

BM280

VCC

GND

R42k2

R32k2

SCLSDA

VCC

CSBSDOVCC

612

5

U2DS9503

GND

Fot. 2

32493249

Page 2: SStacja pogodowatacja pogodowa 33249249 EESP8266SP8266 … · 2019. 7. 9. · Projekty AVT 20 Lipiec 2019 Elektronika dla Wszystkich W artykule przedstawiono konstrukcję prostej

Elektronika dla Wszystkich Lipiec 2019 21

Projekty AVT

Montaż i uruchomieniePodstawą układu jest gotowy moduł zawierający procesor i wyświetlacz (foto-grafia 2). Montaż całości możliwy jest więc na wiele sposo-bów. Można wyko-rzystać płytkę druko-waną, pokazaną na rysunku 1b, która będzie bazą dla pozo-stałych elementów i modułów (doku-mentacja dostęp-na w Elportalu). Higrometr powinien wystawać poza obudowę, w przeciw-nym wypadku wyniki pomiaru będą zaniżone. Temperatura wskazywana przez termometr U1 jest zawyżona o jakieś dwa stopnie gdy czujnik znaj-duje się w obudowie. Jeśli więc prze-widuje się podłączenie zewnętrznego czujnika (czujników), montowanie U1 w obudowie nie ma sensu.

Uruchomienie należy rozpocząć od skompilowania programu. Trzeba pamiętać o wybraniu odpowiedniej wersji płytki. Ze względu na to, że wersji ESP jest kilka, na poniższych zrzutach ekranowych pokazano pra-widłowy wybór.

Naturalnie muszą być zainstalowane wymagane biblioteki. Procesu instalacji bibliotek nie będę opisywał, ponieważ

zajęłoby to kilka stron a ponadto na łamach EdW jest prowadzony kurs, w którym wszystko jest szczegóło-wo opisane i nie ma sensu powielać tych informacji.

Jeśli program kompiluje się pra-widłowo, można go wgrać do modu-łu ESP. Po uruchomieniu powinien pojawić się napis „Restart”, po chwili ekran główny:

Ze względu na brak interfejsu użyt-kownika w postaci np. klawiatury, dane sieci Wi-Fi (SSID, hasło) i serwera thingspeak należy umieścić w kodzie źródłowym, po czym skompilować i wgrać do ESP. Aby zmienić dane sieci Wi-Fi, należy odszukać (CTRL+F) ciągu znaków „password”, po czym wpisać dane swojej sieci://parametry logowania do sieci WiFiconst char* ssid = "nazwaSieci";const char* password = "haslo";

Jeśli dane mają być wysyłane na serwer thingspeak, należy odszukać://dane konta na thingspeakconst char * apiKey = "klucz";unsigned long myChannelNumber = 1;i zmodyfikować apiKey. Skąd wziąć api-Key? Najpierw trzeba zarejestrować się na stronie thingspeak.com. Po rejestracji, potwierdzonej e-mailem i zalogowaniu na stronie, w zakładce „Chanels”

klikamy na „Api Keys” i zobaczymy

gdzie można odczytać lub zmienić klucz.

ProgramProgram, oczywiście w postaci szkicu .ino, jest dość prosty, zawiera komenta-rze, nie ma sensu omawiać go szczegó-łowo. W pętli „loop()” nie ma żadnych „delay” (co jednak wcale nie dowodzi, że funkcje biblioteczne z „delay” nie korzy-stają). Wszystkie opóźnienia realizowane są przy użyciu „millis()”, co oznacza kłopoty co ok. 49 dni. Najprostszym roz-wiązaniem problemu jest reset np. co 24 godziny. W kodzie realizuje to liniaCzasDoResetu = millis() + 24 * 60 * 60 * 1000UL;wykonane pod koniec funkcji „setup()” iif( millis()> CzasDoResetu ){ Serial.print(“\n\*** Abort ***”); abort(); }„w loop()”. Nie jest to jedyny sposób rozwiązania problemu z przepełnieniem licznika systemowego i nie zawsze moż-liwy do zaakceptowania.

Jedyne w całym kodzie polecenie delay() jest użyte w „startup()” w funk-cji inicjalizującej sieć Wi-Fi. Nie było sensu, aby w tej sytuacji używać millis(), bo program kręci się w pętli do czasu nawiązania połączenia z siecią Wi-Fi. Jeśli to się nie uda w ciągu 30 sekund, realizowana jest dalsza część programu, bez komunikacji Wi-Fi.

Rys. 1b

Page 3: SStacja pogodowatacja pogodowa 33249249 EESP8266SP8266 … · 2019. 7. 9. · Projekty AVT 20 Lipiec 2019 Elektronika dla Wszystkich W artykule przedstawiono konstrukcję prostej

Projekty AVT

Elektronika dla WszystkichLipiec 201922

n = 30; while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print(“.”); char txt[20]; sprintf( txt, “Wait %2d”, n ); display.clear(); display.drawString(30, 20, txt ); // display.drawLine(0, 0, 64, 32); // poziom, pion, poziom, pion display.display(); if ( !n-- ) { break; //ESP.restart(); Serial.println(“restart “); } } if ( WiFi.status() == WL_CONNECTED ) { Serial.println(“\n\rPolaczenie WiFi OK”); Serial.println(WiFi.localIP()); } else { Serial.println(“\n\rBlad polaczenia Wi-Fi”); }

Po pięciu minutach zostanie podjęta kolejna próba połączenia z siecią Wi-Fi:

if ( millis() > CzasDoRstWifi ) { millis() + DEF_RESTART_WIFI; WiFi.begin(); display.drawString(128 / 3, STAT_POZ_Y, “RESTART Wi-Fi”); Serial.println(“*Restart Wi-Fi*”); }

Nawiązanie połączenia jest reali-zowane przez funkcję „WiFi.begin();” bez parametrów (ssid, password). Jest to podyktowane tym, że każde wywo-łanie: WiFi.begin(ssid, passphrase) WiFi.softAP(ssid, passphrase, channel) WiFi.disconnect WiFi.softAPdisconnect zapisuje dane w pamięci FLASH. Czę-ste używanie tych funkcji może spo-wodować szybkie jej zużycie. Funkcja „WiFi.begin();” wywoływana jest nieco na wyrost, ponieważ ESP sam próbuje nawiązać połączenie z ostatnio używaną siecią. Można jednak zastąpić „WiFi.begin();” funkcją z parametrami i pró-bować nawiązać połączenie z inną pre-ferowaną siecią. Aby niepotrzebnie nie zapisywać pamięci Flash, przed „WiFi.begin(ssid, password);” należy wywołać „WiFi.persistent(false)”.

W obsłudze barometru dziwić może umieszczenie „bme.begin()” w pętli „loop()”, a nie „setup()”. Dzięki takiemu rozwiązaniu czujnik może być odłącza-ny i podłączany w trakcie pracy urządze-nia. Oczywiście nie zaleca się takiego pos tępowania , ale w programie trzeba przewi-dzieć możliwość utraty komunika-cji, spowodowa-ny np. zakłóce-niami. Fragmentbyte static cntDS = 1; if ( !--cntDS ) { cntDS = 45000UL / DEF_REFRESH_LCD; // Co 45 sekund (45/5 = 9 obiegów pętli wyszukiwanie czujników

powoduje, że co 45 sekund przeszu-kiwana jest magistrala 1-Wire. Dzię-ki temu wykrywane jest odłączenie czy podłączenie nowych czujników. Tablicaconst uint8_t charStopnie16x12[] = { 0B00110000, 0B01111100, 0B01001000, 0B10000010, 0B01001001, 0B00000001, 0B00110010, 0B00000000, 0B00000010, 0B00000000, 0B00000010, 0B00000000, 0B00000010, 0B00000000, 0B00000010, 0B00000000,

0B00000010, 0B00000000, 0B00000001, 0B00000001, 0B00000000, 0B10000010, 0B00000000, 0B01111100, };

definiuje wzór znaku „°C”. Tablica jest umieszczona w pamięci FLASH.

Użytkowników ArduinoUNO i podob-nych na AVR zdziwi tu brak atrybutu PROGMEM. Mikrokontroler, który zasto-sowano w ESP, ma liniową przestrzeń

adresową i o tym, czy dane znajdują się w RAM, FLASH,

czy też w przestrzeni IO, decyduje adres w pamięci, a nie rozkaz CPU.

Co 100 sekund wyniki pomiarów są wysyłane na serwer, za co odpowiada fragment: uint32_t static CzasDoWWW = 10000; if ( millis() > CzasDoWWW ) { CzasDoWWW = millis() + 100000UL;

Wysłanie danych na serwer trwa ponad 5 sekund. Można się o tym dowiedzieć z monitora portu szeregowego. Odpowiadają za to rozkazy, wyróżnio-ne kolorem na list-ingu 1.

Poza wysyłaniem danych na serwer i wyświetlaniem infor-macji na LCD dane o wilgotności, ciśnie-niu i temperaturze są wyświetlane na stro-nie WWW generowa-nej przez stronę stacji pogodowej

Adres IP stacji pogo-dowej można odczytać na routerze, monitorze portu szeregowego lub dowolnym terminalu

W kodzie programu „Serial.print” jest używany dość często, umożliwiając łatwiejsze debugowanie programu.

Strona WWW jest generowana przez funkcję z listingu 2.

Ciąg dalszy na stronie 73

void IndexHandler(){ char static buf[1500]; char txt[100];

buf[0] = 0; sprintf( txt, “SysTick: %d sekund”, millis() / 1000 ); strcat( buf, txt );

if ( dth_presence ) { sprintf( txt, “\nDHT Wilgotnosc: %1.0f%% Temperatura: % 1.0f*C”, dth_h, dth_t ); strcat( buf, txt ); } else { strcat( buf, “DTH Err” ); }

if ( StBme280 ) { sprintf( txt, “\nBMP280 Pressure: %1.0fhPa Temperature: %1.0f*C”, bme_presure / 100, bme_temp ); strcat( buf, txt ); } else { strcat( buf, “BMP Err” ); }

for (byte n = 0; n < MAX_SENSORS && n < device_count; n++) { sprintf( txt, “\n%d %1.2f*C”, n+1, temp[n + 2] ); strcat( buf, txt ); }

webServer.send( 200, “text / plain”, buf );}

Listing 2

CzasObiegu = millis(); ThingSpeak.writeFields(myChannelNumber, apiKey); Serial.print(“Czas wysĹ‚ania do ThingSpeak “); Serial.println( millis() - CzasObiegu);

Listing 1

Page 4: SStacja pogodowatacja pogodowa 33249249 EESP8266SP8266 … · 2019. 7. 9. · Projekty AVT 20 Lipiec 2019 Elektronika dla Wszystkich W artykule przedstawiono konstrukcję prostej

Elektronika dla Wszystkich Lipiec 2019 73

Projekty AVT

Ciąg dalszy ze strony 22Aby funkcja ta działała, musi zostać uruchomiony ser-

wer www, realizowana obsługa zapytań itp. Wszystkie te funkcje można odnaleźć, szukając w kodzie źródłowym ciągu „webServer”. Strona nie jest zbyt okazała, a jeśli miałaby zawierać grafikę, należałoby posłużyć się syste-mem plików. Dokładny opis można znaleźć w EP 12/2018.

Stacja pogodowa może być punktem wyjścia do podob-nych, bardziej rozbudowanych projektów.

[email protected]

R1,R2,R3,R4 . . . . . . . . . . . . . . .2,2kW THTR5,R6 . . . . . . . . . . . . . . . . . . . . . 1kW THTC1,C2 10uF/6.3V ce6.3/2.5 elektrolitD1,D2 . . . . . . .THTDioda LED zielona 5mmU1 . . . . . . . . . . . . . . . . . . DS18B20 TO-92U2 . . . . . . . . . . . . . . . . . . . . DS9503 SO-6F1 . . . . . . . . . . . . . . . . . . PCT 100mA THTJ1 . . . . . . . . . . . . . . . . . . . . . . DTH11 Moduł

+ gniazdo Goldpin 2,54mm

J2,J3 . . . . . . . . . . . . . . . . . . . . . . NS25-G6J4 . . . . . . . . . . . . . . . . . . . . BM280 moduł

+ gniazdo Goldpin 2,54mmJ5 . . . . . . . . . . . . . . . . . . . ESP12-F moduł

+ gniazdo Goldpin kątowe 2,54mmJ6 . . . . . . . . . . . . . . MUSB-B5-S-RA-SMT

gnizdo USB-B Mini

Wykaz elementów

Płytki drukowane są dostępne w Sklepie AVT jako AVT3249