返回文章列表

MicroPython 智慧裝置系統實作與雲端整合

本文探討使用 MicroPython 在 PyBoard 和 ESP32 上實作智慧家庭自動化、智慧垃圾桶和工業環境監控系統。文章涵蓋硬體連線組態、程式碼實作、ThingSpeak 雲端整合與 Blynk 應用程式設定,提供完整的實作與程式碼解析,並展示如何將感測器資料上傳至雲端平台進行視覺化監控。

物聯網 嵌入式系統

本篇文章將引導讀者運用 MicroPython,在 PyBoard 和 ESP32 等微控制器上,開發多個智慧裝置系統,包含智慧家庭自動化、智慧垃圾桶和工業環境監控。文章詳細介紹各系統的硬體架構、感測器連線方式,並提供 MicroPython 程式碼範例,包含 OLED 顯示控制、WiFi 連線設定和資料上傳至 ThingSpeak 雲端平台的實作細節。同時,也說明如何利用 Blynk 應用程式實作遠端控制家電功能,讓讀者能快速上手實作自己的智慧裝置應用。

智慧家庭自動化系統實作

本章節將介紹如何使用MicroPython在PyBoard和ESP32上實作智慧家庭自動化系統。我們將探討兩種不同的方法:第一種是使用PyBoard控制家電,第二種是使用ESP32透過Blynk應用程式實作遠端控制。

使用PyBoard控制家電

首先,我們需要連線PyBoard與開關和繼電器。連線方式如表4.1所示。

表4.1 PyBoard、開關和繼電器連線表

PyBoard開關PyBoard繼電器PyBoardOLED
X1SW1Y1R13.3 VVin
X2SW2Y2R2GNDGND
X3SW3Y3R3X9SCL
X4SW4Y4R4X10SDA

接下來,我們需要在main.py檔案中輸入以下程式碼:

# 控制家電程式
import time
import ssd1306
import machine
from pyb import Pin
from micropython import const

# OLED設定
width = const(128)
height = const(64)
ssd1306_scl = Pin('X9', Pin.OUT_PP)
ssd1306_sda = Pin('X10', Pin.OUT_PP)
i2c_ssd1306 = machine.I2C(scl=ssd1306_scl, sda=ssd1306_sda)
oled = ssd1306.SSD1306_I2C(width, height, i2c_ssd1306)

# 輸入輸出設定
p_in1 = Pin('X1', Pin.IN, Pin.PULL_UP)
p_in2 = Pin('X2', Pin.IN, Pin.PULL_UP)
p_in3 = Pin('X3', Pin.IN, Pin.PULL_UP)
p_in4 = Pin('X4', Pin.IN, Pin.PULL_UP)
p_out1 = Pin('Y1', Pin.OUT, Pin.OUT_PP)
p_out2 = Pin('Y2', Pin.OUT_PP)
p_out3 = Pin('Y3', Pin.OUT_PP)
p_out4 = Pin('Y4', Pin.OUT_PP)

while True:
    oled.fill(0)
    if p_in1.value() == False:
        p_out1.high()
        oled.text('AC-ON', 0, 0)
        oled.show()
    else:
        p_out1.low()
        oled.text('AC-OFF', 0, 0)
        oled.show()

    # 其他家電控制邏輯...

    time.sleep(0.5)

程式碼解析:

  • 初始化OLED顯示屏並設定輸入輸出腳位。
  • 在無窮迴圈中檢查輸入腳位的狀態,並根據狀態控制對應的繼電器。
  • 更新OLED顯示屏上的狀態資訊。

使用ESP32和Blynk實作遠端控制

本文將介紹如何使用ESP32和Blynk應用程式實作遠端控制家電。

首先,需要安裝Thonny IDE並燒錄MicroPython韌體到ESP32中。

ESP32與繼電器連線表

ESP32繼電器ESP32OLED
23R13V3VCC
19R2GNDGND
18R3D19SDA
5R4D23SCL

接下來,需要在Blynk應用程式中建立專案並設定按鈕控制。

Blynk應用程式設定步驟:

  1. 下載並安裝Blynk應用程式。
  2. 建立新專案並選擇ESP32裝置。
  3. 設定按鈕控制項,選擇對應的GPIO腳位。

然後,在boot.py檔案中輸入以下程式碼:

# boot.py檔案
ssid_ = "samsung"  # 修改為你的WiFi SSID
wp2_pass = "qwerty123"  # 修改為你的WiFi密碼

def do_connect():
    import network
    sta_if = network.WLAN(network.STA_IF)
    if not sta_if.isconnected():
        print('連線到網路...')
        sta_if.active(True)
        sta_if.connect(ssid_, wp2_pass)
        while not sta_if.isconnected():
            pass
        print('網路設定:', sta_if.ifconfig())

do_connect()

main.py檔案中輸入以下程式碼:

# main.py檔案
from machine import Pin, SoftI2C
from time import sleep
import network
import utime as time
from machine import Pin
import BlynkLibESP32 as BlynkLib

blynk = BlynkLib.Blynk("你的Auth Token")

while True:
    blynk.run()
    # 控制邏輯...

程式碼解析:

  • boot.py中設定WiFi連線。
  • main.py中使用Blynk函式庫實作遠端控制。

智慧電子垃圾桶的IoT實作

隨著物聯網(IoT)技術的發展,越來越多的應用被開發出來以改善我們的生活。智慧垃圾桶便是其中之一,它利用感測器和無線通訊技術,實作了垃圾桶狀態的即時監控和管理。在本章中,我們將介紹如何使用Pyboard和ESP8266 WiFi模組來建立一個智慧電子垃圾桶系統。

系統硬體架構

智慧垃圾桶系統主要由以下幾個部分組成:

  1. Pyboard:作為系統的主控板,負責讀取感測器的資料並控制WiFi模組。
  2. ESP8266 WiFi模組:提供WiFi連線功能,將垃圾桶的狀態上傳到ThingSpeak雲端平台。
  3. 接近感測器(FC-45):用於檢測垃圾桶的填充狀態。
  4. OLED顯示屏:用於顯示垃圾桶的當前狀態。

硬體連線

ESP8266 Pin描述Pyboard Pin
VCC電源(3.3V)3.3V
GND接地GND
Rx接收來自其他裝置的序列資料Tx
Tx傳送序列資料到其他裝置Rx
CH_En晶片使能腳,連線到3.3V3.3V
GPIO 0一般用途輸入輸出腳,未連線-
GPIO 2一般用途輸入輸出腳,未連線-

系統軟體實作

Step 1:設定ThingSpeak頻道

  1. 首先,需要在ThingSpeak網站上註冊帳號並建立一個新的頻道。
  2. 在頻道設定中,啟用一個欄位(Field),命名為「Bin status」,用於儲存垃圾桶的狀態。

Step 2:取得API Key

  1. 在ThingSpeak頻道設定中,找到「API Keys」選項卡。
  2. 複製Write API Key,這將用於在程式碼中上傳資料到ThingSpeak。

Step 3:組態ESP8266 WiFi模組

  1. 下載ESP8266 WiFi函式庫(pywifi)並將其複製到Pyboard中。
  2. 在程式碼中匯入pywifi函式庫,並設定WiFi連線引數。

程式碼實作

from pyb import Pin
import pyb
import ssd1306
import machine
from micropython import const
from machine import UART
import pywifi

# OLED顯示屏設定
width = const(128)
height = const(64)
ssd1306_scl = Pin('Y9', Pin.OUT_PP)
ssd1306_sda = Pin('Y10', Pin.OUT_PP)
i2c_ssd1306 = machine.I2C(scl=ssd1306_scl, sda=ssd1306_sda)
oled = ssd1306.SSD1306_I2C(width, height, i2c_ssd1306)

while True:
    # 重置Pyboard
    rst_pyb = Pin('X11', Pin.OUT)
    rst_pyb.low()
    pyb.delay(20)
    rst_pyb.high()
    pyb.delay(500)

    # 設定ESP8266 WiFi模組
    Pyboard_wifi = pywifi.ESP8266(1, 115200)
    wifi_mode = 3
    Pyboard_wifi.set_mode(wifi_mode)
    pyb.delay(50)
    Pyboard_wifi.connect(ssid='AndroidAP93E9', psk='uxbm0411')
    pyb.delay(50)

    # 顯示WiFi連線成功
    oled.fill(0)
    oled.text('WiFi Connected', 0, 0)
    oled.show()
    pyb.LED(4).on()  # 藍色LED亮起

    # 設定接近感測器輸入腳
    p_in1 = Pin('X1', Pin.IN, Pin.PULL_UP)
    p_in2 = Pin('X2', Pin.IN, Pin.PULL_UP)
    p_in3 = Pin('X3', Pin.IN, Pin.PULL_UP)

    # 建立TCP連線到ThingSpeak
    Pyboard_wifi.start_connection(protocol='TCP', dest_ip='184.106.153.149', dest_port=80, debug=True)

    # 讀取接近感測器狀態並更新OLED顯示
    if p_in1.value() == True and p_in2.value() == True and p_in3.value() == True:
        oled.text('Bin is Empty', 0, 10)
        bin_status = '0'
        oled.show()
    elif p_in1.value() == False and p_in2.value() == True and p_in3.value() == True:
        oled.text('Bin is less than Half', 0, 10)
        bin_status = '33'
        oled.show()
    elif p_in1.value() == False and p_in2.value() == False and p_in3.value() == True:
        oled.text('Bin is Half', 0, 10)
        bin_status = '66'
        oled.show()
    elif p_in1.value() == False and p_in2.value() == False and p_in3.value() == False:
        oled.text('Bin is Full', 0, 10)
        bin_status = '100'
        oled.show()

    # 上傳垃圾桶狀態到ThingSpeak
    Pyboard_wifi.send('GET https://api.thingspeak.com/update?api_key=HKFRK1JCH5BMOCQ8&field1=' + str(bin_status) + ' HTTP/1.0\r\nHost:192.168.43.176\r\n\r\n', debug=True)
    pyb.delay(1000)

程式碼解密:

  1. 初始化OLED顯示屏:程式碼首先初始化了OLED顯示屏,設定了其解析度和I2C介面。
  2. 重置Pyboard和設定ESP8266:程式碼重置了Pyboard,並設定了ESP8266 WiFi模組的模式和連線引數。
  3. 讀取接近感測器狀態:程式碼讀取了三個接近感測器的狀態,並根據這些狀態更新了OLED顯示屏上的垃圾桶填充狀態。
  4. 上傳資料到ThingSpeak:程式碼使用ESP8266 WiFi模組將垃圾桶的狀態上傳到ThingSpeak雲端平台。

工業環境監測系統實作與 ThingSpeak 雲端整合應用

系統概述與重要性

工業環境監測對於保護人類健康與生態系統至關重要。隨著工業化程式的加速,環境汙染問題日益嚴重,因此建立有效的監測系統成為當務之急。本系統利用 Pyboard 開發板結合多種感測器,實作對工業環境引數的即時監測,並透過 ThingSpeak 雲端平台進行資料上傳與視覺化展示。

硬體組態與感測器介接

本系統採用 Pyboard 作為主控單元,結合以下感測器實作環境引數監測:

  • DHT22:溫度與濕度監測
  • MQ4:甲烷 (CH₄) 濃度檢測
  • MQ2:丁烷濃度檢測
  • CJMCU 6814:多氣體感測器(NH₃、NO₂、CO)

硬體連線組態

Pyboard 引腳感測器功能用途
X1DHT22 資料線溫度與濕度偵測
X2MQ4 類別比輸出甲烷氣體偵測
X3MQ2 類別比輸出丁烷氣體偵測
X4CJMCU 6814 NH₃氨氣濃度偵測
X5CJMCU 6814 NO₂二氧化氮偵測
X6CJMCU 6814 CO一氧化碳偵測

ThingSpeak 雲端頻道設定

  1. 建立新的 ThingSpeak 頻道並命名為「Industrial Environmental Monitoring」
  2. 設定七個欄位分別對應不同的環境引數:
    • Field1:溫度
    • Field2:濕度
    • Field3:甲烷濃度
    • Field4:丁烷濃度
    • Field5:氨氣濃度
    • Field6:二氧化氮濃度
    • Field7:一氧化碳濃度
  3. 取得 API Key 用於資料上傳

系統實作程式碼解析

程式碼實作(main.py)

from pyb import Pin
import pyb
import ssd1306
import machine
from machine import Pin
from micropython import const
import dht
import pywifi

# OLED顯示設定
width = const(128)
height = const(64)
ssd1306_scl = Pin('Y9', Pin.OUT_PP)
ssd1306_sda = Pin('Y10', Pin.OUT_PP)
i2c_ssd1306 = machine.I2C(scl=ssd1306_scl, sda=ssd1306_sda)
oled = ssd1306.SSD1306_I2C(width, height, i2c_ssd1306)

# 感測器初始化
temp_hum = dht.DHT22(Pin('X1'))

while True:
    # 重置 Pyboard WiFi 模組
    rst_pyb = Pin('X11', Pin.OUT)
    rst_pyb.low()
    pyb.delay(20)
    rst_pyb.high()
    pyb.delay(500)
    
    # WiFi 連線設定
    Pyboard_wifi = pywifi.ESP8266(1, 115200)
    wifi_mode = 3
    Pyboard_wifi.set_mode(wifi_mode)
    Pyboard_wifi.connect(ssid='AndroidAP93E9', psk='uxbm0411')
    pyb.delay(50)
    pyb.LED(4).on()  # 藍色 LED 亮起表示連線成功
    
    # 讀取感測器資料
    temp_hum.measure()
    temp = temp_hum.temperature()
    hum = temp_hum.humidity()
    
    MQ4 = pyb.ADC('X2')  # 甲烷感測器
    Out1 = MQ4.read()
    MQ2 = pyb.ADC('X3')  # 丁烷感測器
    Out2 = MQ2.read()
    NH3 = pyb.ADC('X4')  # 氨氣感測器
    Out3 = NH3.read()
    NO2 = pyb.ADC('X5')  # 二氧化氮感測器
    Out4 = NO2.read()
    CO = pyb.ADC('X6')   # 一氧化碳感測器
    Out5 = CO.read()

    # OLED顯示第一頁資料
    oled.text("Tem: " + str(temp), 0, 10)
    oled.text("Humidity:" + str(hum), 0, 20)
    oled.text("Methane:" + str(Out1), 0, 30)
    oled.text("MQ2:" + str(Out2), 0, 40)
    oled.show()
    oled.fill(0)
    pyb.delay(1000)

    # OLED顯示第二頁資料
    oled.text("NH3:" + str(Out3), 0, 10)
    oled.text("NO2: " + str(Out4), 0, 20)
    oled.text("CO:" + str(Out5), 0, 30)
    oled.show()
    pyb.delay(1000)

    # 資料上傳至 ThingSpeak
    Pyboard_wifi.start_connection(protocol='TCP', dest_ip='184.106.153.149', dest_port=80, debug=True)
    Pyboard_wifi.send('GET https://api.thingspeak.com/update?api_key=7RZ93ORH43F2RYP7&field1=' +
                      str(temp) + '&field2=' + str(hum) + '&field3=' + str(Out1) + '&field4=' +
                      str(Out2) + '&field5=' + str(Out3) + '&field6=' + str(Out4) + '&field7=' + str(Out5) +
                      ' HTTP/1.0\r\nHost: 192.168.43.176\r\n\r\n', debug=True)
    pyb.delay(1000)

程式碼重點解析:

  1. 感測器資料讀取:程式中透過 DHT22 感測器讀取溫濕度資料,並使用 ADC 介面讀取各氣體感測器的類別比輸出值。
  2. OLED顯示控制:使用 SSD1306 OLED顯示屏分兩頁顯示環境監測引數,確保資訊清晰呈現。
  3. WiFi連線與資料上傳:透過 ESP8266 WiFi模組將監測資料上傳至 ThingSpeak 平台,實作遠端監控。

系統運作結果展示

執行 main.py 程式後,系統會將工業環境引數即時顯示在 OLED螢幕上,同時將資料上傳至 ThingSpeak雲端平台,如圖4.15所示。