Sadržaj:

IoT Made Ease: ESP-MicroPython-MQTT-ThingGovor: 12 koraka
IoT Made Ease: ESP-MicroPython-MQTT-ThingGovor: 12 koraka

Video: IoT Made Ease: ESP-MicroPython-MQTT-ThingGovor: 12 koraka

Video: IoT Made Ease: ESP-MicroPython-MQTT-ThingGovor: 12 koraka
Video: Как использовать ESP32 WiFi и Bluetooth с Arduino IDE, полная информация с примерами и кодом. 2024, Srpanj
Anonim
IoT Made Ease: ESP-MicroPython-MQTT-ThingSpeak
IoT Made Ease: ESP-MicroPython-MQTT-ThingSpeak

U mom prethodnom vodiču, MicroPython na ESP -u pomoću Jupytera, naučili smo kako instalirati i pokrenuti MicroPython na ESP uređaju. Koristeći Jupyter Notebook kao naše razvojno okruženje, naučili smo i čitati sa senzora (temperatura, vlažnost i svjetlina), koristimo nekoliko komunikacijskih protokola i metoda, analogni, digitalni, 1-žični i I2C, ovaj posljednji za prikaz naših snimljenih podatke na OLED zaslonu.

Sada ćemo u ovom vodiču pomoću MQTT protokola dobiti sve zarobljene podatke i poslati ih na IoT uslugu, ThingSpeak.com i u mobilnu aplikaciju (Thingsview), gdje se možemo prijaviti i igrati s podacima.

Evo blok dijagrama našeg projekta:

Slika
Slika

Korak 1: BoM - Opis materijala

  1. NodeMCU - 8,39 USD
  2. Senzor temperature i relativne vlažnosti DHT22 - 9,95 USD
  3. DS18B20 Vodonepropusni osjetnik temperature - 5,95 USD
  4. OLED zaslon SSD1366- 8,99 USD (nije obavezno)
  5. LDR (1x)
  6. LED diode (1x) (izborno)
  7. Pritisni gumb (1x)
  8. Otpornik 4K7 ohma (2x)
  9. Otpornik 10K ohma (1x)
  10. Otpornik 220 ohma (1x)

Korak 2: Hw

Hw
Hw

Hw koji ćemo ovdje koristiti u osnovi je isti koji se koristi u vodiču: Micropython na ESP -u pomoću Jupytera. Za sve HW veze pogledajte ga.

Izuzetak je Servo, koji nećemo koristiti u ovom projektu.

Iznad možete vidjeti cijeli HW. Povežite uređaje kao što je prikazano.

Korak 3: Micropython, REPL, Jupyter

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

Na svom ESP uređaju morate imati učitan tumač Micropython. Nakon učitavanja, trebali biste programirati svoj ESP na bilo koji od dostupnih načina/IDE -a, poput:

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

U svom vodiču, Micropython na ESP -u Koristeći Jupyter, detaljno sam opisao kako preuzeti i instalirati MicroPython tumač, ESPTool za upravljanje ESP uređajima i kako koristiti Jupyter Notebook kao razvojno okruženje. Slobodno upotrijebite ono što vam je ugodnije.

Obično sav razvoj radim na Jupyter Notebooku, a kad dobijem konačni kod, kopiram ih u Geany i učitam na svoj ESP pomoću Ampy -ja.

Korak 4: Senzori

Senzori
Senzori

Instalirajmo knjižnice, definirajmo GPIO, kreirajmo objekte, funkcije za sve senzore pojedinačno:

A. DHT (temperatura i vlažnost)

Instalirajmo DHT knjižnicu i stvorimo objekt:

od dht uvoz DHT22

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

Sada stvorite funkciju za čitanje DHT senzora:

def readDht ():

dht22.measure () povratak dht22.temperature (), dht22.humidity () Testirajte funkciju DHT

ispis (readDht ())

Rezultat bi trebao biti na primjer:

(17.7, 43.4)

B. DS18B20 (vanjska temperatura)

Instalirajmo knjižnice i stvorimo objekt:

uvoz onewire, ds18x20

vrijeme uvoza # Definirajte koji će pin 1-žični uređaj biti spojen ==> pin 2 (D4) dat = Pin (2) # stvorite objekt s jednom žicom ds = ds18x20. DS18X20 (onewire. OneWire (dat)) Potražite uređaje na bu

senzori = ds.scan ()

print ('pronađeni uređaji:', senzori)

Ispisani rezultat zapravo nije važan, ono što će nam trebati je prvi otkriveni senzor: senzori [0]. A sada možemo izgraditi funkciju za čitanje podataka senzora:

def readDs ():

ds.convert_temp () time.sleep_ms (750) return ds.read_temp (senzori [0])

Uvijek je važno testirati senzor pomoću stvorene funkcije

ispis (readDs ()) Ako dobijete vrijednost temperature, vaš je kôd točan

17.5

C. LDR (Svjetlost)

LDR će koristiti analogni pin našeg ESP -a (samo je jedan u slučaju ESP8266 i nekoliko na ESP32).

Za detalje pogledajte moj vodič ESP32.

Isto kao i prije:

# biblioteka uvoza

iz uvoznog stroja ADC # Definiraj objekt adc = ADC (0) Jednostavna funkcija: adc.read () se može koristiti za čitanje ADC vrijednosti. Ali zapamtite da će unutarnji ADC pretvoriti napone između 0 i 3,3 V u odgovarajuće digitalne vrijednosti, koje variraju od 0 do 1023. Nakon što nas zanima "Luminosity", smatrat ćemo Max svjetlo najvećom zarobljenom vrijednošću senzora (u mom slučaj 900) i minimalno svjetlo koje je u mom slučaju 40. Imajući te vrijednosti možemo "preslikati" vrijednost od 40 do 900 u 0 do 100% svjetline. Za to ćemo stvoriti novu funkciju

def readLdr ():

lumPerct = (adc.read ()-40)*(10/86) # pretvorba u postocima ("karta") povratna runda (lumPerct)

Funkciju biste trebali testirati pomoću ispisa (readLDR ()). Rezultat bi trebao biti cijeli broj između o i 100.

D. Tipka (digitalni ulaz)

Ovdje koristimo Push-Button kao digitalni senzor, ali to može biti "odjek" aktuatora (crpka koja je, na primjer, UKLJUČENA/ISKLJUČENA).

# definirajte pin 13 kao ulaz i aktivirajte unutarnji pull-up otpornik:

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

Možete testirati gumb koji čita funkciju ispisa (readBut ()). Bez pritiska na rezultat trebao bi biti "1". Pritiskom na gumb rezultat bi trebao biti "0"

Korak 5: Snimanje i lokalno prikazivanje svih podataka senzora

Snimanje i lokalno prikazivanje svih podataka senzora
Snimanje i lokalno prikazivanje svih podataka senzora

Sada kada smo stvorili jednu funkciju za svaki senzor, napravimo posljednju koja će čitati sve njih u isto vrijeme:

def colectData ():

temp, hum, = readDht () extTemp = readDs () lum = readLdr () butSts = readBut () vraćanje temp, hum, extTemp, lum, butSts Sada ako koristite

ispis (colectData ())

Dovest će do torke koja uključuje sve snimljene podatke sa senzora:

(17.4, 45.2, 17.3125, 103, 1)

Također možemo opcionalno prikazati te podatke na lokalnom zaslonu:

# uvoz knjižnice i stvaranje objekta i2c

iz stroja import I2C i2c = I2C (scl = Pin (5), sda = Pin (4)) # knjižnica uvoza i stvaranje objekta oled import ssd1306 i2c = I2C (scl = Pin (5), sda = Pin (4)) oled = ssd1306. SSD1306_I2C (128, 64, i2c, 0x3c) # stvorite funkciju: 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 ("Gumb:" + str (butSts), 0, 57) oled.show () # prikaz podataka pomoću funkcije displayData (temp, hum, extTemp, lum, butSts)

Kao opciju, uključit ću i LED koji će biti UKLJUČEN kada počnemo čitati senzore, koji će se ugasiti nakon prikaza tih podataka. Time ćete potvrditi da program radi kada imamo isključen ESP s računala i radi automatski.

Dakle, glavna funkcija bila bi:

# Glavna funkcija za očitavanje svih senzora

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

Dakle, izvršavanjem main () dobit ćemo podatke senzora prikazane na OLED -u kao što je prikazano na slici.

Korak 6: Pokretanje koda lokalne postaje pri pokretanju ESP-a

Pokretanje koda lokalne postaje pri pokretanju ESP-a
Pokretanje koda lokalne postaje pri pokretanju ESP-a

Možemo imati sve što je do sada razvijeno u jednoj datoteci koju će izvršiti naš ESP.

Otvorimo bilo koji uređivač teksta i proširimo sav kôd:

# uvoz općih knjižnica

od uvoza stroja Vrijeme uvoza pin -a # definirajte pin 0 kao izlaz LED = Pin (0, Pin. OUT) # DHT from dht import DHT22 dht22 = DHT22 (Pin (12)) # Funkcija za čitanje DHT def readDht (): dht22.measure () return dht22.temperature (), dht22.humidity () # DS18B20 import onewire, ds18x20 # Definirajte koji će pin 1-žični uređaj biti spojen ==> pin 2 (D4) dat = Pin (2) # Izradite jednožicu objekt ds = ds18x20. DS18X20 (onewire. OneWire (dat)) # skeniranje uređaja na senzorima sabirnice = ds.scan () # funkcija za čitanje DS18B20 def readDs (): ds.convert_temp () time.sleep_ms (750) return okrugla (ds.read_temp (senzori [0]), 1) # LDR iz uvoznog stroja ADC # Definirajte objekt adc = ADC (0) # funkcija za čitanje luminosity def readLdr (): lumPerct = (adc.read ()-40) *(10/86) # pretvaranje u postotke ("karta") povratna runda (lumPerct) # definirajte pin 13 kao ulaz i aktivirajte unutarnji pull-up otpornik: button = Pin (13, Pin. IN, Pin. PULL_UP) # Funkcija za čitanje stanja gumba: def readBut (): gumb za povratak.value () # Funkcija za čitanje svih podataka: def cole ctData (): temp, hum, = readDht () extTemp = readDs () lum = readLdr () butSts = readBut () vraćanje temp, hum, extTemp, lum, butSts # knjižnica uvoza i stvaranje objekta i2c iz stroja za uvoz I2C i2c = I2C (scl = Pin (5), sda = Pin (4)) # knjižnica uvoza i stvaranje objekta oled import ssd1306 i2c = I2C (scl = Pin (5), sda = Pin (4)) oled = ssd1306. SSD1306_I2C (128, 64, i2c, 0x3c) # stvoriti funkciju: 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 ("Gumb:" + str (butSts), 0, 57) oled.show () # Glavna funkcija za čitanje svih senzora def main (): # prikaz podataka s funkcijom led.on () temp, hum, extTemp, lum, butSts = colectData () displayData (temp, hum, extTemp, lum, butSts) led.off () '' '- ----- pokreni glavnu funkciju -------- '' 'main ()

Spremite ga, na primjer kao localData.py.

Za pokretanje ovog koda izravno na vašem terminalu trebat će vam Ampy.

Prvo, na terminalu obavijestimo Ampy o našem serijskom portu:

izvoz AMPY_PORT =/dev/tty. SLAB_USBtoUART

Sada možemo vidjeti datoteke koje se nalaze u našem ESP korijenskom direktoriju:

ampy ls

Kao odgovor dobit ćemo boot.py, to je prva datoteka koja će se pokrenuti u sustavu.

Sada, upotrijebimo Ampy za učitavanje našeg python Script LocalData.py kao /main.py, tako da će se skripta pokrenuti odmah nakon pokretanja:

ampy stavi localData.py /main /py

Ako sada koristimo naredbu amp ls, unutar ESP -a ćete vidjeti 2 datoteke: boot.py i main.py

Poništavanjem ESP -a, program localData.py će se automatski pokrenuti, prikazujući podatke senzora na zaslonu.

Gornji zaslon za ispis terminala prikazuje što smo učinili.

S gornjim kodom, zaslon će se prikazati samo jednom, ali možemo definirati petlju na glavnoj () funkciji, koja će prikazivati podatke o svakom definiranom vremenskom intervalu (PUB_TIME_SEC), i na primjer, sve dok ne pritisnemo gumb:

# petlja dobiva podatke dok se ne pritisne gumb

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

Varijabla PUB_TIME_SEC mora biti deklarirana do trenutka kada želite svoje uzorke.

Kako bismo dodatno poboljšali naš kôd, bilo bi dobro obavijestiti nas da ćemo izaći iz petlje, jer ćemo za to definirati 2 nove opće funkcije, jednu za brisanje prikaza, a drugu za treptanje LED -a određeni broj puta.

# Očisti zaslon:

def displayClear (): oled.fill (0) oled.show () # stvoriti funkciju treptanja def blinkLed (num): za i u rasponu (0, num): led.on () sleep (0.5) led.off () spavanje (0,5)

Dakle, sada možemo prepisati našu glavnu () funkciju:

dok 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 ()

Konačni kod može se preuzeti s mog GitHub -a: localData.py, a također i iz Jupyter Notebooka koji se koristi za razvoj potpunog koda: Jupyter Local Data Development.

Korak 7: Spajanje ESP -a na lokalni WiFi

Povezivanje ESP -a s lokalnim WiFi -jem
Povezivanje ESP -a s lokalnim WiFi -jem

Mrežni modul koristi se za konfiguriranje WiFi veze. Postoje dva WiFi sučelja, jedno za stanicu (kada se ESP8266 poveže s usmjerivačem) i jedno za pristupnu točku (za povezivanje drugih uređaja s ESP8266). Ovdje će naš ESP biti spojen na lokalnu mrežu. Nazovimo knjižnicu i definirajmo naše mrežne vjerodajnice:

uvozna mreža

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

Donja funkcija može se koristiti za povezivanje ESP -a na vašu lokalnu mrežu:

def do_connect ():

wlan = network. WLAN (network. STA_IF) wlan.active (True) ako nije wlan.isconnected (): print ('povezivanje s mrežom …') wlan.connect (WiFi_SSID, WiFi_SSID) dok nije wlan.isconnected (): pass print ('mrežna konfiguracija:', wlan.ifconfig ())

Pokretanjem funkcije, kao rezultat, možete dobiti IP adresu:

do_connect ()

Rezultat će biti:

konfiguracija mreže: ('10.0.1.2 ',' 255.255.255.0 ', '10.0.1.1', '10.0.1.1 ')

Je li u mom slučaju 10.0.1.2 bila ESP IP adresa.

Korak 8: ThingSpeak

ThingSpeak
ThingSpeak

U ovom smo trenutku naučili kako hvatati podatke sa svih senzora, prikazujući ih na OLED -u. Sada je vrijeme da vidimo kako poslati te podatke na IoT platformu, ThingSpeak.

Započnimo!

Prvo morate imati račun na ThinkSpeak.com. Zatim slijedite upute za stvaranje kanala i zabilježite svoj ID kanala i API API ključ.

Gore možete vidjeti 5 polja koja će se koristiti na našem kanalu.

Korak 9: MQTT protokol i veza ThingSpeak

MQTT protokol i veza ThingSpeak
MQTT protokol i veza ThingSpeak

MQTT je arhitektura za objavljivanje/pretplatu koja je prvenstveno razvijena za povezivanje propusne širine i uređaja ograničenih snage putem bežičnih mreža. To je jednostavan i lagan protokol koji radi preko TCP/IP utičnica ili WebSockets. MQTT preko WebSockets može se osigurati SSL -om. Arhitektura objavljivanja/pretplate omogućuje slanje poruka na klijentske uređaje bez potrebe uređaja da neprestano anketira poslužitelj.

MQTT posrednik središnja je točka komunikacije i zadužen je za slanje svih poruka između pošiljatelja i zakonitih primatelja. Klijent je svaki uređaj koji se poveže s posrednikom i može objaviti ili se pretplatiti na teme radi pristupa informacijama. Tema sadrži informacije o usmjeravanju za brokera. Svaki klijent koji želi slati poruke objavljuje ih na određenu temu, a svaki klijent koji želi primati poruke pretplaćuje se na određenu temu. Posrednik isporučuje sve poruke s odgovarajućom temom odgovarajućim klijentima.

ThingSpeak ™ ima MQTT brokera na URL -u mqtt.thingspeak.com i portu 1883. Broker ThingSpeak podržava i MQTT objavljivanje i MQTT pretplatu.

U našem slučaju koristit ćemo: MQTT Publish

Slika
Slika

Slika opisuje strukturu teme. API API ključ je potreban za objavljivanje. Posrednik potvrđuje ispravan CONNECT zahtjev sa CONNACK -om.

MQTT protokol podržan je u ugrađenoj knjižnici u binarnim datotekama Micropython-ovaj protokol se može koristiti za slanje podataka s vašeg ESP8266, putem WIFI-ja, u besplatnu bazu podataka u oblaku.

Koristimo biblioteku umqtt.simple:

iz umqtt.jednostavni uvoz MQTTClient

Poznavajući naš SERVER ID, moguće je stvoriti naš klijentski objekt MQTT:

SERVER = "mqtt.thingspeak.com"

client = MQTTClient ("umqtt_client", SERVER)

Sada, imajući pri ruci svoje vjerodajnice za ThingSpeak:

CHANNEL_ID = "VAŠ ID KANALA"

WRITE_API_KEY = "VAŠ KLJUČ OVDJE"

Izradimo našu "temu" MQTT -a:

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

Neka naši podaci budu poslani na ThingSpeak IoT uslugu, pomoću kreirane funkcije i povežimo njen odgovor s određenim varijablama podataka:

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

S ažuriranjem tih varijabli možemo stvoriti naš "MQTT korisni teret":

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

I to je to! Spremni smo za slanje podataka u ThinsSpeak, jednostavno pomoću 3 reda koda u nastavku:

client.connect ()

client.publish (tema, korisni teret) client.disconnect ()

Sada, ako odete na stranicu svog kanala (kao što je moje gore), vidjet ćete da će svako od 5 polja imati podatke vezane za vaše senzore.

Korak 10: Zapisnik podataka senzora

Zapisnik podataka senzora
Zapisnik podataka senzora

Sada, kada znamo da je sa samo nekoliko redaka koda moguće učitati podatke na IoT uslugu, stvorimo funkciju petlje koja će to raditi automatski u redovitom vremenskom intervalu (slično onome što smo učinili s "Lokalni podaci" ").

Koristeći istu varijablu (PUB_TIME_SEC), prethodno navedenu, jednostavna glavna funkcija za kontinuirano hvatanje podataka, bilježenje na našem kanalu bila bi:

dok je istina:

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, korisni teret) client.disconnect () time.sleep (PUB_TIME_SEC)

Imajte na umu da se samo "korisni teret" mora ažurirati, nakon što se "tema" odnosi na vjerodajnice našeg kanala i neće se promijeniti.

Tražeći stranicu kanala ThingSpeak, primijetit ćete da će se podaci neprestano učitavati u svako polje. Možete pokriti LDR, staviti ruku na senzore temp/hum, pritisnuti gumb itd. I vidjeti kako će kanal automatski "zabilježiti" te podatke za buduću analizu.

Obično bismo za bilježenje podataka trebali nastojati koristiti što je moguće manje energije pa LED ili zaslon ne bismo koristili lokalno. Također, uobičajeno je s ESP uređajima, stavite ih u "duboki san", gdje će mikroprocesor biti u stanju minimalne energije sve dok ne dođe vrijeme za hvatanje podataka i njihovo slanje na IoT platformu.

No, kad se ovdje ideja uči, uključimo i zaslon i LED kao i prije. Pritom će naša funkcija "zapisnika" biti:

dok 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) klijent.connect () client.publish (tema, korisni teret) client.disconnect () time.sleep (PUB_TIME_SEC) blinkLed (3) displayClear ()

Cjelovitu skriptu microPython možete pronaći ovdje: dataLoggerTS_EXT.py i bilježnicu Jupyter koja je korištena za razvoj također možete pronaći ovdje: IoT ThingSpeak Data Logger EXT.ipynb.

Za prijenos skripte na ESP, na svom terminalu upotrijebite naredbu:

ampy stavi dataLoggerTS.py /main.py

I pritisnite tipku ESP - reset. Imat ćete ESP koji bilježi podatke i zapisuje ih na ThingSpeak.com dok se dno ne pritisne (pričekajte da LED lampica zatreperi 3 puta i isključi se OLED).

Korak 11: Aplikacija ThingView

Aplikacija ThingView
Aplikacija ThingView

Zabilježeni podaci mogu se vidjeti izravno na web mjestu ThingSpeak.com ili putem aplikacije, na primjer, ThingsView!

ThingView je aplikacija koju je razvila tvrtka CINETICA i omogućuje vam da na jednostavan način vizualizirate svoje ThingSpeak kanale, samo unesite ID kanala i spremni ste za rad.

Za javne kanale aplikacija će poštivati postavke vašeg prozora: boju, vremensku skalu, vrstu grafikona i broj rezultata. Trenutna verzija podržava linijske i stupčane grafikone, spline grafikoni se prikazuju kao linijski grafikoni.

Za privatne kanale, podaci će se prikazati pomoću zadanih postavki, jer nema načina za čitanje postavki privatnih prozora samo s API ključem.

APLIKACIJA ThingView može se preuzeti za ANDROID i IPHONE.

Korak 12: Zaključak

Zaključak
Zaključak

Kao i uvijek, nadam se da će ovaj projekt pomoći drugima da pronađu svoj put u uzbudljivi svijet elektronike!

Za detalje i konačni kod posjetite moje skladište GitHub: IoT_TS_MQTT

Za više projekata posjetite moj blog: MJRoBot.org

Saludos s juga svijeta!

Vidimo se u mom sljedećem uputstvu!

Hvala vam, Marcelo

Preporučeni: