---
# System prepended metadata

title: 工業物聯網

---

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

![](https://hackmd.io/_uploads/r15K5Utun.png)

# 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
- ![](https://hackmd.io/_uploads/HyPgRBFdh.png)
 
## 版本確認
- 指令 cat /proc/cpuinfo 可以看到BCM版本，需要去確定一下
- 如果版本不是 BCM2835 的話要去platform_detect.py修改
- cpuinfo : BCＭ2835
- ![](https://hackmd.io/_uploads/ByCwPIYO2.png)

## 連續偵測程式
- 最下面那一段改成
```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://hackmd.io/_uploads/HJXEI_tuh.png)
- ![](https://hackmd.io/_uploads/B1Fr8dF_n.png)

- 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
```