İçindekiler:

ESP8266 ile WiFi LED Şerit + Sıcaklık Sensörü: 6 Adım
ESP8266 ile WiFi LED Şerit + Sıcaklık Sensörü: 6 Adım

Video: ESP8266 ile WiFi LED Şerit + Sıcaklık Sensörü: 6 Adım

Video: ESP8266 ile WiFi LED Şerit + Sıcaklık Sensörü: 6 Adım
Video: UZAKTAN SICAKLIK VE NEM OKUYORUZ! - Nodemcu ESP8266, DHT11 / BLYNK #3 2024, Kasım
Anonim
ESP8266 ile WiFi LED Şerit + Sıcaklık Sensörü
ESP8266 ile WiFi LED Şerit + Sıcaklık Sensörü

Bu öğretici, bir ESP8266 kurma ve hem bir sıcaklık sensörü hem de LED şerit ile konuşmasını sağlarken, aynı zamanda WiFi üzerinden MQTT ile giriş ve çıkış gönderebilme adımlarını açıklar. Proje, Güz 2016- CPE 439: Gerçek Zamanlı Gömülü Sistemler'de Cal Poly San Luis Obispo'da alınan bir ders için yapılmıştır. Genel amaç, ucuz donanımla internete bağlı bir "şey" yaratmanın kolaylığını göstermekti.

Gerekli Malzemeler/Ekipman:

  • NodeMCU ESP8266 geliştirme kartı
  • WS2812B LED şerit
  • MAX31820 Sıcaklık sensörü
  • ekmek tahtası
  • 4.7K ohm direnç
  • 220 ohm direnç
  • atlama telleri
  • mikro usb kablosu
  • Linux çalıştıran PC (veya VM) (örn. Ubuntu)

Varsayımlar/Ön Koşullar:

  • Debian tabanlı bir dağıtımda komut satırı araçlarını kullanma ve paketleri yükleme deneyimi
  • Makefile sözdiziminin temel anlayışı
  • bağlantı telleri

1. Adım: Bir Yapı Ortamı Oluşturma

Projeyi oluşturmak için makinenizde kurulu esp-open-sdk'ye ihtiyacınız olacak. Bağlantıyı takip edin ve yapım talimatlarını okuyun. Kısacası, bağımlılıkları yüklemek için bazı Sudo apt-get komutları, esp-open-sdk'yi klonlamak/indirmek için bir git clone --recursive ve son olarak esp-open-sdk oluşturmak için bir make komutu yapacaksınız.

Beni izle

2. Adım: Kaynak Kodu Alın, Yapılandırın ve Oluşturun

Artık esp-open-sdk oluşturulduğuna göre, proje deposunu klonlayın.

git klon

Proje dizinine geçin, bir.local klasörü oluşturun ve örnek ayarları kopyalayın.

cd esp-rtos testleri

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

Şimdi.local/settings.mk dosyasını herhangi bir metin düzenleyiciyle açın ve aşağıdaki ayarları değiştirin:

  • OPENSDK_ROOT: 1. adımda oluşturduğunuz esp-open-sdk'nin konumu için mutlak yol
  • WIFI_SSID: WiFi ağınızın SSID'si
  • WIFI_PASS: WiFi ağınızın şifresi
  • PIXEL_COUNT: WS2812B LED şeridinizdeki piksel sayısı

Not: Bu proje LED'leri sürmek için SPI kullandığından ve bunları sağlamak için NodeMCU 3.3v'yi kullandığından, muhtemelen ~60'tan fazla LED'i kullanamayacaksınız.

Not: Diğer ayarların değiştirilmesine gerek yoktur, ancak istenirse değiştirilebilir. Görev önceliklerinin sırasını korumanız önerilir. Öncelik numarası ne kadar düşükse, görevin önceliği de o kadar düşük olur.

Şimdi projeyi oluşturun:

-C örnekleri/cpe439 yapın

Her şey doğru ayarlanmışsa, derlemeye başlamalıdır. Sonunda görmelisiniz:

'firmware/cpe439.bin' başarıyla oluşturuldu

Beni izle

3. Adım: Donanım Bileşenlerini Bağlayın

Donanım Bileşenlerini Bağlayın
Donanım Bileşenlerini Bağlayın

Artık kod derlendiğine göre, çevre birimlerimizi bağlamanın zamanı geldi.

İlk olarak, NodeMCU'yu devre tahtasına yapıştırın, ardından şemada gösterildiği gibi bağlantıları yapmak için jumper kabloları kullanın.

Dikkat edilmesi gereken birkaç şey:

  1. Önemli: WS2812B veri hattı çift yönlü değildir. Şeritin LED tarafındaki işaretlere yakından bakarsanız, bir yönü gösteren küçük oklar görmelisiniz. NodeMCU'nun D7 çıktısının, yakından bakarsanız şemada görebileceğiniz yön işaretçisiyle aynı şekilde WS2812B'ye gitmesi gerekir.
  2. WS2812B'nizin ne tür konektörlerle birlikte geldiğine bağlı olarak, bunların devre tahtasına güvenli bir şekilde bağlanmasını sağlamak için bazı değişiklikler yapmanız gerekebilir. Ayrıca, bunları breadboard uyumlu atlama kablolarına bağlamak için timsah klipslerini de kullanabilirsiniz.
  3. MAX31820 pinleri daha küçük bir adıma sahiptir ve standart 0,1"/2,54mm jumperlardan daha incedir, bu da onları bağlamayı zorlaştırır. Bunu aşmanın bir yolu dişi-erkek jumper kabloları kullanmak, plastik kasayı dişi taraftan çıkarmak, daha sonra dişi jumper uçlarını daha küçük MAX31820 pimlerinin etrafına sıkıca kıvırmak için pense kullanın.

Bileşenlere zarar vermemek için NodeMCU'yu açmadan önce bağlantıları iki kez kontrol edin.

4. Adım: Flaş ve Çalıştır

yanıp sönen

Tüm donanımlar bağlıyken, NodeMCU'nuzu takın ve aşağıdaki komutla flash yapın:

flash yapmak -C örnekleri/cpe439 ESPPORT=/dev/ttyUSB0

/dev/ttyUSB0, NodeMCU'nun altında görünmesi gereken seri com'dur. Bağlı başka seri cihazlarınız varsa, /dev/ttyUSB1 veya başka bir numara olarak görünebilir. Kontrol etmek için, bu komutu bir kez NodeMCU takılı değilken ve bir kez takılıyken olmak üzere iki kez çalıştırabilir ve farkı karşılaştırabilirsiniz:

ls /dev/ttyUSB*

Karşılaşabileceğiniz bir diğer sorun da cihaza erişim izninizin olmamasıdır. Bunu düzeltmenin iki yolu:

  1. Kullanıcınızı arama grubuna ekleyin:

    sudo adduser $(whoami) araması

  2. cihazı chmod veya chown:

sudo chmod 666 /dev/ttyUSB0 sudo chown $(whoami):$(whoami) /dev/ttyUSB0İlk yöntem kalıcı bir çözüm olduğu için tercih edilir.

Koşma

Flash komutunu başarıyla çalıştırdıktan sonra, cihaz hemen açılır ve derlenmiş kodu çalıştırmaya başlar. Yanıp söndükten sonra herhangi bir noktada seri çıkışı izlemek için aşağıdaki komutu çalıştırabilirsiniz:

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

Zaman kazanmak için bunu ~/.bashrc dosyanıza ekleyebilirsiniz:

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

..bu komut için takma ad olarak "nodemcu" yazmanıza izin verir.

Her şey doğru bir şekilde yapılandırılmışsa, LED şeridiniz yeşil renkte yanmalı ve seri olarak WiFi bağlantısını görmeli, bir IP adresi almalı, MQTT'ye bağlanmalı ve sıcaklık verilerinin dışarı itildiğini bildirmelidir.

MyWiFiSSID ile bağlantılı, kanal 1dhcp istemci başlangıcı…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 = 5xQueueRecetFie_tk başladı okwifi_task: status = 5xQueueRecetFied43tk: 192.168.2.23, mask:255.255.255.0.: (Yeniden)MQTT sunucusuna bağlanılıyor test.mosquitto.org …xQueueReceive +25.50xQueueGönder tamam tamamlandı MQTT bağlantısı gönder… MQTTv311donexQueueReceive +25.56 xQueueGönder tamam

Adım 5: Etkileşim

Cihazınızın WiFi'ye ve MQTT aracısına başarılı bir şekilde bağlandığını varsayarsak, MQTT ile NodeMCU'dan veri gönderip alabilirsiniz. Henüz yapmadıysanız, mosquitto istemcileri paketini kurun:

sudo apt-get install sivrisinek istemcileri

Artık kabuğunuzdan mosquitto_pub ve mosquitto_sub programlarını kullanabilmelisiniz.

Sıcaklık güncellemelerini alma

Sıcaklık verilerini almak için NodeMCU'nun yayınladığı konuya abone olmak için mosquitto_sub komutunu kullanmak isteyeceğiz.

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

Terminale gelen sıcaklık verilerini (Santigrat cinsinden) görmelisiniz.

+25.87+25.93+25.68…

LED şerit rengini uzaktan ayarlama

RGB değerlerini MQTT üzerinden NodeMCU'ya göndermek için basit bir mesaj formatı kullanılır. Komut biçimi şöyle görünür:

r:RRRg:GGGb:BBB~

Burada RRR, GGG, BBB, göndermek istediğiniz rengin RGB değerlerine (0-255) karşılık gelir. Komutumuzu göndermek için mosquitto_pub komutunu kullanacağız. İşte bazı örnekler:

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

Yaratıcı olmak istiyorsanız, bunun gibi çevrimiçi bir renk seçici bulun ve komutu, seçtiğiniz RGB değeriyle düzenleyin.

Dikkat et

Bu projedeki konular, genel bir MQTT aracısında /cpe439/rgb ve /cpe439/temp olarak ayarlanmıştır; bu, başka birinin sizinle aynı konuları yayınlamasını veya bunlara abone olmasını engelleyen hiçbir şey olmadığı anlamına gelir. Bir şeyleri denemek için bir genel aracı kullanmak iyidir, ancak daha ciddi projeler için parola korumalı bir aracıya bağlanmak veya sunucuda kendi aracınızı çalıştırmak isteyeceksiniz.

6. Adım: Uygulama Ayrıntıları

tek telli

ESP8266'nın yalnızca 1 çekirdeği vardır, o kadar uzun ki, sıcaklık sensörünün sıcaklık ölçümü yapması için 750 ms beklemek gibi görevlerin engellenmesi normalde WiFi'nin iyi çalışmamasına ve hatta çökmesine neden olabilir. FreeRTOS paradigmasında, bu uzun beklemeleri işlemek için vTaskDelay()'i çağırırsınız, ancak okuma ve yazma işlemleri arasında FreeRTOS sistem kenesinden daha kısa olan ve dolayısıyla vTaskDelay() ile önlenemeyen çok sayıda daha kısa bekleme süresi de vardır. Bunları da aşmak için, bu projedeki tek kablolu sürücü, ESP8266'nın donanım zamanlayıcısı tarafından çalıştırılan ve her 10 mikro saniyede bir kadar düşük olayları tetikleyebilen bir durum makinesinden çalışacak şekilde yazılmıştır. tek kablolu okuma/yazma işlemleri arasında gerekli süre. Diğer uygulamaların çoğu, bunu halletmek için delay_us() veya benzeri bir engelleme çağrısı kullanır, ancak sürekli olarak sıcaklık güncellemeleri alıyorsanız, tüm bu gecikmeler toplanmaya başlar ve daha az yanıt veren bir uygulama ile sonuçlanır. Kodun bu bölümünün kaynağı extras/onewire klasöründe bulunur.

WS2812B

ESP8266, 800KHz'de LED şeritleri sürmek için yeterince hızlı PWM için herhangi bir standart donanım seçeneğine sahip değildir. Bunu aşmak için, bu proje LED'leri sürmek için SPI MOSI pinini kullanır. SPI'nin saat hızını ayarlayarak ve SPI yükünü değiştirerek, her bir LED'in oldukça güvenilir kontrolünü sağlayabilirsiniz. Bu yöntemin hatasız değildir - biri için LED'lere 5V'luk bir kaynakla güç verilmeli ve SPI pininin çıkışına bir seviye kaydırıcı eklenmelidir. Ancak 3.3V çalışıyor. İkincisi, SPI yöntemini kullanırken kusurlu zamanlama nedeniyle oluşan aksaklıklar var. Üçüncüsü, artık SPI'yi başka hiçbir şey için kullanamazsınız. Bu yöntemle ilgili ek arka plan burada bulunabilir ve kodun bu bölümünün kaynağı extras/ws2812 klasöründe bulunur.

LED şeritleri sürmek için daha güvenilir bir yöntem i2s kullanmaktır. Ancak bu yöntemin çipe özgü birçok hack'i vardır, bu nedenle SPI bir öğrenme alıştırması olarak daha iyi bir seçim gibi görünüyordu.

Önerilen: