Innehållsförteckning:

WiFi LED -remsa + temperatursensor med ESP8266: 6 steg
WiFi LED -remsa + temperatursensor med ESP8266: 6 steg

Video: WiFi LED -remsa + temperatursensor med ESP8266: 6 steg

Video: WiFi LED -remsa + temperatursensor med ESP8266: 6 steg
Video: Введение в плату разработки NodeMCU ESP8266 WiFi с примером HTTP-клиента 2024, November
Anonim
WiFi LED -remsa + temperatursensor med ESP8266
WiFi LED -remsa + temperatursensor med ESP8266

Denna handledning beskriver stegen för att konfigurera en ESP8266 och få den att prata med både en temperatursensor och LED -remsa, samtidigt som den kan ta emot ingång och skicka utmatning med MQTT över WiFi. Projektet gjordes för en kurs på Cal Poly San Luis Obispo hösten 2016- CPE 439: Real Time Embedded Systems. Det övergripande målet var att visa hur enkelt det är att skapa en internetansluten "sak" med billig hårdvara.

Tillbehör/utrustning som krävs:

  • NodeMCU ESP8266 dev -kort
  • WS2812B LED -remsa
  • MAX31820 Temperaturgivare
  • Bakbord
  • 4,7K ohm motstånd
  • 220 ohm motstånd
  • bygelkablar
  • mikro-usb-kabel
  • PC (eller VM) som kör Linux (t.ex. Ubuntu)

Antaganden/förutsättningar:

  • erfarenhet av att använda kommandoradsverktyg och installera paket på en debianbaserad distro
  • grundläggande förståelse för Makefile -syntax
  • anslutningskablar

Steg 1: Skapa en byggmiljö

För att bygga projektet behöver du esp-open-sdk installerat på din maskin. Följ länken och läs bygginstruktionerna. Kort sagt kommer du att göra några sudo apt-get-kommandon för att installera beroenden, en git-klon-rekursiv för att klona/ladda ner esp-open-sdk och slutligen ett make-kommando för att bygga esp-open-sdk.

Se på mig

Steg 2: Hämta källkod, konfigurera och bygg

Nu när esp-open-sdk är byggt, klona projektförvaret.

git-klon

Byt till projektkatalogen, skapa en.local mapp och kopiera exempelinställningarna.

cd esp-rtos-tester

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

Öppna nu.local/settings.mk med valfri textredigerare och ändra följande inställningar:

  • OPENSDK_ROOT: Den absoluta sökvägen för platsen för esp-open-sdk som du byggde i steg 1
  • WIFI_SSID: SSID för ditt WiFi -nätverk
  • WIFI_PASS: Lösenordet för ditt WiFi -nätverk
  • PIXEL_COUNT: Antalet pixlar på din WS2812B LED -remsa

Obs: Eftersom detta projekt använder SPI för att driva lysdioderna och använder NodeMCU 3.3v för att leverera dem, kommer du förmodligen inte att kunna köra mer än ~ 60 lysdioder.

Obs! De andra inställningarna behöver inte ändras, men kan göras om så önskas. Det rekommenderas att hålla ordningen på uppgiftsprioriteringarna. Ju lägre prioritetsnummer, desto lägre prioritet för uppgiften.

Bygg nu projektet:

gör -C -exempel/cpe439

Om allt är korrekt konfigurerat bör det börja kompilera. I slutet bör du se:

'Firmware/cpe439.bin' skapades

Se på mig

Steg 3: Anslut hårdvarukomponenter

Anslut hårdvarukomponenter
Anslut hårdvarukomponenter

Nu när koden är sammanställd är det dags att ansluta våra kringutrustning.

Stick först fast NodeMCU på brödbrädan, använd sedan bygelkablar för att göra anslutningarna enligt diagrammet.

Ett par saker att vara medveten om:

  1. Viktigt: WS2812B-datalinjen är inte dubbelriktad. Om du tittar noga på markeringarna på remsans LED -sida bör du se små pilar som pekar åt ett håll. Utsignalen från D7 i NodeMCU måste vara på väg in i WS2812B på samma sätt som riktningsmarkören, vilket du kan se i diagrammet om du tittar noga.
  2. Beroende på vilken typ av kontakter din WS2812B levereras med, kan du behöva göra några ändringar för att få dem att anslutas säkert till brödbrädan. Du kan också använda krokodilklämmor för att ansluta dem till brödbrädor som kan användas i bygelkablar.
  3. MAX31820-stiften har en mindre delning och är tunnare än vanliga 0,1 "/2,54 mm-hoppare, vilket gör dem knepiga att ansluta. En väg runt detta är att använda hona-till-man-bygeltrådar, ta av plasthöljet från kvinnans sida, använd sedan en tång för att krympa kvinnliga bygeländar tätt runt de mindre MAX31820 stiften.

Kontrollera anslutningarna innan du sätter på NodeMCU för att inte skada komponenterna.

Steg 4: Flash och kör

Blinkar

Med all hårdvara ansluten, anslut din NodeMCU och blinka med följande kommando:

gör flash -C -exempel/cpe439 ESPPORT =/dev/ttyUSB0

/dev/ttyUSB0 är serienumret som NodeMCU ska visas under. Om du har andra seriella enheter anslutna kan det visas som /dev /ttyUSB1 eller något annat nummer. För att kontrollera kan du köra detta kommando två gånger, en gång med NodeMCU urkopplad och en gång med den inkopplad, och jämföra skillnaden:

ls /dev /ttyUSB*

Ett annat problem som du kan stöta på är att du inte har behörighet att komma åt enheten. Två sätt att åtgärda detta är:

  1. Lägg till din användare i uppringningsgruppen:

    sudo adduser $ (whoami) uppringning

  2. chmod eller chown enheten:

sudo chmod 666 /dev /ttyUSB0 sudo chown $ (whoami): $ (whoami) /dev /ttyUSB0Den första metoden föredras eftersom den är en permanent lösning.

Löpning

Efter att ha kört flash -kommandot framgångsrikt startar enheten omedelbart och börjar köra den kompilerade koden. När som helst efter att du blinkat kan du köra följande kommando för att titta på seriell utmatning:

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

För att spara tid kan du lägga till detta i din ~/.bashrc -fil:

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

..som låter dig helt enkelt skriva "nodemcu" som ett alias för det kommandot.

Om allt är korrekt konfigurerat ska din LED -remsa lysa grönt, och på seriell bör du se WiFi -anslutning, få en IP -adress, ansluta till MQTT och meddelanden om att temperaturdata skjuts ut.

ansluten till 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 okFörfrågan temp OKwifi_task: status = 5xQueueReceiveFi 25task_taktaQuansökmottagningskoppling: (Om) anslutning till MQTT -server test.mosquitto.org … xQueueReceive +25,50xQueueSend ok doneSend MQTT connect … MQTTv311donexQueueReceive +25,56 xQueueSend ok

Steg 5: Interagerar

Om du antar att din enhet har anslutit till WiFi och MQTT -mäklaren framgångsrikt kan du skicka och ta emot data från NodeMCU med MQTT. Om du inte redan har gjort det installerar du myggklientpaketet:

sudo apt-get install myggklienter

Du bör nu kunna använda programma mosquitto_pub och mosquitto_sub från ditt skal.

Tar emot temperaturuppdateringar

För att få temperaturdata vill vi använda kommandot mosquitto_sub för att prenumerera på ämnet som NodeMCU publicerar till.

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

Du bör se temperaturdata (i Celsius) som anländer till terminalen.

+25.87+25.93+25.68…

Fjärrinställning av LED -remsans färg

Ett enkelt meddelandeformat används för att skicka RGB -värden till NodeMCU över MQTT. Kommandoformatet ser ut så här:

r: RRRg: GGGb: BBB ~

Där RRR, GGG, BBB motsvarar RGB-värden (0-255) för den färg du vill skicka. För att skicka vårt kommando använder vi kommandot mosquitto_pub. Här är några exempel:

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å

Om du vill bli kreativ hittar du en färgväljare online som den här och redigerar kommandot med vilket RGB-värde du än väljer.

Se upp

Ämnena i detta projekt är inställda på /cpe439 /rgb och /cpe439 /temp på en offentlig MQTT -mäklare, vilket innebär att det inte finns något som hindrar någon annan från att publicera eller prenumerera på samma ämnen som du. För att prova saker är det bra att använda en offentlig mäklare, men för mer seriösa projekt vill du ansluta till en mäklare med lösenordsskydd, eller köra din egen mäklare på servern.

Steg 6: Implementeringsdetaljer

Onewire

ESP8266 har bara 1 kärna, så långa blockeringsuppgifter som att vänta 750 ms för temperatursensorn för att utföra en temperaturmätning skulle normalt leda till att WiFi inte fungerar bra och kanske till och med en krasch. I FreeRTOS -paradigmet ringer du vTaskDelay () för att hantera dessa långa väntetider, men det krävs också många kortare väntetider mellan läsningar och skrivningar som är kortare än FreeRTOS -systemmarkeringen, och kan därför inte undvikas med vTaskDelay (). För att också komma runt dessa skrevs onewire-drivrutinen i detta projekt för att köra iväg från en tillståndsmaskin som drivs av ESP8266s hårdvarutimer, som kan utlösa händelser så låga som var 10 mikro-sekund, vilket råkar vara den kortaste nödvändig tid mellan en -tråds läs-/skrivoperationer. De flesta andra implementeringar använder ett blockerande samtal till delay_us () eller liknande för att hantera detta, men om du ständigt tar temperaturuppdateringar börjar alla dessa förseningar lägga till, vilket resulterar i en mindre responsiv applikation. Källan för den här delen av koden finns i mappen extras/onewire.

WS2812B

ESP8266 har inga standard hårdvarualternativ för PWM tillräckligt snabbt för att driva LED -remsor vid 800KHz. För att komma runt detta använder detta projekt SPI MOSI -stiftet för att driva lysdioderna. Genom att justera klockfrekvensen för SPI och ändra SPI -nyttolasten kan du uppnå en ganska tillförlitlig kontroll av varje enskild lysdiod. Denna metod är inte utan sina brister- för en bör LED-lamporna drivas med en 5V-källa och en nivåskiftare bör läggas till utgången på SPI-stiftet. Men 3.3V fungerar. För det andra finns det fel som uppstår på grund av ofullkomlig timing med SPI -metoden. Och det tredje är nu att du inte kan använda SPI för något annat. Ytterligare bakgrund om denna metod kan hittas här, och källan för denna del av koden finns i mappen extras/ws2812.

En mer pålitlig metod för att köra LED -remsor är att använda i2: er. Men den här metoden har många chipspecifika hack, så SPI verkade vara ett bättre val som inlärningsövning.

Rekommenderad: