Spisu treści:

IoT stało się łatwe: przechwytywanie zdalnych danych pogodowych: promieniowanie UV i powietrze Temperatura i wilgotność: 7 kroków
IoT stało się łatwe: przechwytywanie zdalnych danych pogodowych: promieniowanie UV i powietrze Temperatura i wilgotność: 7 kroków

Wideo: IoT stało się łatwe: przechwytywanie zdalnych danych pogodowych: promieniowanie UV i powietrze Temperatura i wilgotność: 7 kroków

Wideo: IoT stało się łatwe: przechwytywanie zdalnych danych pogodowych: promieniowanie UV i powietrze Temperatura i wilgotność: 7 kroków
Wideo: 25.01 Оперативная обстановка. Так вот ты какой "Леопард 2". @OlegZhdanov 2024, Lipiec
Anonim
IoT stało się łatwe: przechwytywanie zdalnych danych pogodowych: promieniowanie UV i temperatura i wilgotność powietrza
IoT stało się łatwe: przechwytywanie zdalnych danych pogodowych: promieniowanie UV i temperatura i wilgotność powietrza

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.

Obraz
Obraz

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

Analogowy czujnik UV
Analogowy czujnik UV
Analogowy czujnik UV
Analogowy czujnik UV
Analogowy czujnik UV
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

Instalowanie wyświetlacza: OLED
Instalowanie wyświetlacza: OLED
Instalowanie wyświetlacza: OLED
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

Lokalny miernik UV
Lokalny miernik UV
Lokalny miernik UV
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

Instalacja DHT22 do pomiaru temperatury i wilgotności powietrza
Instalacja DHT22 do pomiaru temperatury i wilgotności powietrza
Instalacja DHT22 do pomiaru temperatury i wilgotności powietrza
Instalacja DHT22 do pomiaru 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):

  1. VCC (podłączymy się do 3,3 V z NodeMCU);
  2. Dane się;
  3. Niepodłączony i
  4. 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

Wysyłanie danych do ThingSpeak.com
Wysyłanie danych do ThingSpeak.com
Wysyłanie danych do ThingSpeak.com
Wysyłanie danych do ThingSpeak.com
Wysyłanie danych do ThingSpeak.com
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!

  1. Najpierw musisz mieć konto na ThinkSpeak.com
  2. Postępuj zgodnie z instrukcjami, aby utworzyć kanał i zanotuj swój identyfikator kanału i zapisz klucz API
  3. Zaktualizuj poniższy kod za pomocą sieci Wi-Fi i danych logowania Thinkspeak
  4. 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

Wniosek
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:

Obraz
Obraz

Saludo z południa świata!

Do zobaczenia w mojej następnej instrukcji!

Dziękuję Ci, Marcelo

Zalecana: