Съдържание:

IoT стана лесно: Заснемане на отдалечени метеорологични данни: UV и въздушна температура и влажност: 7 стъпки
IoT стана лесно: Заснемане на отдалечени метеорологични данни: UV и въздушна температура и влажност: 7 стъпки

Видео: IoT стана лесно: Заснемане на отдалечени метеорологични данни: UV и въздушна температура и влажност: 7 стъпки

Видео: IoT стана лесно: Заснемане на отдалечени метеорологични данни: UV и въздушна температура и влажност: 7 стъпки
Видео: Hubble - 15 years of discovery 2024, Юли
Anonim
IoT стана лесно: Заснемане на отдалечени метеорологични данни: UV и въздушна температура и влажност
IoT стана лесно: Заснемане на отдалечени метеорологични данни: UV и въздушна температура и влажност

В този урок ще заснемем отдалечени данни като 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 сензор
Аналоговият UV сензор
Аналоговият UV сензор
Аналоговият UV сензор
Аналоговият 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
Инсталиране на дисплей: OLED
Инсталиране на дисплей: OLED
Инсталиране на дисплей: 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 измервател

Локален UV метър
Локален UV метър
Локален UV метър
Локален 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 за измерване на температурата и влажността на въздуха
Инсталиране на DHT22 за измерване на температурата и влажността на въздуха
Инсталиране на DHT22 за измерване на температурата и влажността на въздуха
Инсталиране на DHT22 за измерване на температурата и влажността на въздуха

Един от най -използваните сензори за улавяне на метеорологични данни е DHT22 (или неговият брат DHT11), цифров сензор за относителна влажност и температура. Той използва капацитивен сензор за влажност и термистор за измерване на околния въздух и изплюва цифров сигнал върху извода за данни (не са необходими аналогови входни щифтове).

Сензорът трябва да се захранва между 3.3V и 5V и ще работи от -40oC до +80oC с точност от +/- 0.5oC за температура и +/- 2% за относителна влажност. Важно е също така да се има предвид, че периодът му на наблюдение е средно 2 секунди (минимално време между показанията). Сайтът на Adafruit предоставя много информация както за DHT22, така и за неговия брат DHT11. За повече подробности, моля, посетете страницата с уроци DHT22/11.

DHT22 има 4 пина (обърнат към сензора, щифт 1 е най -ляв):

  1. VCC (ще се свържем към 3.3V от NodeMCU);
  2. Излизане на данни;
  3. Не са свързани и
  4. Земя.

След като обикновено ще използвате сензора на разстояния, по -малки от 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

Изпращане на данни до ThingSpeak.com
Изпращане на данни до ThingSpeak.com
Изпращане на данни до ThingSpeak.com
Изпращане на данни до ThingSpeak.com
Изпращане на данни до ThingSpeak.com
Изпращане на данни до ThingSpeak.com

Досега използвахме само NodeMCU ESP12-E като обикновена и обикновена платка Arduino. Разбира се, ние само „надраскахме“реалния потенциал на този грандиозен малък чип и сега е моментът да излетим в небето! Или по -добре към звездите! Ех… към облака!;-)

Нека да започнем!

  1. Първо, трябва да имате акаунт в ThinkSpeak.com
  2. Следвайте инструкциите, за да създадете канал и вземете под внимание идентификатора на канала си и API за запис на ключ
  3. Актуализирайте кода по -долу с вашата WiFi мрежа и идентификационни данни на Thinkspeak
  4. Стартирайте програмата на 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:

Образ
Образ

Поздрави от юга на света!

Ще се видим в следващата ми инструкция!

Благодаря ти, Марсело

Препоръчано: