顯示具有 MicroPython 標籤的文章。 顯示所有文章
顯示具有 MicroPython 標籤的文章。 顯示所有文章

2025年4月20日 星期日

[micro:bit] 亮亮鼠-多工程式

 前一篇文章:亮亮鼠

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# Imports go at the top
from microbit import *
mode = 0
value = 0

def my_sound_event():
    global mode
    if microphone.current_event() == SoundEvent.LOUD:
        mode+=1
        mode%=3

run_every(my_sound_event, ms=50)

# Code in a 'while True:' loop repeats forever
microphone.set_threshold(SoundEvent.LOUD, 80)
while True:
    display.show(mode+1)
    if button_a.was_pressed():
        mode+=1
        mode%=3
    if button_b.was_pressed():
        value = 1-value
    if mode == 0:
        pin0.write_digital(value)         
    if mode == 1:
        pin0.write_digital(value)    
        value = 1-value
    if mode == 2:
        if display.read_light_level()<70:
            pin0.write_digital(1)
        else:
            pin0.write_digital(0)
    sleep(500)  

2025年1月6日 星期一

ESP32-S按下按鈕利用ESP-NOW傳送訊息給另一顆ESP32-S點亮LED

 


傳送端程式:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import machine
import network
import espnow
import time

# 初始化 Wi-Fi 接口為 STA 模式
sta = network.WLAN(network.STA_IF)
sta.active(True)

# 初始化 ESP-NOW
esp = espnow.ESPNow()
esp.active(True)

# 添加另一顆晶片的 MAC 地址
peer_mac = b'\xb0\xa7\x32\xc0\xc6\xbc'  # 另一顆晶片的 MAC 地址
esp.add_peer(peer_mac)

# 設定 GPIO0 為按鈕
button = machine.Pin(0, machine.Pin.IN, machine.Pin.PULL_UP)

while True:
    if button.value() == 0:  # 檢測按鈕是否按下
        print("Button pressed, sending message...")
        esp.send(peer_mac, b"Button pressed!")
        time.sleep(0.5)  # 避免反彈,稍作延遲

接收端程式:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import machine
import network
import espnow
import time

# 初始化 Wi-Fi 接口為 STA 模式
sta = network.WLAN(network.STA_IF)
sta.active(True)

# 初始化 ESP-NOW
esp = espnow.ESPNow()
esp.active(True)

# 設定 GPIO2 為 LED
led = machine.Pin(2, machine.Pin.OUT)
led.off()  # 初始狀態關閉 LED

def on_recv(peer, msg):
    if msg:
        print("Received message:", msg)
        led.on()  # 點亮 LED
        time.sleep(1)  # 點亮 1 秒
        led.off()  # 關閉 LED

# 保持程式運行
while True:
    # 接收訊息
    if on_recv(*esp.recv()):
        break  # 如果接收到 'end' 訊息,結束循環
    pass

執行結果:
如最上面的影片

傳送端終端機的資訊:
MPY: soft reboot
Button pressed, sending message...
Button pressed, sending message...
Button pressed, sending message...

接收端終端機的資訊:
Received message: b'Button pressed!'
Received message: b'Button pressed!'
Received message: b'Button pressed!'

使用兩顆esp32實現ESP-NOW 1對1的雙向的通訊程式



兩顆程式一樣,只是MAC 位址不同,需注意。 
可以接收和傳送的程式:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import network
import espnow

# 初始化 Wi-Fi 接口為 STA 模式
sta = network.WLAN(network.STA_IF)
sta.active(True)

# 獲取並顯示 ESP32 的 MAC 地址
mac_address = sta.config('mac')
mac_address_readable = ':'.join(['{:02x}'.format(b) for b in mac_address])
print("MAC Address:", mac_address_readable)

# 初始化 ESP-NOW
esp = espnow.ESPNow()
esp.active(True)

# 添加另一顆晶片的 MAC 地址
peer_mac = b'\xb0\xa7\x32\xc0\xc6\xbc'  # 另一顆晶片的 MAC 地址
esp.add_peer(peer_mac)

# 設置一個函數來處理接收到的訊息
def on_recv(peer, msg):
    if msg:
        print("Received from {}: {}".format(peer, msg))
        if msg == b'end':
            print("Ending communication")
            return True
    return False

# 主要的循環來發送和接收訊息
while True:
    # 傳送訊息
    message = b"Hello from ESP-NOW!"
    esp.send(peer_mac, message)
    print("Message sent:", message)
    
    # 接收訊息
    if on_recv(*esp.recv()):
        break  # 如果接收到 'end' 訊息,結束循環

    # 稍作延遲以避免過多的傳送
    import time
    time.sleep(1)

執行結果:
MPY: soft reboot
MAC Address: b0:a7:32:c0:c6:70
Message sent: b'Hello from ESP-NOW!'
Received from b'\xb0\xa72\xc0\xc6\xbc': b'Hello from ESP-NOW!'
Message sent: b'Hello from ESP-NOW!'
Received from b'\xb0\xa72\xc0\xc6\xbc': b'Hello from ESP-NOW!'
Message sent: b'Hello from ESP-NOW!'
Received from b'\xb0\xa72\xc0\xc6\xbc': b'Hello from ESP-NOW!'
Message sent: b'Hello from ESP-NOW!'
Received from b'\xb0\xa72\xc0\xc6\xbc': b'Hello from ESP-NOW!'
Message sent: b'Hello from ESP-NOW!'
Received from b'\xb0\xa72\xc0\xc6\xbc': b'Hello from ESP-NOW!'
Message sent: b'Hello from ESP-NOW!'
Received from b'\xb0\xa72\xc0\xc6\xbc': b'Hello from ESP-NOW!'
Message sent: b'Hello from ESP-NOW!'
Received from b'\xb0\xa72\xc0\xc6\xbc': b'Hello from ESP-NOW!'

使用兩顆esp32實現ESP-NOW 1對1的單向的通訊程式





實作環境:利用兩台PC以及兩顆ESP32,分別執行Thonny,

接收端程式:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import network
import espnow

# A WLAN interface must be active to send()/recv()
sta = network.WLAN(network.WLAN.IF_STA)
sta.active(True)
sta.disconnect()   # Because ESP8266 auto-connects to last Access Point

# Get the MAC address
mac_address = sta.config('mac')

# Convert the MAC address to a readable format
mac_address_readable = ':'.join(['{:02x}'.format(b) for b in mac_address])

print("MAC Address:", mac_address_readable)

e = espnow.ESPNow()
e.active(True)

while True:
    host, msg = e.recv()
    if msg:             # msg == None if timeout in recv()
        print(host, msg)
        if msg == b'end':
            break

僅執行接收程式的執行結果:
MPY: soft reboot
MAC Address: b0:a7:32:c0:c6:70

傳送程式:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import network
import espnow

# A WLAN interface must be active to send()/recv()
sta = network.WLAN(network.WLAN.IF_STA)  # Or network.WLAN.IF_AP
sta.active(True)
sta.disconnect()      # For ESP8266

e = espnow.ESPNow()
e.active(True)
peer = b'\xb0\xa7\x32\xc0\xc6\x70'   # MAC address of peer's wifi interface
e.add_peer(peer)      # Must add_peer() before send()

e.send(peer, "Starting...")
for i in range(100):
    e.send(peer, str(i), True)
e.send(peer, b'end')

執行結果(接收端):
MPY: soft reboot
MAC Address: b0:a7:32:c0:c6:70
b'\xb0\xa72\xc0\xc6\xbc' b'Starting...'
b'\xb0\xa72\xc0\xc6\xbc' b'0'
b'\xb0\xa72\xc0\xc6\xbc' b'1'
b'\xb0\xa72\xc0\xc6\xbc' b'2'
b'\xb0\xa72\xc0\xc6\xbc' b'3'
b'\xb0\xa72\xc0\xc6\xbc' b'4'
b'\xb0\xa72\xc0\xc6\xbc' b'5'
b'\xb0\xa72\xc0\xc6\xbc' b'6'
b'\xb0\xa72\xc0\xc6\xbc' b'7'
b'\xb0\xa72\xc0\xc6\xbc' b'8'
b'\xb0\xa72\xc0\xc6\xbc' b'9'
b'\xb0\xa72\xc0\xc6\xbc' b'10'
b'\xb0\xa72\xc0\xc6\xbc' b'11'
b'\xb0\xa72\xc0\xc6\xbc' b'12'
b'\xb0\xa72\xc0\xc6\xbc' b'13'
b'\xb0\xa72\xc0\xc6\xbc' b'14'
b'\xb0\xa72\xc0\xc6\xbc' b'15'
b'\xb0\xa72\xc0\xc6\xbc' b'16'
b'\xb0\xa72\xc0\xc6\xbc' b'17'
b'\xb0\xa72\xc0\xc6\xbc' b'18'
b'\xb0\xa72\xc0\xc6\xbc' b'19'
b'\xb0\xa72\xc0\xc6\xbc' b'20'
b'\xb0\xa72\xc0\xc6\xbc' b'21'
b'\xb0\xa72\xc0\xc6\xbc' b'22'
b'\xb0\xa72\xc0\xc6\xbc' b'23'
b'\xb0\xa72\xc0\xc6\xbc' b'24'
b'\xb0\xa72\xc0\xc6\xbc' b'25'
b'\xb0\xa72\xc0\xc6\xbc' b'26'
b'\xb0\xa72\xc0\xc6\xbc' b'27'
b'\xb0\xa72\xc0\xc6\xbc' b'28'
b'\xb0\xa72\xc0\xc6\xbc' b'29'
b'\xb0\xa72\xc0\xc6\xbc' b'30'
b'\xb0\xa72\xc0\xc6\xbc' b'31'
b'\xb0\xa72\xc0\xc6\xbc' b'32'
b'\xb0\xa72\xc0\xc6\xbc' b'33'
b'\xb0\xa72\xc0\xc6\xbc' b'34'
b'\xb0\xa72\xc0\xc6\xbc' b'35'
b'\xb0\xa72\xc0\xc6\xbc' b'36'
b'\xb0\xa72\xc0\xc6\xbc' b'37'
b'\xb0\xa72\xc0\xc6\xbc' b'38'
b'\xb0\xa72\xc0\xc6\xbc' b'39'
b'\xb0\xa72\xc0\xc6\xbc' b'40'
b'\xb0\xa72\xc0\xc6\xbc' b'41'
b'\xb0\xa72\xc0\xc6\xbc' b'42'
b'\xb0\xa72\xc0\xc6\xbc' b'43'
b'\xb0\xa72\xc0\xc6\xbc' b'44'
b'\xb0\xa72\xc0\xc6\xbc' b'45'
b'\xb0\xa72\xc0\xc6\xbc' b'46'
b'\xb0\xa72\xc0\xc6\xbc' b'47'
b'\xb0\xa72\xc0\xc6\xbc' b'48'
b'\xb0\xa72\xc0\xc6\xbc' b'49'
b'\xb0\xa72\xc0\xc6\xbc' b'50'
b'\xb0\xa72\xc0\xc6\xbc' b'51'
b'\xb0\xa72\xc0\xc6\xbc' b'52'
b'\xb0\xa72\xc0\xc6\xbc' b'53'
b'\xb0\xa72\xc0\xc6\xbc' b'54'
b'\xb0\xa72\xc0\xc6\xbc' b'55'
b'\xb0\xa72\xc0\xc6\xbc' b'56'
b'\xb0\xa72\xc0\xc6\xbc' b'57'
b'\xb0\xa72\xc0\xc6\xbc' b'58'
b'\xb0\xa72\xc0\xc6\xbc' b'59'
b'\xb0\xa72\xc0\xc6\xbc' b'60'
b'\xb0\xa72\xc0\xc6\xbc' b'61'
b'\xb0\xa72\xc0\xc6\xbc' b'62'
b'\xb0\xa72\xc0\xc6\xbc' b'63'
b'\xb0\xa72\xc0\xc6\xbc' b'64'
b'\xb0\xa72\xc0\xc6\xbc' b'65'
b'\xb0\xa72\xc0\xc6\xbc' b'66'
b'\xb0\xa72\xc0\xc6\xbc' b'67'
b'\xb0\xa72\xc0\xc6\xbc' b'68'
b'\xb0\xa72\xc0\xc6\xbc' b'69'
b'\xb0\xa72\xc0\xc6\xbc' b'70'
b'\xb0\xa72\xc0\xc6\xbc' b'71'
b'\xb0\xa72\xc0\xc6\xbc' b'72'
b'\xb0\xa72\xc0\xc6\xbc' b'73'
b'\xb0\xa72\xc0\xc6\xbc' b'74'
b'\xb0\xa72\xc0\xc6\xbc' b'75'
b'\xb0\xa72\xc0\xc6\xbc' b'76'
b'\xb0\xa72\xc0\xc6\xbc' b'77'
b'\xb0\xa72\xc0\xc6\xbc' b'78'
b'\xb0\xa72\xc0\xc6\xbc' b'79'
b'\xb0\xa72\xc0\xc6\xbc' b'80'
b'\xb0\xa72\xc0\xc6\xbc' b'81'
b'\xb0\xa72\xc0\xc6\xbc' b'82'
b'\xb0\xa72\xc0\xc6\xbc' b'83'
b'\xb0\xa72\xc0\xc6\xbc' b'84'
b'\xb0\xa72\xc0\xc6\xbc' b'85'
b'\xb0\xa72\xc0\xc6\xbc' b'86'
b'\xb0\xa72\xc0\xc6\xbc' b'87'
b'\xb0\xa72\xc0\xc6\xbc' b'88'
b'\xb0\xa72\xc0\xc6\xbc' b'89'
b'\xb0\xa72\xc0\xc6\xbc' b'90'
b'\xb0\xa72\xc0\xc6\xbc' b'91'
b'\xb0\xa72\xc0\xc6\xbc' b'92'
b'\xb0\xa72\xc0\xc6\xbc' b'93'
b'\xb0\xa72\xc0\xc6\xbc' b'94'
b'\xb0\xa72\xc0\xc6\xbc' b'95'
b'\xb0\xa72\xc0\xc6\xbc' b'96'
b'\xb0\xa72\xc0\xc6\xbc' b'97'
b'\xb0\xa72\xc0\xc6\xbc' b'98'
b'\xb0\xa72\xc0\xc6\xbc' b'99'
b'\xb0\xa72\xc0\xc6\xbc' b'end'

2024年11月11日 星期一

wokwi模擬工具:MicroPython MQTT Weather Logger (ESP32)

wokwi這套模擬工具值得推薦,不但可以模擬ESP32,也能模擬Pico、SIM32和Arduno。
網址:https://wokwi.com/
以下是用它來模擬MQTT。


參考網址:https://wokwi.com/projects/322577683855704658

2024年10月28日 星期一

請ChatGPT協助除錯ESP8266機智雲的MicroPython程式

一、先給提示詞"修訂程式與並給一個初步程式碼:









 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from machine import Pin
from machine import Timer

# Define led_status as a global variable
led_status = 0

# Initialize LED pin
led = Pin(2, Pin.OUT)

# Define the LED flash function
def flash_led(timer):
    global led_status
    led.value(led_status)
    led_status = 1 - led_status

# Set up a periodic timer to toggle the LED every 500ms
tim = Timer(-1)
tim.init(period=500, mode=Timer.PERIODIC, callback=flash_led)

# No need for a while loop if the timer handles the LED toggling
# Just keep the script alive
while True:
    pass










ChatGPT很快地幫忙找出程式有三項問題,包括:全域變數、計時器的初始化、以及多餘程式碼,並給予正確的程式碼。

二、提示語告訴要產生的程式和使用接腳


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
from machine import Pin, Timer, PWM
import time

# 定義 LED 狀態
led_status = 0

# 初始化 LED 引腳
led = Pin(2, Pin.OUT)

# 定義 PWM 的引腳,使用 GPIO 4
buzzer = PWM(Pin(4))

# 音符對應的頻率(以簡單音階為例)
tones = {
    'C': 261,
    'D': 294,
    'E': 329,
    'F': 349,
    'G': 392,
    'A': 440,
    'B': 493
}

# 播放音符的函數
def play_tone(tone, duration):
    if tone in tones:
        buzzer.freq(tones[tone])  # 設定頻率
        buzzer.duty(512)  # 設定占空比,0-1023 之間,512 表示 50% 占空比
        time.sleep(duration)  # 播放音符的持續時間
        buzzer.duty(0)  # 停止聲音

# 定義 LED 閃爍的函數
def flash_led(timer):
    global led_status
    led.value(led_status)
    led_status = 1 - led_status

# 設置一個定時器,每500毫秒切換 LED 狀態
tim = Timer(-1)
tim.init(period=500, mode=Timer.PERIODIC, callback=flash_led)

# 播放一段簡單音樂的函數
def play_melody():
    melody = ['C', 'D', 'E', 'F', 'G', 'A', 'B', 'C']  # 簡單音階
    duration = 0.5  # 每個音符的持續時間為0.5秒
    for note in melody:
        play_tone(note, duration)
        time.sleep(0.1)  # 音符之間的短暫停頓

# 播放音樂
play_melody()

# 保持程式運行
while True:
    pass



三、請ChatGPT產生機智雲板子上的光敏電阻和LED控制程式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
from machine import Pin, ADC, PWM
import time

# 初始化光敏電阻 (A0)
light_sensor = ADC(0)

# 初始化 RGB LED 引腳
red = PWM(Pin(15), freq=500)
green = PWM(Pin(12), freq=500)
blue = PWM(Pin(13), freq=500)

# 設置初始 LED 亮度
red.duty(0)
green.duty(0)
blue.duty(0)

# 設定光線閾值,低於這個值時視為光線暗,進行顏色變化
LIGHT_THRESHOLD = 500  # 根據實際環境調整

# 顏色變化函數
def set_color(r, g, b):
    red.duty(r)
    green.duty(g)
    blue.duty(b)

# 變化 RGB 顏色
def color_cycle():
    set_color(1023, 0, 0)    # 紅色
    time.sleep(0.5)
    set_color(0, 1023, 0)    # 綠色
    time.sleep(0.5)
    set_color(0, 0, 1023)    # 藍色
    time.sleep(0.5)
    set_color(1023, 1023, 0) # 黃色
    time.sleep(0.5)
    set_color(0, 1023, 1023) # 青色
    time.sleep(0.5)
    set_color(1023, 0, 1023) # 紫色
    time.sleep(0.5)
    set_color(1023, 1023, 1023) # 白色
    time.sleep(0.5)

# 主迴圈
while True:
    light_value = light_sensor.read()  # 讀取光敏電阻的數值
    print("Light Value:", light_value)  # 可在控制台查看光線讀數

    if light_value < LIGHT_THRESHOLD:  # 如果光線低於閾值,啟動 RGB 變化
        color_cycle()
    else:
        # 關閉 RGB LED
        set_color(0, 0, 0)

    time.sleep(1)  # 每秒檢查一次光線狀態



最後把兩支程式請ChatGPT合併後的程式:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
from machine import Pin, Timer, PWM, ADC
import time

# 初始化 LED 引腳
led = Pin(2, Pin.OUT)
led_status = 0

# 初始化蜂鳴器的 PWM 引腳,使用 GPIO 4
beeper = PWM(Pin(4, Pin.OUT))

# 初始化光敏電阻 (A0) 和 RGB LED (GPIO 15, 12, 13)
light_sensor = ADC(0)
red = PWM(Pin(15), freq=500)
green = PWM(Pin(12), freq=500)
blue = PWM(Pin(13), freq=500)

# 設置初始 RGB LED 亮度
red.duty(0)
green.duty(0)
blue.duty(0)

# 光線強度閾值,低於此值視為光線暗
LIGHT_THRESHOLD = 500

# 定義 LED 閃爍的函數
def flash_led(timer):
    global led_status
    led.value(led_status)
    led_status = 1 - led_status

# 定義 PWM 控制 RGB 顏色
def set_color(r, g, b):
    red.duty(r)
    green.duty(g)
    blue.duty(b)

# 顏色變化函數
def color_cycle():
    set_color(1023, 0, 0)    # 紅色
    time.sleep(0.5)
    set_color(0, 1023, 0)    # 綠色
    time.sleep(0.5)
    set_color(0, 0, 1023)    # 藍色
    time.sleep(0.5)
    set_color(1023, 1023, 0) # 黃色
    time.sleep(0.5)
    set_color(0, 1023, 1023) # 青色
    time.sleep(0.5)
    set_color(1023, 0, 1023) # 紫色
    time.sleep(0.5)
    set_color(1023, 1023, 1023) # 白色
    time.sleep(0.5)

# 音樂音符和頻率
notes = [
    392, 330, 330, 0, 
    349, 294, 294, 0, 
    262, 294, 330, 349, 392, 392, 392, 0
]

# 音樂播放函數
def play_melody():
    for note in notes:
        if note == 0:
            beeper.duty(0)  # 休止符
        else:
            beeper.duty(512)  # 設置音量
            beeper.freq(note) # 設置頻率
        time.sleep(0.2)  # 音符持續 0.2 秒
        beeper.duty(0)
        time.sleep(0.1)  # 休止 0.1 秒

# 設置一個定時器,每 500 毫秒切換 LED 狀態
tim_led = Timer(-1)
tim_led.init(period=500, mode=Timer.PERIODIC, callback=flash_led)

# 主迴圈
while True:
    # 讀取光敏電阻的數值
    light_value = light_sensor.read()
    print("Light Value:", light_value)

    if light_value < LIGHT_THRESHOLD:  # 如果光線低於閾值,顯示 RGB 顏色變化
        color_cycle()
    else:
        set_color(0, 0, 0)  # 光線充足時,關閉 RGB LED

    play_melody()  # 播放音樂
    time.sleep(2)  # 每隔 2 秒播放一次音樂並檢查光線狀況


2024年10月6日 星期日

用Raspberry Pi Pico學Python

教材:Getting started with Raspberry Pi Pico

MicroPython for Pico:Quick reference for the RP2

範例一:LED閃爍控制

1
2
3
4
5
6
7
from machine import Pin
import time
led = Pin(26, Pin.OUT)

while True:
    led.toggle()
    time.sleep(1)

範例二:採用硬體計時器

1
2
3
4
5
6
7
8
from machine import Pin, Timer
led = Pin(26, Pin.OUT)
timer = Timer()

def blink(timer):
    led.toggle()

timer.init(freq=1, mode=Timer.PERIODIC, callback=blink)

範例三、輸入輸出

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
from machine import Pin
import time

led = Pin(26, Pin.OUT)
button = Pin(27, Pin.IN, Pin.PULL_DOWN)

while True:
    if button.value():
        led.toggle()
        time.sleep(0.5)


2024年6月18日 星期二

機智雲開發板的網路輸出控制



硬體:機智雲開發板

參考程式:MicroPython – Getting Started with MQTT on ESP32/ESP8266

燒錄暨編寫工具:uPyCraft

boot.py:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# Complete project details at https://RandomNerdTutorials.com

try:
  import usocket as socket
except:
  import socket

from machine import Pin, PWM
import network

import esp
esp.osdebug(None)

import gc
gc.collect()

ssid = 'cmlin2'
password = '0928931103'

station = network.WLAN(network.STA_IF)

station.active(True)
station.connect(ssid, password)

while station.isconnected() == False:
  pass

print('Connection successful')
print(station.ifconfig())

led = Pin(2, Pin.OUT)

main.py:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import time
# Complete project details at https://RandomNerdTutorials.com

def web_page():
  if led.value() == 1:
    gpio_state="ON"
  else:
    gpio_state="OFF"
  
  html = """<html><head> <title>ESP Web Server</title> <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" href="data:,"> <style>html{font-family: Helvetica; display:inline-block; margin: 0px auto; text-align: center;}
  h1{color: #0F3376; padding: 2vh;}p{font-size: 1.5rem;}.button{display: inline-block; background-color: #e7bd3b; border: none; 
  border-radius: 4px; color: white; padding: 16px 40px; text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}
  .button2{background-color: #4286f4;}</style></head><body> <h1>ESP Web Server</h1> 
  <p>GPIO state: <strong>""" + gpio_state + """</strong></p><p><a href="/?led=on"><button class="button">ON</button></a></p>
  <p><a href="/?led=off"><button class="button button2">OFF</button></a></p></body></html>"""
  return html

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 80))
s.listen(5)

while True:
  conn, addr = s.accept()
  print('Got a connection from %s' % str(addr))
  request = conn.recv(1024)
  request = str(request)
  print('Content = %s' % request)
  led_on = request.find('/?led=on')
  led_off = request.find('/?led=off')
  if led_on == 6:
    print('LED ON')
    led.value(0)
    RedLED = PWM(Pin(15))
    GreedLED = PWM(Pin(12))
    BlueLED=  PWM(Pin(13))
    RedLED.duty(0)
    GreedLED.duty(0)
    BlueLED.duty(0)
    for i in range(0, 1024, 10):
        RedLED.duty(i)   
        time.sleep(0.01)
    RedLED.duty(0)
    for i in range(0, 1024, 10):
        GreedLED.duty(i)   
        time.sleep(0.01)
    GreedLED.duty(0)
    for i in range(0, 1024, 10):
        BlueLED.duty(i)   
        time.sleep(0.01)
    BlueLED.duty(0)
  if led_off == 6:
    print('LED OFF')
    led.value(1)
    RedLED = PWM(Pin(15))
    GreedLED = PWM(Pin(12))
    BlueLED=  PWM(Pin(13))
    RedLED.duty(0)
    GreedLED.duty(0)
    BlueLED.duty(0)

  response = web_page()
  conn.send('HTTP/1.1 200 OK\n')
  conn.send('Content-Type: text/html\n')
  conn.send('Connection: close\n\n')
  conn.sendall(response)
  conn.close()


2024年6月17日 星期一

(AI應用) micro:bit/Wukong Breakout Board/Smart AI Lens三方合作用Python撰寫顏色辨識程式

參考文章:AI-Lens-Python Samples Code

程式套件:EF_Produce_MicroPython-master

程式編輯器:https://python.microbit.org/

專案程式要先從程式套件中,下載兩個重要程式,Wukong.py和AILens.py到程式編輯器的專案中。



範例一:顏色辨識

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from microbit import *
from AILens import *
ai = AILENS()
ai.switch_function(Color)
while True:
    ai.get_image()
    if (ai.get_color_type() == "Green"):
        display.scroll("Green")
        sleep(2000)
    elif (ai.get_color_type() == "Red"):
        display.scroll("Red")
        sleep(2000)
    elif (ai.get_color_type() == "Blue"):
        display.scroll("Blue")
        sleep(2000)
    elif (ai.get_color_type() == "Yellow"):
        display.scroll("Yellow")
        sleep(2000)
    elif (ai.get_color_type() == "Black"):
        display.scroll("Black")
        sleep(2000)
    elif (ai.get_color_type() == "White"):
        display.scroll("White")
        sleep(2000)
    else:
        display.show(Image.SAD)

範例二:控制燈的顏色
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
from microbit import *
from AILens import *
import neopixel

# 初始化AILens
ai = AILENS()
ai.switch_function(Color)

# 初始化WS2812B LED,假設有4顆LED連接在pin16上
np = neopixel.NeoPixel(pin16, 4)

def set_color(color):
    for i in range(4):
        np[i] = color
    np.show()

while True:
    ai.get_image()
    color_type = ai.get_color_type()
    if color_type == "Green":
        set_color((0, 255, 0))  # 綠色
        display.scroll("Green")
        sleep(2000)
    elif color_type == "Red":
        set_color((255, 0, 0))  # 紅色
        display.scroll("Red")
        sleep(2000)
    elif color_type == "Blue":
        set_color((0, 0, 255))  # 藍色
        display.scroll("Blue")
        sleep(2000)
    elif color_type == "Yellow":
        set_color((255, 255, 0))  # 黃色
        display.scroll("Yellow")
        sleep(2000)
    elif color_type == "Black":
        set_color((0, 0, 0))  # 黑色(關閉LED)
        display.scroll("Black")
        sleep(2000)
    elif color_type == "White":
        set_color((255, 255, 255))  # 白色
        display.scroll("White")
        sleep(2000)
    else:
        set_color((0, 0, 0))  # 關閉LED
        display.show(Image.SAD)

2024年6月16日 星期日

(AI協作)讓ChatGPT生成彩虹鳥童話故事再生成Python控制程式

前一篇文章:(AI協作)用Python設計亮亮鼠控制程式再運用ChatGPT產生童話故事

範例一:

提示詞:

彩虹鳥有那些能力呢?

ChaptGPT生成的內容:

在遙遠的魔法森林裡,住著一隻名叫亮亮的小老鼠和一隻美麗的小鳥,名叫彩虹。彩虹不僅以她五彩斑斕的羽毛和動聽的歌聲而聞名,她還擁有三項神奇的能力,讓她在森林中獨一無二。

第一項能力是彩虹能夠治癒傷痛。她的羽毛中蘊含著魔法,只要輕輕觸碰受傷的動物,它們的傷口就會迅速癒合。不論是身體上的創傷還是心靈上的痛楚,彩虹的羽毛都能帶來安慰和治療。

第二項能力是彩虹能夠預知天氣變化。每當暴風雨即將來臨或是陽光燦爛的日子即將到來,彩虹的羽毛會隨著天氣的變化而改變顏色。這項能力讓森林裡的動物們能夠提前準備,避開惡劣的天氣,或者享受美好的時光。

第三項能力是彩虹的歌聲具有魔力。當她唱起歌來,所有聽到她歌聲的動物都會感到心情愉快,煩惱和憂慮會隨之消散。她的歌聲能夠喚醒沉睡的花朵,使植物茁壯成長,讓整個森林都充滿生機。

一天,亮亮在森林裡遇見了彩虹,被她的美麗和善良深深吸引。亮亮決定用自己的能力來保護和幫助彩虹,兩隻動物很快成為了密不可分的好朋友。

有一天,一場突如其來的暴風雨襲擊了森林,彩虹的羽毛變成了深紫色,預示著危險的來臨。亮亮立即爬到彩虹的樹下,用閃燈發出警告信號,提醒其他動物們避開風暴。彩虹則用她的歌聲安撫著動物們的情緒,讓大家在驚恐中找到一絲平靜。

暴風雨過後,彩虹和亮亮一起巡視森林,治癒受傷的動物,幫助大家重建家園。彩虹用她的羽毛治癒了亮亮的傷口,亮亮則用他的電燈照亮了彩虹的道路。兩隻動物在彼此的陪伴和支持中,建立了深厚的感情。

最終,亮亮和彩虹的愛情故事在森林中傳開,成為了魔法森林裡最美麗的傳說。動物們都為他們的愛情感到高興,他們的故事也代代相傳,永不消逝。在這片充滿魔力的森林裡,亮亮和彩虹用他們的光芒和歌聲,帶來了無盡的希望和幸福。


範例二:

提示詞:

幫我產生彩虹鳥Python程式可以在micro:bit

上執行,完成三項能力

ChapGPT生成內容:

當然,這裡有一個 Python 程式,可以在 micro:bit 上模擬彩虹鳥的三項能力。這段程式包括了用 LED 顯示屏顯示不同的圖案來模擬治癒能力、預知天氣變化和播放歌曲。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from microbit import *
import music
import random

# 彩虹鳥能力的顯示圖案
heal_icon = Image.HEART
weather_icons = [Image.SUNNY, Image.CLOUD, Image.RAIN]
sing_icon = Image.MUSIC_QUAVER

# 治癒能力
def heal():
    display.show(heal_icon)
    sleep(2000)
    display.clear()

# 預知天氣變化
def predict_weather():
    weather = random.choice(weather_icons)
    display.show(weather)
    sleep(2000)
    display.clear()

# 播放歌曲
def sing():
    display.show(sing_icon)
    music.play(music.ENTERTAINER)
    display.clear()

# 主循環
while True:
    if button_a.was_pressed():
        heal()
    if button_b.was_pressed():
        predict_weather()
    if pin_logo.is_touched():
        sing()

這段程式實現了彩虹鳥的三項能力:

1. **治癒能力**:按下 A 鍵,LED 顯示屏會顯示心形圖案,模擬治癒能力。

2. **預知天氣變化**:按下 B 鍵,LED 顯示屏會隨機顯示太陽、雲朵或雨滴圖案,模擬預知天氣變化的能力。

3. **播放歌曲**:觸摸 micro:bit 的 logo,LED 顯示屏會顯示音符圖案,並播放一段音樂,模擬彩虹鳥的歌聲。

將這段程式上傳到 micro:bit 上,即可看到彩虹鳥的三項神奇能力在你的 micro:bit 上展示出來。

執行失敗,因Image.SUNNY, Image.CLOUD, Image.RAIN並未定義。

範例三:

提示詞:

產生Image的LED 顯示屏會隨機顯示太陽、雲朵或雨滴圖案,Python程式,樣式如下:

display.show(Image('00300:' '03630:' '36963:' '03630:' '00300'))

ChatGPT生成的內容:

當然,這裡有一個 Python 程式,可以在 micro

上模擬彩虹鳥的三項能力,其中包括 LED 顯示屏隨機顯示太陽、雲朵或雨滴圖案的功能。


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
from microbit import *
import music
import random

# 治癒能力的顯示圖案
heal_icon = Image('09090:'
                  '90909:'
                  '09990:'
                  '09090:'
                  '00900')

# 預知天氣變化的圖案
sunny_icon = Image('00300:'
                   '03630:'
                   '36963:'
                   '03630:'
                   '00300')

cloud_icon = Image('00000:'
                   '00330:'
                   '03663:'
                   '36666:'
                   '03660')

rainy_icon = Image('00000:'
                   '00300:'
                   '03630:'
                   '03630:'
                   '36963')

weather_icons = [sunny_icon, cloud_icon, rainy_icon]

# 播放歌曲的顯示圖案
sing_icon = Image('00000:'
                  '09090:'
                  '00900:'
                  '09090:'
                  '00000')

# 治癒能力
def heal():
    display.show(heal_icon)
    sleep(2000)
    display.clear()

# 預知天氣變化
def predict_weather():
    weather = random.choice(weather_icons)
    display.show(weather)
    sleep(2000)
    display.clear()

# 播放歌曲
def sing():
    display.show(sing_icon)
    music.play(music.ENTERTAINER)
    display.clear()

# 主循環
while True:
    if button_a.was_pressed():
        heal()
    if button_b.was_pressed():
        predict_weather()
    if pin_logo.is_touched():
        sing()

這段程式實現了彩虹鳥的三項能力:

  1. 治癒能力:按下 A 鍵,LED 顯示屏會顯示心形圖案,模擬治癒能力。
  2. 預知天氣變化:按下 B 鍵,LED 顯示屏會隨機顯示太陽、雲朵或雨滴圖案,模擬預知天氣變化的能力。
  3. 播放歌曲:觸摸 micro:bit的 logo,LED 顯示屏會顯示音符圖案,並播放一段音樂,模擬彩虹鳥的歌聲。

將這段程式上傳到 micro:bit上,即可看到彩虹鳥的三項神奇能力在你的 micro:bit上展示出來。

執行結果正常。

範例四:
提示詞:
治癒能力請加上WS2812B-6的程式,顏色可以變化

ChatGPT生成內容:
當然,這裡是一個改進過的 Python 程式,可以在 micro:bit上模擬彩虹鳥的三項能力,並包括使用 WS2812B LED 變化顏色來展示治癒能力。為了使用 WS2812B LED,你需要安裝 micro:bit的 neopixel 庫。

首先,請確保你已經安裝了 neopixel 庫。如果還沒有安裝,你可以在 Mu 編輯器中使用以下命令來安裝:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import neopixel
from microbit import pin0, sleep

# 創建 neopixel 物件,假設有 6 顆 LED 連接在 pin0 上
np = neopixel.NeoPixel(pin0, 6)

# 設置所有 LED 的顏色為紅色
for i in range(6):
    np[i] = (255, 0, 0)
np.show()

現在,將這段程式整合到主程式中:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
from microbit import *
import music
import random
import neopixel

# 創建 neopixel 物件,假設有 6 顆 LED 連接在 pin0 上
np = neopixel.NeoPixel(pin0, 6)

# 治癒能力的顯示圖案
heal_icon = Image('09090:'
                  '90909:'
                  '09990:'
                  '09090:'
                  '00900')

# 預知天氣變化的圖案
sunny_icon = Image('00300:'
                   '03630:'
                   '36963:'
                   '03630:'
                   '00300')

cloud_icon = Image('00000:'
                   '00330:'
                   '03663:'
                   '36666:'
                   '03660')

rainy_icon = Image('00000:'
                   '00300:'
                   '03630:'
                   '03630:'
                   '36963')

weather_icons = [sunny_icon, cloud_icon, rainy_icon]

# 播放歌曲的顯示圖案
sing_icon = Image('00000:'
                  '09090:'
                  '00900:'
                  '09090:'
                  '00000')

# 設置 neopixel 顏色變化
def set_neopixel_color():
    for i in range(6):
        np[i] = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
    np.show()

# 治癒能力
def heal():
    display.show(heal_icon)
    set_neopixel_color()
    sleep(2000)
    np.clear()
    display.clear()

# 預知天氣變化
def predict_weather():
    weather = random.choice(weather_icons)
    display.show(weather)
    sleep(2000)
    display.clear()

# 播放歌曲
def sing():
    display.show(sing_icon)
    music.play(music.ENTERTAINER)
    display.clear()

# 主循環
while True:
    if button_a.was_pressed():
        heal()
    if button_b.was_pressed():
        predict_weather()
    if pin_logo.is_touched():
        sing()

這段程式實現了以下功能:

  1. 治癒能力:按下 A 鍵,LED 顯示屏會顯示心形圖案,同時 WS2812B LED 燈會隨機變化顏色,模擬治癒能力。
  2. 預知天氣變化:按下 B 鍵,LED 顯示屏會隨機顯示太陽、雲朵或雨滴圖案,模擬預知天氣變化的能力。
  3. 播放歌曲:觸摸 micro
    的 logo,LED 顯示屏會顯示音符圖案,並播放一段音樂,模擬彩虹鳥的歌聲。

請確保 WS2812B LED 正確連接到 micro:bit的 pin0,並且提供適當的電源。將這段程式上傳到 micro:bit上,即可看到彩虹鳥的三項神奇能力在你的 micro:bit上展示出來。

執行結果正常。