Spisu treści:
- Krok 1: BoM - zestawienie materiałów
- Krok 2: Analogowy czujnik UV
- Krok 3: Instalowanie wyświetlacza: OLED
- Krok 4: Lokalny miernik UV
- Krok 5: Instalacja DHT22 do pomiarów temperatury i wilgotności powietrza
- Krok 6: Wysyłanie danych do ThingSpeak.com
- Krok 7: Wniosek
Wideo: IoT stało się łatwe: przechwytywanie zdalnych danych pogodowych: promieniowanie UV i powietrze Temperatura i wilgotność: 7 kroków
2024 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2024-02-01 14:42
W tym samouczku przechwycimy dane zdalne, takie jak promieniowanie UV (promieniowanie ultrafioletowe), temperatura i wilgotność powietrza. Dane te będą bardzo ważne i zostaną wykorzystane w przyszłej kompletnej Stacji Pogodowej.
Schemat blokowy pokazuje, co dostaniemy na końcu.
Krok 1: BoM - zestawienie materiałów
NodeMCU (ESP8266-12E) - 9,00 USD
Czujnik wilgotności i temperatury (DHT22) – 10,00 USD
Czujnik UV - 4,00 USD
OLED 12,00 USD
Deska do krojenia chleba - 1,00 USD
Krok 2: Analogowy czujnik UV
Ten czujnik UV generuje wyjście analogowe proporcjonalne do promieniowania ultrafioletowego występującego w widmie wykrywania światła. Wykorzystuje fotodiodę UV (opartą na azotku galu), która może wykrywać światło w zakresie 240-370nm (który obejmuje UVB i większość widma UVA). Poziom sygnału z fotodiody jest bardzo mały, na poziomie nanoamperów, dlatego moduł ma wbudowany wzmacniacz operacyjny wzmacniający sygnał do bardziej czytelnego poziomu napięcia (0 do 1 V).
Czujnik i wzmacniacz operacyjny można zasilać, podłączając VCC do 3,3 VDC (lub 5 VDC) i GND do uziemienia. Sygnał analogowy można uzyskać z pinu OUT.
Jego wyjście będzie w miliwoltach i zostanie odczytane przez wejście analogowe naszego NodeMCU. Po przeczytaniu powinniśmy go „przekonwertować” (lub „zmapować”), aby wartości były lepiej obsługiwane przez kod. Możemy to zrobić za pomocą funkcji readSensorUV():
/* Odczytywanie czujnika UV w mV i wywołanie obliczenia indeksu UV */
void readSensorUV() { byte numOfReadings = 5; dataSensorUV = 0; for (int i=0; i<liczbaOdczytów; i++) { dataSensorUV += analogRead(sensorUVPin); opóźnienie (200); } dataSensorUV /= numOfReadings; daneSensorUV = (daneSensorUV * (3,3 / 1023,0))*1000; Serial.println(dataSensorUV); indeksOblicz(); }
Gdy mamy dane UV, możemy łatwo obliczyć wskaźnik UV zgodnie z definicją w powyższej tabeli. Funkcja indexCalculate() zrobi to za nas:
/* Obliczanie indeksu UV */
void indexOblicz() { if (dataSensorUV < 227) indexUV = 0; inaczej if (227 <= dataSensorUV && dataSensorUV < 318) indexUV = 1; inaczej if (318 <= dataSensorUV && dataSensorUV < 408) indexUV = 2; inaczej if (408 <= dataSensorUV && dataSensorUV < 503) indexUV = 3; inaczej if (503 <= dataSensorUV && dataSensorUV < 606) indexUV = 4; inaczej if (606 <= dataSensorUV && dataSensorUV < 696) indexUV = 5; inaczej if (696 <= dataSensorUV && dataSensorUV < 795) indexUV = 6; inaczej if (795 <= dataSensorUV && dataSensorUV < 881) indexUV = 7; inaczej if (881 <= dataSensorUV && dataSensorUV < 976) indexUV = 8; inaczej if (976 <= dataSensorUV && dataSensorUV < 1079) indexUV = 9; inaczej if (1079 <= dataSensorUV && dataSensorUV < 1170) indexUV = 10; w przeciwnym razie indeks UV = 11; }
Krok 3: Instalowanie wyświetlacza: OLED
Do celów testowych na naszym mierniku UV umieścimy diodę OLED (ten krok jest całkowicie opcjonalny).
Podczas testów można używać monitora szeregowego, ale co się dzieje, gdy używasz swoich prototypów daleko od komputera w trybie samodzielnym? W tym celu zainstalujmy wyświetlacz OLED, SSD1306, którego główne cechy to:
- Rozmiar wyświetlacza: 0,96"
- I2C IIC SPI szeregowy
- 128X64
- Biała dioda LED OLED LCD
Postępuj zgodnie ze schematem elektrycznym i podłącz 4 piny naszego OLED:
- VCC przechodzi do 3,3 V
- GND idzie do ziemi
- SCL przechodzi do NodeMCU (GPIO 2) ==> D4
- SDA trafia do NodeMCU (GPIO 0) ==>D3
Po podłączeniu wyświetlacza pobierz i zainstaluj jego bibliotekę na naszym Arduino IDE: "ESP8266 OLED Driver for SSD1306 display" opracowany przez Daniela Eichhorna (upewnij się, że używasz wersji 3.0.0 lub wyższej!).
Zainstaluj bibliotekę na swoim Arduino IDE, którą można znaleźć na SSD1306Wire.h
Po ponownym uruchomieniu IDE biblioteka powinna być już zainstalowana.
Biblioteka obsługuje protokół I2C umożliwiający dostęp do wyświetlacza OLED za pomocą wbudowanej biblioteki Wire.h:
/* OLED */
#include "SSD1306Wire.h" #include "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; Wyświetlacz przewodowy SSD1306 (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN);
Wymieńmy kilka ważnych API, które będą używane z naszym wyświetlaczem OLED. Pełną listę można znaleźć na podanym powyżej GITHub.
A. Sterowanie wyświetlaczem:
void init(); // Zainicjuj wyświetlacz
nieważne wyświetlanie włączone (unieważnione); // Włącza wyświetlanie void displayOff(void); // Wyłącza wyświetlanie void clear(void); // Wyczyść lokalny bufor pikseli void flipScreenVertical(); // Odwróć wyświetlacz do góry nogami
B. Operacje tekstowe:
void drawString(int16_t x, int16_t y, tekst ciągu); // (xpos, ypos, "Tekst")
void setFont(const char* fontData); // Ustawia bieżącą czcionkę.
Dostępne czcionki domyślne:
- ArialMT_Plain_10,
-
ArialMT_Plain_16,
- ArialMT_Plain_24
Po zainstalowaniu zarówno samego OLED, jak i jego biblioteki, napiszmy prosty program, aby go przetestować. Wpisz poniższy kod w swoim IDE, wynik powinien być wyświetlany na powyższym zdjęciu:
* OLED */
#include "SSD1306Wire.h" #include "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; Wyświetlacz przewodowy SSD1306 (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); nieważna konfiguracja () { Serial.begin(115200); konfiguracja wyświetlacza(); } void loop() { } /* Inicjowanie i wyświetlanie danych konfiguracyjnych na OLED */ void displaySetup() { display.init(); // inicjalizacja wyświetlania display.clear(); // Wyczyść wyświetlanie display.flipScreenVertical(); // Odwróć wyświetlacz do góry nogami display.display(); // Umieść dane na wyświetlaczu Serial.println("Inicjowanie testu wyświetlania"); display.setFont(ArialMT_Plain_24); display.drawString(30, 0, "OLED"); // (xpos, ypos, "Tekst") display.setFont(ArialMT_Plain_16); display.drawString(18, 29, "Test zainicjowany"); display.setFont(ArialMT_Plain_10); display.drawString(10, 52, "Serial BaudRate:"); display.drawString(90, 52, String(11500)); display.display(); // Opóźnienie wyświetlania danych (3000); }
Powyższy program można pobrać z mojego GitHub:
NodeMCU_OLED_Test
Krok 4: Lokalny miernik UV
Teraz, z zainstalowanym wyświetlaczem OLED, możemy podłączyć baterię i wykonać kilka zdalnych testów za pomocą naszego "miernika UV"
#define SW_VERSION "UV_Sensor_V.1"
/* Czujnik UV */ #define sensorUVPin A0 int dataSensorUV = 0; int indeks UV = 0; /* OLED */ #include "SSD1306Wire.h" #include "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; Wyświetlacz przewodowy SSD1306 (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); void setup() { Serial.begin(115200); konfiguracja wyświetlacza(); } void loop() { readSensorUV(); wyświetl UV(); opóźnienie (1000); } /* Inicjowanie i wyświetlanie danych konfiguracyjnych na OLED */ void displaySetup() { display.init(); // inicjalizacja wyświetlania display.clear(); // Wyczyść wyświetlanie display.flipScreenVertical(); // Odwróć wyświetlacz do góry nogami display.display(); // Umieść dane na wyświetlaczu Serial.println("Inicjowanie testu czujnika UV"); display.setFont(ArialMT_Plain_24); display.drawString(10, 0, "MJRoBot"); display.setFont(ArialMT_Plain_16); display.drawString(0, 29, "Test czujnika UV"); display.setFont(ArialMT_Plain_10); display.drawString(0, 52, "Wer. oprogramowania:"); display.drawString(45, 52, SW_VERSION); display.display(); opóźnienie (3000); } /* Odczytaj czujnik UV w mV i wywołaj obliczenia indeksu UV */ void readSensorUV() { byte numOfReadings = 5; dataSensorUV = 0; for (int i=0; i<liczbaOdczytów; i++) { dataSensorUV += analogRead(sensorUVPin); opóźnienie (200); } dataSensorUV /= numOfReadings; daneSensorUV = (daneSensorUV * (3,3 / 1023,0))*1000; Serial.println(dataSensorUV); indeksOblicz(); } /* Obliczanie indeksu UV */ void indexCalculate() { if (dataSensorUV < 227) indexUV = 0; inaczej if (227 <= dataSensorUV && dataSensorUV < 318) indexUV = 1; inaczej if (318 <= dataSensorUV && dataSensorUV < 408) indexUV = 2; inaczej if (408 <= dataSensorUV && dataSensorUV < 503) indexUV = 3; inaczej if (503 <= dataSensorUV && dataSensorUV < 606) indexUV = 4; inaczej if (606 <= dataSensorUV && dataSensorUV < 696) indexUV = 5; inaczej if (696 <= dataSensorUV && dataSensorUV < 795) indexUV = 6; inaczej if (795 <= dataSensorUV && dataSensorUV < 881) indexUV = 7; inaczej if (881 <= dataSensorUV && dataSensorUV < 976) indexUV = 8; inaczej if (976 <= dataSensorUV && dataSensorUV < 1079) indexUV = 9; inaczej if (1079 <= dataSensorUV && dataSensorUV < 1170) indexUV = 10; w przeciwnym razie indeks UV = 11; } /* Wyświetl wartości UV na lokalnym OLED*/ void displayUV() { display.clear(); display.setFont(ArialMT_Plain_16); display.drawString(20, 0, "Czujnik UV"); display.drawString(0, 23, "UV (mV):"); display.drawString(80, 23, String(dataSensorUV)); display.drawString(0, 48, "Indeks UV:"); display.setFont(ArialMT_Plain_24); display.drawString(82, 42, String(indexUV)); display.display(); }
Powyższy kod można pobrać z mojego GitHun: NodeMCU_UV_Sensor_OLED.ino
Krok 5: Instalacja DHT22 do pomiarów temperatury i wilgotności powietrza
Jednym z najczęściej używanych czujników do przechwytywania danych pogodowych jest DHT22 (lub jego brat DHT11), cyfrowy czujnik wilgotności względnej i temperatury. Wykorzystuje pojemnościowy czujnik wilgotności i termistor do pomiaru otaczającego powietrza i wypuszcza sygnał cyfrowy na pin danych (nie są potrzebne analogowe piny wejściowe).
Czujnik powinien być zasilany w zakresie od 3,3 V do 5 V i pracować w zakresie od -40oC do +80oC z dokładnością +/- 0,5oC dla temperatury i +/-2% dla wilgotności względnej. Należy również pamiętać, że jego okres wykrywania wynosi średnio 2 sekundy (minimalny czas między odczytami). Strona Adafruit dostarcza wielu informacji zarówno o DHT22, jak i jego bracie DHT11. Aby uzyskać więcej informacji, odwiedź stronę samouczka DHT22/11.
DHT22 ma 4 piny (w stronę czujnika, pin 1 jest najbardziej na lewo):
- VCC (podłączymy się do 3,3 V z NodeMCU);
- Dane się;
- Niepodłączony i
- Grunt.
Gdy zwykle będziesz używać czujnika na odległościach mniejszych niż 20m, rezystor 10K powinien być podłączony między pinami Data i VCC. Pin wyjściowy zostanie podłączony do pinu D3 NodeMCU (patrz schemat powyżej). Po zainstalowaniu czujnika w naszym module, pobierz bibliotekę DHT z repozytorium Adafruit GitHub i zainstaluj ją w pliku biblioteki Arduino. Po ponownym załadowaniu Arduino IDE powinna zostać zainstalowana „biblioteka czujników DHT”.
Na początku kodu musimy zawrzeć wiersze:
/* DHT22*/
#include "DHT.h" #define DHTPIN D2 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); szum pływaka = 0; temp. pływaka = 0;
Zostanie utworzona nowa funkcja odczytu czujnika:
/* Pobierz dane DHT */
void getDhtData(void) { float tempIni = temp; pływak humIni = szum; temp = dht.odczytTemperatura(); szum = dht.odczytWilgotność(); if (isnan(hum) || isnan(temp)) // Sprawdź, czy jakiekolwiek odczyty nie powiodły się i wyjdź wcześniej (aby spróbować ponownie). { Serial.println("Nie udało się odczytać z czujnika DHT!"); temp = tempIni; hum = humIni; powrót; } }
Pełny kod zawierający czujniki UV i DHT można pobrać z mojego GitHub: NodeMCU_UV_DHT_Sensor_OLED
Krok 6: Wysyłanie danych do ThingSpeak.com
Do tej pory używaliśmy tylko NodeMCU ESP12-E jako zwykłej i zwykłej płytki Arduino. Oczywiście tylko „wydrapaliśmy” prawdziwy potencjał tego spektakularnego małego chipa i teraz nadszedł czas, aby wznieść się do nieba! Albo lepiej do gwiazd! Eh…do chmury!;-)
Zaczynajmy!
- Najpierw musisz mieć konto na ThinkSpeak.com
- Postępuj zgodnie z instrukcjami, aby utworzyć kanał i zanotuj swój identyfikator kanału i zapisz klucz API
- Zaktualizuj poniższy kod za pomocą sieci Wi-Fi i danych logowania Thinkspeak
- Uruchom program na IDE
Skomentujmy najważniejsze części kodu:
Najpierw wywołajmy bibliotekę ESP8266, zdefiniujmy klienta WiFi i zdefiniujmy poświadczenia lokalnego routera i Thinkspeak:
/* ESP12-E i Thinkspeak*/
#include klienta WiFiClient; const char* MY_SSID = "TUTAJ TWÓJ ID SSD"; const char* MY_PWD = "TUTAJ TWOJE HASŁO"; const char* TS_SERVER = "api.thingspeak.com"; String TS_API_KEY ="TWÓJ KLUCZ API ZAPISU KANAŁU";
Po drugie, dołączmy bardzo ważną bibliotekę dla projektów IoT: SimpleTimer.h:
/* TIMER */
#include minutnik SimpleTimer;
Po trzecie, podczas setup() zainicjujemy komunikację szeregową, wywołamy funkcję connectWiFi() i zdefiniujemy timery. Zauważ, że wiersz kodu: timer.setInterval(60000L, sendDataTS); wywoła funkcję sendDataTS() co 60 sekund, aby przesłać dane do kanału ThinkSpeak.
pusta konfiguracja()
{ … Numer seryjny.początek(115200); opóźnienie(10); … połączWifi(); timer.setInterval(60000L, sendDataTS); … }
W końcu, podczas loop(), jedynym potrzebnym poleceniem jest zainicjowanie timera i to wszystko!
pusta pętla()
{ … timer.run(); // Inicjuje SimpleTimer }
Poniżej możesz zobaczyć dwie ważne funkcje wykorzystywane do obsługi komunikacji Thinkspeak:
Połączenie ESP12-E z siecią WiFi:
/***************************************************
* Podłączanie WiFi *********************************************** ***/ void connectWifi() { Serial.print("Łączenie z "+ *MY_SSID); WiFi.begin (MOJE_SSID, MOJE_PWD); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } Serial.println(""); Serial.println("Połączenie WiFi"); Serial.println(""); }
ESP12-E wysyła dane do ThinkSpeak:
/***************************************************
* Wysyłanie danych do kanału Thinkspeak ********************************************* ******/ void sendDataTS(void) { if (client.connect(TS_SERVER, 80)) { String postStr = TS_API_KEY; postStr += "&field1="; postStr += String(dataSensorUV); postStr += "&field2="; postStr += String(indexUV); postStr += "&field3="; postStr += String(temp); postStr += "&field4="; postStr += String(szum); postStr += "\r\n\r\n"; client.print("POST /aktualizacja HTTP/1.1\n"); client.print("Host: api.thingspeak.com\n"); client.print("Połączenie: zamknij\n"); client.print("X-THINGSPEAKAPIKEY: " + TS_API_KEY + "\n"); client.print("Typ treści: application/x-www-form-urlencoded\n"); client.print("Treść-Długość: "); klient.print(postStr.length()); klient.print("\n\n"); klient.print(postStr); opóźnienie (1000); } wysłano++; klient.stop(); }
Pełny kod można znaleźć na moim GitHub: NodeMCU_UV_DHT_Sensor_OLED_TS_EXT
Po przesłaniu kodu do NodeMCU. Podłączmy zewnętrzną baterię i zróbmy jakiś pomiar pod słońcem. Położyłem Stację zdalną na dachu i zacząłem przechwytywać dane na ThingSpeak.com, jak pokazano na powyższych zdjęciach.
Krok 7: Wniosek
Jak zawsze mam nadzieję, że ten projekt pomoże innym odnaleźć drogę do ekscytującego świata elektroniki!
Aby uzyskać szczegółowe informacje i ostateczny kod, odwiedź mój depozyt na GitHub: RPi-NodeMCU-Weather-Station
Więcej projektów znajdziesz na moim blogu: MJRoBot.org
Czekać na dalsze informacje! Następny samouczek prześlemy dane ze zdalnej stacji pogodowej do centralnej, opartej na serwerze WWW Raspberry Pi:
Saludo z południa świata!
Do zobaczenia w mojej następnej instrukcji!
Dziękuję Ci, Marcelo
Zalecana:
M5STACK Jak wyświetlić temperaturę, wilgotność i ciśnienie na M5StickC ESP32 za pomocą Visuino - łatwe do wykonania: 6 kroków
M5STACK Jak wyświetlić temperaturę, wilgotność i ciśnienie na M5StickC ESP32 za pomocą Visuino - łatwe do zrobienia: W tym samouczku nauczymy się, jak zaprogramować ESP32 M5Stack StickC z Arduino IDE i Visuino, aby wyświetlić temperaturę, wilgotność i ciśnienie za pomocą czujnika ENV (DHT12, BMP280, BMM150)
Jak zrobić rejestrator danych wilgotności i temperatury w czasie rzeczywistym za pomocą Arduino UNO i karty SD - Symulacja rejestratora danych DHT11 w Proteus: 5 kroków
Jak zrobić rejestrator danych wilgotności i temperatury w czasie rzeczywistym za pomocą Arduino UNO i karty SD | Symulacja rejestratora danych DHT11 w Proteus: Wstęp: cześć, tu Liono Maker, tutaj link do YouTube. Tworzymy kreatywne projekty z Arduino i pracujemy na systemach wbudowanych.Data-Logger: Rejestrator danych (również rejestrator danych lub rejestrator danych) to urządzenie elektroniczne, które rejestruje dane w czasie w
Automatyzacja szklarni z LoRa! (Część 1) -- Czujniki (temperatura, wilgotność, wilgotność gleby): 5 kroków
Automatyzacja szklarni z LoRa! (Część 1) || Czujniki (temperatura, wilgotność, wilgotność gleby): W tym projekcie pokażę, jak zautomatyzowałem szklarnię. Oznacza to, że pokażę Ci, jak zbudowałem szklarnię i jak podłączyłem elektronikę energetyczną i automatykę. Pokażę ci również, jak zaprogramować płytkę Arduino, która używa L
WEMOS D1 Temperatura/Wilgotność IoT: 6 kroków
WEMOS D1 Temperatura/Wilgotność IoT: Jest to prosty projekt montażu, podłączenia, kompilacji, który pozwoli Ci rozpocząć pracę z czujnikiem temperatury i wilgotności IoT, który łączy się z Wi-Fi i „przesyła” dane do platformy Blynk IoT. Łatwe monitorowanie za pomocą smartfona.Oprócz os
DIY MusiLED, zsynchronizowane z muzyką diody LED z aplikacją Windows i Linux jednym kliknięciem (32-bitowe i 64-bitowe). Łatwe do odtworzenia, łatwe w użyciu, łatwe do przenoszenia: 3 kroki
DIY MusiLED, zsynchronizowane z muzyką diody LED z aplikacją Windows i Linux jednym kliknięciem (32-bitowe i 64-bitowe). Łatwy do odtworzenia, łatwy w użyciu, łatwy do przenoszenia. Ten projekt pomoże Ci podłączyć 18 diod LED (6 czerwonych + 6 niebieskich + 6 żółtych) do płyty Arduino i przeanalizować sygnały karty dźwiękowej komputera w czasie rzeczywistym i przekazać je do diody LED, aby je oświetlić zgodnie z efektami beatu (Snare, High Hat, Kick)