Kazalo:

IoT Made Ease: ESP-MicroPython-MQTT-Thing Govorite: 12 korakov
IoT Made Ease: ESP-MicroPython-MQTT-Thing Govorite: 12 korakov

Video: IoT Made Ease: ESP-MicroPython-MQTT-Thing Govorite: 12 korakov

Video: IoT Made Ease: ESP-MicroPython-MQTT-Thing Govorite: 12 korakov
Video: MicroPython - MQTT tutorial on ESP32 2024, November
Anonim
IoT Made Ease: ESP-MicroPython-MQTT-ThingSpeak
IoT Made Ease: ESP-MicroPython-MQTT-ThingSpeak

V moji prejšnji vadnici, MicroPython na ESP z uporabo Jupyterja, smo se naučili, kako namestiti in zagnati MicroPython na napravi ESP. Z uporabo prenosnega računalnika Jupyter kot našega razvojnega okolja smo se naučili tudi brati s senzorjev (temperatura, vlažnost in svetilnost). Uporabljamo več komunikacijskih protokolov in metod, analognih, digitalnih, 1-žičnih in I2C, zadnjih za prikaz naših zajetih posnetkov. podatke na zaslonu OLED.

Zdaj bomo v tej vadnici s protokolom MQTT dobili vse zajete podatke in jih poslali na storitev IoT, ThingSpeak.com in v mobilno aplikacijo (Thingsview), kjer se lahko prijavite in igrate s podatki.

Tu je blok diagram našega projekta:

Slika
Slika

1. korak: BoM - materialni material

  1. NodeMCU - 8,39 USD
  2. Senzor temperature in relativne vlažnosti DHT22 - 9,95 USD
  3. DS18B20 Vodotesni temperaturni senzor - 5,95 USD
  4. Zaslon OLED SSD1366- 8,99 USD (neobvezno)
  5. LDR (1x)
  6. LED (1x) (neobvezno)
  7. Potisni gumb (1x)
  8. Upor 4K7 ohm (2x)
  9. Upor 10K ohm (1x)
  10. Upor 220 ohm (1x)

2. korak: Hw

Hw
Hw

Hw, ki ga bomo tukaj uporabljali, je v osnovi enak kot v vadnici: Micropython na ESP z uporabo Jupyterja. Za vse povezave HW glejte to.

Izjema je Servo, ki ga v tem projektu ne bomo uporabljali.

Zgoraj si lahko ogledate celoten HW. Priključite naprave, kot je prikazano tam.

3. korak: Micropython, REPL, Jupyter

Micropython, REPL, Jupyter
Micropython, REPL, Jupyter
Micropython, REPL, Jupyter
Micropython, REPL, Jupyter

Na napravi ESP morate imeti naložen tolmač Micropython. Ko je naložen, morate programirati svoj ESP na kateri koli od razpoložljivih načinov/IDE, ki so na voljo, na primer:

  • REPL
  • Beležnica Jupyter
  • Mu
  • ESPCut (samo Windows)
  • … Itd

V svoji vadnici Micropython o ESP z uporabo Jupyterja sem podrobno opisal, kako naložim in namestim tolmač MicroPython, ESPTool za upravljanje naprav ESP in kako uporabljati Jupyter Notebook kot razvojno okolje. Uporabite tisto, kar vam je bolj udobno.

Ponavadi ves razvoj naredim na prenosnem računalniku Jupyter, in ko dobim končno kodo, jih kopiram v Geany in jo z Ampyjem naložim na svoj ESP.

4. korak: Senzorji

Senzorji
Senzorji

Namestimo knjižnice, opredelimo GPIO, ustvarimo predmete, funkcije za vse senzorje posebej:

A. DHT (temperatura in vlažnost)

Namestimo knjižnico DHT in ustvarimo predmet:

od dht uvoz DHT22

iz uvoza stroja Pin dht22 = DHT22 (Pin (12))

Zdaj ustvarite funkcijo za branje senzorja DHT:

def readDht ():

dht22.measure () vrne dht22.temperature (), dht22.humidity () Preizkusite funkcijo DHT

tiskanje (readDht ())

Rezultat bi moral biti na primer:

(17.7, 43.4)

B. DS18B20 (zunanja temperatura)

Namestimo knjižnice in ustvarimo predmet:

uvoz onewire, ds18x20

čas uvoza # Določite, kateri pin 1-žilne naprave bo priključen ==> pin 2 (D4) dat = Pin (2) # ustvarite objekt z eno žico ds = ds18x20. DS18X20 (onewire. OneWire (dat)) Poiščite naprave na bu

senzorji = ds.scan ()

print ('najdene naprave:', senzorji)

Natisnjeni rezultat v resnici ni pomemben, kar potrebujemo, je prvi zaznani senzor: senzorji [0]. In zdaj lahko zgradimo funkcijo za branje senzorskih podatkov:

def readDs ():

ds.convert_temp () time.sleep_ms (750) vrne ds.read_temp (senzorji [0])

Vedno je pomembno, da senzor preizkusite z ustvarjeno funkcijo

tiskanje (readDs ()) Če dobite vrednost temperature, je vaša koda pravilna

17.5

C. LDR (svetilnost)

LDR bo uporabljal analogni pin našega ESP (le en je v primeru ESP8266 in več ESP32).

Za podrobnosti si oglejte mojo vadnico ESP32.

Enako kot prej:

# knjižnica za uvoz

iz strojnega uvoza ADC # Določite objekt adc = ADC (0) Preprosta funkcija: adc.read () lahko uporabite za branje vrednosti ADC. Ne pozabite pa, da bo notranji ADC pretvoril napetosti med 0 in 3,3 V v ustrezne digitalne vrednosti, ki se razlikujejo od 0 do 1023. Ko nas zanima "Svetilnost", bomo največjo zajeto vrednost senzorja upoštevali pri največji svetlobi (v mojem primer 900) in najmanjša svetloba, ki je v mojem primeru 40. S temi vrednostmi lahko "preslikamo" vrednost od 40 do 900 v 0 do 100% svetilnosti. Za to bomo ustvarili novo funkcijo

def readLdr ():

lumPerct = (adc.read ()-40)*(10/86) # pretvorba v odstotkih ("zemljevid") povratni krog (lumPerct)

Funkcijo morate preizkusiti s funkcijo print (readLDR ()). Rezultat mora biti celo število med o in 100.

D. Tipka (digitalni vhod)

Tukaj uporabljamo potisni gumb kot digitalni senzor, vendar je lahko "odmev" aktuatorja (na primer vklopljeno/izklopljeno črpalko).

# določite pin 13 kot vhod in aktivirajte notranji vlečni upor:

button = Pin (13, Pin. IN, Pin. PULL_UP) # Funkcija za branje stanja gumba: def readBut (): gumb za vrnitev.value ()

Lahko preizkusite gumb, ki bere funkcijo print (readBut ()). Brez pritiska na rezultat mora biti "1". S pritiskom na gumb bi moral biti rezultat "0"

5. korak: Zajemite in lokalno prikažite vse podatke senzorja

Lokalno zajem in prikaz vseh senzorskih podatkov
Lokalno zajem in prikaz vseh senzorskih podatkov

Zdaj, ko smo ustvarili eno funkcijo za vsak senzor, ustvarimo zadnjo, ki bo prebrala vse hkrati:

def colectData ():

temp, hum, = readDht () extTemp = readDs () lum = readLdr () butSts = readBut () vrnitev temp, hum, extTemp, lum, butSts Zdaj, če uporabljate

tiskanje (colectData ())

Rezultat bo nabor, ki vključuje vse zajete podatke s senzorjev:

(17.4, 45.2, 17.3125, 103, 1)

Te podatke lahko po želji prikažemo tudi na lokalnem zaslonu:

# uvoz knjižnice in ustvarite objekt i2c

iz stroja uvoz I2C i2c = I2C (scl = Pin (5), sda = Pin (4)) # knjižnica za uvoz in ustvari objekt oled uvoz ssd1306 i2c = I2C (scl = Pin (5), sda = Pin (4)) oled = ssd1306. SSD1306_I2C (128, 64, i2c, 0x3c) # ustvari funkcijo: def displayData (temp, hum, extTemp, lum, butSts): oled.fill (0) oled.text ("Temp:" + str (temp) + "oC", 0, 4) oled.text ("Hum:" + str (hum) + "%", 0, 16) oled.text ("ExtTemp:" + str (extTemp) + "oC", 0, 29) oled.text ("Lumin:" + str (lum) + "%", 0, 43) oled.text ("Button:" + str (butSts), 0, 57) oled.show () # prikaz podatkov s funkcijo displayData (temp, hum, extTemp, lum, butSts)

Kot možnost bom vključil tudi LED, ki bo vklopljena, ko začnemo brati senzorje, potem ko se ti podatki prikažejo, ugasne. S tem boste potrdili, da program deluje, ko imamo ESP odklopljen od računalnika in se samodejno zažene.

Torej bi bila glavna funkcija:

# Glavna funkcija za branje vseh senzorjev

def main (): # prikaz podatkov s funkcijo led.on () temp, hum, extTemp, lum, butSts = colectData () displayData (temp, hum, extTemp, lum, butSts) led.off ()

Tako bomo z izvajanjem main () dobili podatke senzorja, prikazane na OLED, kot je prikazano na sliki.

6. korak: Zaženite kodo lokalne postaje pri zagonu ESP

Zagon kode lokalne postaje pri zagonu ESP
Zagon kode lokalne postaje pri zagonu ESP

Vse, kar smo doslej razvili, lahko imamo v eni sami datoteki, ki jo bo izvedel naš ESP.

Odprimo kateri koli urejevalnik besedil in v njem postavimo vso kodo:

# uvoz splošnih knjižnic

iz uvoza stroja Čas uvoza pin # določite pin 0 kot izhod LED = Pin (0, Pin. OUT) # DHT from dht import DHT22 dht22 = DHT22 (Pin (12)) # Funkcija za branje DHT def readDht (): dht22.measure () return dht22.temperature (), dht22.humidity () # DS18B20 import onewire, ds18x20 # Določite, kateri pin 1-žilne naprave bo priključen ==> pin 2 (D4) dat = Pin (2) # Ustvarite enožično objekt ds = ds18x20. DS18X20 (onewire. OneWire (dat)) # skeniranje naprav na senzorjih vodila = ds.scan () # funkcija za branje DS18B20 def readDs (): ds.convert_temp () time.sleep_ms (750) return round (ds.read_temp (sensors [0]), 1) # LDR iz uvoznega stroja ADC # Določite objekt adc = ADC (0) # funkcija za branje svetilnosti def readLdr (): lumPerct = (adc.read ()-40) *(10/86) # pretvorba v odstotkih ("zemljevid") povratni krog (lumPerct) # določite pin 13 kot vhod in aktivirajte notranji vlečni upor: gumb = Pin (13, Pin. IN, Pin. PULL_UP) # Funkcija za branje stanja gumba: def readBut (): gumb za vrnitev.value () # Funkcija za branje vseh podatkov: def cole ctData (): temp, hum, = readDht () extTemp = readDs () lum = readLdr () butSts = readBut () vrnitev temp, hum, extTemp, lum, butSts # knjižnica za uvoz in ustvarite objekt i2c iz stroja za uvoz I2C i2c = I2C (scl = Pin (5), sda = Pin (4)) # knjižnica za uvoz in ustvari objekt oled import ssd1306 i2c = I2C (scl = Pin (5), sda = Pin (4)) oled = ssd1306. SSD1306_I2C (128, 64, i2c, 0x3c) # ustvarite funkcijo: def displayData (temp, hum, extTemp, lum, butSts): oled.fill (0) oled.text ("Temp:" + str (temp) + "oC", 0, 4) oled.text ("Hum:" + str (hum) + "%", 0, 16) oled.text ("ExtTemp:" + str (extTemp) + "oC", 0, 29) oled. text ("Lumin:" + str (lum) + "%", 0, 43) oled.text ("Button:" + str (butSts), 0, 57) oled.show () # Glavna funkcija za branje vseh senzorjev def main (): # prikaz podatkov s funkcijo led.on () temp, hum, extTemp, lum, butSts = colectData () displayData (temp, hum, extTemp, lum, butSts) led.off () '' ''- ----- zaženi glavno funkcijo -------- '' 'main ()

Shranite ga, na primer kot localData.py.

Za zagon te kode neposredno na vašem terminalu potrebujete Ampy.

Najprej na terminalu obvestite Ampy o naših serijskih vratih:

izvozi AMPY_PORT =/dev/tty. SLAB_USBtoUART

Zdaj lahko vidimo datoteke, ki so v našem korenskem imeniku ESP:

ampy ls

Kot odgovor bomo dobili boot.py, to je prva datoteka, ki se bo izvajala v sistemu.

Zdaj pa uporabimo Ampy za nalaganje našega python Script LocalData.py kot /main.py, zato se bo skript zagnal takoj po zagonu:

ampy dal localData.py /main /py

Če zdaj uporabimo ukaz amp ls, boste v ESP -ju videli 2 datoteki: boot.py in main.py

Če ponastavite ESP, se bo program localData.py samodejno zagnal in prikazal podatke senzorja na zaslonu.

Zgornji zaslon za tiskanje terminala prikazuje, kaj smo storili.

Z zgornjo kodo se bo zaslon prikazal le enkrat, lahko pa določimo zanko na glavni () funkciji, ki bo prikazovala podatke za vsak definiran časovni interval (PUB_TIME_SEC) in na primer, dokler ne pritisnemo gumba:

# zanka za pridobivanje podatkov, dokler ne pritisnete gumba

while button.value (): led.on () temp, hum, extTemp, lum, butSts = colectData () displayData (temp, hum, extTemp, lum, butSts) led.off () time.sleep (PUB_TIME_SEC)

Spremenljivko PUB_TIME_SEC morate prijaviti do časa, ko želite vzorce.

Za večjo izboljšavo naše kode bi bilo dobro obvestiti, da bomo izstopili iz zanke, zato bomo opredelili 2 novi splošni funkciji, eno za brisanje zaslona in drugo za utripanje LED -ja določeno število krat.

# Čist zaslon:

def displayClear (): oled.fill (0) oled.show () # ustvarite funkcijo utripanja def blinkLed (num): za i v razponu (0, num): led.on () sleep (0.5) led.off () spanje (0,5)

Tako lahko zdaj prepišemo našo funkcijo main ():

while button.value ():

led.on () temp, hum, extTemp, lum, butSts = colectData () displayData (temp, hum, extTemp, lum, butSts) led.off () time.sleep (PUB_TIME_SEC) blinkLed (3) displayClear ()

Končno kodo lahko prenesete z mojega GitHub -a: localData.py in tudi prenosnega računalnika Jupyter, ki se uporablja za razvoj celotne kode: Jupyter Local Data Development.

7. korak: ESP povežite z lokalno WiFi

Priključitev ESP na lokalno WiFi
Priključitev ESP na lokalno WiFi

Omrežni modul se uporablja za konfiguriranje povezave WiFi. Obstajata dva vmesnika WiFi, eden za postajo (ko se ESP8266 poveže z usmerjevalnikom) in drugi za dostopno točko (za priključitev drugih naprav na ESP8266). Tu bo naš ESP povezan z lokalnim omrežjem. Pokličimo knjižnico in določimo svoje omrežne poverilnice:

uvozno omrežje

WiFi_SSID = "VAŠ SSID" WiFi_PASS = "VAŠA GESLA"

Spodnjo funkcijo lahko uporabite za povezavo ESP v lokalno omrežje:

def do_connect ():

wlan = network. WLAN (network. STA_IF) wlan.active (True), če ni wlan.isconnected (): print ("povezovanje v omrežje …") wlan.connect (WiFi_SSID, WiFi_SSID), medtem ko ni wlan.isconnected (): pass print ('omrežna konfiguracija:', wlan.ifconfig ())

Če zaženete funkcijo, lahko kot rezultat dobite naslov IP:

do_connect ()

Rezultat bo:

omrežna konfiguracija: ('10.0.1.2 ',' 255.255.255.0 ', '10.0.1.1', '10.0.1.1 ')

Je bil v mojem primeru 10.0.1.2 naslov IP ESP.

8. korak: ThingSpeak

ThingSpeak
ThingSpeak

Na tej točki smo se naučili, kako zajeti podatke iz vseh senzorjev in jih prikazati na OLED -u. Zdaj je čas, da vidimo, kako te podatke poslati na platformo IoT, ThingSpeak.

Začnimo!

Najprej morate imeti račun na ThinkSpeak.com. Nato sledite navodilom za ustvarjanje kanala in upoštevajte svoj ID kanala in ključ API -ja za pisanje.

Zgoraj si lahko ogledate 5 polj, ki bodo uporabljena na našem kanalu.

9. korak: Protokol MQTT in povezava ThingSpeak

Protokol MQTT in povezava ThingSpeak
Protokol MQTT in povezava ThingSpeak

MQTT je arhitektura za objavo/naročnino, ki je razvita predvsem za povezovanje pasovne širine in naprav z omejeno močjo prek brezžičnih omrežij. To je preprost in lahek protokol, ki deluje prek vtičnic TCP/IP ali WebSockets. MQTT prek WebSockets je mogoče zavarovati s protokolom SSL. Arhitektura objave/naročnine omogoča pošiljanje sporočil na odjemalce, ne da bi naprava morala neprestano iskati strežnik.

Posrednik MQTT je osrednja točka komunikacije in je odgovoren za pošiljanje vseh sporočil med pošiljatelji in zakonitimi prejemniki. Odjemalec je vsaka naprava, ki se poveže s posrednikom in lahko za dostop do informacij objavi ali se naroči na teme. Tema vsebuje informacije o usmerjanju posrednika. Vsak odjemalec, ki želi poslati sporočila, jih objavi pri določeni temi, vsak odjemalec, ki želi prejemati sporočila, pa se naroči na določeno temo. Posrednik posreduje vsa sporočila z ustrezno temo ustreznim strankam.

ThingSpeak ™ ima posrednika MQTT na naslovu mqtt.thingspeak.com in vratih 1883. Posrednik ThingSpeak podpira objavo MQTT in naročnino na MQTT.

V našem primeru bomo uporabili: MQTT Publish

Slika
Slika

Slika prikazuje strukturo teme. Za objavo je potreben ključ API za pisanje. Posrednik s CONNACK -om potrdi pravilno zahtevo CONNECT.

Protokol MQTT je podprt v vgrajeni knjižnici v binarnih datotekah Micropython-ta protokol se lahko uporablja za pošiljanje podatkov iz vašega ESP8266 prek WIFI v brezplačno bazo podatkov v oblaku.

Uporabimo knjižnico umqtt.simple:

iz umqtt.simple import MQTTClient

Če poznamo naš ID strežnika, je mogoče ustvariti naš odjemalski objekt MQTT:

SERVER = "mqtt.thingspeak.com"

odjemalec = MQTTClient ("umqtt_client", SERVER)

Zdaj, ko imate pri roki poverilnice za ThingSpeak:

CHANNEL_ID = "VAŠ KANALNI ID"

WRITE_API_KEY = "VAŠ KLJUČ"

Ustvarimo našo "temo" MQTT:

topic = "kanali/" + CHANNEL_ID + "/objava/" + WRITE_API_KEY

Poskrbimo, da se naši podatki pošljejo v storitev ThingSpeak IoT Service z ustvarjeno funkcijo in njen odgovor povežemo s posebnimi spremenljivkami podatkov:

temp, hum, extTemp, lum, butSts = colectData ()

S posodobljenimi spremenljivkami lahko ustvarimo naš "MQTT Payload":

payload = "field1 ="+str (temp)+"& field2 ="+str (hum)+"& field3 ="+str (extTemp)+"& field4 ="+str (lum)+"& field5 ="+str (butSts)

In to je to! Pripravljeni smo poslati podatke v ThinsSpeak, preprosto z uporabo treh spodnjih vrstic kode:

client.connect ()

client.publish (tema, koristna obremenitev) client.disconnect ()

Če odprete stran svojega kanala (kot je moja zgoraj), boste videli, da bo vsako od petih polj vsebovalo podatke, povezane z vašimi senzorji.

10. korak: Zapisovalnik podatkov senzorja

Zapisovalnik podatkov senzorja
Zapisovalnik podatkov senzorja

Zdaj, ko vemo, da je z le nekaj vrsticami kode mogoče naložiti podatke v storitev IoT, ustvarimo funkcijo zanke, ki bo to izvajala samodejno v rednem časovnem intervalu (podobno kot smo naredili z "Lokalni podatki" ").

Z uporabo iste spremenljivke (PUB_TIME_SEC), ki je bila prej deklarirana, bi bila preprosta glavna funkcija za neprekinjeno zajemanje podatkov, beleženje na našem kanalu:

medtem ko je res:

temp, hum, extTemp, lum, butSts = colectData () payload = "field1 ="+str (temp)+"& field2 ="+str (hum)+"& field3 ="+str (extTemp)+"& field4 ="+ str (lum)+"& field5 ="+str (butSts) client.connect () client.publish (tema, koristna obremenitev) client.disconnect () time.sleep (PUB_TIME_SEC)

Upoštevajte, da je treba posodobiti samo "koristno obremenitev", ko je "tema" povezana z poverilnicami našega kanala in se ne bo spremenila.

Če iščete stran kanala ThingSpeak, boste opazili, da se bodo podatki neprestano nalagali na vsako polje. Lahko pokrijete LDR, položite roko na senzorje temp/hum, pritisnete gumb itd. In si ogledate, kako bo kanal samodejno "zapisal" te podatke za prihodnjo analizo.

Običajno bi morali za beleženje podatkov poskušati uporabiti čim manj energije, zato LED ali zaslona ne bi uporabljali lokalno. Prav tako je običajno pri napravah ESP, jih postavite v "globok spanec", kjer bo mikroprocesor v stanju minimalne energije, dokler ne bo čas za zajem podatkov in njihovo pošiljanje na platformo IoT.

Ko pa se ideja tukaj uči, vključimo tudi zaslon in LED, kot smo to počeli prej. Pri tem bo funkcija »zapisovalnika«:

while button.value ():

led.on () temp, hum, extTemp, lum, butSts = colectData () displayData (temp, hum, extTemp, lum, butSts) led.off () temp, hum, extTemp, lum, butSts = colectData () payload = "field1 ="+str (temp)+"& field2 ="+str (hum)+"& field3 ="+str (extTemp)+"& field4 ="+str (lum)+"& field5 ="+str (butSts) odjemalec.connect () client.publish (tema, koristna obremenitev) client.disconnect () time.sleep (PUB_TIME_SEC) blinkLed (3) displayClear ()

Celoten skript microPython najdete tukaj: dataLoggerTS_EXT.py in zvezek Jupyter, ki je bil uporabljen za razvoj, najdete tudi tukaj: IoT ThingSpeak Data Logger EXT.ipynb.

Če želite naložiti skript na ESP, na svojem terminalu uporabite ukaz:

ampy dal dataLoggerTS.py /main.py

In pritisnite gumb za ponastavitev ESP. ESP bo zajemal podatke in jih zapisoval na ThingSpeak.com, dokler ne pritisnete na dno (počakajte, da LED utripa 3 -krat in OLED ugasne).

11. korak: Aplikacija ThingView

Aplikacija ThingView
Aplikacija ThingView

Zabeležene podatke si lahko ogledate neposredno na spletnem mestu ThingSpeak.com ali prek aplikacije, na primer ThingsView!

ThingView je aplikacija, ki jo je razvil CINETICA in vam omogoča preprosto vizualizacijo vaših kanalov ThingSpeak, samo vnesite ID kanala in pripravljeni ste.

Za javne kanale bo aplikacija spoštovala nastavitve vašega okna: barvo, časovni okvir, vrsto grafikona in število rezultatov. Trenutna različica podpira vrstice in stolpce, spline grafikoni so prikazani kot vrstice.

Za zasebne kanale bodo podatki prikazani s privzetimi nastavitvami, saj ni mogoče prebrati nastavitev zasebnih oken samo s ključem API.

APP ThingView lahko prenesete za ANDROID in IPHONE.

12. korak: Zaključek

Zaključek
Zaključek

Kot vedno upam, da lahko ta projekt pomaga drugim najti pot v razburljiv svet elektronike!

Za podrobnosti in končno kodo obiščite moj depozitar GitHub: IoT_TS_MQTT

Za več projektov obiščite moj blog: MJRoBot.org

Saludos z juga sveta!

Se vidimo v mojem naslednjem navodilu!

Hvala vam, Marcelo

Priporočena: