สารบัญ:
- ขั้นตอนที่ 1: การสร้างสภาพแวดล้อมการสร้าง
- ขั้นตอนที่ 2: รับซอร์สโค้ด กำหนดค่า และสร้าง
- ขั้นตอนที่ 3: เชื่อมต่อส่วนประกอบฮาร์ดแวร์
- ขั้นตอนที่ 4: แฟลชและเรียกใช้
- ขั้นตอนที่ 5: โต้ตอบ
- ขั้นตอนที่ 6: รายละเอียดการใช้งาน
วีดีโอ: WiFi LED Strip + เซ็นเซอร์อุณหภูมิพร้อม ESP8266: 6 ขั้นตอน
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:06
บทช่วยสอนนี้อธิบายขั้นตอนในการตั้งค่า 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 ลงบนเขียงหั่นขนม จากนั้นใช้สายจัมเปอร์เพื่อทำการเชื่อมต่อตามที่แสดงในแผนภาพ
สิ่งที่ควรทราบ:
- สำคัญ: สายข้อมูล WS2812B ไม่ใช่แบบสองทิศทาง หากคุณดูเครื่องหมายที่ด้าน LED ของแถบอย่างใกล้ชิด คุณจะเห็นลูกศรเล็กๆ ชี้ไปทิศทางเดียว เอาต์พุตจาก D7 ของ NodeMCU จะต้องมุ่งหน้าไปยัง WS2812B ในลักษณะเดียวกับเครื่องหมายบอกทิศทาง ซึ่งคุณจะเห็นได้ในแผนภาพหากดูอย่างใกล้ชิด
- คุณอาจต้องทำการปรับเปลี่ยนบางอย่างเพื่อให้เชื่อมต่อเข้ากับเขียงหั่นขนมได้อย่างปลอดภัย ทั้งนี้ขึ้นอยู่กับประเภทของตัวเชื่อมต่อ WS2812B ของคุณ คุณยังสามารถใช้คลิปจระเข้เพื่อเชื่อมต่อกับสายจัมเปอร์แบบเขียงหั่นขนมได้
- หมุด 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*
ปัญหาอื่นที่คุณอาจพบคือการไม่ได้รับอนุญาตให้เข้าถึงอุปกรณ์ สองวิธีในการแก้ไขปัญหานี้คือ:
-
เพิ่มผู้ใช้ของคุณในกลุ่มสนทนา:
sudo adduser $(whoami) dialout
- 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 จึงเป็นตัวเลือกที่ดีกว่าในการเรียนรู้