Innholdsfortegnelse:
2025 Forfatter: John Day | [email protected]. Sist endret: 2025-01-13 06:58
Denne opplæringen beskriver trinnene for å sette opp en ESP8266 og få den til å snakke med både en temperatursensor og LED -stripe, samtidig som den kan motta inngang og sende utgang med MQTT over WiFi. Prosjektet ble laget for et kurs tatt på Cal Poly San Luis Obispo høsten 2016- CPE 439: Real Time Embedded Systems. Det overordnede målet var å demonstrere det enkle å lage en internett-tilkoblet "ting" med billig maskinvare.
Rekvisita/utstyr som kreves:
- NodeMCU ESP8266 dev -kort
- WS2812B LED -stripe
- MAX31820 Temperatursensor
- Brødbrett
- 4,7K ohm motstand
- 220 ohm motstand
- jumper ledninger
- mikro-usb-kabel
- PC (eller VM) som kjører Linux (f.eks. Ubuntu)
Forutsetninger/forutsetninger:
- erfaring med bruk av kommandolinjeverktøy og installering av pakker på en debianbasert distro
- grunnleggende forståelse av Makefile -syntaks
- tilkobling av ledninger
Trinn 1: Opprette et bygningsmiljø
For å bygge prosjektet trenger du esp-open-sdk installert på maskinen. Følg lenken og les byggeinstruksjonene. Kort sagt, du gjør noen sudo apt-get-kommandoer for å installere avhengigheter, en git-klon-rekursiv for å klone/laste ned esp-open-sdk, og til slutt en kommando for å bygge esp-open-sdk.
Se på meg
Trinn 2: Få kildekoden, konfigurer og bygg
Nå som esp-open-sdk er bygget, klon prosjektdatabasen.
git-klon
Bytt til prosjektkatalogen, opprett en.local mappe og kopier eksempelinnstillingene.
cd esp-rtos-tester
mkdir -p.local cp settings.example.mk.local/settings.mk
Åpne nå.local/settings.mk med hvilken som helst tekstredigerer og endre følgende innstillinger:
- OPENSDK_ROOT: Den absolutte banen for plasseringen av esp-open-sdk du bygde i trinn 1
- WIFI_SSID: SSID for WiFi -nettverket ditt
- WIFI_PASS: Passordet til WiFi -nettverket ditt
- PIXEL_COUNT: Antall piksler på WS2812B LED -stripen
Merk: Siden dette prosjektet bruker SPI til å drive lysdiodene og bruker NodeMCU 3.3v for å levere dem, vil du sannsynligvis ikke kunne kjøre mer enn ~ 60 lysdioder.
Merk: De andre innstillingene trenger ikke endres, men kan gjøres om ønskelig. Det anbefales å holde rekkefølgen på oppgaveprioritetene. Jo lavere prioritetsnummer, desto lavere prioritet er oppgaven.
Bygg nå prosjektet:
lage -C eksempler/cpe439
Hvis alt er konfigurert riktig, bør det begynne å kompilere. På slutten bør du se:
Oppretting av firmware/cpe439.bin
Se på meg
Trinn 3: Koble til maskinvarekomponenter
Nå som koden er kompilert, er det på tide å koble til eksterne enheter.
Fest først NodeMCU på brødbrettet, og bruk deretter jumperkabler for å lage tilkoblingene som vist i diagrammet.
Et par ting å være oppmerksom på:
- Viktig: WS2812B-datalinjen er ikke toveis. Hvis du ser nøye på markeringene på LED -siden av stripen, bør du se små piler som peker i en retning. Utgangen fra D7 til NodeMCU må være på vei inn i WS2812B på samme måte som retningsmarkøren, som du kan se i diagrammet hvis du ser nøye etter.
- Avhengig av hva slags kontakter WS2812B kommer med, må du kanskje gjøre noen endringer for å få dem til å koble seg sikkert til brødbrettet. Du kan også bruke krokodilleklips for å koble dem til brødkabel-kompatible hoppekabler.
- MAX31820-pinnene har en mindre tonehøyde og er tynnere enn vanlige 0,1 "/2,54 mm-hoppere, noe som gjør dem vanskelige å koble til. En vei rundt dette er å bruke hun-til-mann-hoppetråder, ta av plasthuset fra kvinnesiden, bruk deretter noen tang for å krympe den kvinnelige jumperendene tett rundt de mindre MAX31820 -pinnene.
Dobbeltsjekk tilkoblingene før du slår på NodeMCU for ikke å skade komponentene.
Trinn 4: Flash og Run
Blinker
Når all maskinvare er tilkoblet, kobler du til NodeMCU og blinker med følgende kommando:
lag flash -C eksempler/cpe439 ESPPORT =/dev/ttyUSB0
/dev/ttyUSB0 er serienummeret NodeMCU skal vises under. Hvis du har andre serielle enheter tilkoblet, kan det vises som /dev /ttyUSB1 eller et annet nummer. For å kontrollere kan du kjøre denne kommandoen to ganger, en gang med NodeMCU frakoblet, og en gang med den plugget inn, og sammenligne forskjellen:
ls /dev /ttyUSB*
Et annet problem du kan støte på er ikke å ha tillatelse til å få tilgang til enheten. To måter å fikse dette på er:
-
Legg til brukeren din i oppringingsgruppen:
sudo adduser $ (whoami) dialout
- chmod eller chown enheten:
sudo chmod 666 /dev /ttyUSB0 sudo chown $ (whoami): $ (whoami) /dev /ttyUSB0Den første metoden foretrekkes da den er en permanent løsning.
Løping
Etter å ha kjørt flash -kommandoen vellykket, starter enheten umiddelbart og begynner å kjøre den kompilerte koden. Når som helst etter at du har blinket, kan du kjøre følgende kommando for å se seriell utgang:
python3 -m serial.tools.miniterm --eol CRLF --exit -char 003 /dev /ttyUSB0 500000 --raw -q
For å spare tid kan du legge dette til i ~/.bashrc -filen:
alias nodemcu = 'python3 -m serial.tools.miniterm --eol CRLF --exit -char 003 /dev /ttyUSB0 500000 --raw -q'
..som lar deg ganske enkelt skrive "nodemcu" som et alias for den kommandoen.
Hvis alt er konfigurert riktig, skal LED -stripen lyse grønt, og på seriell bør du se WiFi -tilkobling, få en IP -adresse, koble til MQTT og meldinger om at temperaturdata skyves ut.
koblet til MyWiFiSSID, start av kanal 1dhcp -klient … wifi_task: status = 1wifi_task: status = 1ip: 192.168.2.23, mask: 255.255.255.0, gw: 192.168.2.1ws2812_spi_init okForespørsel temp OKwifi_task: status = 5xQueueReceiveFi: (Re) koble til MQTT -server test.mosquitto.org … xQueueReceive +25,50xQueueSend ok doneSend MQTT connect … MQTTv311donexQueueReceive +25,56 xQueueSend ok
Trinn 5: Samhandling
Forutsatt at enheten din har koblet seg til WiFi og MQTT -megleren med hell, vil du kunne sende og motta data fra NodeMCU med MQTT. Hvis du ikke allerede har gjort det, kan du installere pakken med myggklienter:
sudo apt-get install mosquitto-klienter
Du bør nå kunne bruke programmene mosquitto_pub og mosquitto_sub fra skallet ditt.
Mottar temperaturoppdateringer
For å motta temperaturdata vil vi bruke kommandoen mosquitto_sub til å abonnere på emnet som NodeMCU publiserer til.
mosquitto_sub -h test.mosquitto.org -t /cpe439 /temp
Du bør se temperaturdata (i Celsius) som ankommer terminalen.
+25.87+25.93+25.68…
Innstilling av fargen på LED -stripen eksternt
Et enkelt meldingsformat brukes til å sende RGB -verdier til NodeMCU over MQTT. Kommandoformatet ser slik ut:
r: RRRg: GGGb: BBB ~
Hvor RRR, GGG, BBB tilsvarer RGB-verdier (0-255) for fargen du vil sende. For å sende kommandoen vår bruker vi kommandoen mosquitto_pub. Her er noen eksempler:
mosquitto_pub -h test.mosquitto.org -t /cpe439 /rgb -m 'r: 255g: 0b: 0 ~' # redmosquitto_pub -h test.mosquitto.org -t /cpe439 /rgb -m 'r: 0g: 255b: 0 ~ ' # greenmosquitto_pub -h test.mosquitto.org -t /cpe439 /rgb -m' r: 0g: 0b: 255 ~ ' # blå
Hvis du vil bli kreativ, finn en fargevelger på nettet som denne, og rediger kommandoen med hvilken RGB-verdi du enn velger.
Pass på
Emnene i dette prosjektet er satt til /cpe439 /rgb og /cpe439 /temp på en offentlig MQTT -megler, noe som betyr at det ikke er noe som hindrer noen andre i å publisere eller abonnere på de samme emnene som deg. For å prøve ting, er det greit å bruke en offentlig megler, men for mer seriøse prosjekter vil du koble til en megler med passordbeskyttelse, eller kjøre din egen megler på serveren.
Trinn 6: Implementeringsdetaljer
Onewire
ESP8266 har bare 1 kjerne, så lange blokkeringsoppgaver som å vente 750 ms på at temperatursensoren skal utføre en temperaturmåling, vil normalt føre til at WiFi ikke fungerer godt, og kanskje til og med et krasj. I FreeRTOS -paradigmet ringer du vTaskDelay () for å håndtere disse lange ventene, men det kreves også mange kortere ventetider mellom lesing og skriving som er kortere enn FreeRTOS -systemmerke, og dermed ikke kan unngås med vTaskDelay (). For å også komme rundt disse ble onewire-driveren i dette prosjektet skrevet for å kjøre ut av en statsmaskin som drives av ESP8266s maskinvaretimer, som kan utløse hendelser så lave som hvert 10 mikro-sekund, noe som tilfeldigvis er den korteste nødvendig tid mellom en -lese lese-/skriveoperasjoner. De fleste andre implementeringer bruker et blokkerende anrop til delay_us () eller lignende for å håndtere dette, men hvis du stadig tar temperaturoppdateringer, begynner alle forsinkelsene å legge seg opp, noe som resulterer i en mindre responsiv applikasjon. Kilden for denne delen av koden er plassert i mappen extras/onewire.
WS2812B
ESP8266 har ingen standard maskinvarealternativer for PWM raskt nok til å drive LED -strips på 800KHz. For å komme rundt dette bruker dette prosjektet SPI MOSI -pinnen til å drive lysdiodene. Ved å justere klokkefrekvensen til SPI, og endre SPI -nyttelasten rundt, kan du oppnå ganske pålitelig kontroll av hver enkelt LED. Denne metoden er ikke uten feil- for en bør lysdiodene drives med en 5V-kilde og en nivåskifter bør legges til utgangen på SPI-pinnen. Men 3.3V fungerer. For det andre er det feil som oppstår på grunn av ufullkommen timing ved bruk av SPI -metoden. Og det tredje er at nå kan du ikke bruke SPI til noe annet. Ytterligere bakgrunn på denne metoden finner du her, og kilden for denne delen av koden er plassert i mappen extras/ws2812.
En mer pålitelig metode for å kjøre LED -strips er å bruke i2s. Imidlertid har denne metoden mange chipspesifikke hack, så SPI syntes å være et bedre valg som en læringsøvelse.