INHOUDSOPGAWE:

WiFi LED -strook + temperatuursensor met ESP8266: 6 stappe
WiFi LED -strook + temperatuursensor met ESP8266: 6 stappe

Video: WiFi LED -strook + temperatuursensor met ESP8266: 6 stappe

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

Hierdie handleiding beskryf die stappe om 'n ESP8266 op te stel en dit met beide 'n temperatuursensor en LED -strook te laat praat, terwyl u ook insette kan ontvang en uitset kan stuur met MQTT via WiFi. Die projek is gemaak vir 'n kursus wat by Cal Poly San Luis Obispo in die herfs 2016 gevolg is- CPE 439: Real Time Embedded Systems. Die algemene doelwit was om die gemak van die skep van 'n internet-gekoppelde 'ding' met goedkoop hardeware aan te toon.

Benodighede/toerusting benodig:

  • NodeMCU ESP8266 dev board
  • WS2812B LED strook
  • MAX31820 Temperatuursensor
  • Broodbord
  • Weerstand van 4,7K ohm
  • 220 ohm weerstand
  • springdrade
  • mikro-usb-kabel
  • PC (of VM) met Linux (bv. Ubuntu)

Aannames/voorvereistes:

  • ervaring met die gebruik van opdragreëlgereedskap en die installering van pakkette op 'n debian-gebaseerde distro
  • basiese begrip van Makefile -sintaksis
  • drade verbind

Stap 1: Skep 'n bouomgewing

Om die projek te bou, benodig u esp-open-sdk op u masjien. Volg die skakel en lees die bouinstruksies. Kortom, u doen 'n paar sudo apt-get-opdragte om afhanklikes te installeer, 'n git-kloon-teruglopend om te kloon/aflaai esp-open-sdk, en uiteindelik 'n make-opdrag om esp-open-sdk te bou.

Kyk vir my

Stap 2: Kry bronkode, konfigureer en bou

Noudat esp-open-sdk gebou is, kloon die projekbewaarplek.

git-kloon

Verander in die projekgids, skep 'n.lokale gids en kopieer die voorbeeldinstellings.

cd esp-rtos-toetse

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

Maak nou.local/settings.mk oop met enige teksredakteur en verander die volgende instellings:

  • OPENSDK_ROOT: die absolute pad vir die ligging van esp-open-sdk wat u in stap 1 gebou het
  • WIFI_SSID: Die SSID van u WiFi -netwerk
  • WIFI_PASS: Die wagwoord van u WiFi -netwerk
  • PIXEL_COUNT: Die aantal pixels op u WS2812B LED -strook

Let wel: Aangesien hierdie projek SPI gebruik om die LED's aan te dryf en die NodeMCU 3.3v gebruik om dit te voorsien, sal u waarskynlik nie meer as ~ 60 LED's kan bestuur nie.

Opmerking: die ander instellings hoef nie verander te word nie, maar kan indien nodig. Dit word aanbeveel om die orde van die taakprioriteite te hou. Hoe laer die prioriteitsnommer, hoe laer is die prioriteit van die taak.

Bou nou die projek:

maak -C voorbeelde/cpe439

As alles korrek opgestel is, moet dit begin saamstel. Aan die einde moet u sien:

'Firmware/cpe439.bin' is suksesvol geskep

Kyk vir my

Stap 3: Koppel hardeware -komponente aan

Koppel hardeware -komponente
Koppel hardeware -komponente

Noudat die kode saamgestel is, is dit tyd om ons randapparatuur aan te sluit.

Plak eers die NodeMCU op die broodbord en gebruik dan draaddrade om die verbindings te maak soos in die diagram getoon.

'N Paar dinge om van bewus te wees:

  1. Belangrik: die WS2812B-datalyn is nie in twee rigtings nie. As u die merke aan die LED -kant van die strook goed bekyk, moet u klein pyltjies in een rigting sien. Die uitset van D7 van die NodeMCU moet op dieselfde manier na die WS2812B gaan as die rigtingmerker, wat u in die diagram kan sien as u mooi kyk.
  2. Afhangende van die tipe verbindings waarmee u WS2812B kom, moet u moontlik 'n paar aanpassings aanbring sodat hulle veilig op die broodbord kan aansluit. U kan ook krokodilleklemme gebruik om dit aan broodkabels in staat te stel.
  3. Die MAX31820-penne het 'n kleiner steek en is dunner as standaard 0.1 "/2.54mm-springers, wat dit moeilik maak om aan te sluit. Een manier om dit te vermy, is om vroulike-tot-manlike draaddrade te gebruik en die plastiekhouer van die vroulike kant af te haal, Gebruik dan 'n tang om die eindpunte van die vroulike trui styf om die kleiner MAX31820 -penne te krimp.

Kontroleer eers die verbindings voordat u die NodeMCU aanskakel om nie die komponente te beskadig nie.

Stap 4: Flits en hardloop

Flitsend

Koppel u NodeMCU aan met al die hardeware aangeslote en flits met die volgende opdrag:

maak flits -C voorbeelde/cpe439 ESPPORT =/dev/ttyUSB0

/dev/ttyUSB0 is die reekskom waarin die NodeMCU moet verskyn. As u ander seriële toestelle gekoppel het, kan dit verskyn as /dev /ttyUSB1 of 'n ander nommer. Om te kontroleer, kan u hierdie opdrag twee keer uitvoer, een keer met NodeMCU losgekoppel, en een keer daarmee ingeprop, en die verskil vergelyk:

ls /dev /ttyUSB*

'N Ander probleem wat u mag ondervind, is dat u nie toegang tot die toestel het nie. Twee maniere om dit reg te stel, is:

  1. Voeg u gebruiker by die inbelgroep:

    sudo adduser $ (whoami) inbel

  2. chmod of chown die toestel:

sudo chmod 666 /dev /ttyUSB0 sudo chown $ (whoami): $ (whoami) /dev /ttyUSB0Die eerste metode word verkies, aangesien dit 'n permanente oplossing is.

Hardloop

Nadat die flitsopdrag suksesvol uitgevoer is, begin die toestel onmiddellik en begin die saamgestelde kode begin. U kan op enige stadium na die flits die volgende opdrag uitvoer om na die seriële uitset te kyk:

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

Om tyd te bespaar, kan u dit by u ~/.bashrc -lêer voeg:

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

.. waarmee u eenvoudig "nodemcu" kan tik as 'n alias vir die opdrag.

As alles korrek gekonfigureer is, moet u LED -strook groen brand, en op seriële moet u WiFi -verbinding sien, 'n IP -adres kry, verbinding maak met MQTT en boodskappe dat temperatuurdata uitgestoot word.

gekoppel aan MyWiFiSSID, begin van kanaal 1dhcp -kliënt … wifi_task: status = 1wifi_task: status = 1ip: 192.168.2.23, masker: 255.255.255.0, gw: 192.168.2.1ws2812_spi_init okVraag temp OKwifi_task: status = 5xQueueReceiveFi 25t3_taakvraag_tikstuur:: (Her) verbinding met MQTT -bediener test.mosquitto.org … xQueueReceive +25.50xQueueSend ok doneStuur MQTT connect … MQTTv311donexQueueReceive +25.56 xQueueSend ok

Stap 5: Interaksie

As u toestel suksesvol met WiFi en die MQTT -makelaar gekoppel is, kan u data van die NodeMCU stuur met MQTT. As u dit nog nie gedoen het nie, installeer die pakket vir muskiete -kliënte:

sudo apt-get install mosquitto-kliënte

U behoort nou die muskiet_pub- en muskiet_sub -programme vanuit u dop te kan gebruik.

Ontvang temperatuuropdaterings

Om temperatuurdata te ontvang, wil ons die opdrag mosquitto_sub gebruik om in te teken op die onderwerp waarop die NodeMCU publiseer.

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

U behoort temperatuurdata (in Celsius) te sien aankom in die terminaal.

+25.87+25.93+25.68…

Stel die LED -strook se kleur op afstand in

'N Eenvoudige boodskapformaat word gebruik om RGB -waardes na die NodeMCU oor MQTT te stuur. Die opdragformaat lyk so:

r: RRRg: GGGb: BBB ~

Waar RRR, GGG, BBB ooreenstem met RGB-waardes (0-255) van die kleur wat u wil stuur. Om ons opdrag te stuur, gebruik ons die opdrag mosquitto_pub. Hier is 'n paar voorbeelde:

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 ~ ' # blou

As u kreatief wil wees, soek 'n aanlyn-kieser soos hierdie en wysig die opdrag met die RGB-waarde wat u kies.

Passop

Die onderwerpe in hierdie projek is ingestel op /cpe439 /rgb en /cpe439 /temp op 'n openbare MQTT -makelaar, wat beteken dat daar niks is wat iemand anders weerhou om dieselfde onderwerpe as u te publiseer of in te teken nie. Om dinge uit te probeer, is dit goed om 'n openbare makelaar te gebruik, maar vir ernstiger projekte wil u met 'n wagwoordbeskerming skakel met 'n makelaar of u eie makelaar op die bediener bestuur.

Stap 6: Uitvoeringsbesonderhede

Onewire

Die ESP8266 het slegs 1 kern, so lank, om take te blokkeer, soos om 750 ms te wag vir die temperatuursensor om 'n temperatuurmeting uit te voer, sal gewoonlik veroorsaak dat WiFi nie goed funksioneer nie, en miskien selfs 'n ongeluk. In die FreeRTOS -paradigma bel u vTaskDelay () om hierdie lang wag te hanteer, maar daar is ook baie korter wag tussen lees en skryf wat korter is as die FreeRTOS -stelselmerk, en kan dus nie met vTaskDelay () vermy word nie. Om dit ook te vermy, is die onewire-bestuurder in hierdie projek geskryf om weg te loop van 'n staatsmasjien wat aangedryf word deur die hardeware-timer van die ESP8266, wat gebeurtenisse so laag as elke 10 mikro-sekondes kan veroorsaak, wat die kortste is. benodigde tyd tussen die lees/skryf van een draad. Die meeste ander implementerings gebruik 'n blokkeeroproep na delay_us () of soortgelyk om dit te hanteer, maar as u voortdurend temperatuuropdaterings neem, begin al die vertragings optel, wat lei tot 'n minder responsiewe toepassing. Die bron vir hierdie gedeelte van die kode is geleë in die ekstra/onewire -lêergids.

WS2812B

Die ESP8266 het geen standaard hardeware -opsies vir PWM wat vinnig genoeg is om LED -stroke teen 800KHz aan te dryf nie. Om dit te vermy, gebruik hierdie projek die SPI MOSI -pen om die LED's aan te dryf. Deur die kloksnelheid van SPI aan te pas en die SPI -lading te verander, kan u elke individuele LED redelik betroubaar beheer. Hierdie metode is nie sonder gebreke nie- vir een moet die LED's aangedryf word met 'n 5V-bron en 'n vlakverskuiwing moet by die uitset van die SPI-pen gevoeg word. Maar 3.3V werk wel. Tweedens is daar foute wat voorkom as gevolg van onvolmaakte tydsberekening met die SPI -metode. En die derde is dat u nou SPI vir niks anders kan gebruik nie. Bykomende agtergrond oor hierdie metode kan hier gevind word, en die bron vir hierdie gedeelte van die kode is in die gids extras/ws2812.

'N Meer betroubare metode om LED -stroke te bestuur, is om i2's te gebruik. Hierdie metode het egter baie chipspesifieke hacks, dus SPI was 'n beter keuse as 'n leeroefening.

Aanbeveel: