Мазмұны:

IoT жеңілдетілді: Қашықтағы ауа райы деректерін түсіру: УК және ауа температурасы мен ылғалдылық: 7 қадам
IoT жеңілдетілді: Қашықтағы ауа райы деректерін түсіру: УК және ауа температурасы мен ылғалдылық: 7 қадам

Бейне: IoT жеңілдетілді: Қашықтағы ауа райы деректерін түсіру: УК және ауа температурасы мен ылғалдылық: 7 қадам

Бейне: IoT жеңілдетілді: Қашықтағы ауа райы деректерін түсіру: УК және ауа температурасы мен ылғалдылық: 7 қадам
Бейне: Why Russia's enemies are afraid of MiG-31 SUPERSONIC INTERCEPTOR 2024, Қараша
Anonim
IoT жеңілдетілді: Қашықтағы ауа райы деректерін түсіру: УК және ауа температурасы мен ылғалдылық
IoT жеңілдетілді: Қашықтағы ауа райы деректерін түсіру: УК және ауа температурасы мен ылғалдылық

Бұл оқулықта біз УК (ультракүлгін сәуле), ауа температурасы мен ылғалдылық сияқты қашықтағы деректерді аламыз. Бұл деректер өте маңызды болады және болашақта метеостанцияда пайдаланылады.

Диаграмма блогы соңында не алатынымызды көрсетеді.

Кескін
Кескін

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

NodeMCU (ESP8266-12E) - USD 9.00

Ылғалдылық пен температура сенсоры (DHT22) - USD10.00

Ультракүлгін датчигі - 4,00 АҚШ доллары

OLED АҚШ доллары 12.00

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

2 -қадам: Аналогтық ультракүлгін сенсоры

Аналогты ультракүлгін сенсоры
Аналогты ультракүлгін сенсоры
Аналогты ультракүлгін сенсоры
Аналогты ультракүлгін сенсоры
Аналогты ультракүлгін сенсоры
Аналогты ультракүлгін сенсоры

Бұл ультрафиолет датчигі жарықты сезетін спектрде орналасқан ультракүлгін сәулеленуге пропорционалды шығыс шығарады. Ол 240-370нм жарық диапазонын (ультракүлгін сәулелер мен УКА спектрінің көп бөлігін қамтитын) анықтай алатын ультракүлгін фотодиодты (галлий нитридіне негізделген) қолданады. Фотодиодтан сигнал деңгейі өте аз, нано-ампер деңгейінде, сондықтан модуль сигналды оқылатын вольт деңгейіне (0-ден 1В-ге дейін) күшейту үшін операциялық күшейткішті енгізді.

Датчик пен оп-амперді VCC-ті 3.3VDC-ке (немесе 5VDC-ке) және GND-ді жерге қосу арқылы қосуға болады. Аналогты сигналды OUT түйреуішінен алуға болады.

Оның шығысы милливольтта болады және оны NodeMCU аналогтық кірісі оқиды. Мәнді оқығаннан кейін, оны кодпен жақсы өңдеу үшін оны «түрлендіру» (немесе «карта») жасау керек. Біз мұны readSensorUV () функциясымен жасай аламыз:

/ * Ультракүлгін сенсорды мВ -да оқыңыз және ультракүлгін индексін есептеңіз */

жарамсыз 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 (); }

Бізде ультракүлгін сәулелену деректері болғаннан кейін, біз жоғарыда келтірілген кестеде анықталғандай ультракүлгін индексін оңай есептей аламыз. IndexCalculate () функциясы мұны біз үшін жасайды:

/ * УК индексін есептеу */

void indexCalculate () {if (dataSensorUV <227) indexUV = 0; else if (227 <= dataSensorUV && dataSensorUV <318) indexUV = 1; else if (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; else if (696 <= dataSensorUV && dataSensorUV <795) indexUV = 6; else if (795 <= dataSensorUV && dataSensorUV <881) indexUV = 7; else if (881 <= dataSensorUV && dataSensorUV <976) indexUV = 8; else if (976 <= dataSensorUV && dataSensorUV <1079) indexUV = 9; else if (1079 <= dataSensorUV && dataSensorUV <1170) indexUV = 10; else indexUV = 11; }

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

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

Сынақ мақсатында біз ультрафиолет өлшегішке OLED қосамыз (бұл қадам міндетті емес).

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

  • Дисплей өлшемі: 0,96 дюйм
  • I2C IIC SPI сериялық
  • 128X64
  • Ақ OLED СКД жарықдиодты

Электр схемасын орындаңыз және OLED -дің 4 түйреуішін қосыңыз:

  • VCC 3,3В кернеуге өтеді
  • GND жерге түседі
  • SCL NodeMCU (GPIO 2) ==> D4 тармағына өтеді
  • SDA NodeMCU (GPIO 0) ==> D3 тармағына өтеді

Дисплейді қосқаннан кейін, оның кітапханасын Arduino IDE -ге жүктеп, орнатамыз: Даниэль Эйххорн әзірлеген «SSD1306 дисплейі үшін ESP8266 OLED драйвері» (3.0.0 немесе одан үлкен нұсқасын қолданғаныңызға көз жеткізіңіз!).

Кітапхананы SSD1306Wire.h сайтынан табуға болатын Arduino IDE -ге орнатыңыз

IDE қайта іске қосылғаннан кейін, кітапхана қазірдің өзінде орнатылуы керек.

Кітапхана кірістірілген Wire.h кітапханасының көмегімен OLED дисплейіне қол жеткізу үшін 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. Дисплей басқару:

void init (); // Дисплейді инициализациялау

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

B. Мәтіндік операциялар:

void drawString (int16_t x, int16_t y, Жол мәтіні); // (xpos, ypos, «Мәтін»)

void 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 () бойынша орнату деректерін бастау және көрсету; // display display.clear () дисплейін инициализациялау; // Дисплейдің дисплейін тазарту.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 -қадам: жергілікті ультракүлгін өлшегіш

Жергілікті ультракүлгін өлшегіш
Жергілікті ультракүлгін өлшегіш
Жергілікті ультракүлгін өлшегіш
Жергілікті ультракүлгін өлшегіш

Енді OLED дисплейі орнатылғанда, біз батареяны қосамыз және «ультракүлгін ультракүлгіні» қолдана отырып, қашықтан тест жасай аламыз.

SW_VERSION «UV_Sensor_V.1» анықтаңыз

/ * УК датчигі */ #define сенсор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 display.clear () дисплейін инициализациялау; // Дисплейдің дисплейін тазарту.flipScreenVertically (); // Дисплейді төңкеріңіз display.display (); // Деректерді дисплейге қойыңыз Serial.println («Ультракүлгін датчиктерді сынауды бастау»); display.setFont (ArialMT_Plain_24); display.drawString (10, 0, «MJRoBot»); display.setFont (ArialMT_Plain_16); display.drawString (0, 29, «Ультрафиолет датчиктерінің сынағы»); display.setFont (ArialMT_Plain_10); display.drawString (0, 52, «SW Ver.:»); display.drawString (45, 52, SW_VERSION); display.display (); кешіктіру (3000); } / * Ультракүлгін сенсорды mV -де оқыңыз және UV индексінің есептелуін шақырыңыз * / void readSensorUV () {byte 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; else if (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; else if (696 <= dataSensorUV && dataSensorUV <795) indexUV = 6; else if (795 <= dataSensorUV && dataSensorUV <881) indexUV = 7; else if (881 <= dataSensorUV && dataSensorUV <976) indexUV = 8; else if (976 <= dataSensorUV && dataSensorUV <1079) indexUV = 9; else if (1079 <= dataSensorUV && dataSensorUV <1170) indexUV = 10; else indexUV = 11; } /* УК мәндерін жергілікті OLED -де көрсету* / void displayUV () {display.clear (); display.setFont (ArialMT_Plain_16); display.drawString (20, 0, «Ультракүлгін сенсоры»); 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,3 В пен 5 В аралығында болуы керек және температура үшін +/- 0,5oC дәлдікпен -40oC-тан +80oC-ге дейін және салыстырмалы ылғалдылық үшін +/- 2% жұмыс істейді. Сондай -ақ, оның сезу кезеңі орташа 2 секундты құрайтынын есте ұстаған жөн (оқу арасындағы ең аз уақыт). Adafruit сайты DHT22 және оның ағасы DHT11 туралы көптеген ақпарат береді. Қосымша ақпарат алу үшін DHT22/11 оқулық бетіне кіріңіз.

DHT22 -де 4 түйреуіш бар (сенсорға қарама -қарсы, 1 -түйреуіш сол жақта):

  1. VCC (біз NodeMCU -дан 3.3V -ге қосамыз);
  2. Деректерді шығару;
  3. Қосылмаған және
  4. Жер.

Әдетте сенсорды 20 м -ден аз қашықтықта қолданатын болсаңыз, Data мен VCC түйреуіштері арасында 10K резистор қосылуы керек. Шығу штыры D3 түйініне NodeMCU қосылады (жоғарыдағы диаграмманы қараңыз). Сенсор біздің модульге орнатылғаннан кейін DHT кітапханасын Adafruit GitHub репозиторийінен жүктеп алып, оны Arduino кітапханасының файлына орнатыңыз. Arduino IDE қайта жүктегеннен кейін «DHT сенсорлық кітапханасы» орнатылуы керек.

Кодтың басында біз жолдарды қосуымыз керек:

/* DHT22*/

#«DHT.h» қосу #DHTPIN D2 анықтау #DHTTYPE DHT22 DHT dht (DHTPIN, DHTTYPE) анықтау; float hum = 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; hum = humIni; қайтару; }}

Ультракүлгін және 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 идентификаторыңыз осында»; const char* MY_PWD = «СІЗДІҢ ПАРОЛЫҢЫЗ МЫНА ЖЕРДЕ»; const char* TS_SERVER = «api.thingspeak.com»; String TS_API_KEY = «АРНАҢЫЗДЫҢ АРНАСЫНЫҢ КІЛТІН ЖАЗУ»;

Екіншіден, IoT жобалары үшін өте маңызды кітапхананы қосайық: SimpleTimer.h:

/ * ТАЙМЕР */

#SimpleTimer таймерін қосыңыз;

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

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

{… 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 += Жол (dataSensorUV); postStr += «& field2 =»; postStr += Жол (indexUV); postStr += «& field3 =»; postStr += Жол (темп); 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 («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 веб -серверіне негізделген қашықтықтағы метеостанциядан деректерді орталыққа жібереміз:

Кескін
Кескін

Әлемнің оңтүстігінен сәлем!

Келесі нұсқаулықта кездескенше!

Рақмет сізге, Марсело

Ұсынылған: