iT邦幫忙

0

Day 4, D1 mini的斜槓人生(同時是訂閱端也是發佈端)

  • 分享至 

  • xImage
  •  

記得上一次做了MQTT,手機查看溫溼度嗎?不知道的話,請參見Day2的內容回顧(沒有,我怎麼可能是為了賺閱覽數這麼膚淺的行為)。當時的D1 mini是單純的發佈訊息端,這一次,我們要令它身兼二職,感受時下流行的斜槓人生(誤除了溫溼度外,可以用手機給指令開燈,那我們開始吧!歐對了,我依然是跟著教程走的。
這次,我們的材料有:

  1. D1 mini
  2. 一堆線
  3. 10k ohm
  4. 1k ohm
  5. 2N222電晶體
  6. 繼電器
    https://ithelp.ithome.com.tw/upload/images/20220607/20149573kuZvPjri25.png
    圖片源自網路
  7. 一個燈泡外加燈座
  8. MQTT中介: io.adafruit.com
  9. 手機APP: MQTT Client

先附上一張電晶體電路簡圖
https://ithelp.ithome.com.tw/upload/images/20220607/201495730544q0n8Sj.png
我們一樣將D1 mini零號作為溫溼度感測使用,將14號作為輸出高低電位訊號使用,來告訴繼電器通電還是斷電。
話說,有沒有人對於電晶體的出現感到疑惑呢?或是,為甚麼不能去掉電晶體這個步驟,直接接繼電器呢?

其實呢,這跟電機系學到的電子學有點關係,想當年上課真的是皮繃得很緊,但好在,要解釋這裡的目的並不困難,在這裡,電晶體與電阻組合成的電路,可以簡稱為開關,也就是狀態處於三極區(triode)以及截止區(cut-off),完全不會用到飽和區(saturation)狀態,甚麼?聽不懂?那有沒有聽過薛丁格的貓?介於生與死之間,沒有不生不死這種狀態,又換個比喻,這個電路像個耳朵,只介於有懷孕與沒有懷孕之間,不會有既懷孕又沒懷孕兩種狀態同時成立。而不管是生死還是懷不懷孕,其實就是開(三極區)和關(截止區)這兩種狀態,而這一切要歸功於電路的設計。
恩,懂了。
那為甚麼不直接跳過電晶體,直接使用Pin 14腳位訊號呢?其實,這是作為保護D1 mini的設計,如果直接將Pin 14腳連接繼電器,做高低訊號傳輸,理論上是沒問題的,然而,現實裡,會有繼電器的高電流逆流回Pin 14的可能性,到時候,可能會造成D1 mini毀損(錢錢飛了),嚴重一點,就是火災現場了。但有了電晶體作為保護替死鬼,D1 mini就能逃過死劫。
以下為程式碼:

from machine import Pin
import time
import network
from umqtt.robust import MQTTClient
import dht

sensor = dht.DHT11(Pin(0)) #溫溼度感測
relay = Pin(14, Pin.OUT, value = 0) #命令繼電器通電或斷電的輸出訊號

client = MQTTClient(
    client_id = "temp_humi你開心取名就好",
    server = 'io.adafruit.com',
    user = 'adafruit 帳號',
    password = 'adafruit key',
    ssl = False)
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect('Wifi', 'code')
while not sta_if.isconnect():
    print("No wifi signal")
    time.sleep(0.5)
    pass
print("Wifi connected!")

def get_msg(topic, msg):
    if msg == b"on":
        relay.value(1)
    elif msg == b"off":
        relay.value(0)
    print(msg)
    
client.connect()
client.set_callback(get_msg)
client.subscribe(b" adafruit帳號/feeds/light")#訂閱端設置,燈開關

last_time = 0
while True:
    if time.time() - last_time >= 3:
        sensor.measure()
        temp_humi = "%2d °C/ %2d%%" % (
            sensor.temperature(),
            sensor.humidity())
        client.publish(b"adafruit帳號/feeds/temp_humi",
            temp_humi.encode()) #發佈端設定,溫濕度
        last_time =time.time()
    client.check_msg()

接下來,延續Day2的手機App設定,我們接著創建Publisher就行了。
輕點創建事件名稱,會直接進入訂閱端,選取上傳圖案
https://ithelp.ithome.com.tw/upload/images/20220607/20149573WcaN0v7TOt.jpg
我們會進入發佈端設定,這時在topic輸入:Adafruit帳號/feeds/light,message輸入:on或是off,並送出訊號就可以了。
https://ithelp.ithome.com.tw/upload/images/20220607/20149573E7mpy99sJ3.jpg
https://ithelp.ithome.com.tw/upload/images/20220607/20149573ApMWxbClBn.jpg


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言