Мазмуну:

IoT оңой: Алыскы аба ырайы маалыматын тартуу: UV жана абанын температурасы жана нымдуулугу: 7 кадам
IoT оңой: Алыскы аба ырайы маалыматын тартуу: UV жана абанын температурасы жана нымдуулугу: 7 кадам

Video: IoT оңой: Алыскы аба ырайы маалыматын тартуу: UV жана абанын температурасы жана нымдуулугу: 7 кадам

Video: IoT оңой: Алыскы аба ырайы маалыматын тартуу: UV жана абанын температурасы жана нымдуулугу: 7 кадам
Video: КАК ПРИГОТОВИТЬ БОГРАЧ. ТАК Я ЕЩЁ НЕ ГОТОВИЛ. ЛУЧШИЙ РЕЦЕПТ 2024, Июль
Anonim
IoT оңой: Алыскы аба ырайы маалыматын тартуу: UV жана абанын температурасы жана нымдуулугу
IoT оңой: Алыскы аба ырайы маалыматын тартуу: UV жана абанын температурасы жана нымдуулугу

Бул үйрөткүчтө биз UV (Ultra-Violet радиациясы), абанын температурасы жана нымдуулугу сыяктуу алыскы маалыматтарды тартып алабыз. Бул маалыматтар абдан маанилүү болот жана келечекте толук Аба ырайы станциясында колдонулат.

Диаграмма блогу аягында эмнени аларыбызды көрсөтөт.

Сүрөт
Сүрөт

1 -кадам: БМ - Материалдык эсеп

NodeMCU (ESP8266-12E) - USD 9.00

Нымдуулук жана температура сенсору (DHT22) - USD10.00

UV сенсор - USD 4.00

OLED USD 12.00

Нан тактасы - USD1.00

2 -кадам: Аналогдук UV сенсор

Аналогдук UV сенсор
Аналогдук UV сенсор
Аналогдук UV сенсор
Аналогдук UV сенсор
Аналогдук UV сенсор
Аналогдук UV сенсор

Бул ультрафиолет сенсору жарыкты сезүүчү спектрде табылган ультрафиолет нурлануусуна пропорционалдуу аналогдук чыгарууну жаратат. Бул 240-370nm жарык диапазонун (UVB жана UVA спектринин көпчүлүгүн камтыйт) аныктай турган UV фотодиодун (галлий нитридинин негизинде) колдонот. Фотодиоддон келген сигналдын деңгээли өтө кичине, нано-ампердик деңгээлде, ошондуктан модул сигналды окулуучу вольт деңгээлине (0дон 1Вге чейин) күчөтүү үчүн оперативдүү күчөткүчтү орноткон.

Сенсорду жана оп-ампти VCCди 3.3VDC (же 5VDC) менен GNDге туташтыруу менен иштетсе болот. Аналогдук сигналды OUT пининен алууга болот.

Анын чыгышы милливольтто болот жана биздин NodeMCUнун аналогдук кирүүсү тарабынан окулат. Окугандан кийин, баалуулуктар код менен жакшыраак иштеши үчүн аны "айландыруу" (же "карта") кылышыбыз керек. Биз муну readSensorUV () функциясы менен жасай алабыз:

/ * UV сенсорун мВда окуңуз жана UV индексинин эсебин чакырыңыз */

жараксыз 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; else if (227 <= dataSensorUV && dataSensorUV <318) indexUV = 1; башка болсо (318 <= dataSensorUV && dataSensorUV <408) indexUV = 2; else if (408 <= dataSensorUV && dataSensorUV <503) indexUV = 3; else if (503 <= dataSensorUV && dataSensorUV <606) indexUV = 4; else if (606 <= dataSensorUV && dataSensorUV <696) indexUV = 5; башка болсо (696 <= dataSensorUV && dataSensorUV <795) indexUV = 6; башка болсо (795 <= dataSensorUV && dataSensorUV <881) indexUV = 7; башка болсо (881 <= dataSensorUV && dataSensorUV <976) indexUV = 8; else if (976 <= dataSensorUV && dataSensorUV <1079) indexUV = 9; башка болсо (1079 <= dataSensorUV && dataSensorUV <1170) indexUV = 10; else indexUV = 11; }

3 -кадам: Дисплейди орнотуу: OLED

Дисплейди орнотуу: OLED
Дисплейди орнотуу: OLED
Дисплейди орнотуу: OLED
Дисплейди орнотуу: OLED

Сыноо максатында, биз УК метрге OLEDди киргизебиз (Бул кадам толугу менен милдеттүү эмес).

Сериялык мониторду колдонуу тесттер учурунда жакшы, бирок сиз прототиптериңизди компьютериңизден алысыраак режимде колдонуп жатканыңызда эмне болуп жатат? Бул үчүн, келгиле, негизги мүнөздөмөлөрү болгон OLED дисплейди, SSD1306 орнотолу:

  • Дисплейдин өлчөмү: 0.96"
  • I2C IIC SPI сериясы
  • 128X64
  • Ак OLED LCD LED

Электр схемасын ээрчип, OLED'ибиздин 4 казыгын туташтырыңыз:

  • VCC 3.3V чейин барат
  • GND жерге түшөт
  • SCL NodeMCU (GPIO 2) ==> D4 барат
  • SDA NodeMCU (GPIO 0) ==> D3 барат

Дисплейди туташтыргандан кийин, анын китепканасын Arduino IDEге жүктөп, орнотуп алалы: Даниэль Эйххорн тарабынан иштелип чыккан "SSD1306 дисплейи үчүн ESP8266 OLED драйвери" (3.0.0 же андан чоңураак версиясын колдонгонуңузду текшериңиз!).

Китепкананы Arduino IDEге орнотуңуз, аны SSD1306Wire.h сайтынан таба аласыз

Сиз IDEди кайра баштагандан кийин, китепкана буга чейин эле орнотулган болушу керек.

Китепкана O2D дисплейине Wire.h камтылган китепканасын колдонуу үчүн I2C протоколун колдойт:

/ * 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);

Келгиле, биздин OLED дисплейибизде колдонула турган кээ бир маанилүү APIлерди тизмектеп көрөлү. Толук тизме жогоруда берилген GITHubдан тапса болот.

A. Display Control:

void init (); // Дисплейди баштоо

void displayOn (жараксыз); // Void displayOff дисплейин күйгүзүү (void); // Дисплейди өчүрүү жокко чыгаруу (жараксыз); // Жергиликтүү пиксель буферинин жараксыздыгын тазалоо flipScreenVertically (); // Дисплейди тескери буруңуз

B. Текст операциялары:

Void drawString (int16_t x, int16_t y, String text); // (xpos, ypos, "Текст")

жараксыз setFont (const char* fontData); // Учурдагы арипти орнотот.

Жеткиликтүү демейки шрифттер:

  • ArialMT_Plain_10,
  • ArialMT_Plain_16,

  • ArialMT_Plain_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 (); // дисплейди көрсөтүүнү баштоо.clear (); // Clear display display.flipScreenVertically (); // дисплейди тескери карагыла display.display (); // Маалыматтарды дисплейге коюңуз Serial.println ("Дисплей тестин баштоо"); display.setFont (ArialMT_Plain_24); display.drawString (30, 0, "OLED"); // (xpos, ypos, "Текст") 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 Meter" аркылуу алыскы тесттерди жасай алабыз.

#define SW_VERSION "UV_Sensor_V.1"

/ * UV Sensor */ #define sensorUVPin 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 (); // дисплейди көрсөтүүнү баштоо.clear (); // Clear display display.flipScreenVertically (); // дисплейди тескери карагыла display.display (); // Маалыматтарды дисплейге коюңуз Serial.println ("UV Sensor Test башталууда"); display.setFont (ArialMT_Plain_24); display.drawString (10, 0, "MJRoBot"); display.setFont (ArialMT_Plain_16); display.drawString (0, 29, "UV Sensor Test"); 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; else if (408 <= dataSensorUV && dataSensorUV <503) indexUV = 3; else if (503 <= dataSensorUV && dataSensorUV <606) indexUV = 4; башка болсо (606 <= dataSensorUV && dataSensorUV <696) indexUV = 5; башка болсо (696 <= dataSensorUV && dataSensorUV <795) indexUV = 6; башка болсо (795 <= dataSensorUV && dataSensorUV <881) indexUV = 7; башка болсо (881 <= dataSensorUV && dataSensorUV <976) indexUV = 8; else 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 Sensor"); display.drawString (0, 23, "UV (mV):"); display.drawString (80, 23, String (dataSensorUV)); display.drawString (0, 48, "UV Index:"); 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 Tutorial баракчасына баш багыңыз.

DHT22де 4 төөнөгүч бар (сенсорго карап, 1 -пин эң сол жакта):

  1. VCC (биз NodeMCUдан 3.3Vга туташабыз);
  2. Маалыматтарды чыгаруу;
  3. Туташкан эмес жана
  4. Жер.

Адатта сенсорду 20мден аз аралыкта колдонсоңуз, маалыматтар менен VCC казыктарынын ортосунда 10K каршылыгы туташтырылышы керек. Чыгуучу пин NodeMCU пин D3 туташат (жогорудагы диаграмманы караңыз). Сенсор биздин модулга орнотулгандан кийин, Adafruit GitHub репозиторийинен DHT китепканасын жүктөп алып, аны Arduino китепканасынын файлына орнотуңуз. Сиз Arduino IDEди кайра жүктөгөндөн кийин, "DHT сенсор китепканасы" орнотулушу керек.

Коддун башында биз саптарды камтышыбыз керек:

/* DHT22*/

#кошуу "DHT.h" #аныктоо DHTPIN D2 #аныктоо DHTTYPE DHT22 DHT dht (DHTPIN, DHTTYPE); float hum = 0; float temp = 0;

Сенсорду окуу үчүн жаңы функция түзүлөт:

/ * DHT маалыматын алуу */

void getDhtData (void) {float tempIni = temp; float humIni = hum; темп = dht.readTemperature (); hum = dht.readHumidity (); if (isnan (hum) || isnan (temp)) // Окуулар ишке ашпай калганын текшериңиз жана эрте чыгып кетиңиз (кайра аракет кылуу үчүн). {Serial.println ("DHT сенсорунан окуу ишке ашкан жок!"); темп = tempIni; hum = humIni; кайтуу; }}

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*/

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

/ * ТАЙМЕР */

#SimpleTimer таймерин кошуу;

Үчүнчүдөн, () орнотуу учурунда биз сериялык байланышты баштайбыз, connectWiFi () функциясын чакырабыз жана таймерлерди аныктайбыз. Көңүл буруңуз: коддун сабы: timer.setInterval (60000L, sendDataTS); ThinkSpeak каналына маалыматтарды жүктөө үчүн sendDataTS () функциясын ар 60 секунд сайын чакырат.

жараксыз орнотуу ()

{… Serial.begin (115200); кечигүү (10); … ConnectWifi (); timer.setInterval (60000L, sendDataTS); …}

Акыры, бирок жок дегенде, цикл учурунда (), таймерди иштетүү үчүн бир гана буйрук керек жана бул бүттү!

боштук цикл ()

{… Timer.run (); // SimpleTimer баштайт}

Төмөндө, Thinkspeak байланышын иштетүү үчүн колдонулган эки маанилүү функцияны көрө аласыз:

WiFi тармагыңыз менен ESP12-E байланышы:

/***************************************************

*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 каналына маалыматтарды жөнөтүү **************************************** ******/ 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 += Сап (темп); postStr += "& field4 ="; postStr += String (hum); postStr += "\ r / n / r / n"; client.print ("POST /update HTTP /1.1 / n"); client.print ("Хост: api.thingspeak.com / n"); client.print ("Байланыш: жабуу / n"); client.print ("X-THINGSPEAKAPIKEY:" + TS_API_KEY + "\ n"); client.print ("Content-Type: 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го жүктөгөндөн кийин. Келгиле, тышкы батареяны туташтырып, күн астында бир аз өлчөө жүргүзөлү. Мен алыскы станцияны чатырга коюп, ThingSpeak.com сайтындагы маалыматтарды жогоруда сүрөттөрдө көрсөтүлгөндөй тартып баштайм.

7 -кадам: Жыйынтык

Жыйынтык
Жыйынтык

Дайыма эле, бул долбоор башкаларга электрониканын кызыктуу дүйнөсүнө жол табууга жардам берет деп ишенем!

Чоо-жайын жана акыркы кодду алуу үчүн GitHub депозитарийиме баш багыңыз: RPi-NodeMCU-Weather-Station

Башка долбоорлор үчүн, менин блогума баш багыңыз: MJRoBot.org

Бар болуңуз! Кийинки үйрөткүч, биз Raspberry Pi веб -серверине негизделген алыскы аба ырайы станциясындагы маалыматтарды борбордук станцияга жөнөтөбүз:

Сүрөт
Сүрөт

Дүйнөнүн түштүгүнөн салам!

Кийинки көрсөтмөмдө көрүшкөнчө!

Рахмат, Marcelo

Сунушталууда: