---
# System prepended metadata

title: Arduino筆記-9
tags: [Arduino]

---

# Arduino筆記-9

**注意!此部分需要用到Python和Discord Bot，第一次使用可以到[這裡](https://hackmd.io/@AndrewCho365/S1yXoFC8C)查看Thonny IDE教學**以及[這裡](https://hackmd.io/@AndrewCho365/rJo8Vq08C)查看Discord Bot教學

## 學習內容

1. 介紹pyserial函式庫
2. 使用pyserial連接DHT11
3. 使用pyserial連接SG90、全彩LED

## 介紹pyserial函式庫

pyserial是一個可以和Python達成序列埠通訊的函式庫
可以像使用Arduino IDE 的序列埠監控窗一樣進行輸入與輸出
因為Arduino不方便進行聯網，
所以可以使pyserial函式庫進行物聯網。

首先，按照前面[IDE教學](https://hackmd.io/@AndrewCho365/S1yXoFC8C)安裝**pyserial**函式庫
或是在cmd輸入下方指令⬇️
```
pip install pyserial
```
安裝完後在第一行輸入下方程式導入模組。
```py=
import serial
```
接著是一些設定（連接埠、波特率）
連接埠可以在裝置管理員找到。波特率則要設置的和開發板一樣。
```py=
COM_PORT = "COM3" # 請根據您的連接埠更改此處
BAUD_RATE = 9600 # Arduino的Serial.begin()設定的波特率

ser = serial.Serial(COM_PORT, BAUD_RATE)
```
接下來就是接收和輸出資訊
### 輸出⬇️
```py=
ser.write(message.encode())  # 將字符串編碼為位元組
```

### 接收⬇️
```py=
data = ser.readline().decode().strip()
print(data)
```
這行代碼包含了三個主要的操作，我將逐一解釋它們的用途：

1. `.readline()`: 這個函數從串口讀取一行數據直到遇到換行符號。

2. `.decode()`: 由於從串口讀取的數據是以位元組（byte）形式存在的，
                `decode()` 函數將這些位元組數據轉換成字符串（str），
                這樣能夠以人類可讀的文本格式處理數據。
                
3. `.strip()`: 這個函數用於移除字符串兩端的空白字符（包括空格、換行符號等），
               這通常用於清理數據，確保在進一步處理之前不會有不必要的空白或特殊字符。

接下來進行的是pyserial的實作，
會需要用的前面的Discord bot進行物聯網操作，所以沒看過教學的記得回去看。

## 使用pyserial連接DHT11

首先需要按照溫濕度感測器的教學處理好接線和上傳程式

接著進行程式編寫，
因為溫濕度感測器只會輸出資料，
所以只需要用到接收的部分。

最後打入以下程式碼⬇️

```py=
import discord
import serial

bot = discord.Bot(intents = discord.Intents.all())

COM_PORT = "COM3"
BAUD_RATE = 9600

ser = serial.Serial(COM_PORT, BAUD_RATE)

@bot.event
async def on_ready():
    print(f"「{bot.user}」已登入")

@bot.slash_command(description="查詢溫濕度")
async def th(ctx):
    data = ser.readline().decode().strip()
    await ctx.respond("data")

bot.run("bot_token")
```

將開發板與電腦連接後，
打開Discord 使用指令，
接著就會收到溫度與濕度的資料了。

## 使用pyserial連接SG90、全彩LED

首先需要按照伺服馬達和全彩LED的教學處理好接線和上傳程式

接著進行程式編寫，
因為伺服馬達和全彩LED都只會接收資料，
所以只需要用到輸出的部分。

底下的程式碼包含伺服馬達和全彩LED，
接著將需要的部分打入⬇️

```py=
import discord
import serial

bot = discord.Bot(intents = discord.Intents.all())

COM_PORT = "COM3"
BAUD_RATE = 9600

ser = serial.Serial(COM_PORT, BAUD_RATE)

@bot.event
async def on_ready():
    print(f"「{bot.user}」已登入")
        
@bot.slash_command(description="控制全彩LED")
async def set_led(ctx,r: int,g: int,b: int):
    light = f'{r} {g} {b}'
    ser.write(str.encode(str(light)))
    await ctx.respond(light)

@bot.slash_command(description="控制伺服馬達")
async def set_angle(ctx,angle: int):
    if 0 <= angle <= 180:
        ser.write(str.encode(str(angle)))
        await ctx.respond(f"伺服馬達已轉到 {angle} 度")
    else:
        await ctx.respond("請輸入 0 到 180 的角度")

bot.run("bot_token")
```

將開發板與電腦連接後，
打開Discord 使用指令，
接著就可以控制伺服馬達和全彩LED。