Inhoudsopgave:

WiFi LED-strip + temperatuursensor met ESP8266 - Ajarnpa
WiFi LED-strip + temperatuursensor met ESP8266 - Ajarnpa

Video: WiFi LED-strip + temperatuursensor met ESP8266 - Ajarnpa

Video: WiFi LED-strip + temperatuursensor met ESP8266 - Ajarnpa
Video: Display WiFi Access Points on LCD with ESP8266 signal strength as percentage 2024, Juli-
Anonim
WiFi LED-strip + temperatuursensor met ESP8266
WiFi LED-strip + temperatuursensor met ESP8266

Deze tutorial beschrijft de stappen om een ESP8266 in te stellen en hem te laten praten met zowel een temperatuursensor als een ledstrip, terwijl hij ook input kan ontvangen en output kan verzenden met MQTT via wifi. Het project is gemaakt voor een cursus die in de herfst van 2016 werd gevolgd bij Cal Poly San Luis Obispo - CPE 439: Real Time Embedded Systems. Het algemene doel was om het gemak te demonstreren van het maken van een internet-verbonden "ding" met goedkope hardware.

Benodigde benodigdheden/apparatuur:

  • NodeMCU ESP8266 ontwikkelbord
  • WS2812B ledstrip
  • MAX31820 Temperatuursensor
  • Breadboard
  • 4.7K ohm weerstand
  • 220 ohm weerstand
  • jumperdraden
  • micro-usb-kabel
  • PC (of VM) met linux (bijv. Ubuntu)

Aannames/vereisten:

  • ervaring met het gebruik van opdrachtregelprogramma's en het installeren van pakketten op een op Debian gebaseerde distributie
  • basiskennis van de Makefile-syntaxis
  • aansluitdraden

Stap 1: Een bouwomgeving creëren

Om het project te bouwen, moet esp-open-sdk op uw computer zijn geïnstalleerd. Volg de link en lees de bouwinstructies. In het kort zul je wat sudo apt-get commando's doen om afhankelijkheden te installeren, een git clone --recursive to clone/download esp-open-sdk, en tenslotte een make commando om esp-open-sdk te bouwen.

Kijk naar mij

Stap 2: Broncode ophalen, configureren en bouwen

Nu esp-open-sdk is gebouwd, kloon je de projectrepository.

git clone

Ga naar de projectdirectory, maak een.local-map en kopieer de voorbeeldinstellingen.

cd esp-rtos-tests

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

Open nu.local/settings.mk met een teksteditor en wijzig de volgende instellingen:

  • OPENSDK_ROOT: het absolute pad voor de locatie van esp-open-sdk die u in stap 1 hebt gebouwd
  • WIFI_SSID: de SSID van je wifi-netwerk
  • WIFI_PASS: Het wachtwoord van uw WiFi-netwerk
  • PIXEL_COUNT: Het aantal pixels op uw WS2812B ledstrip

Opmerking: aangezien dit project SPI gebruikt om de LED's aan te sturen en de NodeMCU 3.3v gebruikt om ze te leveren, zult u waarschijnlijk niet meer dan ~60 LED's kunnen aansturen.

Let op: De overige instellingen hoeven niet te worden gewijzigd, maar kunnen desgewenst wel. Het wordt aanbevolen om de volgorde van de taakprioriteiten aan te houden. Hoe lager het prioriteitsnummer, hoe lager de prioriteit van de taak.

Bouw nu het project:

maak -C voorbeelden/cpe439

Als alles correct is ingesteld, zou het moeten beginnen met compileren. Aan het einde zou je moeten zien:

Met succes 'firmware/cpe439.bin' aangemaakt

Kijk naar mij

Stap 3: Sluit hardwarecomponenten aan

Hardwarecomponenten aansluiten
Hardwarecomponenten aansluiten

Nu de code is gecompileerd, is het tijd om onze randapparatuur aan te sluiten.

Plak eerst de NodeMCU op het breadboard en gebruik vervolgens jumperdraden om de verbindingen te maken zoals weergegeven in het diagram.

Een paar dingen om op te letten:

  1. Belangrijk: De WS2812B datalijn is niet bidirectioneel. Als je goed kijkt naar de markeringen op de LED-kant van de strip, zou je kleine pijlen moeten zien die in één richting wijzen. De uitvoer van D7 van de NodeMCU moet op dezelfde manier naar de WS2812B gaan als de richtingmarkering, die u in het diagram kunt zien als u goed kijkt.
  2. Afhankelijk van het soort connectoren waarmee uw WS2812B wordt geleverd, moet u mogelijk enkele wijzigingen aanbrengen om ze stevig op het breadboard te laten aansluiten. U kunt ook krokodillenklemmen gebruiken om ze aan te sluiten op startkabels die geschikt zijn voor breadboards.
  3. De MAX31820 pinnen hebben een kleinere steek en zijn dunner dan standaard 0,1"/2,54 mm jumpers, waardoor ze lastig aan te sluiten zijn. Een manier om dit te omzeilen is om vrouwelijke-naar-mannelijke jumperdraden te gebruiken, de plastic behuizing van de vrouwelijke kant te verwijderen, gebruik vervolgens een tang om de uiteinden van de vrouwelijke jumper stevig rond de kleinere MAX31820-pinnen te krimpen.

Controleer de verbindingen nogmaals voordat u de NodeMCU inschakelt om de componenten niet te beschadigen.

Stap 4: Flash en uitvoeren

Knipperend

Sluit alle hardware aan, sluit uw NodeMCU aan en flits met de volgende opdracht:

make flash -C voorbeelden/cpe439 ESPPORT=/dev/ttyUSB0

/dev/ttyUSB0 is de seriële com waaronder de NodeMCU zou moeten verschijnen. Als je andere seriële apparaten hebt aangesloten, kan het worden weergegeven als /dev/ttyUSB1 of een ander nummer. Om dit te controleren, kunt u deze opdracht twee keer uitvoeren, één keer met NodeMCU losgekoppeld en één keer met aangesloten, en het verschil vergelijken:

ls /dev/ttyUSB*

Een ander probleem dat u kunt tegenkomen, is dat u geen toestemming hebt om toegang te krijgen tot het apparaat. Twee manieren om dit op te lossen zijn:

  1. Voeg uw gebruiker toe aan de uitbelgroep:

    sudo adduser $(whoami) dialout

  2. chmod of chown het apparaat:

sudo chmod 666 /dev/ttyUSB0 sudo chown $(whoami):$(whoami) /dev/ttyUSB0De eerste methode heeft de voorkeur omdat het een permanente oplossing is.

Rennen

Nadat de flash-opdracht met succes is uitgevoerd, start het apparaat onmiddellijk op en begint de gecompileerde code uit te voeren. Op elk moment na het knipperen kunt u de volgende opdracht uitvoeren om de seriële uitvoer te bekijken:

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

Om tijd te besparen kun je dit toevoegen aan je ~/.bashrc-bestand:

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

..waarmee je eenvoudig "nodemcu" kunt typen als een alias voor die opdracht.

Als alles correct is geconfigureerd, moet uw LED-strip groen oplichten en op serieel zou u WiFi-verbinding moeten zien, een IP-adres krijgen, verbinding maken met MQTT en berichten dat temperatuurgegevens naar buiten worden geduwd.

verbonden met MyWiFiSSID, kanaal 1dhcp client start…wifi_task: status = 1wifi_task: status = 1ip:192.168.2.23, mask:255.255.255.0, gw:192.168.2.1ws2812_spi_init okRequest temp OKwifi_task: status = 5xQueueReceive ConnectSend okqqQueueReceive ConnectSend okqq: (Her)verbinden met MQTT-server test.mosquitto.org …xQueueReceive +25.50xQueueSend ok doneSend MQTT connect … MQTTv311donexQueueReceive +25.56 xQueueSend ok

Stap 5: Interactie

Ervan uitgaande dat uw apparaat met succes verbinding heeft gemaakt met WiFi en de MQTT-broker, kunt u met MQTT gegevens verzenden en ontvangen van de NodeMCU. Installeer het Mosquitto Clients-pakket als je dat nog niet hebt gedaan:

sudo apt-get install mug-clients

Je zou nu de programma's mosquitto_pub en mosquitto_sub uit je shell moeten kunnen gebruiken.

Temperatuurupdates ontvangen

Om temperatuurgegevens te ontvangen, willen we de opdracht mosquitto_sub gebruiken om ons te abonneren op het onderwerp waarnaar de NodeMCU publiceert.

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

U zou temperatuurgegevens (in Celsius) moeten zien die in de terminal aankomen.

+25.87+25.93+25.68…

De kleur van de ledstrip op afstand instellen

Er wordt een eenvoudig berichtformaat gebruikt om RGB-waarden via MQTT naar de NodeMCU te sturen. Het opdrachtformaat ziet er als volgt uit:

r:RRRg:GGGb:BBB~

Waarbij RRR, GGG, BBB overeenkomen met RGB-waarden (0-255) van de kleur die u wilt verzenden. Om onze opdracht te verzenden, gebruiken we de opdracht mosquitto_pub. Hier zijn enkele voorbeelden:

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

Als je creatief wilt zijn, zoek dan online een kleurenkiezer zoals deze en bewerk de opdracht met de RGB-waarde die je kiest.

Kijk uit

De onderwerpen in dit project zijn ingesteld op /cpe439/rgb en /cpe439/temp op een openbare MQTT-broker, wat betekent dat er niets is dat iemand anders ervan weerhoudt om dezelfde onderwerpen als jij te publiceren of erop te abonneren. Om dingen uit te proberen, is het gebruik van een openbare makelaar prima, maar voor serieuzere projecten wilt u verbinding maken met een makelaar met wachtwoordbeveiliging, of uw eigen makelaar op de server draaien.

Stap 6: Implementatiedetails

Onewire

De ESP8266 heeft maar 1 core, dus lang blokkerende taken zoals 750 ms wachten op de temperatuursensor om een temperatuurmeting uit te voeren, zou normaal gesproken resulteren in een niet goed functionerende wifi en misschien zelfs een crash. In het FreeRTOS-paradigma roept u vTaskDelay() aan om deze lange wachttijden af te handelen, maar er zijn ook veel kortere wachttijden vereist tussen lees- en schrijfbewerkingen die korter zijn dan de FreeRTOS-systeemvink en dus niet kunnen worden vermeden met vTaskDelay(). Om deze ook te omzeilen, is de onewire-driver in dit project geschreven om van een state-machine te lopen die wordt aangedreven door de hardware-timer van de ESP8266, die gebeurtenissen kan activeren die zo laag zijn als elke 10 microseconden, wat toevallig de kortste is benodigde tijd tussen eendraads lees-/schrijfbewerkingen. De meeste andere implementaties gebruiken een blokkerende oproep naar delay_us() of iets dergelijks om dit af te handelen, maar als je constant temperatuurupdates ontvangt, beginnen al die vertragingen op te lopen, wat resulteert in een minder responsieve applicatie. De bron voor dit deel van de code bevindt zich in de map extras/onewire.

WS2812B

De ESP8266 heeft geen standaard hardware-opties voor PWM die snel genoeg is om LED-strips op 800KHz aan te sturen. Om dit te omzeilen, gebruikt dit project de SPI MOSI-pin om de LED's aan te sturen. Door de kloksnelheid van SPI aan te passen en de SPI-payload rond te veranderen, kunt u een redelijk betrouwbare besturing van elke afzonderlijke LED bereiken. Deze methode is niet zonder gebreken - bijvoorbeeld moeten de LED's worden gevoed met een 5V-bron en moet een niveauverschuiver worden toegevoegd aan de uitgang van de SPI-pin. Maar 3.3V werkt wel. Ten tweede zijn er glitches die optreden als gevolg van onvolmaakte timing met behulp van de SPI-methode. En ten derde kun je SPI nu voor niets anders gebruiken. Aanvullende achtergrondinformatie over deze methode is hier te vinden, en de bron voor dit gedeelte van de code bevindt zich in de map extras/ws2812.

Een betrouwbaardere methode voor het aansturen van LED-strips is het gebruik van i2s. Deze methode heeft echter veel chip-specifieke hacks, dus SPI leek een betere keuze als leeroefening.

Aanbevolen: