Sisällysluettelo:

IoT Helppo: Kauko -säätietojen tallentaminen: UV- ja ilman lämpötila ja kosteus: 7 vaihetta
IoT Helppo: Kauko -säätietojen tallentaminen: UV- ja ilman lämpötila ja kosteus: 7 vaihetta

Video: IoT Helppo: Kauko -säätietojen tallentaminen: UV- ja ilman lämpötila ja kosteus: 7 vaihetta

Video: IoT Helppo: Kauko -säätietojen tallentaminen: UV- ja ilman lämpötila ja kosteus: 7 vaihetta
Video: 40 полезных автотоваров с алиэкспресс, которые упростят жизнь любому автовладельцу #8 2024, Heinäkuu
Anonim
IoT Helppo: Kauko -säätietojen tallentaminen: UV ja ilman lämpötila ja kosteus
IoT Helppo: Kauko -säätietojen tallentaminen: UV ja ilman lämpötila ja kosteus

Tässä opetusohjelmassa keräämme etätietoja UV (ultraviolettisäteily), ilman lämpötila ja kosteus. Nämä tiedot ovat erittäin tärkeitä ja niitä käytetään tulevassa täydellisessä sääasemassa.

Lohkokaavio näyttää, mitä saamme lopussa.

Kuva
Kuva

Vaihe 1: BoM - Bill of Material

NodeMCU (ESP8266-12E) - 9,00 USD

Kosteus- ja lämpötila -anturi (DHT22) - USD10.00

UV -anturi - 4,00 USD

OLED USD 12.00

Leipälauta - 1,00 USD

Vaihe 2: Analoginen UV -anturi

Analoginen UV -anturi
Analoginen UV -anturi
Analoginen UV -anturi
Analoginen UV -anturi
Analoginen UV -anturi
Analoginen UV -anturi

Tämä UV-anturi tuottaa analogisen lähdön, joka on verrannollinen valoa tunnistavasta spektristä löytyvään ultraviolettisäteilyyn. Se käyttää UV-fotodiodia (perustuu galliumnitridiin), joka pystyy havaitsemaan 240-370 nm: n valon (joka kattaa UVB: n ja suurimman osan UVA-spektristä). Valodiodin signaalitaso on hyvin pieni, nano-ampeeritasolla, joten moduuli on sisällyttänyt operaatiovahvistimen vahvistamaan signaalin luettavammalle voltitasolle (0-1 V).

Anturiin ja op-vahvistimeen voidaan kytkeä virta kytkemällä VCC 3.3VDC (tai 5VDC) ja GND maadoitukseen. Analoginen signaali voidaan saada OUT -nastasta.

Sen lähtö on millivoltteja ja se luetaan NodeMCU: n analogisen tulon avulla. Kun se on luettu, se pitäisi "muuntaa" (tai "kartoittaa"), jotta koodi käsittelee arvot paremmin. Voimme tehdä sen funktiolla readSensorUV ():

/ * Lue UV -anturi mV ja soita UV -indeksilasku */

void readSensorUV () {tavu numOfReadings = 5; dataSensorUV = 0; for (int i = 0; i <numOfReadings; i ++) {dataSensorUV+= analogRead (sensorUVPin); viive (200); } dataSensorUV /= numOfReadings; dataSensorUV = (dataSensorUV * (3.3 / 1023.0)) * 1000; Serial.println (dataSensorUV); indexCalculate (); }

Kun meillä on UV -tiedot, voimme helposti laskea UV -indeksin yllä olevan taulukon mukaisesti. Funktio indexCalculate () tekee sen puolestamme:

/ * UV -indeksin laskeminen */

void indexCalculate () {if (dataSensorUV <227) indexUV = 0; muuten jos (227 <= dataSensorUV && dataSensorUV <318) indexUV = 1; muuten jos (318 <= dataSensorUV && dataSensorUV <408) indexUV = 2; muuten jos (408 <= dataSensorUV && dataSensorUV <503) indexUV = 3; muuten jos (503 <= dataSensorUV && dataSensorUV <606) indexUV = 4; muuten jos (606 <= dataSensorUV && dataSensorUV <696) indexUV = 5; muuten jos (696 <= dataSensorUV && dataSensorUV <795) indexUV = 6; muuten jos (795 <= dataSensorUV && dataSensorUV <881) indexUV = 7; muuten jos (881 <= dataSensorUV && dataSensorUV <976) indexUV = 8; muuten jos (976 <= dataSensorUV && dataSensorUV <1079) indexUV = 9; else if (1079 <= dataSensorUV && dataSensorUV <1170) indexUV = 10; muuten indeksiUV = 11; }

Vaihe 3: Näytön asentaminen: OLED

Näytön asentaminen: OLED
Näytön asentaminen: OLED
Näytön asentaminen: OLED
Näytön asentaminen: OLED

Testaustarkoituksiin lisäämme OLED -valon UV -mittariin (tämä vaihe on täysin valinnainen).

Sarjamonitorin käyttö on OK testien aikana, mutta mitä tapahtuu, kun käytät prototyyppejä kaukana tietokoneesta erillisessä tilassa? Asennetaan sitä varten OLED -näyttö, SSD1306, jonka pääominaisuudet ovat:

  • Näytön koko: 0,96"
  • I2C IIC SPI -sarja
  • 128 x 64
  • Valkoinen OLED LCD LED

Noudata sähkökaaviota ja liitä OLEDin neljä nastaa:

  • VCC menee 3,3 V.
  • GND menee maahan
  • SCL siirtyy NodeMCU: hon (GPIO 2) ==> D4
  • SDA siirtyy NodeMCU: hon (GPIO 0) ==> D3

Kun olemme liittäneet näytön, lataa ja asenna sen kirjasto Arduino IDE -laitteeseemme: Daniel Eichhornin kehittämä "ESP8266 OLED Driver for SSD1306 -näyttö" (Varmista, että käytät versiota 3.0.0 tai uudempaa!).

Asenna kirjasto Arduino IDE -laitteeseesi, joka löytyy SSD1306Wire.h -sivustolta

Kun olet käynnistänyt IDE: n uudelleen, kirjaston pitäisi olla jo asennettu.

Kirjasto tukee I2C-protokollaa OLED-näytön käyttämiseen sisäänrakennetun Wire.h-kirjaston avulla:

/ * OLED */

#include "SSD1306Wire.h" #include "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; SSD1306Wire -näyttö (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN);

Luetellaan joitakin tärkeitä sovellusliittymiä, joita käytetään OLED -näytön kanssa. Täydellinen luettelo löytyy yllä olevasta GITHubista.

Näytön ohjaus:

mitätön init (); // Alusta näyttö

void displayOn (mitätön); // Kytke näyttö päälle tyhjä näyttöOff (void); // Kytke näyttö pois päältä void clear (void); // Tyhjennä paikallinen pikselipuskuri void flipScreenVertically (); // Käännä näyttö ylösalaisin

Tekstitoiminnot:

void drawString (int16_t x, int16_t y, merkkijonoteksti); // (xpos, ypos, "Teksti")

void setFont (const char* fontData); // Asettaa nykyisen fontin.

Käytettävissä olevat oletusfontit:

  • ArialMT_Plain_10,
  • ArialMT_Plain_16,

  • ArialMT_Plain_24

Kun sekä OLED että sen kirjasto on asennettu, kirjoitetaan yksinkertainen ohjelma sen testaamiseksi. Kirjoita IDE -laitteeseesi alla oleva koodi, tuloksen pitäisi olla yllä olevan kuvan mukainen näyttö:

* OLED */

#include "SSD1306Wire.h" #include "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; SSD1306Wire -näyttö (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); void setup () {Serial.begin (115200); displaySetup (); } void loop () {} / * Aloita ja näytä asetustiedot OLED -laitteella * / void displaySetup () {display.init (); // alustetaan näytön näyttö.clear (); // Tyhjennä näytön näyttö.flipScreenVertically (); // Käännä näyttö ylösalaisin.display (); // Laita tiedot näyttöön Serial.println ("Initiation Display Test"); display.setFont (ArialMT_Plain_24); display.drawString (30, 0, "OLED"); // (xpos, ypos, "Teksti") display.setFont (ArialMT_Plain_16); display.drawString (18, 29, "Testi aloitettu"); display.setFont (ArialMT_Plain_10); display.drawString (10, 52, "Serial BaudRate:"); display.drawString (90, 52, merkkijono (11500)); display.display (); // Laita tiedot näytön viiveeseen (3000); }

Yllä oleva ohjelma voidaan ladata GitHubista:

SolmuMCU_OLED_Testi

Vaihe 4: Paikallinen UV -mittari

Paikallinen UV -mittari
Paikallinen UV -mittari
Paikallinen UV -mittari
Paikallinen UV -mittari

Nyt kun OLED -näyttö on asennettu, voimme liittää akun ja tehdä joitain etätestejä käyttämällä "UV -mittaria"

#define SW_VERSION "UV_Sensor_V.1"

/ * UV -anturi */ #määrittele anturiUVPin A0 int dataSensorUV = 0; int -indeksiUV = 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 -näyttö (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); void setup () {Serial.begin (115200); displaySetup (); } void loop () {readSensorUV (); displayUV (); viive (1000); } / * Aloita ja näytä asetustiedot OLED -laitteella * / void displaySetup () {display.init (); // alustetaan näytön näyttö.clear (); // Tyhjennä näytön näyttö.flipScreenVertically (); // Käännä näyttö ylösalaisin.display (); // Laita tiedot näyttöön Serial.println ("Initiation UV Sensor Test"); display.setFont (ArialMT_Plain_24); display.drawString (10, 0, "MJRoBot"); display.setFont (ArialMT_Plain_16); display.drawString (0, 29, "UV -anturitesti"); display.setFont (ArialMT_Plain_10); display.drawString (0, 52, "SW Ver.:"); display.drawString (45, 52, SW_VERSION); display.display (); viive (3000); } / * Lue UV -anturi mV: ssä ja kutsu UV -indeksilasku * / void readSensorUV () {tavu numOfReadings = 5; dataSensorUV = 0; for (int i = 0; i <numOfReadings; i ++) {dataSensorUV+= analogRead (sensorUVPin); viive (200); } dataSensorUV /= numOfReadings; dataSensorUV = (dataSensorUV * (3.3 / 1023.0)) * 1000; Serial.println (dataSensorUV); indexCalculate (); } / * UV -indeksin laskeminen * / void indexCalculate () {if (dataSensorUV <227) indexUV = 0; muuten jos (227 <= dataSensorUV && dataSensorUV <318) indexUV = 1; muuten jos (318 <= dataSensorUV && dataSensorUV <408) indexUV = 2; muuten jos (408 <= dataSensorUV && dataSensorUV <503) indexUV = 3; muuten jos (503 <= dataSensorUV && dataSensorUV <606) indexUV = 4; muuten jos (606 <= dataSensorUV && dataSensorUV <696) indexUV = 5; muuten jos (696 <= dataSensorUV && dataSensorUV <795) indexUV = 6; muuten jos (795 <= dataSensorUV && dataSensorUV <881) indexUV = 7; muuten jos (881 <= dataSensorUV && dataSensorUV <976) indexUV = 8; muuten jos (976 <= dataSensorUV && dataSensorUV <1079) indexUV = 9; else if (1079 <= dataSensorUV && dataSensorUV <1170) indexUV = 10; muuten indeksiUV = 11; } /* Näytä UV -arvot paikallisessa OLED -näytössä* / void displayUV () {display.clear (); display.setFont (ArialMT_Plain_16); display.drawString (20, 0, "UV -anturi"); display.drawString (0, 23, "UV (mV):"); display.drawString (80, 23, merkkijono (dataSensorUV)); display.drawString (0, 48, "UV -indeksi:"); display.setFont (ArialMT_Plain_24); display.drawString (82, 42, merkkijono (indexUV)); display.display (); }

Yllä oleva koodi voidaan ladata GitHun -sivustoltani: NodeMCU_UV_Sensor_OLED.ino

Vaihe 5: DHT22 -laitteen asentaminen ilman lämpötilan ja kosteuden mittauksiin

DHT22 -asentaminen ilman lämpötilan ja kosteuden mittauksiin
DHT22 -asentaminen ilman lämpötilan ja kosteuden mittauksiin
DHT22 -asentaminen ilman lämpötilan ja kosteuden mittauksiin
DHT22 -asentaminen ilman lämpötilan ja kosteuden mittauksiin

Yksi yleisimmin käytetyistä antureista säätietojen tallentamiseen on DHT22 (tai sen veli DHT11), digitaalinen suhteellisen kosteuden ja lämpötilan anturi. Se käyttää kapasitiivista kosteusanturia ja termistoria ympäröivän ilman mittaamiseen ja sylkee digitaalisen signaalin datanapille (ei tarvita analogisia tulonappeja).

Anturin tulee olla 3,3 V: n ja 5 V: n välillä ja se toimii -40 oC- +80 oC tarkkuudella +/- 0,5 oC lämpötilassa ja +/- 2% suhteellisessa kosteudessa. On myös tärkeää pitää mielessä, että sen havaitsemisaika on keskimäärin 2 sekuntia (vähimmäisaika lukemien välillä). Adafruitin sivusto tarjoaa paljon tietoa sekä DHT22: sta että sen veljestä DHT11. Lisätietoja on DHT22/11 -opetusohjelman sivulla.

DHT22: ssa on 4 nastaa (anturia vasten, nasta 1 on eniten jäljellä):

  1. VCC (muodostamme yhteyden 3.3 V: iin NodeMCU: sta);
  2. Data ulos;
  3. Ei kytketty ja
  4. Maa.

Kun tavallisesti käytät anturia alle 20 metrin etäisyyksillä, 10K -vastus on kytkettävä Data- ja VCC -nastojen väliin. Lähtötappi liitetään NodeMCU -nastaan D3 (katso yllä oleva kaavio). Kun anturi on asennettu moduuliin, lataa DHT -kirjasto Adafruit GitHub -varastosta ja asenna se Arduinon kirjasto -tiedostoosi. Kun olet ladannut Arduino IDE: n uudelleen, "DHT -anturikirjasto" tulee asentaa.

Koodin alussa on oltava seuraavat rivit:

/* DHT22*/

#sisällytä "DHT.h" #define DHTPIN D2 #define DHTTYPE DHT22 DHT dht (DHTPIN, DHTTYPE); kelluva hum = 0; kellukkeen lämpötila = 0;

Anturin lukemiseen luodaan uusi toiminto:

/ * Hanki DHT -tiedot */

void getDhtData (void) {float tempIni = temp; float humIni = hum; lämpötila = dht.readTemperature (); hum = dht.readHumidity (); if (isnan (hum) || isnan (temp)) // Tarkista, onko jokin luku epäonnistunut, ja poistu aikaisin (yritä uudelleen). {Serial.println ("DHT -anturin lukeminen epäonnistui!"); lämpötila = tempIni; hum = humIni; palata; }}

Koko koodi, mukaan lukien UV- ja DHT -anturit, voidaan ladata GitHubista: NodeMCU_UV_DHT_Sensor_OLED

Vaihe 6: Tietojen lähettäminen ThingSpeak.com -sivustoon

Tietojen lähettäminen ThingSpeak.com -sivustoon
Tietojen lähettäminen ThingSpeak.com -sivustoon
Tietojen lähettäminen ThingSpeak.com -sivustoon
Tietojen lähettäminen ThingSpeak.com -sivustoon
Tietojen lähettäminen ThingSpeak.com -sivustoon
Tietojen lähettäminen ThingSpeak.com -sivustoon

Toistaiseksi olemme käyttäneet vain NodeMCU ESP12-E tavallisena ja tavallisena Arduino-korttina. Tietenkin olemme vain "raapineet" tämän upean pienen sirun todellisen potentiaalin ja nyt on aika nousta taivaaseen! Tai parempi tähdille! Eh… pilveen!;-)

Aloitetaanpa!

  1. Ensinnäkin sinulla on oltava tili ThinkSpeak.com -sivustolla
  2. Luo kanava noudattamalla ohjeita ja merkitse muistiin kanavatunnuksesi ja Write API -avaimesi
  3. Päivitä alla oleva koodi WiFi -verkkoosi ja Thinkspeakin kirjautumistietoihin
  4. Suorita ohjelma IDE: llä

Kommentoidaan koodin tärkeimmät osat:

Soitetaan ensin ESP8266 -kirjastoon, määritetään WiFi -asiakas ja määritetään paikalliset reitittimen ja Thinkspeakin kirjautumistiedot:

/* ESP12-E & Thinkspeak*/

#Sisällytä WiFiClient -asiakas; const char* MY_SSID = "SINUN SSD -TÄSTÄ"; const char* MY_PWD = "SALASANA TÄSTÄ"; const char* TS_SERVER = "api.thingspeak.com"; String TS_API_KEY = "KANAVAN KIRJOITA API -AVAIN";

Toiseksi, sisällytetään erittäin tärkeä kirjasto IoT -projekteille: SimpleTimer.h:

/ * AJASTIN */

#sisältää SimpleTimer -ajastimen;

Kolmanneksi, asennuksen () aikana aloitamme sarjaliikenteen, kutsumme toiminnon connectWiFi () ja määritämme ajastimet. Huomaa, että koodirivi: timer.setInterval (60000L, sendDataTS); kutsuu funktiota sendDataTS () 60 sekunnin välein ladatakseen tietoja ThinkSpeak -kanavalle.

mitätön asennus ()

{… Sarja.alku (115200); viive (10); … ConnectWifi (); timer.setInterval (60000L, sendDataTS); …}

Lopuksi, mutta ei vähäisimpänä, silmukan () aikana ainoa tarvittava komento on käynnistää ajastin ja se on siinä!

tyhjä silmukka ()

{… Timer.run (); // Käynnistää SimpleTimer}

Alla näet kaksi tärkeää toimintoa, joita käytetään Thinkspeak -viestinnän käsittelyyn:

ESP12-E-yhteys WiFi-verkkoon:

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

*WiFi -yhteyden muodostaminen *********************************************** ***/ void connectWifi () {Serial.print ("Yhdistäminen"+*MY_SSID); WiFi.begin (MY_SSID, MY_PWD); while (WiFi.status ()! = WL_CONNECTED) {delay (1000); Serial.print ("."); } Sarja.println (""); Serial.println ("WiFi -yhteys"); Serial.println (""); }

ESP12-E lähettää tietoja ThinkSpeakiin:

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

*Tietojen lähettäminen Thinkspeak -kanavalle ******************************************** ******/ void sendDataTS (void) {if (client.connect (TS_SERVER, 80)) {String postStr = TS_API_KEY; postStr += "& field1 ="; postStr += Jono (dataSensorUV); postStr += "& field2 ="; postStr += Merkkijono (indexUV); postStr += "& field3 ="; postStr += Merkkijono (lämpötila); postStr += "& field4 ="; postStr += Jono (hum); postStr += "\ r / n / r / n"; client.print ("POST /päivitä HTTP /1.1 / n"); client.print ("Isäntä: api.thingspeak.com / n"); client.print ("Yhteys: sulje / 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); viive (1000); } lähetetty ++; client.stop (); }

Koko koodi löytyy GitHubistani: NodeMCU_UV_DHT_Sensor_OLED_TS_EXT

Kun olet ladannut koodin NodeMCU -laitteeseesi. Kytketään ulkoinen akku ja tehdään mittauksia auringon alla. Laitan etäaseman katolle ja aloitan tietojen tallentamisen ThingSpeak.com -sivustolla yllä olevien kuvien mukaisesti.

Vaihe 7: Johtopäätös

Johtopäätös
Johtopäätös

Kuten aina, toivon, että tämä projekti voi auttaa muita löytämään tiensä elektroniikan jännittävään maailmaan!

Lisätietoja ja lopullisen koodin löydät GitHub-varastostani: RPi-NodeMCU-Weather-Station

Lisää projekteja löydät blogistani: MJRoBot.org

Pysy kanavalla! Seuraava opetusohjelma lähetämme tietoja etäsääasemalta keskusasemalle Raspberry Pi -verkkopalvelimen perusteella:

Kuva
Kuva

Terveisiä etelästä maailmasta!

Nähdään seuraavassa ohjeessani!

Kiitos, Marcelo

Suositeltava: