# 助教
- 尤宏恩
- 環境:windows, android
- 黃士昕
- 環境:Mac, iphone
- 使用iphone要開啟 **"最大化相容性"** 樹莓派才可以連接的到
- 在
- 石辛睿翔
- 環境:windows, android

# 1. LED
* 自行挑戰看看
* 請使用軟體模擬PWM方法完成並完成下列條件:
1. 控制一LED燈使其隨著時間逐漸變亮,待達到亮度最大時停止一秒,接續使LED燈隨著時間逐漸變暗,待達到亮度最小時停止一秒,反覆上述過程。
2. 以KeyboardInterrupt(Crtl+c)例外信號中斷程式,並使用try…except…進行例外處理。
3. LED燈接腳模式請以BOARD為準
範例code :
```javascript=
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
GPIO.setup(11,GPIO.OUT)
pwm = GPIO.PWM(11,60)
while True:
try:
pwm.start(0)
for i in range(0,100,5):
pwm.ChangeDutyCycle(i)
time.sleep(0.1)
for i in range(100,0,-5):
pwm.ChangeDutyCycle(i)
time.sleep(0.1)
except KeyboardInterrupt:
print('exit')
break
GPIO.cleanup()
```
# 2. 蜂鳴器 - 睿翔
```python=
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12, GPIO.OUT)
voice = GPIO.PWM(12, 50)
voice.start(50)
voice.ChangeFrequency(523)
time.sleep(1)
voice.ChangeFrequency(587)
time.sleep(1)
print('end')
voice.stop()
GPIO.cleanup()
```
# 3. DHT11 - Tony
- 
## 版本確認
- 指令 cat /proc/cpuinfo 可以看到BCM版本,需要去確定一下
- 如果版本不是 BCM2835 的話要去platform_detect.py修改
- cpuinfo : BCM2835
- 
## 連續偵測程式
- 最下面那一段改成
```python=
while True:
try:
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
if humidity is not None and temperature is not None:
print(f'Temp={temperature:0.1f}* Humidity={humidity:0.1f}%')
else:
print('Failed to get reading. Try again!')
sys.exit(1) #每格1秒output一次,看輸出的變化
except KeyboardInterrupt:
break
```
# 4. 超音波 - Tony
- 
- 
- https://pimylifeup.com/raspberry-pi-distance-sensor/
## 確認角位
- BCM模式
- GND-GND,VCC-3.3V,TRIG-(號碼),ECHO-(號碼)
- 可能需要一下角位輸出是否正確
- 要用平面去偵測距離,若是用手或是曲面他會炸掉
```python=
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
# 設定 GPIO 的模式為 BCM 模式(Broadcom 腳位編號)。
TRIG = 4
ECHO = 17
# 定義 TRIG 和 ECHO 兩個變量,分別代表超聲波模組的觸發腳位和回聲腳位。
# 可以依自己的腳位去設定
GPIO.setup(TRIG, GPIO.OUT)
GPIO.setup(ECHO, GPIO.IN)
# 使用 GPIO.setup() 函數設定 TRIG 和 ECHO 的引腳模式,
# TRIG 設為輸出模式,ECHO 設為輸入模式。
def measure_distance():
GPIO.output(TRIG, False)
time.sleep(0.5) # 等待傳感器穩定
GPIO.output(TRIG, True)
time.sleep(0.00001)
GPIO.output(TRIG, False)
pulse_start = time.time()
pulse_end = time.time()
# 他這邊等於0的時候代表他現在是低電位,也就是他現在沒有收到回程訊號
while GPIO.input(ECHO) == 0:
pulse_start = time.time()
# 他這邊等於1的時候代表他現在是高電位,也就是他現在收到回程訊號
while GPIO.input(ECHO) == 1:
pulse_end = time.time()
# 我們將收到的起始跟結束相減就可以獲得他的時間
pulse_duration = pulse_end - pulse_start
distance = pulse_duration * 17150 # 乘以聲速(34300 cm/s)
# 然後因為來回所以要除2
distance = round(distance, 1) # 四捨五入到小數點後一位
return distance
while True:
try:
distance = measure_distance()
print('Distance:', distance, 'cm')
time.sleep(1)
except KeyboardInterrupt:
break
GPIO.cleanup()
```
# 5. 聲音感測
- GND-GND,VCC-5V,OUT-GPIO(號碼)
- 確認是程式碼問題,還是感測器的問題。
## 三個角位
```python=
import RPi.GPIO as GPIO
import time
# GPIO SETUP
sound = 17
GPIO.setmode(GPIO.BCM)
GPIO.setup(sound, GPIO.IN)
def check_sound():
if GPIO.input(sound):
print("Sound Detected!")
else:
print("Sound not Detected!")
# infinite loop
while True:
check_sound()
time.sleep(1)
GPIO.cleanup()
```
### 有LED
```python=
import RPi.GPIO as GPIO
import time
#GPIO SETUP
sound = 17
led = 27
GPIO.setmode(GPIO.BCM)
GPIO.setup(sound, GPIO.IN)
GPIO.setup(led,GPIO.OUT)
def callback(sound):
if GPIO.input(sound):
print "Sound Detected!"
GPIO.output(led,HIGH)
else:
print "Sound Detected!"
GPIO.output(led,LOW)
GPIO.add_event_detect(sound, GPIO.BOTH, bouncetime=300) # let us know when the pin goes HIGH or LOW
GPIO.add_event_callback(sound, callback) # assign function to GPIO PIN, Run function on change
# infinite loop
while True:
time.sleep(1)
# infinite loop
while True:
check_sound()
time.sleep(3)
GPIO.cleanup()
```
## 四個角位
```python=
import RPi.GPIO as GPIO
import time
# GPIO SETUP
sound_digital = 17
sound_analog = 0
GPIO.setmode(GPIO.BCM)
GPIO.setup(sound_digital, GPIO.IN)
def check_sound():
if GPIO.input(sound_digital):
print("Sound Detected!")
else:
print("Sound not Detected!")
# infinite loop
while True:
check_sound()
time.sleep(3)
GPIO.cleanup()
```
# 6. 搖桿
- 還在測試中
```python=
import RPi.GPIO as GPIO
import time
# 设置GPIO引脚编号模式为BCM
GPIO.setmode(GPIO.BCM)
# 定义连接到摇杆传感器的GPIO引脚
output_pin_x = 17
output_pin_y = 27
button_pin = 22
vcc_pin = 5
gnd_pin = 6
# 配置GPIO引脚
GPIO.setup(output_pin_x, GPIO.IN)
GPIO.setup(output_pin_y, GPIO.IN)
GPIO.setup(button_pin, GPIO.IN)
GPIO.setup(vcc_pin, GPIO.OUT)
GPIO.setup(gnd_pin, GPIO.OUT)
# 打开摇杆传感器电源
GPIO.output(vcc_pin, GPIO.HIGH)
GPIO.output(gnd_pin, GPIO.LOW)
try:
while True:
# 读取摇杆传感器 X 轴位置值
position_x = GPIO.input(output_pin_x)
# 读取摇杆传感器 Y 轴位置值
position_y = GPIO.input(output_pin_y)
# 读取摇杆传感器按钮状态
button_state = GPIO.input(button_pin)
# 处理摇杆位置和按钮状态
print("X轴位置:{}".format(position_x))
print("Y轴位置:{}".format(position_y))
print("按钮状态:{}".format(button_state))
print("------------------------------------")
time.sleep(0.1)
except KeyboardInterrupt:
# 关闭摇杆传感器电源
GPIO.output(vcc_pin, GPIO.LOW)
GPIO.cleanup()
```
# 倒車雷達
```python=
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
# 設定 GPIO 的模式為 BCM 模式(Broadcom 腳位編號)。
TRIG = 4
ECHO = 17
LED = 11
# 定義 TRIG 和 ECHO 兩個變量,分別代表超聲波模組的觸發腳位和回聲腳位。
# 可以依自己的腳位去設定
GPIO.setup(TRIG, GPIO.OUT)
GPIO.setup(ECHO, GPIO.IN)
# 使用 GPIO.setup() 函數設定 TRIG 和 ECHO 的引腳模式,
# TRIG 設為輸出模式,ECHO 設為輸入模式。
GPIO.setup(LED,GPIO.OUT)
voice = GPIO.PWM(13,50)
voice.start(50) #dc之範圍須為(0.0<dc<100.0)
def measure_distance():
GPIO.output(TRIG, False)
time.sleep(0.5) # 等待傳感器穩定
GPIO.output(TRIG, True)
time.sleep(0.00001)
GPIO.output(TRIG, False)
pulse_start = time.time()
pulse_end = time.time()
# 他這邊等於0的時候代表他現在是低電位,也就是他現在沒有收到回程訊號
while GPIO.input(ECHO) == 0:
pulse_start = time.time()
# 他這邊等於1的時候代表他現在是高電位,也就是他現在收到回程訊號
while GPIO.input(ECHO) == 1:
pulse_end = time.time()
# 我們將收到的起始跟結束相減就可以獲得他的時間
pulse_duration = pulse_end - pulse_start
distance = pulse_duration * 17150 # 乘以聲速(34300 cm/s)
# 然後因為來回所以要除2
distance = round(distance, 1) # 四捨五入到小數點後一位
return distance
while True:
try:
distance = measure_distance()
print('Distance:', distance, 'cm')
time.sleep(1)
if(distance<30):
GPIO.output(11,True)
voice.ChangeFrequency(523)
time.sleep(1)
elif(30<=distance<100):
GPIO.output(11,True)
voice.ChangeFrequency(523)
time.sleep(0.5)
GPIO.output(11,False)
voice.ChangeFrequency(523)
time.sleep(0.5)
else:
GPIO.output(11,False)
except KeyboardInterrupt:
break
GPIO.cleanup
```