สารบัญ:

IoT ทำได้ง่าย: ESP-MicroPython-MQTT-ThingSpeak: 12 ขั้นตอน
IoT ทำได้ง่าย: ESP-MicroPython-MQTT-ThingSpeak: 12 ขั้นตอน

วีดีโอ: IoT ทำได้ง่าย: ESP-MicroPython-MQTT-ThingSpeak: 12 ขั้นตอน

วีดีโอ: IoT ทำได้ง่าย: ESP-MicroPython-MQTT-ThingSpeak: 12 ขั้นตอน
วีดีโอ: IoT 101 with MicroPython + Python Socket + GUI 2024, กรกฎาคม
Anonim
IoT ทำได้ง่าย: ESP-MicroPython-MQTT-ThingSpeak
IoT ทำได้ง่าย: ESP-MicroPython-MQTT-ThingSpeak

ในบทช่วยสอนก่อนหน้าของฉัน MicroPython บน ESP โดยใช้ Jupyter เราได้เรียนรู้วิธีติดตั้งและเรียกใช้ MicroPython บนอุปกรณ์ ESP การใช้ Jupyter Notebook เป็นสภาพแวดล้อมการพัฒนาของเรา เรายังได้เรียนรู้วิธีการอ่านจากเซ็นเซอร์ (อุณหภูมิ ความชื้น และความส่องสว่าง) เราใช้โปรโตคอลและวิธีการสื่อสารที่หลากหลาย อนาล็อก ดิจิตอล 1-Wire และ I2C ซึ่งเป็นอันสุดท้ายที่จะแสดงการบันทึกของเรา ข้อมูลบนจอแสดงผล OLED

ในบทช่วยสอนนี้โดยใช้โปรโตคอล MQTT เราจะได้รับข้อมูลที่บันทึกไว้ทั้งหมด ส่งไปยังบริการ IoT, ThingSpeak.com และไปยังแอปมือถือ (Thingsview) ซึ่งเราสามารถบันทึกและเล่นกับข้อมูลได้

ที่นี่ บล็อกไดอะแกรมของโครงการของเรา:

ภาพ
ภาพ

ขั้นตอนที่ 1: BoM - บิลวัสดุ

  1. NodeMCU - US$ 8.39
  2. DHT22 เซ็นเซอร์อุณหภูมิและความชื้นสัมพัทธ์ - USD 9.95
  3. DS18B20 เซ็นเซอร์อุณหภูมิกันน้ำ - USD 5.95
  4. จอแสดงผล OLED SSD1366- USD 8.99 (อุปกรณ์เสริม)
  5. LDR (1x)
  6. ไฟ LED (1x) (อุปกรณ์เสริม)
  7. ปุ่มกด (1x)
  8. ตัวต้านทาน 4K7 โอห์ม (2x)
  9. ตัวต้านทาน 10K โอห์ม (1x)
  10. ตัวต้านทาน 220 โอห์ม (1x)

ขั้นตอนที่ 2: Hw

The Hw
The Hw

Hw ที่เราจะใช้ที่นี่โดยพื้นฐานแล้วเหมือนกับที่ใช้ในบทช่วยสอน: Micropython บน ESP โดยใช้ Jupyter อ้างถึงมันสำหรับการเชื่อมต่อ HW ทั้งหมด

ข้อยกเว้นคือ Servo ที่เราจะไม่ใช้ในโครงการนี้

ด้านบนคุณสามารถดู HW แบบเต็มได้ เชื่อมต่ออุปกรณ์ตามที่แสดง

ขั้นตอนที่ 3: Micropython, REPL, Jupyter

Micropython, REPL, Jupyter
Micropython, REPL, Jupyter
Micropython, REPL, Jupyter
Micropython, REPL, Jupyter

คุณต้องมีล่าม Micropython โหลดบนอุปกรณ์ ESP ของคุณ เมื่อโหลดแล้ว คุณควรตั้งโปรแกรม ESP โดยใช้วิธีการ/IDE ที่มีอยู่ เช่น:

  • ตัวแทน
  • Jupyter Notebook
  • หมู่
  • ESPCut (เฉพาะ Windows)
  • … ฯลฯ

ในบทช่วยสอนของฉัน Micropython บน ESP โดยใช้ Jupyter ฉันให้รายละเอียดวิธีดาวน์โหลดและติดตั้งล่าม MicroPython, ESPTool เพื่อจัดการอุปกรณ์ ESP และวิธีใช้ Jupyter Notebook เป็นสภาพแวดล้อมการพัฒนา รู้สึกอิสระที่จะใช้สิ่งที่สะดวกสำหรับคุณ

ฉันมักจะทำการพัฒนาทั้งหมดบน Jupyter Notebook และเมื่อได้โค้ดสุดท้ายแล้ว ฉันจะคัดลอกไปยัง Geany และโหลดลงใน ESP โดยใช้ Ampy

ขั้นตอนที่ 4: เซ็นเซอร์

เซนเซอร์
เซนเซอร์

มาติดตั้งไลบรารี่, กำหนด GPIO, สร้างอ็อบเจ็กต์, ฟังก์ชันสำหรับเซ็นเซอร์ทั้งหมดทีละตัว:

ก. DHT (อุณหภูมิและความชื้น)

มาติดตั้งไลบรารี DHT และสร้างวัตถุ:

จากการนำเข้า dht DHT22

จากการนำเข้าเครื่อง พิน dht22 = DHT22(พิน(12))

ตอนนี้ สร้างฟังก์ชันเพื่ออ่านเซ็นเซอร์ DHT:

def readDht():

dht22.measure() ส่งคืน dht22.temperature(), dht22.humidity() ทดสอบฟังก์ชัน DHT

พิมพ์ (readDht())

ผลลัพธ์ควรเป็นเช่น:

(17.7, 43.4)

ข. DS18B20 (อุณหภูมิภายนอก)

มาติดตั้งไลบรารี่และสร้างวัตถุกันเถอะ:

นำเข้า onewire, ds18x20

เวลานำเข้า # กำหนดขาที่จะเชื่อมต่ออุปกรณ์ 1 สาย ==> พิน 2 (D4) dat = Pin(2) # สร้างวัตถุ onewire ds = ds18x20. DS18X20(onewire. OneWire(dat)) สแกนหาอุปกรณ์บน bu

เซ็นเซอร์ = ds.scan()

พิมพ์ ('อุปกรณ์ที่พบ:' เซ็นเซอร์)

ผลลัพธ์ที่พิมพ์ออกมานั้นไม่สำคัญนัก สิ่งที่เราต้องการคือเซ็นเซอร์ตัวแรกที่ตรวจพบ: เซ็นเซอร์[0] และตอนนี้ เราสามารถสร้างฟังก์ชันเพื่ออ่านข้อมูลเซ็นเซอร์ได้:

def readDs():

ds.convert_temp() time.sleep_ms(750) ส่งคืน ds.read_temp(เซ็นเซอร์[0])

การทดสอบเซ็นเซอร์โดยใช้ฟังก์ชันที่สร้างขึ้นเป็นสิ่งสำคัญเสมอ

พิมพ์(readDs()) หากคุณได้รับค่าอุณหภูมิ รหัสของคุณถูกต้อง

17.5

C. LDR (ความส่องสว่าง)

LDR จะใช้พินอะนาล็อกของ ESP ของเรา (มีเพียงอันเดียวในกรณีของ ESP8266 และอีกหลายอันสำหรับ ESP32)

อ้างถึงบทช่วยสอน ESP32 ของฉันสำหรับรายละเอียด

เช่นเดียวกับที่ทำก่อนหน้านี้:

#นำเข้าห้องสมุด

จากการนำเข้าเครื่อง ADC # กำหนดวัตถุ adc = ADC(0) ฟังก์ชันอย่างง่าย: adc.read() สามารถใช้อ่านค่า ADC ได้ แต่อย่าลืมว่า ADC ภายในจะแปลงแรงดันไฟฟ้าระหว่าง 0 ถึง 3.3V เป็นค่าดิจิตอลที่เกี่ยวข้องกัน ซึ่งมีค่าตั้งแต่ 0 ถึง 1,023 เมื่อเราสนใจ "ความส่องสว่าง" เราจะถือว่าแสงสูงสุดเป็นค่าสูงสุดที่จับได้จากเซ็นเซอร์ (ใน my กรณี 900) และแสงขั้นต่ำที่ในกรณีของฉันคือ 40 มีค่าเหล่านั้นเราสามารถ "แมป" ค่าจาก 40 ถึง 900 ใน 0 ถึง 100% ของความส่องสว่าง เพื่อการนั้น เราจะสร้างฟังก์ชันใหม่

def readLdr():

lumPerct = (adc.read()-40)*(10/86) # แปลงเป็นเปอร์เซ็นต์ ("map") ส่งคืนรอบ (lumPerct)

คุณควรทดสอบฟังก์ชันโดยใช้ print (readLDR()) ผลลัพธ์ควรเป็นจำนวนเต็มระหว่าง o ถึง 100

ง. ปุ่มกด (อินพุตดิจิตอล)

ในที่นี้ เราใช้ปุ่มกดเป็นเซ็นเซอร์ดิจิทัล แต่อาจเป็น "เสียงสะท้อน" ของแอคทูเอเตอร์ (เช่น ปั๊มที่เปิด/ปิด เป็นต้น)

# กำหนดพิน 13 เป็นอินพุตและเปิดใช้งานตัวต้านทานแบบดึงขึ้นภายใน:

ปุ่ม = พิน (13, Pin. IN, Pin. PULL_UP) # ฟังก์ชั่นการอ่านสถานะปุ่ม: def readBut(): return button.value()

คุณสามารถทดสอบปุ่มอ่านฟังก์ชัน print(readBut()) โดยไม่ต้องกดผลลัพธ์ควรเป็น "1" กดปุ่ม ผลลัพธ์ควรเป็น "0"

ขั้นตอนที่ 5: จับและแสดงข้อมูลเซ็นเซอร์ทั้งหมดภายในเครื่อง

การจับและแสดงข้อมูลเซ็นเซอร์ทั้งหมดภายในเครื่อง
การจับและแสดงข้อมูลเซ็นเซอร์ทั้งหมดภายในเครื่อง

ตอนนี้เราได้สร้างฟังก์ชันหนึ่งฟังก์ชันสำหรับเซ็นเซอร์แต่ละตัวแล้ว มาสร้างฟังก์ชันสุดท้ายที่จะอ่านฟังก์ชันทั้งหมดพร้อมกัน:

def colectData():

temp, hum, = readDht() extTemp = readDs() lum = readLdr() butSts = readBut() คืนค่า temp, hum, extTemp, lum, butSts ตอนนี้ถ้าคุณใช้

พิมพ์(colectData())

จะส่งผลให้เกิด tuple ที่รวมข้อมูลที่จับทั้งหมดจากเซ็นเซอร์:

(17.4, 45.2, 17.3125, 103, 1)

นอกจากนี้เรายังสามารถเลือกแสดงข้อมูลเหล่านั้นบนจอแสดงผลในเครื่องได้:

# นำเข้าไลบรารีและสร้างวัตถุ i2c

จากการนำเข้าเครื่อง I2C i2c = I2C(scl=Pin(5), sda=Pin(4)) # นำเข้าไลบรารีและสร้างวัตถุ oled นำเข้า ssd1306 i2c = I2C(scl=Pin(5), sda=Pin(4)) oled = ssd1306. SSD1306_I2C(128, 64, i2c, 0x3c) # สร้างฟังก์ชัน: def displayData(temp, hum, extTemp, lum, butSts): oled.fill(0) oled.text("Temp:" + str(temp) + "oC", 0, 4) oled.text("Hum: " + str(hum) + "%", 0, 16) oled.text("ExtTemp: " + str(extTemp) + "oC", 0, 29) oled.text("Lumin: " + str(lum) + "%", 0, 43) oled.text("Button: " + str(butSts), 0, 57) oled.show() # แสดงข้อมูลโดยใช้ฟังก์ชัน displayData(temp, hum, extTemp, lum, butSts)

เป็นตัวเลือก ฉันจะรวม LED ไว้ด้วยเมื่อเราเริ่มอ่านเซ็นเซอร์ โดยจะปิดหลังจากที่ข้อมูลนั้นแสดงขึ้น การทำเช่นนี้จะช่วยยืนยันว่าโปรแกรมทำงานเมื่อเราตัดการเชื่อมต่อ ESP จากพีซีและทำงานโดยอัตโนมัติ

ดังนั้น หน้าที่หลักจะเป็น:

# ฟังก์ชั่นหลักในการอ่านเซ็นเซอร์ทั้งหมด

def main(): # แสดงข้อมูลด้วยฟังก์ชัน led.on() temp, hum, extTemp, lum, butSts = colectData() displayData(temp, hum, extTemp, lum, butSts) led.off()

ดังนั้นการรัน main() เราจะได้ข้อมูลเซ็นเซอร์ที่แสดงบน OLED ตามที่แสดงในภาพ

ขั้นตอนที่ 6: เรียกใช้ Local Station Code บน ESP Start-up

การรันรหัส Local Station บน ESP Start-up
การรันรหัส Local Station บน ESP Start-up

เราสามารถมีทุกสิ่งที่พัฒนามาจนถึงตอนนี้ในไฟล์เดียวที่ ESP ของเราดำเนินการได้

เปิดโปรแกรมแก้ไขข้อความแล้ววางโค้ดทั้งหมด:

#นำเข้าห้องสมุดทั่วไป

จากการนำเข้าเครื่อง เวลานำเข้าพิน # กำหนดพิน 0 เป็นเอาต์พุตนำ = Pin(0, Pin. OUT) # DHT จากการนำเข้า dht DHT22 dht22 = DHT22 (พิน (12)) # ฟังก์ชั่นการอ่าน DHT def readDht (): dht22.measure () return dht22.temperature(), dht22.humidity() # DS18B20 import onewire, ds18x20 # Define which pin the 1-wire device will be connected ==> pin 2 (D4) dat = Pin(2) # Create the onewire วัตถุ ds = ds18x20. DS18X20(onewire. OneWire(dat)) # สแกนหาอุปกรณ์บนเซ็นเซอร์บัส = ds.scan() # ฟังก์ชั่นอ่าน DS18B20 def readDs(): ds.convert_temp() time.sleep_ms(750) return round(ds.read_temp(sensors[0]), 1) # LDR from machine import ADC # Define object adc = ADC(0) #function to read luminosity def readLdr(): lumPerct = (adc.read()-40) * (10/86) # แปลงเป็นเปอร์เซ็นต์ ("แผนที่") ส่งคืนรอบ (lumPerct) # กำหนดพิน 13 เป็นอินพุตและเปิดใช้งานตัวต้านทานแบบดึงขึ้นภายใน: ปุ่ม = Pin (13, Pin. IN, Pin. PULL_UP) # ฟังก์ชั่นอ่านสถานะปุ่ม: def readBut(): return button.value() # ฟังก์ชั่นอ่านข้อมูลทั้งหมด: def cole ctData(): temp, hum, = readDht() extTemp = readDs() lum = readLdr() butSts = readBut() return temp, hum, extTemp, lum, butSts # นำเข้าไลบรารีและสร้างวัตถุ i2c จากการนำเข้าเครื่อง I2C i2c = I2C(scl=Pin(5), sda=Pin(4)) # นำเข้าไลบรารีและสร้างวัตถุ oled นำเข้า ssd1306 i2c = I2C(scl=Pin(5), sda=Pin(4)) oled = ssd1306. SSD1306_I2C(128, 64, i2c, 0x3c) # สร้างฟังก์ชัน: def displayData(temp, hum, extTemp, lum, butSts): oled.fill(0) oled.text("Temp: " + str(temp) + "oC", 0, 4) oled.text("Hum: " + str(hum) + "%", 0, 16) oled.text("ExtTemp: " + str(extTemp) + "oC", 0, 29) oled text("Lumin: " + str(lum) + "%", 0, 43) oled.text("Button: " + str(butSts), 0, 57) oled.show() # ฟังก์ชั่นหลักในการอ่านเซ็นเซอร์ทั้งหมด def main(): # แสดงข้อมูลด้วยฟังก์ชัน led.on() temp, hum, extTemp, lum, butSts = colectData() displayData(temp, hum, extTemp, lum, butSts) led.off() '''- ----- เรียกใช้ฟังก์ชันหลัก --------''' main()

บันทึก เช่น localData.py

ในการรันโค้ดนี้โดยตรงบนเทอร์มินัลของคุณ คุณจะต้องใช้ Ampy

ก่อนอื่นบน Terminal ให้แจ้ง Ampy พอร์ต Serial ของเรา:

ส่งออก AMPY_PORT=/dev/tty. SLAB_USBtoUART

ตอนนี้ เราสามารถเห็นไฟล์ที่อยู่ในไดเร็กทอรีราก ESP ของเรา:

ampy ls

ในการตอบกลับ เราจะได้ boot.py ซึ่งเป็นไฟล์แรกที่จะทำงานในระบบ

ตอนนี้ ลองใช้ Ampy เพื่อโหลด python Script LocalData.py ของเราเป็น /main.py ดังนั้นสคริปต์จะทำงานหลังจากบูต:

ampy ใส่ localData.py /main/py

หากเราใช้คำสั่ง amp ls ตอนนี้ คุณจะเห็น 2 ไฟล์ใน ESP.: boot.py และ main.py

การรีเซ็ต ESP จะทำให้โปรแกรม localData.py ทำงานโดยอัตโนมัติ โดยแสดงข้อมูลเซ็นเซอร์บนจอแสดงผล

หน้าจอการพิมพ์ Terminal ด้านบนแสดงสิ่งที่เราได้ทำไปแล้ว

ด้วยโค้ดข้างต้น การแสดงผลจะแสดงเพียงครั้งเดียว แต่เราสามารถกำหนดวนซ้ำบนฟังก์ชัน main() ซึ่งจะแสดงข้อมูลในทุกช่วงเวลาที่กำหนด (PUB_TIME_SEC) และตัวอย่างเช่น จนกว่าเราจะกดปุ่ม:

# วนลูปรับข้อมูลจนกว่าจะกดปุ่ม

ในขณะที่ button.value(): led.on() temp, hum, extTemp, lum, butSts = colectData() displayData(temp, hum, extTemp, lum, butSts) led.off() time.sleep(PUB_TIME_SEC)

ต้องประกาศตัวแปร PUB_TIME_SEC ตามเวลาที่คุณต้องการให้ตัวอย่างของคุณ

เพื่อปรับปรุงโค้ดของเราให้มากขึ้น เป็นการดีที่จะแจ้งให้ทราบว่าเราจะออกจากลูป เพื่อที่เราจะกำหนดฟังก์ชันทั่วไปใหม่ 2 ฟังก์ชัน ฟังก์ชันหนึ่งสำหรับล้างการแสดงผล และอีกฟังก์ชันหนึ่งเพื่อกะพริบไฟ LED ในจำนวนครั้งที่กำหนด

# ล้างจอแสดงผล:

def displayClear(): oled.fill(0) oled.show() # create a Blink function def blinkLed(num): สำหรับฉันในช่วง(0, num): led.on() sleep(0.5) led.off() นอนหลับ(0.5)

ตอนนี้เราสามารถเขียนฟังก์ชัน main() ของเราใหม่ได้:

ในขณะที่ button.value():

led.on() temp, hum, extTemp, lum, butSts = colectData() displayData(temp, hum, extTemp, lum, butSts) led.off() time.sleep(PUB_TIME_SEC) blinkLed(3) displayClear()

สามารถดาวน์โหลดรหัสสุดท้ายได้จาก GitHub ของฉัน: localData.py และ Jupyter Notebook ที่ใช้สำหรับการพัฒนาโค้ดแบบเต็ม: Jupyter Local Data Development

ขั้นตอนที่ 7: เชื่อมต่อ ESP กับ Local WiFi

การเชื่อมต่อ ESP กับ Local WiFi
การเชื่อมต่อ ESP กับ Local WiFi

โมดูลเครือข่ายใช้เพื่อกำหนดค่าการเชื่อมต่อ WiFi มีอินเทอร์เฟซ WiFi สองแบบ แบบหนึ่งสำหรับสถานี (เมื่อ ESP8266 เชื่อมต่อกับเราเตอร์) และอีกช่องหนึ่งสำหรับจุดเชื่อมต่อ (สำหรับอุปกรณ์อื่นๆ เพื่อเชื่อมต่อกับ ESP8266) ที่นี่ ESP ของเราจะเชื่อมต่อกับเครือข่ายท้องถิ่น มาเรียกไลบรารี่และกำหนดข้อมูลรับรองเครือข่ายของเรา:

นำเข้าเครือข่าย

WiFi_SSID = "SSID ของคุณ" WiFi_PASS = "รหัสผ่านของคุณ"

สามารถใช้ฟังก์ชันด้านล่างเพื่อเชื่อมต่อ ESP กับเครือข่ายท้องถิ่นของคุณ:

def do_connect():

wlan = network. WLAN(network. STA_IF) wlan.active(True) if not wlan.isconnected(): print('connecting to network…') wlan.connect(WiFi_SSID, WiFi_SSID) while not wlan.isconnected(): ผ่าน พิมพ์ ('การกำหนดค่าเครือข่าย:', wlan.ifconfig ())

เมื่อใช้งานฟังก์ชันนี้ คุณจะได้รับที่อยู่ IP ดังต่อไปนี้:

do_connect()

ผลลัพธ์จะเป็น:

การกำหนดค่าเครือข่าย: ('10.0.1.2', '255.255.255.0', '10.0.1.1', '10.0.1.1')

ในกรณีของฉันคือ 10.0.1.2 คือที่อยู่ IP ของ ESP

ขั้นตอนที่ 8: The ThingSpeak

The ThingSpeak
The ThingSpeak

ณ จุดนี้ เราได้เรียนรู้วิธีบันทึกข้อมูลจากเซ็นเซอร์ทั้งหมด โดยแสดงบน OLED ของเรา ถึงเวลาดูวิธีส่งข้อมูลเหล่านั้นไปยังแพลตฟอร์ม IoT อย่าง ThingSpeak

เอาล่ะ!

ขั้นแรก คุณต้องมีบัญชีที่ ThinkSpeak.com จากนั้น ทำตามคำแนะนำเพื่อสร้างช่องและจดบันทึกรหัสช่องและเขียนคีย์ API

ด้านบนคุณจะเห็นช่อง 5 ช่องที่จะใช้ในช่องของเรา

ขั้นตอนที่ 9: โปรโตคอล MQTT และการเชื่อมต่อ ThingSpeak

โปรโตคอล MQTT และการเชื่อมต่อ ThingSpeak
โปรโตคอล MQTT และการเชื่อมต่อ ThingSpeak

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

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

ThingSpeak™ มีโบรกเกอร์ MQTT อยู่ที่ URL mqtt.thingspeak.com และพอร์ต 1883 โบรกเกอร์ ThingSpeak รองรับทั้งการเผยแพร่ MQTT และการสมัครรับข้อมูล MQTT

ในกรณีของเรา เราจะใช้: MQTT Publish

ภาพ
ภาพ

รูปอธิบายโครงสร้างหัวข้อ ต้องใช้คีย์ API เขียนเพื่อเผยแพร่ โบรกเกอร์รับทราบคำขอ CONNECT ที่ถูกต้องด้วย CONNACK

โปรโตคอล MQTT ได้รับการสนับสนุนในไลบรารีในตัวในไบนารี Micropython - โปรโตคอลนี้สามารถใช้ส่งข้อมูลจาก ESP8266 ของคุณผ่าน WIFI ไปยังฐานข้อมูลบนคลาวด์ฟรี

ลองใช้ไลบรารี umqtt.simple:

จาก umqtt.simple นำเข้า MQTTClient

และเมื่อทราบ SERVER ID ของเราแล้ว คุณสามารถสร้างวัตถุไคลเอนต์ MQTT ของเราได้:

เซิร์ฟเวอร์ = "mqtt.thingspeak.com"

ลูกค้า = MQTTClient("umqtt_client", SERVER)

ตอนนี้ มีข้อมูลประจำตัว ThingSpeak อยู่ในมือแล้ว:

CHANNEL_ID = "รหัสช่องของคุณ"

WRITE_API_KEY = "กุญแจของคุณที่นี่"

มาสร้าง MQTT "หัวข้อ" ของเรากันเถอะ:

หัวข้อ = "ช่อง/" + CHANNEL_ID + "/เผยแพร่/" + WRITE_API_KEY

มาส่งข้อมูลของเราไปที่ ThingSpeak IoT Service โดยใช้ฟังก์ชันที่สร้างขึ้นและเชื่อมโยงการตอบสนองต่อตัวแปรข้อมูลเฉพาะ:

อุณหภูมิ, ฮัม, extTemp, lum, butSts = colectData()

เมื่ออัปเดตตัวแปรเหล่านั้น เราสามารถสร้าง "MQTT Payload" ของเราได้:

เพย์โหลด = "field1="+str(temp)+"&field2="+str(hum)+"&field3="+str(extTemp)+"&field4="+str(lum)+"&field5="+str(butSts))

และนั่นแหล่ะ! เราพร้อมที่จะส่งข้อมูลไปยัง ThinsSpeak เพียงแค่ใช้โค้ด 3 บรรทัดด้านล่าง:

client.connect()

client.publish(หัวข้อ, เพย์โหลด) client.disconnect()

ตอนนี้ หากคุณไปที่หน้าช่องของคุณ (ตามที่ของฉันด้านบน) คุณจะเห็นว่าแต่ละฟิลด์จาก 5 ช่องจะมีข้อมูลที่เกี่ยวข้องกับเซ็นเซอร์ของคุณ

ขั้นตอนที่ 10: ตัวบันทึกข้อมูลเซ็นเซอร์

เครื่องบันทึกข้อมูลเซ็นเซอร์
เครื่องบันทึกข้อมูลเซ็นเซอร์

ตอนนี้ เมื่อเรารู้ว่ามีโค้ดเพียงไม่กี่บรรทัดที่อัปโหลดข้อมูลไปยังบริการ IoT ได้แล้ว เรามาสร้างฟังก์ชันวนรอบเพื่อดำเนินการโดยอัตโนมัติตามช่วงเวลาปกติ (คล้ายกับที่เราเคยทำกับ "ข้อมูลในเครื่อง") ")

การใช้ตัวแปรเดียวกัน (PUB_TIME_SEC) ที่ประกาศไว้ก่อนหน้านี้ ฟังก์ชันหลักง่ายๆ ในการบันทึกข้อมูลอย่างต่อเนื่อง การบันทึกลงในช่องของเราจะเป็นดังนี้:

ในขณะที่จริง:

temp, hum, extTemp, lum, butSts = colectData() payload = "field1="+str(temp)+"&field2="+str(hum)+"&field3="+str(extTemp)+"&field4="+ str(lum)+"&field5="+str(butSts) client.connect() client.publish(topic, payload) client.disconnect() time.sleep(PUB_TIME_SEC)

โปรดทราบว่าจะต้องอัปเดตเฉพาะ "ส่วนข้อมูล" เมื่อ "หัวข้อ" เกี่ยวข้องกับข้อมูลรับรองช่องของเราและจะไม่เปลี่ยนแปลง

เมื่อมองหาหน้าช่อง ThingSpeak คุณจะสังเกตเห็นว่าข้อมูลจะถูกโหลดอย่างต่อเนื่องในแต่ละฟิลด์ คุณสามารถปิด LDR วางมือบนเซ็นเซอร์อุณหภูมิ/ความชื้น กดปุ่ม ฯลฯ และดูว่าช่องจะ "บันทึก" ข้อมูลเหล่านั้นโดยอัตโนมัติเพื่อการวิเคราะห์ในอนาคตได้อย่างไร

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

แต่เมื่อเกิดแนวคิดขึ้นแล้ว ให้รวมจอแสดงผลและ LED ไว้ด้วยเหมือนที่เคยทำมา ในการทำเช่นนั้น ฟังก์ชัน "คนตัดไม้" ของเราจะเป็น:

ในขณะที่ button.value():

led.on() temp, hum, extTemp, lum, butSts = colectData() displayData(temp, hum, extTemp, lum, butSts) led.off() temp, hum, extTemp, lum, butSts = colectData() payload = ไคลเอนต์ "field1="+str(temp)+"&field2="+str(hum)+"&field3="+str(extTemp)+"&field4="+str(lum)+"&field5="+str(butSts).connect() client.publish(หัวข้อ, payload) client.disconnect() time.sleep(PUB_TIME_SEC) blinkLed(3) displayClear()

สามารถดูสคริปต์ microPython ฉบับสมบูรณ์ได้ที่นี่: dataLoggerTS_EXT.py และสมุดบันทึก Jupyter ที่ใช้สำหรับการพัฒนาสามารถพบได้ที่นี่: IoT ThingSpeak Data Logger EXT.ipynb

ในการอัปโหลดสคริปต์บน ESP บนเทอร์มินัลของคุณให้ใช้คำสั่ง:

ampy ใส่ dataLoggerTS.py /main.py

และกดปุ่ม ESP - รีเซ็ต คุณจะมี ESP ที่จับข้อมูลและบันทึกลงใน ThingSpeak.com จนกว่าจะกดด้านล่างค้างไว้ (รอให้ไฟ LED กะพริบ 3 ครั้งและ OLED จะดับลง)

ขั้นตอนที่ 11: แอพ ThingView

แอพ ThingView
แอพ ThingView

ข้อมูลที่บันทึกไว้สามารถดูได้โดยตรงบนเว็บไซต์ ThingSpeak.com หรือผ่านแอพ เช่น ThingsView!

ThingView เป็นแอปที่พัฒนาโดย CINETICA ที่ให้คุณเห็นภาพช่อง ThingSpeak ของคุณในวิธีที่ง่าย เพียงป้อนรหัสช่อง คุณก็พร้อมแล้ว

สำหรับช่องสาธารณะ แอปพลิเคชันจะเคารพการตั้งค่าหน้าต่างของคุณ: สี ช่วงเวลา ประเภทแผนภูมิ และจำนวนผลลัพธ์ เวอร์ชันปัจจุบันรองรับแผนภูมิเส้นและคอลัมน์ แผนภูมิ spline จะแสดงเป็นแผนภูมิเส้น

สำหรับช่องส่วนตัว ข้อมูลจะแสดงโดยใช้การตั้งค่าเริ่มต้น เนื่องจากไม่มีวิธีอ่านการตั้งค่าหน้าต่างส่วนตัวด้วยคีย์ API เท่านั้น

สามารถดาวน์โหลดแอป ThingView สำหรับ Android และ IPHONE

ขั้นตอนที่ 12: บทสรุป

บทสรุป
บทสรุป

และเช่นเคย ฉันหวังว่าโครงการนี้จะช่วยให้ผู้อื่นค้นพบหนทางสู่โลกที่น่าตื่นเต้นของอิเล็กทรอนิกส์!

สำหรับรายละเอียดและรหัสสุดท้าย โปรดไปที่ศูนย์ฝาก GitHub ของฉัน: IoT_TS_MQTT

สำหรับโครงการเพิ่มเติม โปรดเยี่ยมชมบล็อกของฉัน: MJRoBot.org

Saludos จากทางใต้ของโลก!

พบกันใหม่ในคำสั่งต่อไปของฉัน!

ขอขอบคุณ, มาร์เซโล

แนะนำ: