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, Juli
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 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 snimljenih snimaka podatke na OLED ekranu.

Sada ćemo u ovom vodiču pomoću MQTT protokola dobiti sve snimljene podatke, šaljući 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:

Image
Image

Korak 1: BoM - Predmet materijala

  1. NodeMCU - 8,39 USD
  2. DHT22 Senzor temperature i relativne vlažnosti - 9,95 USD
  3. DS18B20 Vodonepropusni senzor temperature - 5,95 USD
  4. OLED ekran SSD1366- 8,99 USD (opcionalno)
  5. LDR (1x)
  6. LED diode (1x) (opcionalno)
  7. Taster (1x)
  8. Otpornik 4K7 ohm (2x)
  9. Otpornik 10K ohm (1x)
  10. Otpornik 220 ohma (1x)

Korak 2: Hw

The Hw
The 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 koristeći bilo koji od dostupnih načina/IDE -a, poput:

  • REPL
  • Jupyter Notebook
  • 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 koristite 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 biblioteke, definirajmo GPIO, kreirajmo objekte, funkcije za sve senzore pojedinačno:

A. DHT (temperatura i vlažnost)

Instalirajmo DHT biblioteku i kreirajmo objekt:

od dht uvoz DHT22

iz uvoza mašine Pin dht22 = DHT22 (Pin (12))

Sada stvorite funkciju za čitanje DHT senzora:

def readDht ():

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

ispis (readDht ())

Rezultat bi trebao biti na primjer:

(17.7, 43.4)

B. DS18B20 (vanjska temperatura)

Instalirajmo biblioteke i kreirajmo objekt:

uvoz onewire, ds18x20

vrijeme uvoza # Odredite koji pin će 1-žični uređaj biti spojen ==> pin 2 (D4) dat = Pin (2) # kreirajte jednožični objekt ds = ds18x20. DS18X20 (onewire. OneWire (dat)) Skenirajte uređaje na bu

senzori = ds.scan ()

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

Odštampani 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š kôd je tačan

17.5

C. LDR (Luminosity)

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

Za detalje pogledajte moje uputstvo za ESP32.

Isto kao i ranije:

# biblioteka za uvoz

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 interni 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 da je Max svjetlo najveća snimljena vrijednost 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) # konverzija u procentima ("mapa") povratna runda (lumPerct)

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

D. Taster (digitalni ulaz)

Ovdje koristimo Push-Button kao digitalni senzor, ali to može biti "odjek" aktuatora (na primjer, pumpa koja je 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 dugmeta: def readBut (): dugme za povratak.value ()

Možete testirati dugme koje čita funkciju print (readBut ()). Bez pritiska na rezultat trebao bi biti "1". Pritiskom na dugme 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 ih sve čitati 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 ekranu:

# importirajte biblioteku i kreirajte objekt i2c

iz stroja import I2C i2c = I2C (scl = Pin (5), sda = Pin (4)) # biblioteka uvoza i stvaranje objekta oled uvoz ssd1306 i2c = I2C (scl = Pin (5), sda = Pin (4)) oled = ssd1306. SSD1306_I2C (128, 64, i2c, 0x3c) # kreirajte 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 ("Dugme:" + 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 što se ti podaci prikažu. Ovo će vam pomoći da potvrdite da program radi kada imamo isključen ESP sa računara 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 stanice 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 biblioteka

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 pin 1-žičnog uređaja će biti spojen ==> pin 2 (D4) dat = Pin (2) # Kreirajte jednožični 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 procentima ("mapa") povratna runda (lumPerct) # definirajte pin 13 kao ulaz i aktivirajte unutrašnji pull-up otpornik: button = Pin (13, Pin. IN, Pin. PULL_UP) # Funkcija za čitanje stanja dugmeta: def readBut (): dugme 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 # biblioteka uvoza i kreiranje objekta i2c iz stroja za uvoz I2C i2c = I2C (scl = Pin (5), sda = Pin (4)) # biblioteka za uvoz i kreiranje objekta oled import ssd1306 i2c = I2C (scl = Pin (5), sda = Pin (4)) oled = ssd1306. SSD1306_I2C (128, 64, i2c, 0x3c) # kreirajte 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 ("Dugme:" + 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 ()

Sačuvajte 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 sistemu.

Sada, upotrijebimo Ampy za učitavanje naše 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 ekranu.

Gornji ekran za štampanje terminala pokazuje šta smo uradili.

Sa 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 dugme:

# petlja za dobijanje podataka dok se ne pritisne dugme

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 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.

# Jasan prikaz:

def displayClear (): oled.fill (0) oled.show () # kreira 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 se može preuzeti sa mog GitHub -a: localData.py, a takođe i iz Jupyter Notebook -a koji se koristi za razvoj potpunog koda: Jupyter Local Data Development.

Korak 7: Povezivanje ESP -a s lokalnom WiFi mrežom

Povezivanje ESP -a na lokalni WiFi
Povezivanje ESP -a na lokalni WiFi

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 na ESP8266). Ovdje će naš ESP biti povezan s lokalnom mrežom. Nazovimo biblioteku 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 na mrežu …') 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:

mrežna konfiguracija: ('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 našem OLED -u. Sada je vrijeme da vidimo kako poslati te podatke na IoT platformu, ThingSpeak.

Počnimo!

Prvo morate imati račun na ThinkSpeak.com. Zatim slijedite upute za kreiranje kanala i zapišite svoj ID kanala i API API ključ.

Iznad 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/pretplaćivanje 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 -a može se osigurati pomoću SSL -a. Arhitektura objavljivanja/pretplate omogućuje slanje poruka na klijentske uređaje bez potrebe uređaja da neprestano anketira poslužitelj.

MQTT posrednik je središnja 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 sa 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

Image
Image

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

MQTT protokol je podržan u ugrađenoj biblioteci u Micropython binarnim datotekama-ovaj protokol se može koristiti za slanje podataka sa vašeg ESP8266 preko WIFI-a u besplatnu bazu podataka u oblaku.

Koristimo biblioteku umqtt.simple:

iz umqtt.simple import MQTTClient

Znajući naš SERVER ID, moguće je kreirati naš klijentski objekt MQTT:

SERVER = "mqtt.thingspeak.com"

client = MQTTClient ("umqtt_client", SERVER)

Sada, pri ruci, imate svoje vjerodajnice za ThingSpeak:

CHANNEL_ID = "VAŠ ID KANALA"

WRITE_API_KEY = "VAŠ KLJUČ OVDJE"

Kreirajmo našu MQTT "temu":

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

Hajde da pošaljemo naše podatke na ThingSpeak IoT uslugu, koristeći kreiranu funkciju i povežemo njen odgovor s određenim varijablama podataka:

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

S ažuriranim tim varijablama možemo stvoriti naš "MQTT korisni teret":

korisni teret = "polje1 ="+str (temp)+"& polje2 ="+str (pjevušenje)+"& polje3 ="+str (extTemp)+"& polje4 ="+str (lum)+"& polje5 ="+str (butSts))

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

client.connect ()

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

Sada, ako odete na stranicu svog kanala (kao što je moje gore), vidjet ćete da svako od 5 polja ima 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, kreirajmo funkciju petlje koja će to raditi automatski u redovnom 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, njihovo bilježenje na našem kanalu bila bi:

dok je True:

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 dugme itd. I vidjeti kako će kanal automatski "evidentirati" te podatke za buduću analizu.

Obično bismo za evidentiranje podataka trebali pokušati koristiti što je manje moguće energije, tako da LED ili zaslon ne bismo koristili lokalno. Također, uobičajeno je za ESP uređaje, 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 ekran 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 ()

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

Za postavljanje skripte na ESP, na svom terminalu koristite 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 da se OLED isključi).

Korak 11: Aplikacija ThingView

Aplikacija ThingView
Aplikacija ThingView

Zapisani podaci mogu se vidjeti direktno na web stranici ThingSpeak.com ili putem aplikacije, na primjer, ThingsView!

ThingView je aplikacija koju je razvila kompanija CINETICA i omogućava 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 stupne karte, spline grafikoni se prikazuju kao linijski grafikoni.

Za privatne kanale, podaci će se prikazivati pomoću zadanih postavki, jer nema načina da se pročitaju postavke privatnih prozora samo s API ključem.

Aplikaciju ThingView možete 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 -a: IoT_TS_MQTT

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

Saludos sa juga svijeta!

Vidimo se u mom sljedećem uputstvu!

Hvala ti, Marcelo

Preporučuje se: