สารบัญ:

WiFi LED Strip + เซ็นเซอร์อุณหภูมิพร้อม ESP8266: 6 ขั้นตอน
WiFi LED Strip + เซ็นเซอร์อุณหภูมิพร้อม ESP8266: 6 ขั้นตอน

วีดีโอ: WiFi LED Strip + เซ็นเซอร์อุณหภูมิพร้อม ESP8266: 6 ขั้นตอน

วีดีโอ: WiFi LED Strip + เซ็นเซอร์อุณหภูมิพร้อม ESP8266: 6 ขั้นตอน
วีดีโอ: Arduino ESP8266 BLYNK IOT - ทดลอง Sensor DHT22/DHT11 วัดอุณหภูมิ และ ความชื้นในอากาศ 2024, กรกฎาคม
Anonim
WiFi LED Strip + เซ็นเซอร์อุณหภูมิพร้อม ESP8266
WiFi LED Strip + เซ็นเซอร์อุณหภูมิพร้อม ESP8266

บทช่วยสอนนี้อธิบายขั้นตอนในการตั้งค่า ESP8266 และสื่อสารกับทั้งเซ็นเซอร์อุณหภูมิและแถบ LED ในขณะที่ยังสามารถรับอินพุตและส่งออกด้วย MQTT ผ่าน WiFi โครงการนี้จัดทำขึ้นสำหรับหลักสูตรที่ Cal Poly San Luis Obispo ในฤดูใบไม้ร่วง 2016- CPE 439: Real Time Embedded Systems เป้าหมายโดยรวมคือการแสดงให้เห็นถึงความง่ายในการสร้าง "สิ่ง" ที่เชื่อมต่ออินเทอร์เน็ตด้วยฮาร์ดแวร์ราคาถูก

วัสดุ/อุปกรณ์ที่จำเป็น:

  • บอร์ดพัฒนา NodeMCU ESP8266
  • WS2812B แถบ LED
  • MAX31820 เซ็นเซอร์อุณหภูมิ
  • เขียงหั่นขนม
  • ตัวต้านทาน 4.7K โอห์ม
  • ตัวต้านทาน 220 โอห์ม
  • สายจัมเปอร์
  • สายไมโครยูเอสบี
  • PC (หรือ VM) ที่ใช้ linux (เช่น Ubuntu)

สมมติฐาน/ข้อกำหนดเบื้องต้น:

  • มีประสบการณ์ในการใช้เครื่องมือบรรทัดคำสั่งและการติดตั้งแพ็คเกจบน distro แบบเดเบียน
  • ความเข้าใจพื้นฐานของไวยากรณ์ Makefile
  • สายต่อ

ขั้นตอนที่ 1: การสร้างสภาพแวดล้อมการสร้าง

ในการสร้างโครงการ คุณจะต้องติดตั้ง esp-open-sdk บนเครื่องของคุณ ตามลิงค์และอ่านคำแนะนำในการสร้าง กล่าวโดยย่อ คุณจะต้องใช้คำสั่ง sudo apt-get เพื่อติดตั้งการพึ่งพา, git clone --recursive เพื่อโคลน/ดาวน์โหลด esp-open-sdk และสุดท้ายคือคำสั่ง make เพื่อสร้าง esp-open-sdk

ดูฉันนะ

ขั้นตอนที่ 2: รับซอร์สโค้ด กำหนดค่า และสร้าง

เมื่อสร้าง esp-open-sdk แล้ว ให้โคลนที่เก็บโปรเจ็กต์

โคลน git

เปลี่ยนเป็นไดเร็กทอรีโครงการ สร้างโฟลเดอร์.local และคัดลอกการตั้งค่าตัวอย่าง

cd esp-rtos-tests

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

ตอนนี้เปิด.local/settings.mk ด้วยโปรแกรมแก้ไขข้อความและเปลี่ยนการตั้งค่าต่อไปนี้:

  • OPENSDK_ROOT: เส้นทางที่แน่นอนสำหรับตำแหน่งของ esp-open-sdk ที่คุณสร้างขึ้นในขั้นตอนที่ 1
  • WIFI_SSID: SSID ของเครือข่าย WiFi ของคุณ
  • WIFI_PASS: รหัสผ่านของเครือข่าย WiFi ของคุณ
  • PIXEL_COUNT: จำนวนพิกเซลบนแถบ LED WS2812B ของคุณ

หมายเหตุ: เนื่องจากโปรเจ็กต์นี้ใช้ SPI เพื่อขับเคลื่อน LED และใช้ NodeMCU 3.3v เพื่อจัดหา คุณจึงอาจไม่สามารถขับ LED มากกว่า ~ 60 ดวงได้

หมายเหตุ: ไม่จำเป็นต้องเปลี่ยนการตั้งค่าอื่นๆ แต่สามารถเปลี่ยนแปลงได้หากต้องการ ขอแนะนำให้จัดลำดับความสำคัญของงาน ยิ่งหมายเลขลำดับความสำคัญต่ำ ลำดับความสำคัญของงานก็จะยิ่งต่ำลง

ตอนนี้สร้างโครงการ:

ทำตัวอย่าง -C/cpe439

หากทุกอย่างได้รับการตั้งค่าอย่างถูกต้อง ก็ควรเริ่มการคอมไพล์ ในตอนท้ายคุณควรเห็น:

สร้าง 'firmware/cpe439.bin' สำเร็จ

ดูฉันนะ

ขั้นตอนที่ 3: เชื่อมต่อส่วนประกอบฮาร์ดแวร์

เชื่อมต่อส่วนประกอบฮาร์ดแวร์
เชื่อมต่อส่วนประกอบฮาร์ดแวร์

เมื่อรวบรวมโค้ดแล้ว ก็ถึงเวลาเชื่อมต่ออุปกรณ์ต่อพ่วงของเรา

ขั้นแรก ติด NodeMCU ลงบนเขียงหั่นขนม จากนั้นใช้สายจัมเปอร์เพื่อทำการเชื่อมต่อตามที่แสดงในแผนภาพ

สิ่งที่ควรทราบ:

  1. สำคัญ: สายข้อมูล WS2812B ไม่ใช่แบบสองทิศทาง หากคุณดูเครื่องหมายที่ด้าน LED ของแถบอย่างใกล้ชิด คุณจะเห็นลูกศรเล็กๆ ชี้ไปทิศทางเดียว เอาต์พุตจาก D7 ของ NodeMCU จะต้องมุ่งหน้าไปยัง WS2812B ในลักษณะเดียวกับเครื่องหมายบอกทิศทาง ซึ่งคุณจะเห็นได้ในแผนภาพหากดูอย่างใกล้ชิด
  2. คุณอาจต้องทำการปรับเปลี่ยนบางอย่างเพื่อให้เชื่อมต่อเข้ากับเขียงหั่นขนมได้อย่างปลอดภัย ทั้งนี้ขึ้นอยู่กับประเภทของตัวเชื่อมต่อ WS2812B ของคุณ คุณยังสามารถใช้คลิปจระเข้เพื่อเชื่อมต่อกับสายจัมเปอร์แบบเขียงหั่นขนมได้
  3. หมุด MAX31820 มีระยะพิทช์ที่เล็กกว่าและบางกว่าจัมเปอร์มาตรฐาน 0.1"/2.54 มม. ทำให้เชื่อมต่อได้ยาก วิธีหนึ่งคือใช้สายจัมเปอร์ตัวเมียกับตัวผู้ ถอดกล่องพลาสติกจากด้านตัวเมีย จากนั้นใช้คีมหนีบปลายจัมเปอร์ตัวเมียให้แน่นรอบๆ หมุด MAX31820 ที่เล็กกว่า

ตรวจสอบการเชื่อมต่ออีกครั้งก่อนที่จะเปิด NodeMCU เพื่อไม่ให้ส่วนประกอบเสียหาย

ขั้นตอนที่ 4: แฟลชและเรียกใช้

แวบวับ

เมื่อเชื่อมต่อฮาร์ดแวร์ทั้งหมดแล้ว ให้เสียบ NodeMCU ของคุณและแฟลชด้วยคำสั่งต่อไปนี้:

ทำ flash -C Example/cpe439 ESPPORT=/dev/ttyUSB0

/dev/ttyUSB0 เป็นคอมซีเรียลที่ NodeMCU ควรแสดงภายใต้ หากคุณมีอุปกรณ์ซีเรียลอื่นเชื่อมต่ออยู่ อุปกรณ์นั้นอาจแสดงเป็น /dev/ttyUSB1 หรือหมายเลขอื่น ในการตรวจสอบ คุณสามารถเรียกใช้คำสั่งนี้ได้สองครั้ง โดยเมื่อไม่ได้เสียบปลั๊ก NodeMCU และอีกครั้งเมื่อเสียบปลั๊กแล้ว และเปรียบเทียบความแตกต่าง:

ls /dev/ttyUSB*

ปัญหาอื่นที่คุณอาจพบคือการไม่ได้รับอนุญาตให้เข้าถึงอุปกรณ์ สองวิธีในการแก้ไขปัญหานี้คือ:

  1. เพิ่มผู้ใช้ของคุณในกลุ่มสนทนา:

    sudo adduser $(whoami) dialout

  2. chmod หรือ chown อุปกรณ์:

sudo chmod 666 /dev/ttyUSB0 sudo chown $(whoami):$(whoami) /dev/ttyUSB0วิธีแรกเป็นที่ต้องการเนื่องจากเป็นวิธีการแก้ปัญหาแบบถาวร

วิ่ง

หลังจากรันคำสั่ง flash สำเร็จแล้ว อุปกรณ์จะบู๊ตทันทีและเริ่มรันโค้ดที่คอมไพล์แล้ว เมื่อใดก็ได้หลังจากกะพริบ คุณสามารถเรียกใช้คำสั่งต่อไปนี้เพื่อดูเอาต์พุตแบบอนุกรม:

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

เพื่อประหยัดเวลา คุณสามารถเพิ่มสิ่งนี้ลงในไฟล์ ~/.bashrc ของคุณ:

นามแฝง nodemcu='python3 -m serial.tools.miniterm --eol CRLF --exit-char 003 /dev/ttyUSB0 500000 --raw -q'

..ซึ่งให้คุณพิมพ์ "nodemcu" เป็นนามแฝงสำหรับคำสั่งนั้น

หากทุกอย่างได้รับการกำหนดค่าอย่างถูกต้อง แถบ LED ของคุณควรสว่างเป็นสีเขียว และบนซีเรียล คุณจะเห็นการเชื่อมต่อ WiFi รับที่อยู่ IP เชื่อมต่อกับ MQTT และข้อความแจ้งว่าข้อมูลอุณหภูมิกำลังถูกผลักออก

เชื่อมต่อกับ MyWiFiSSID ช่อง 1dhcp ไคลเอนต์เริ่ม…wifi_task: สถานะ = 1wifi_task: สถานะ = 1ip:192.168.2.23, หน้ากาก:255.255.255.0, gw:192.168.2.1ws2812_spi_init okRequest ชั่วคราว OKwifi_task: สถานะ = 5xQueueReview_Quettk_Sed: สิ้นสุดการเชื่อมต่อ:: (อีกครั้ง)กำลังเชื่อมต่อกับเซิร์ฟเวอร์ MQTT test.mosquitto.org …xQueueReceive +25.50xQueueส่ง เรียบร้อย ส่ง MQTT เชื่อมต่อ … MQTTv311donexQueueReceive +25.56 xQueueส่ง ตกลง

ขั้นตอนที่ 5: โต้ตอบ

สมมติว่าอุปกรณ์ของคุณเชื่อมต่อกับ WiFi และโบรกเกอร์ MQTT สำเร็จ คุณจะสามารถส่งและรับข้อมูลจาก NodeMCU ด้วย MQTT หากคุณยังไม่ได้ติดตั้ง ให้ติดตั้งแพ็คเกจไคลเอนต์ mosquitto:

sudo apt-get ติดตั้ง mosquitto-clients

ตอนนี้คุณควรจะสามารถใช้โปรแกรม mosquitto_pub และ mosquitto_sub จากเชลล์ของคุณได้

รับการอัพเดตอุณหภูมิ

ในการรับข้อมูลอุณหภูมิ เราต้องใช้คำสั่ง mosquitto_sub เพื่อสมัครรับข้อมูลหัวข้อที่ NodeMCU กำลังเผยแพร่

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

คุณควรเห็นข้อมูลอุณหภูมิ (เป็นเซลเซียส) ที่มาถึงเทอร์มินัล

+25.87+25.93+25.68…

การตั้งค่าสีแถบ LED จากระยะไกล

รูปแบบข้อความอย่างง่ายใช้เพื่อส่งค่า RGB ไปยัง NodeMCU ผ่าน MQTT รูปแบบคำสั่งมีลักษณะดังนี้:

r:RRRg:GGGb:BBB~

โดยที่ RRR, GGG, BBB สอดคล้องกับค่า RGB (0-255) ของสีที่คุณต้องการส่ง ในการส่งคำสั่ง เราจะใช้คำสั่ง mosquitto_pub นี่คือตัวอย่างบางส่วน:

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~' # สีน้ำเงิน

หากคุณต้องการสร้างสรรค์ ให้ค้นหาเครื่องมือเลือกสีออนไลน์แบบนี้ และแก้ไขคำสั่งด้วยค่า RGB ใดก็ได้ที่คุณเลือก

ระวัง

หัวข้อในโครงการนี้ถูกกำหนดเป็น /cpe439/rgb และ /cpe439/temp บนโบรกเกอร์ MQTT สาธารณะ ซึ่งหมายความว่าไม่มีสิ่งใดขัดขวางไม่ให้ผู้อื่นเผยแพร่หรือสมัครรับหัวข้อเดียวกันกับคุณ สำหรับการทดลองใช้งาน การใช้นายหน้าสาธารณะนั้นใช้ได้ แต่สำหรับโครงการที่จริงจังกว่านี้ คุณจะต้องการเชื่อมต่อกับนายหน้าที่มีการป้องกันด้วยรหัสผ่าน หรือเรียกใช้นายหน้าของคุณเองบนเซิร์ฟเวอร์

ขั้นตอนที่ 6: รายละเอียดการใช้งาน

Onewire

ESP8266 มีเพียง 1 คอร์ ซึ่งใช้เวลานานมาก การบล็อกงาน เช่น การรอให้เซ็นเซอร์อุณหภูมิทำการวัดอุณหภูมิ 750 มิลลิวินาที โดยปกติจะทำให้ WiFi ทำงานได้ไม่ดี และอาจถึงขั้นหยุดทำงาน ในกระบวนทัศน์ FreeRTOS คุณเรียก vTaskDelay() เพื่อจัดการกับการรอที่ยาวนานเหล่านี้ แต่ก็มีการรอที่สั้นกว่าที่จำเป็นอีกมากระหว่างการอ่านและการเขียนที่สั้นกว่าการทำเครื่องหมายของระบบ FreeRTOS ดังนั้นจึงไม่สามารถหลีกเลี่ยงได้ด้วย vTaskDelay() เพื่อหลีกเลี่ยงสิ่งเหล่านี้ ไดรเวอร์ onewire ในโครงการนี้ถูกเขียนขึ้นเพื่อให้ทำงานโดยเครื่องจักรของรัฐที่ขับเคลื่อนโดยตัวจับเวลาฮาร์ดแวร์ของ ESP8266 ซึ่งสามารถทริกเกอร์เหตุการณ์ได้ต่ำสุดทุกๆ 10 ไมโครวินาที ซึ่งเกิดขึ้นน้อยที่สุด เวลาที่ต้องการระหว่างการดำเนินการอ่าน/เขียน onewire การใช้งานอื่นๆ ส่วนใหญ่ใช้การบล็อกการโทรเพื่อ delay_us() หรือคล้ายกันเพื่อจัดการกับสิ่งนี้ แต่ถ้าคุณอัปเดตอุณหภูมิอย่างต่อเนื่อง ความล่าช้าทั้งหมดจะเริ่มเพิ่มขึ้น ส่งผลให้แอปพลิเคชันตอบสนองน้อยลง ซอร์สของโค้ดส่วนนี้อยู่ในโฟลเดอร์ extras/onewire

WS2812B

ESP8266 ไม่มีตัวเลือกฮาร์ดแวร์มาตรฐานสำหรับ PWM เร็วพอที่จะขับแถบ LED ที่ 800KHz เพื่อหลีกเลี่ยงปัญหานี้ โปรเจ็กต์นี้ใช้พิน SPI MOSI เพื่อขับเคลื่อน LED ด้วยการปรับอัตรานาฬิกาของ SPI และการเปลี่ยนแปลงน้ำหนักบรรทุก SPI คุณสามารถควบคุม LED แต่ละตัวได้อย่างน่าเชื่อถือ วิธีนี้ไม่ได้ไม่มีข้อบกพร่อง - สำหรับวิธีหนึ่ง LED ควรได้รับพลังงานจากแหล่งกำเนิด 5V และควรเพิ่มตัวปรับระดับไปยังเอาต์พุตของพิน SPI แต่ 3.3V ใช้งานได้ ประการที่สอง มีข้อบกพร่องที่เกิดขึ้นเนื่องจากการกำหนดเวลาที่ไม่สมบูรณ์โดยใช้วิธี SPI และประการที่สามคือตอนนี้คุณไม่สามารถใช้ SPI เพื่ออย่างอื่นได้ พื้นหลังเพิ่มเติมเกี่ยวกับวิธีการนี้สามารถพบได้ที่นี่ และแหล่งที่มาของรหัสส่วนนี้จะอยู่ในโฟลเดอร์ extras/ws2812

วิธีที่เชื่อถือได้มากขึ้นในการขับแถบ LED คือการใช้ i2s อย่างไรก็ตาม วิธีนี้มีการแฮ็กเฉพาะชิปจำนวนมาก ดังนั้น SPI จึงเป็นตัวเลือกที่ดีกว่าในการเรียนรู้