Indholdsfortegnelse:

WiFi LED Strip + Temperatursensor Med ESP8266: 6 trin
WiFi LED Strip + Temperatursensor Med ESP8266: 6 trin

Video: WiFi LED Strip + Temperatursensor Med ESP8266: 6 trin

Video: WiFi LED Strip + Temperatursensor Med ESP8266: 6 trin
Video: Контроллер температуры мобильного телефона с модулем WIFI DT 06 | Программирование LDmicro-Roboremo 2024, Juli
Anonim
WiFi LED Strip + Temperatursensor Med ESP8266
WiFi LED Strip + Temperatursensor Med ESP8266

Denne vejledning beskriver trinene til opsætning af en ESP8266 og får den til at tale med både en temperatursensor og LED -strimmel, samtidig med at den kan modtage input og sende output med MQTT over WiFi. Projektet blev lavet til et kursus taget på Cal Poly San Luis Obispo i efteråret 2016- CPE 439: Real Time Embedded Systems. Det overordnede mål var at demonstrere letheden ved at oprette en internetforbundet "ting" med billig hardware.

Forbrugsvarer/udstyr påkrævet:

  • NodeMCU ESP8266 dev board
  • WS2812B LED -strimmel
  • MAX31820 Temperatursensor
  • Brødbræt
  • 4,7K ohm modstand
  • 220 ohm modstand
  • jumper ledninger
  • mikro-usb kabel
  • PC (eller VM), der kører linux (f.eks. Ubuntu)

Forudsætninger/forudsætninger:

  • erfaring med brug af kommandolinjeværktøjer og installation af pakker på en debian-baseret distro
  • grundlæggende forståelse af Makefile -syntaks
  • tilslutning af ledninger

Trin 1: Oprettelse af et bygningsmiljø

For at bygge projektet skal du have esp-open-sdk installeret på din maskine. Følg linket, og læs byggevejledningen. Kort sagt laver du nogle sudo apt-get-kommandoer for at installere afhængigheder, en git-klon-rekursiv for at klone/downloade esp-open-sdk og endelig en make-kommando for at bygge esp-open-sdk.

Se mig

Trin 2: Hent kildekode, konfigurer og opbyg

Nu hvor esp-open-sdk er bygget, skal du klone projektlageret.

git-klon

Skift til projektmappen, opret en.local mappe, og kopier eksempelindstillingerne.

cd esp-rtos-tests

mkdir -p.local cp settings.example.mk.local/settings.mk

Åbn nu.local/settings.mk med en hvilken som helst tekstredigerer, og rediger følgende indstillinger:

  • OPENSDK_ROOT: Den absolutte sti for placeringen af esp-open-sdk, du byggede i trin 1
  • WIFI_SSID: SSID'et for dit WiFi -netværk
  • WIFI_PASS: Adgangskoden til dit WiFi -netværk
  • PIXEL_COUNT: Antallet af pixels på din WS2812B LED -strimmel

Bemærk: Da dette projekt bruger SPI til at drive LED'erne og bruger NodeMCU 3.3v til at levere dem, vil du sandsynligvis ikke kunne køre mere end ~ 60 LED'er.

Bemærk: De andre indstillinger skal ikke ændres, men kan gøres om ønsket. Det anbefales at holde rækkefølgen for opgaveprioriteterne. Jo lavere prioritetsnummer, desto lavere prioritet er opgaven.

Byg nu projektet:

lav -C eksempler/cpe439

Hvis alt er konfigureret korrekt, skal det begynde at kompilere. I slutningen skal du se:

'Firmware/cpe439.bin' blev oprettet

Se mig

Trin 3: Tilslut hardwarekomponenter

Tilslut hardwarekomponenter
Tilslut hardwarekomponenter

Nu hvor koden er kompileret, er det tid til at forbinde vores eksterne enheder.

Først skal du sætte NodeMCU fast på brødbrættet, og derefter bruge jumperwires til at foretage forbindelserne som vist i diagrammet.

Et par ting at være opmærksom på:

  1. Vigtigt: WS2812B-datalinjen er ikke tovejs. Hvis du ser nøje på markeringerne på LED -siden af strimlen, skal du se små pile, der peger i en retning. Outputtet fra D7 i NodeMCU skal være på vej ind i WS2812B på samme måde som retningsmarkøren, som du kan se i diagrammet, hvis du ser godt efter.
  2. Afhængigt af hvilken slags stik din WS2812B kommer med, skal du muligvis foretage nogle ændringer for at få dem til at slutte sikkert til brødbrættet. Du kan også bruge alligatorklemmer til at forbinde dem til brødbræt-kompatible jumperkabler.
  3. MAX31820 benene har en mindre tonehøjde og er tyndere end standard 0,1 "/2,54 mm jumpere, hvilket gør dem vanskelige at forbinde. En vej udenom dette er at bruge hun-til-mand-jumperwire, tage plastikhuset af fra kvindesiden, brug derefter nogle tænger til at krympe den kvindelige jumper ender tæt omkring de mindre MAX31820 ben.

Dobbelttjek forbindelserne, før NodeMCU tændes for ikke at beskadige komponenterne.

Trin 4: Flash og kør

Blinker

Når al hardware er tilsluttet, skal du tilslutte din NodeMCU og blinke med følgende kommando:

lav flash -C eksempler/cpe439 ESPPORT =/dev/ttyUSB0

/dev/ttyUSB0 er den serielle com, NodeMCU skal vises under. Hvis du har andre serielle enheder tilsluttet, vises det muligvis som /dev /ttyUSB1 eller et andet nummer. For at kontrollere kan du køre denne kommando to gange, en gang med NodeMCU frakoblet, og en gang med den tilsluttet, og sammenligne forskellen:

ls /dev /ttyUSB*

Et andet problem, du kan støde på, er ikke at have tilladelse til at få adgang til enheden. To måder at løse dette på er:

  1. Føj din bruger til dialout -gruppen:

    sudo adduser $ (whoami) dialout

  2. chmod eller chown enheden:

sudo chmod 666 /dev /ttyUSB0 sudo chown $ (whoami): $ (whoami) /dev /ttyUSB0Den første metode foretrækkes, da den er en permanent løsning.

Løb

Efter at have udført flash -kommandoen, starter enheden straks og begynder at køre den kompilerede kode. Når som helst efter at du har blinket, kan du køre følgende kommando for at se seriel output:

python3 -m serial.tools.miniterm --eol CRLF --exit -char 003 /dev /ttyUSB0 500000 --raw -q

For at spare tid kan du føje dette til din ~/.bashrc -fil:

alias nodemcu = 'python3 -m serial.tools.miniterm --eol CRLF --exit -char 003 /dev /ttyUSB0 500000 --raw -q'

..som giver dig mulighed for ganske enkelt at skrive "nodemcu" som et alias for den kommando.

Hvis alt er konfigureret korrekt, skal din LED -strimmel lyse grønt, og på seriel skal du se WiFi -forbindelse, få en IP -adresse, oprette forbindelse til MQTT og meddelelser om, at temperaturdata skubbes ud.

forbundet med MyWiFiSSID, kanal 1dhcp -klientstart … wifi_task: status = 1wifi_task: status = 1ip: 192.168.2.23, mask: 255.255.255.0, gw: 192.168.2.1ws2812_spi_init okForespørg temp OKwifi_task: status = 5xQueueReceiveFi: (Gen) forbindelse til MQTT -server test.mosquitto.org … xQueueReceive +25,50xQueueSend ok doneSend MQTT connect … MQTTv311donexQueueReceive +25,56 xQueueSend ok

Trin 5: Interagerer

Forudsat at din enhed har oprettet forbindelse til WiFi og MQTT -mægleren med succes, vil du kunne sende og modtage data fra NodeMCU med MQTT. Hvis du ikke allerede har gjort det, skal du installere pakken med mygklienter:

sudo apt-get install mosquitto-klienter

Du skulle nu kunne bruge programmerne mosquitto_pub og mosquitto_sub fra din skal.

Modtager temperaturopdateringer

For at modtage temperaturdata vil vi bruge kommandoen mosquitto_sub til at abonnere på det emne, NodeMCU publicerer til.

mosquitto_sub -h test.mosquitto.org -t /cpe439 /temp

Du bør se temperaturdata (i Celsius), der ankommer til terminalen.

+25.87+25.93+25.68…

Fjernindstilling af LED -båndets farve

Et simpelt meddelelsesformat bruges til at sende RGB -værdier til NodeMCU over MQTT. Kommandoformatet ser sådan ud:

r: RRRg: GGGb: BBB ~

Hvor RRR, GGG, BBB svarer til RGB-værdier (0-255) for den farve, du vil sende. For at sende vores kommando bruger vi kommandoen mosquitto_pub. Her er nogle 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 blive kreativ, skal du finde en farvevælger online som denne og redigere kommandoen med den RGB-værdi, du vælger.

Pas på

Emnerne i dette projekt er indstillet til /cpe439 /rgb og /cpe439 /temp på en offentlig MQTT -mægler, hvilket betyder, at der ikke er noget, der forhindrer andre i at publicere eller abonnere på de samme emner som dig. For at prøve tingene er det fint at bruge en offentlig mægler, men for mere seriøse projekter vil du gerne oprette forbindelse til en mægler med adgangskodebeskyttelse eller køre din egen mægler på serveren.

Trin 6: Implementeringsdetaljer

Onewire

ESP8266 har kun 1 kerne, så lange blokeringsopgaver, såsom at vente 750 ms på temperatursensoren for at udføre en temperaturmåling, ville normalt resultere i, at WiFi ikke fungerer godt, og måske endda et nedbrud. I FreeRTOS -paradigmet kalder du vTaskDelay () for at håndtere disse lange ventetider, men der kræves også mange kortere ventetider mellem læsninger og skrivninger, der er kortere end FreeRTOS -systemmærket, og kan derfor ikke undgås med vTaskDelay (). For også at komme uden om disse blev onewire-driveren i dette projekt skrevet til at køre af en statsmaskine, der drives af ESP8266s hardwaretimer, som kan udløse begivenheder så lave som hvert 10 mikro-sekund, hvilket tilfældigvis er den korteste krævet tid mellem en -tråds læse-/skriveoperationer. De fleste andre implementeringer bruger et blokerende opkald til delay_us () eller lignende til at håndtere dette, men hvis du konstant tager temperaturopdateringer, begynder alle disse forsinkelser at tilføje sig, hvilket resulterer i en mindre responsiv applikation. Kilden til denne del af koden er placeret i mappen extras/onewire.

WS2812B

ESP8266 har ikke nogen standard hardware muligheder for PWM hurtigt nok til at drive LED strips på 800KHz. For at komme uden om dette bruger dette projekt SPI MOSI -pin til at drive lysdioderne. Ved at justere SPI -urets hastighed og ændre SPI -nyttelasten, kan du opnå en pålidelig kontrol af hver enkelt LED. Denne metode er ikke uden dens fejl- for en skal LED'erne forsynes med en 5V kilde, og en niveauskifter skal tilføjes til udgangen af SPI-stiften. Men 3.3V virker. For det andet er der fejl, der opstår på grund af ufuldkommen timing ved hjælp af SPI -metoden. Og for det tredje er nu, at du ikke kan bruge SPI til noget andet. Yderligere baggrund om denne metode kan findes her, og kilden til denne del af koden er placeret i mappen extras/ws2812.

En mere pålidelig metode til at køre LED -strips er at bruge i2'er. Denne metode har dog mange chipspecifikke hacks, så SPI syntes at være et bedre valg som læringsøvelse.

Anbefalede: