Table des matières:

Bande LED WiFi + Capteur de température avec ESP8266 : 6 étapes
Bande LED WiFi + Capteur de température avec ESP8266 : 6 étapes

Vidéo: Bande LED WiFi + Capteur de température avec ESP8266 : 6 étapes

Vidéo: Bande LED WiFi + Capteur de température avec ESP8266 : 6 étapes
Vidéo: Home Assistant - DIY - ESPHome - NodeMCU - ESP8266 - Station Multi-Capteur - Domotique 2024, Novembre
Anonim
Bande LED WiFi + Capteur de température avec ESP8266
Bande LED WiFi + Capteur de température avec ESP8266

Ce tutoriel décrit les étapes pour configurer un ESP8266 et le faire parler à la fois à un capteur de température et à une bande LED, tout en pouvant également recevoir des entrées et envoyer des sorties avec MQTT via WiFi. Le projet a été réalisé pour un cours suivi à Cal Poly San Luis Obispo à l'automne 2016 - CPE 439: Systèmes embarqués en temps réel. L'objectif global était de démontrer la facilité de créer une "chose" connectée à Internet avec du matériel bon marché.

Fournitures/équipement requis:

  • Carte de développement NodeMCU ESP8266
  • Bande LED WS2812B
  • MAX31820 Capteur de température
  • Planche à pain
  • Résistance de 4,7K ohms
  • résistance de 220 ohms
  • fils de liaison
  • câble micro usb
  • PC (ou VM) exécutant Linux (par exemple, Ubuntu)

Hypothèses/Prérequis:

  • expérience avec l'utilisation d'outils en ligne de commande et l'installation de packages sur une distribution basée sur Debian
  • compréhension de base de la syntaxe Makefile
  • fils de connexion

Étape 1: Création d'un environnement de construction

Pour construire le projet, vous aurez besoin d'esp-open-sdk installé sur votre machine. Suivez le lien et lisez les instructions de construction. En bref, vous ferez des commandes sudo apt-get pour installer des dépendances, un clone git --recursive pour cloner/télécharger esp-open-sdk, et enfin une commande make pour compiler esp-open-sdk.

Regarde moi

Étape 2: Obtenez le code source, configurez et créez

Maintenant que esp-open-sdk est construit, clonez le référentiel du projet.

git clone

Accédez au répertoire du projet, créez un dossier.local et copiez les exemples de paramètres.

cd esp-rtos-tests

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

Ouvrez maintenant.local/settings.mk avec n'importe quel éditeur de texte et modifiez les paramètres suivants:

  • OPENSDK_ROOT: le chemin absolu de l'emplacement de esp-open-sdk que vous avez construit à l'étape 1
  • WIFI_SSID: Le SSID de votre réseau WiFi
  • WIFI_PASS: Le mot de passe de votre réseau WiFi
  • PIXEL_COUNT: Le nombre de pixels sur votre bande LED WS2812B

Remarque: Étant donné que ce projet utilise SPI pour piloter les LED et utilise le NodeMCU 3.3v pour les alimenter, vous ne pourrez probablement pas piloter plus de ~ 60 LED.

Remarque: les autres paramètres n'ont pas besoin d'être modifiés, mais peuvent l'être si vous le souhaitez. Il est recommandé de garder l'ordre des priorités des tâches. Plus le numéro de priorité est bas, plus la priorité de la tâche est basse.

Maintenant, construisez le projet:

make -C exemples/cpe439

Si tout est configuré correctement, la compilation devrait commencer. A la fin vous devriez voir:

'firmware/cpe439.bin' créé avec succès

Regarde moi

Étape 3: Connecter les composants matériels

Connecter les composants matériels
Connecter les composants matériels

Maintenant que le code est compilé, il est temps de connecter nos périphériques.

Tout d'abord, collez le NodeMCU sur la planche à pain, puis utilisez des cavaliers pour effectuer les connexions comme indiqué sur le schéma.

Quelques choses à savoir:

  1. Important: la ligne de données WS2812B n'est pas bidirectionnelle. Si vous regardez attentivement les marques sur le côté LED de la bande, vous devriez voir de petites flèches pointant dans une direction. La sortie de D7 du NodeMCU doit se diriger vers le WS2812B de la même manière que le marqueur de direction, que vous pouvez voir sur le diagramme si vous regardez de près.
  2. Selon le type de connecteurs fournis avec votre WS2812B, vous devrez peut-être apporter quelques modifications pour les connecter en toute sécurité à la maquette. Vous pouvez également utiliser des pinces crocodiles pour les connecter à des câbles de démarrage compatibles avec la maquette.
  3. Les broches du MAX31820 ont un pas plus petit et sont plus fines que les cavaliers standard de 0,1"/2,54 mm, ce qui les rend difficiles à connecter. Une solution consiste à utiliser des câbles de raccordement femelle à mâle, à retirer le boîtier en plastique du côté femelle, puis utilisez une pince pour sertir les extrémités du cavalier femelle autour des plus petites broches du MAX31820.

Vérifiez les connexions avant de mettre le NodeMCU sous tension afin de ne pas endommager les composants.

Étape 4: Flashez et exécutez

Clignotant

Avec tout le matériel connecté, branchez votre NodeMCU et flashez avec la commande suivante:

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

/dev/ttyUSB0 est le numéro de série sous lequel le NodeMCU doit apparaître. Si d'autres périphériques série sont connectés, ils peuvent apparaître sous la forme /dev/ttyUSB1 ou un autre numéro. Pour vérifier, vous pouvez exécuter cette commande deux fois, une fois avec NodeMCU débranché et une fois avec celui-ci branché, et comparer la différence:

ls /dev/ttyUSB*

Un autre problème que vous pouvez rencontrer est de ne pas avoir la permission d'accéder à l'appareil. Deux façons de résoudre ce problème sont:

  1. Ajoutez votre utilisateur au groupe d'appel:

    sudo adduser $ (whoami) dialout

  2. chmod ou chown l'appareil:

sudo chmod 666 /dev/ttyUSB0 sudo chown $(whoami):$(whoami) /dev/ttyUSB0La première méthode est préférée car il s'agit d'une solution permanente.

Fonctionnement

Après avoir exécuté la commande flash avec succès, l'appareil démarrera immédiatement et commencera à exécuter le code compilé. À tout moment après avoir clignoté, vous pouvez exécuter la commande suivante pour regarder la sortie série:

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

Pour gagner du temps, vous pouvez ajouter ceci à votre fichier ~/.bashrc:

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

..qui vous permet de taper simplement "nodemcu" comme alias pour cette commande.

Si tout est configuré correctement, votre bande LED devrait s'allumer en vert, et en série, vous devriez voir une connexion Wi-Fi, obtenir une adresse IP, se connecter à MQTT et des messages indiquant que les données de température sont en cours d'expulsion.

connecté avec MyWiFiSSID, canal 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 Started_25.43xQuett_Ta:: (Re)connexion au serveur MQTT test.mosquitto.org …xQueueReceive +25.50xQueueSend ok doneSend MQTT connect … MQTTv311donexQueueReceive +25.56 xQueueSend ok

Étape 5: Interagir

En supposant que votre appareil se soit connecté au WiFi et au courtier MQTT avec succès, vous pourrez envoyer et recevoir des données du NodeMCU avec MQTT. Si vous ne l'avez pas déjà fait, installez le package clients mosquitto:

sudo apt-get install mosquitto-clients

Vous devriez maintenant pouvoir utiliser les programmes mosquitto_pub et mosquitto_sub depuis votre shell.

Recevoir des mises à jour de température

Pour recevoir des données de température, nous utiliserons la commande mosquitto_sub pour nous abonner au sujet sur lequel le NodeMCU publie.

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

Vous devriez voir les données de température (en degrés Celsius) arriver dans le terminal.

+25.87+25.93+25.68…

Réglage à distance de la couleur de la bande LED

Un format de message simple est utilisé pour envoyer des valeurs RVB au NodeMCU via MQTT. Le format de la commande ressemble à ceci:

r:RRRg:GGGb:BBB~

Où RRR, GGG, BBB correspondent aux valeurs RVB (0-255) de la couleur que vous souhaitez envoyer. Pour envoyer notre commande, nous utiliserons la commande mosquitto_pub. Voici quelques exemples:

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

Si vous voulez faire preuve de créativité, trouvez un sélecteur de couleurs en ligne comme celui-ci et modifiez la commande avec la valeur RVB de votre choix.

Fais attention

Les sujets de ce projet sont définis sur /cpe439/rgb et /cpe439/temp sur un courtier MQTT public, ce qui signifie que rien n'empêche quelqu'un d'autre de publier ou de s'abonner aux mêmes sujets que vous. Pour essayer des choses, utiliser un courtier public est bien, mais pour des projets plus sérieux, vous voudrez vous connecter à un courtier avec une protection par mot de passe ou exécuter votre propre courtier sur le serveur.

Étape 6: Détails de la mise en œuvre

Un fil

L'ESP8266 n'a qu'un seul cœur, donc le blocage de tâches telles que l'attente de 750 ms pour que le capteur de température effectue une mesure de température entraînerait normalement un dysfonctionnement du WiFi, voire un crash. Dans le paradigme FreeRTOS, vous appelez vTaskDelay() pour gérer ces longues attentes, mais il existe également de nombreuses attentes plus courtes requises entre les lectures et les écritures qui sont plus courtes que la coche du système FreeRTOS et ne peuvent donc pas être évitées avec vTaskDelay(). Pour les contourner également, le pilote onewire de ce projet a été écrit pour s'exécuter à partir d'une machine d'état pilotée par la minuterie matérielle de l'ESP8266, qui peut déclencher des événements aussi bas que toutes les 10 microsecondes, ce qui se trouve être le plus court temps requis entre les opérations de lecture/écriture onewire. La plupart des autres implémentations utilisent un appel bloquant à delay_us() ou similaire pour gérer cela, mais si vous effectuez constamment des mises à jour de température, tous ces retards commencent à s'accumuler, ce qui entraîne une application moins réactive. La source de cette portion de code se trouve dans le dossier extras/onewire.

WS2812B

L'ESP8266 n'a pas d'options matérielles standard pour PWM suffisamment rapide pour piloter des bandes LED à 800 KHz. Pour contourner ce problème, ce projet utilise la broche SPI MOSI pour piloter les LED. En ajustant la fréquence d'horloge de SPI et en modifiant la charge utile SPI, vous pouvez obtenir un contrôle assez fiable de chaque LED individuelle. Cette méthode n'est pas sans défauts - pour l'une, les LED doivent être alimentées avec une source de 5 V et un décaleur de niveau doit être ajouté à la sortie de la broche SPI. Mais 3.3V fonctionne. Deuxièmement, il y a des problèmes qui se produisent en raison d'un timing imparfait à l'aide de la méthode SPI. Et troisièmement, vous ne pouvez plus utiliser SPI pour autre chose. Des informations supplémentaires sur cette méthode peuvent être trouvées ici, et la source de cette partie de code se trouve dans le dossier extras/ws2812.

Une méthode plus fiable pour piloter des bandes LED consiste à utiliser des i2s. Cependant, cette méthode a beaucoup de hacks spécifiques aux puces, donc SPI semblait être un meilleur choix comme exercice d'apprentissage.

Conseillé: