Съдържание:
- Стъпка 1: BoM - материална сметка
- Стъпка 2: Аналоговият UV сензор
- Стъпка 3: Инсталиране на дисплей: OLED
- Стъпка 4: Местен UV измервател
- Стъпка 5: Инсталиране на DHT22 за измерване на температурата и влажността на въздуха
- Стъпка 6: Изпращане на данни до ThingSpeak.com
- Стъпка 7: Заключение
Видео: IoT стана лесно: Заснемане на отдалечени метеорологични данни: UV и въздушна температура и влажност: 7 стъпки
2024 Автор: John Day | [email protected]. Последно модифициран: 2024-02-01 14:39
В този урок ще заснемем отдалечени данни като UV (ултравиолетова радиация), температура на въздуха и влажност. Тези данни ще бъдат много важни и ще бъдат използвани в бъдеща цялостна метеорологична станция.
Блоковата диаграма показва какво ще получим в края.
Стъпка 1: BoM - материална сметка
NodeMCU (ESP8266-12E) - 9,00 щ.д.
Сензор за влажност и температура (DHT22) - 10,00 USD
UV сензор - 4,00 щ.д.
OLED USD 12.00
Платформа - USD1.00
Стъпка 2: Аналоговият UV сензор
Този UV сензор генерира аналогов изход, пропорционален на ултравиолетовото излъчване, открито в спектъра на чувствителност към светлина. Той използва UV фотодиод (на базата на галиев нитрид), който може да открие светлинния диапазон 240-370nm (който покрива UVB и по-голямата част от UVA спектъра). Нивото на сигнала от фотодиода е много малко, в нивото на нано-ампера, така че модулът е вградил операционен усилвател за усилване на сигнала до по-четиво ниво на волт (0 до 1V).
Сензорът и оп-усилвателят могат да се захранват чрез свързване на VCC към 3.3VDC (или 5VDC) и GND към захранването. Аналоговият сигнал може да бъде получен от изхода OUT.
Неговият изход ще бъде в миливолта и ще се чете от аналоговия вход на нашия NodeMCU. След като бъде прочетено, трябва да го „преобразуваме“(или „картографираме“), за да може стойностите да се обработват по -добре от кода. Можем да го направим с функцията readSensorUV ():
/ * Прочетете UV сензора в mV и извикайте изчислението на UV индекса */
void readSensorUV () {байт numOfReadings = 5; dataSensorUV = 0; for (int i = 0; i <numOfReadings; i ++) {dataSensorUV+= analogRead (sensorUVPin); забавяне (200); } dataSensorUV /= numOfReadings; dataSensorUV = (dataSensorUV * (3.3 / 1023.0)) * 1000; Serial.println (dataSensorUV); indexCalculate (); }
След като имаме UV данните, можем лесно да изчислим UV индекса, както е дефинирано в горната таблица. Функцията indexCalculate () ще го направи вместо нас:
/ * Изчисляване на UV индекс */
void indexCalculate () {if (dataSensorUV <227) indexUV = 0; иначе ако (227 <= dataSensorUV && dataSensorUV <318) indexUV = 1; иначе ако (318 <= dataSensorUV && dataSensorUV <408) indexUV = 2; иначе if (408 <= dataSensorUV && dataSensorUV <503) indexUV = 3; иначе ако (503 <= dataSensorUV && dataSensorUV <606) indexUV = 4; иначе if (606 <= dataSensorUV && dataSensorUV <696) indexUV = 5; иначе if (696 <= dataSensorUV && dataSensorUV <795) indexUV = 6; else if (795 <= dataSensorUV && dataSensorUV <881) indexUV = 7; иначе if (881 <= dataSensorUV && dataSensorUV <976) indexUV = 8; иначе if (976 <= dataSensorUV && dataSensorUV <1079) indexUV = 9; иначе ако (1079 <= dataSensorUV && dataSensorUV <1170) indexUV = 10; else indexUV = 11; }
Стъпка 3: Инсталиране на дисплей: OLED
За целите на теста ще включим OLED на нашия UV метър (Тази стъпка е напълно незадължителна).
По време на тестовете е добре да използвате серийния монитор, но какво се случва, когато използвате прототипите си далеч от компютъра си в самостоятелен режим? За целта нека да инсталираме OLED дисплей, SSD1306, чиито основни характеристики са:
- Размер на дисплея: 0.96"
- I2C IIC SPI сериен
- 128X64
- Бял OLED LCD LED
Следвайте електрическата схема и свържете 4 -те пина на нашия OLED:
- VCC преминава към 3.3V
- GND отива на земята
- SCL отива в NodeMCU (GPIO 2) ==> D4
- SDA отива в NodeMCU (GPIO 0) ==> D3
След като свържем дисплея, нека изтеглим и инсталираме неговата библиотека в нашата Arduino IDE: „ESP8266 OLED драйвер за SSD1306 дисплей“, разработен от Daniel Eichhorn (Уверете се, че използвате версия 3.0.0 или по -нова!).
Инсталирайте библиотеката на вашата Arduino IDE, която може да бъде намерена на SSD1306Wire.h
След като рестартирате IDE, библиотеката трябва да е вече инсталирана.
Библиотеката поддържа I2C протокол за достъп до OLED дисплея с помощта на вградената библиотека 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; SSD1306Wire дисплей (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN);
Нека изброим някои важни API, които ще се използват с нашия OLED дисплей. Пълният списък може да бъде намерен в GITHub, предоставен по -горе.
A. Контрол на дисплея:
void init (); // Инициализиране на дисплея
void displayOn (void); // Включете дисплея на void displayOff (void); // Изключване на дисплея void clear (void); // Изчистване на локалния пикселен буфер void flipScreenVertical (); // Обърнете дисплея с главата надолу
Б. Текстови операции:
void drawString (int16_t x, int16_t y, текст на низ); // (xpos, ypos, "Текст")
void setFont (const char* fontData); // Задава текущия шрифт.
Налични шрифтове по подразбиране:
- ArialMT_Plain_10,
-
ArialMT_Plain_16,
- ArialMT_Равнина_24
След като самите OLED и неговата библиотека са инсталирани, нека напишем проста програма, която да го тества. Въведете с долния код на вашата IDE, резултатът трябва да бъде дисплей, както е показано на горната снимка:
* OLED */
#include "SSD1306Wire.h" #include "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; SSD1306Wire дисплей (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); void setup () {Serial.begin (115200); displaySetup (); } void loop () {} / * Иницииране и показване на настройка на OLED * / void displaySetup () {display.init (); // инициализира дисплея display.clear (); // Изчистване на дисплея.flipScreenVertical (); // Обърнете дисплея с главата надолу display.display (); // Поставете данни на дисплея Serial.println ("Иницииране на тест за показване"); display.setFont (ArialMT_Plain_24); display.drawString (30, 0, "OLED"); // (xpos, ypos, "Text") display.setFont (ArialMT_Plain_16); display.drawString (18, 29, "Тестът е започнат"); display.setFont (ArialMT_Plain_10); display.drawString (10, 52, "Serial BaudRate:"); display.drawString (90, 52, String (11500)); display.display (); // Поставяне на данни за забавяне на дисплея (3000); }
Горната програма може да бъде изтеглена от моя GitHub:
NodeMCU_OLED_Test
Стъпка 4: Местен UV измервател
Сега, с инсталиран OLED дисплей, можем да свържем батерия и да направим някои дистанционни тестове, използвайки нашия „UV метър“
#define SW_VERSION "UV_Sensor_V.1"
/ * UV сензор */ #дефинира сензорUVPin A0 int dataSensorUV = 0; int indexUV = 0; / * OLED */ #include "SSD1306Wire.h" #include "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; SSD1306Wire дисплей (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); void setup () {Serial.begin (115200); displaySetup (); } void loop () {readSensorUV (); displayUV (); забавяне (1000); } / * Иницииране и показване на данни за настройка на OLED * / void displaySetup () {display.init (); // инициализира дисплея display.clear (); // Изчистване на дисплея.flipScreenVertical (); // Обърнете дисплея с главата надолу display.display (); // Поставете данни на дисплея Serial.println ("Иницииране на тест за UV сензор"); display.setFont (ArialMT_Plain_24); display.drawString (10, 0, "MJRoBot"); display.setFont (ArialMT_Plain_16); display.drawString (0, 29, "Тест за UV сензор"); display.setFont (ArialMT_Plain_10); display.drawString (0, 52, "SW Ver.:"); display.drawString (45, 52, SW_VERSION); display.display (); забавяне (3000); } / * Прочетете UV сензора в mV и извикайте изчислението на UV индекс * / void readSensorUV () {байт numOfReadings = 5; dataSensorUV = 0; for (int i = 0; i <numOfReadings; i ++) {dataSensorUV+= analogRead (sensorUVPin); забавяне (200); } dataSensorUV /= numOfReadings; dataSensorUV = (dataSensorUV * (3.3 / 1023.0)) * 1000; Serial.println (dataSensorUV); indexCalculate (); } / * Изчисляване на UV индекс * / void indexCalculate () {if (dataSensorUV <227) indexUV = 0; else if (227 <= dataSensorUV && dataSensorUV <318) indexUV = 1; иначе ако (318 <= dataSensorUV && dataSensorUV <408) indexUV = 2; иначе if (408 <= dataSensorUV && dataSensorUV <503) indexUV = 3; иначе if (503 <= dataSensorUV && dataSensorUV <606) indexUV = 4; иначе if (606 <= dataSensorUV && dataSensorUV <696) indexUV = 5; иначе if (696 <= dataSensorUV && dataSensorUV <795) indexUV = 6; иначе if (795 <= dataSensorUV && dataSensorUV <881) indexUV = 7; иначе if (881 <= dataSensorUV && dataSensorUV <976) indexUV = 8; иначе if (976 <= dataSensorUV && dataSensorUV <1079) indexUV = 9; иначе ако (1079 <= dataSensorUV && dataSensorUV <1170) indexUV = 10; else indexUV = 11; } /* Показване на UV стойностите на локалния OLED* / void displayUV () {display.clear (); display.setFont (ArialMT_Plain_16); display.drawString (20, 0, "UV сензор"); display.drawString (0, 23, "UV (mV):"); display.drawString (80, 23, String (dataSensorUV)); display.drawString (0, 48, "UV индекс:"); display.setFont (ArialMT_Plain_24); display.drawString (82, 42, String (indexUV)); display.display (); }
Горният код може да бъде изтеглен от моя GitHun: NodeMCU_UV_Sensor_OLED.ino
Стъпка 5: Инсталиране на DHT22 за измерване на температурата и влажността на въздуха
Един от най -използваните сензори за улавяне на метеорологични данни е DHT22 (или неговият брат DHT11), цифров сензор за относителна влажност и температура. Той използва капацитивен сензор за влажност и термистор за измерване на околния въздух и изплюва цифров сигнал върху извода за данни (не са необходими аналогови входни щифтове).
Сензорът трябва да се захранва между 3.3V и 5V и ще работи от -40oC до +80oC с точност от +/- 0.5oC за температура и +/- 2% за относителна влажност. Важно е също така да се има предвид, че периодът му на наблюдение е средно 2 секунди (минимално време между показанията). Сайтът на Adafruit предоставя много информация както за DHT22, така и за неговия брат DHT11. За повече подробности, моля, посетете страницата с уроци DHT22/11.
DHT22 има 4 пина (обърнат към сензора, щифт 1 е най -ляв):
- VCC (ще се свържем към 3.3V от NodeMCU);
- Излизане на данни;
- Не са свързани и
- Земя.
След като обикновено ще използвате сензора на разстояния, по -малки от 20 m, трябва да бъде свързан 10K резистор между пиновете Data и VCC. Изходният щифт ще бъде свързан към NodeMCU щифт D3 (вижте диаграмата по -горе). След като сензорът е инсталиран в нашия модул, изтеглете DHT библиотеката от хранилището на Adafruit GitHub и я инсталирайте във файла на вашата библиотека Arduino. След като презаредите вашата Arduino IDE, "DHT сензорната библиотека" трябва да бъде инсталирана.
В началото на кода трябва да включим редовете:
/* DHT22*/
#include "DHT.h" #deteine DHTPIN D2 #deteine DHTTYPE DHT22 DHT dht (DHTPIN, DHTTYPE); плаващ шум = 0; плаваща температура = 0;
Ще бъде създадена нова функция за четене на сензора:
/ * Вземете DHT данни */
void getDhtData (void) {float tempIni = temp; float humIni = бучене; temp = dht.readTemperature (); hum = dht.readHumidity (); if (isnan (hum) || isnan (temp)) // Проверете дали четенето е неуспешно и излезте рано (за да опитате отново). {Serial.println ("Неуспешно четене от DHT сензор!"); temp = tempIni; бум = хумини; връщане; }}
Пълният код, включително UV и DHT сензорите, може да бъде изтеглен от моя GitHub: NodeMCU_UV_DHT_Sensor_OLED
Стъпка 6: Изпращане на данни до ThingSpeak.com
Досега използвахме само NodeMCU ESP12-E като обикновена и обикновена платка Arduino. Разбира се, ние само „надраскахме“реалния потенциал на този грандиозен малък чип и сега е моментът да излетим в небето! Или по -добре към звездите! Ех… към облака!;-)
Нека да започнем!
- Първо, трябва да имате акаунт в ThinkSpeak.com
- Следвайте инструкциите, за да създадете канал и вземете под внимание идентификатора на канала си и API за запис на ключ
- Актуализирайте кода по -долу с вашата WiFi мрежа и идентификационни данни на Thinkspeak
- Стартирайте програмата на IDE
Нека коментираме най -важните части на кода:
Първо, нека да извикаме библиотеката ESP8266, да определим WiFi клиента и да определим вашите локални идентификационни данни за маршрутизатор и Thinkspeak:
/* ESP12-E & Thinkspeak*/
#include WiFiClient клиент; const char* MY_SSID = "ТВОЯТ SSD ID ТУК"; const char* MY_PWD = "ВАШАТА ПАРОЛА ТУК"; const char* TS_SERVER = "api.thingspeak.com"; String TS_API_KEY = "ВАШИЯ КАНАЛ ЗА ЗАПИСВАНЕ НА КЛЮЧ НА API";
Второ, нека включим една много важна библиотека за IoT проекти: SimpleTimer.h:
/ * ТАЙМЕР */
#include SimpleTimer таймер;
Трето, по време на setup () ще инициираме серийна комуникация, ще извикаме функцията connectWiFi () и ще определим таймерите. Обърнете внимание, че редът на кода: timer.setInterval (60000L, sendDataTS); ще извиква функцията sendDataTS () на всеки 60 секунди, за да качва данни в канала ThinkSpeak.
void setup ()
{… Serial.begin (115200); забавяне (10); … ConnectWifi (); timer.setInterval (60000L, sendDataTS); …}
И накрая, но не на последно място, по време на цикъла (), единствената необходима команда е да инициира таймера и това е всичко!
void loop ()
{… Timer.run (); // Инициира SimpleTimer}
По -долу можете да видите двете важни функции, използвани за работа с Thinkspeak комуникация:
ESP12-E връзка с вашата WiFi мрежа:
/***************************************************
*Свързване на WiFi *********************************************** ***/ void connectWifi () {Serial.print ("Свързване към"+*MY_SSID); WiFi.begin (MY_SSID, MY_PWD); while (WiFi.status ()! = WL_CONNECTED) {забавяне (1000); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi свързан"); Serial.println (""); }
ESP12-E изпраща данни към ThinkSpeak:
/***************************************************
*Изпращане на данни към Thinkspeak Channel ****************************************** ******/ void sendDataTS (void) {if (client.connect (TS_SERVER, 80)) {String postStr = TS_API_KEY; postStr += "& field1 ="; postStr += String (dataSensorUV); postStr += "& field2 ="; postStr += Низ (indexUV); postStr += "& field3 ="; postStr += Низ (temp); postStr += "& field4 ="; postStr += Низ (бръмчене); postStr += "\ r / n / r / n"; client.print ("POST /актуализиране на HTTP /1.1 / n"); client.print ("Хост: api.thingspeak.com / n"); client.print ("Връзка: затвори / n"); client.print ("X-THINGSPEAKAPIKEY:" + TS_API_KEY + "\ n"); client.print ("Тип съдържание: application/x-www-form-urlencoded / n"); client.print ("Content-Length:"); client.print (postStr.length ()); client.print ("\ n / n"); client.print (postStr); забавяне (1000); } изпратен ++; client.stop (); }
Пълният код може да бъде намерен на моя GitHub: NodeMCU_UV_DHT_Sensor_OLED_TS_EXT
След като качите кода във вашия NodeMCU. Нека свържем външна батерия и направим известно измерване под слънцето. Слагам Remote Station на покрива и започвам да записвам данни на ThingSpeak.com, както е показано на снимките по -горе.
Стъпка 7: Заключение
Както винаги, надявам се този проект да помогне на другите да намерят своя път във вълнуващия свят на електрониката!
За подробности и окончателен код, моля, посетете моя депозитар на GitHub: RPi-NodeMCU-Weather-Station
За повече проекти, моля, посетете моя блог: MJRoBot.org
Останете на линия! Следващият урок ще изпратим данни от отдалечена метеорологична станция до централна, базирана на уеб сървър на Raspberry Pi:
Поздрави от юга на света!
Ще се видим в следващата ми инструкция!
Благодаря ти, Марсело
Препоръчано:
(Проект IOT) Вземете метеорологични данни с помощта на ESP8266 и API на Openweather: 5 стъпки
(Проект IOT) Вземете метеорологични данни с помощта на ESP8266 и API на Openweather: В тази инструкция ще изградим прост проект на IOT, в който да извлечем метеорологичните данни на нашия град от openweather.com/api и да ги покажем с помощта на софтуер за обработка
M5STACK Как да показвате температура, влажност и налягане на M5StickC ESP32 с помощта на Visuino - Лесно за изпълнение: 6 стъпки
M5STACK Как да показвате температура, влажност и налягане на M5StickC ESP32 с помощта на Visuino - Лесно за правене: В този урок ще се научим как да програмираме ESP32 M5Stack StickC с Arduino IDE и Visuino за показване на температурата, влажността и налягането с помощта на сензор ENV (DHT12, BMP280, BMM150)
Как да направим рекордер за данни за влажност и температура в реално време с Arduino UNO и SD-карта - DHT11 регистратор на данни Симулация в Proteus: 5 стъпки
Как да направим рекордер за данни за влажност и температура в реално време с Arduino UNO и SD-карта | DHT11 симулация на регистратор на данни в Proteus: Въведение: Здравейте, това е Liono Maker, ето линк към YouTube. Ние правим творчески проект с Arduino и работим върху вградени системи. Data-Logger: Регистратор на данни (също регистратор на данни или запис на данни) е електронно устройство, което записва данни във времето с
Изпращане на данни за безжични сензори за температура и влажност на IoT на Google в Google Sheet: 39 стъпки
Изпращане на данни за сензора за температура и влажност на безжичния интернет на IoT към Google Sheet: Тук използваме сензора за температура и влажност на NCD, но стъпките остават равни за всеки от ncd продуктите, така че ако имате други безжични сензори за ncd, можете да наблюдавате наред освен това. Чрез спирането на този текст трябва да
Изпращане на данни от-IOT-безжичен-сензор за температура и влажност-към-MySQL: 41 стъпки
Изпращане на данни от-IOT-безжичен сензор за температура и влажност-към-MySQL: Представяне на сензора за температура и влажност на IoT на NCD за дълги разстояния Разполагащ с обхват до 28 мили и безжична мрежова архитектура, този сензор предава данни за влажност (± 1,7%) и температура (± 0,3 ° C) на определени от потребителя интервали, спящ