Skip to content

Commit

Permalink
Raspberry Pi 5 対応 (GPIO Zeroに変更)
Browse files Browse the repository at this point in the history
  • Loading branch information
bokunimowakaru committed Jun 1, 2024
1 parent c7214e7 commit e24d76d
Show file tree
Hide file tree
Showing 10 changed files with 411 additions and 30 deletions.
1 change: 0 additions & 1 deletion learning/example20_iot_notifier.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,5 +137,4 @@ def udp_app():
pwm_bell.close() ## ↑
# GPIO.cleanup(port_btn) # ボタン用GPIOを未使用状態に戻す
btn.close() ## ↑
udp_run = False # スレッドudp_appの起動
exit() # プログラムの終了
1 change: 0 additions & 1 deletion learning/example20_iot_notifier_rpi.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,5 +116,4 @@ def udp_app():
GPIO.cleanup(ports[i]) # LED用GPIOを未使用状態に戻す
GPIO.cleanup(port_bell) # チャイム用GPIOを未使用状態に
GPIO.cleanup(port_btn) # ボタン用GPIOを未使用状態に戻す
udp_run = False # スレッドudp_appの起動
exit() # プログラムの終了
23 changes: 14 additions & 9 deletions learning/example28_chime_btn.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,26 +17,30 @@
pong_f = 440 # チャイム音の周波数2

import socket # IP通信用モジュールの組み込み
from RPi import GPIO # GPIOモジュールの取得
# from RPi import GPIO # RPi内のGPIOモジュールの取得
from gpiozero import TonalBuzzer ## GPIO Zero のTonalBuzzerを取得
from time import sleep # スリープ実行モジュールの取得
import threading # スレッド用ライブラリの取得

def chime(key): # チャイム(スレッド用)
global pwm # グローバル変数pwmを取得
if key == "Ping":
pwm.ChangeFrequency(ping_f) # PWM周波数の変更
pwm.start(50) # PWM出力を開始。デューティ50%
# pwm.ChangeFrequency(ping_f) # PWM周波数の変更
# pwm.start(50) # PWM出力を開始。50%
pwm.play(ping_f) ## ↑
sleep(1) # 1秒の待ち時間処理
pwm.stop() # PWM出力停止
if key == "Pong":
pwm.ChangeFrequency(pong_f) # PWM周波数の変更
pwm.start(50) # PWM出力を開始。デューティ50%
# pwm.ChangeFrequency(pong_f) # PWM周波数の変更
# pwm.start(50) # PWM出力を開始。50%
pwm.play(pong_f) ## ↑
sleep(0.3) # 0.3秒の待ち時間処理
pwm.stop() # PWM出力停止

GPIO.setmode(GPIO.BCM) # ポート番号の指定方法の設定
GPIO.setup(port, GPIO.OUT) # ポート番号portのGPIOを出力に
pwm = GPIO.PWM(port, ping_f) # PWM出力用のインスタンスを生成
# GPIO.setmode(GPIO.BCM) # ポート番号の指定方法の設定
# GPIO.setup(port, GPIO.OUT) # ポート番号portのGPIOを出力に
# pwm = GPIO.PWM(port, ping_f) # PWM出力用のインスタンスを生成
pwm = TonalBuzzer(port) ## ↑

print('Listening UDP port', 1024, '...', flush=True) # ポート番号1024表示
try:
Expand All @@ -52,7 +56,8 @@ def chime(key): # チャイム(スレッド用
udp, udp_from = sock.recvfrom(64) # UDPパケットを取得
except KeyboardInterrupt: # キー割り込み発生時
print('\nKeyboardInterrupt') # キーボード割り込み表示
GPIO.cleanup(port) # GPIOを未使用状態に戻す
# GPIO.cleanup(port) # GPIOを未使用状態に戻す
pwm.close() ## ↑
exit() # プログラムの終了
udp = udp.decode().strip() # データを文字列へ変換
if not udp.isprintable() or len(udp) != 4: # 4文字以下で表示可能
Expand Down
66 changes: 66 additions & 0 deletions learning/example28_chime_btn_rpi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
#!/usr/bin/env python3
# coding: utf-8

# Example 28 IoTボタンでチャイム音・玄関呼び鈴システム
# IoTボタンが送信するUDPを受信し、チャイム音を鳴り分ける

# 接続図
# [IoTボタン] ------> [本機]
# ボタン操作 チャイム音

# 機器構成
# 本機 GPIOポート4にブザー
# IoTボタン example14_iot_btn.py

port = 4 # GPIO ポート番号
ping_f = 554 # チャイム音の周波数1
pong_f = 440 # チャイム音の周波数2

import socket # IP通信用モジュールの組み込み
from RPi import GPIO # GPIOモジュールの取得
from time import sleep # スリープ実行モジュールの取得
import threading # スレッド用ライブラリの取得

def chime(key): # チャイム(スレッド用)
global pwm # グローバル変数pwmを取得
if key == "Ping":
pwm.ChangeFrequency(ping_f) # PWM周波数の変更
pwm.start(50) # PWM出力を開始。デューティ50%
sleep(1) # 1秒の待ち時間処理
pwm.stop() # PWM出力停止
if key == "Pong":
pwm.ChangeFrequency(pong_f) # PWM周波数の変更
pwm.start(50) # PWM出力を開始。デューティ50%
sleep(0.3) # 0.3秒の待ち時間処理
pwm.stop() # PWM出力停止

GPIO.setmode(GPIO.BCM) # ポート番号の指定方法の設定
GPIO.setup(port, GPIO.OUT) # ポート番号portのGPIOを出力に
pwm = GPIO.PWM(port, ping_f) # PWM出力用のインスタンスを生成

print('Listening UDP port', 1024, '...', flush=True) # ポート番号1024表示
try:
sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)# ソケットを作成
sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # オプション
sock.bind(('', 1024)) # ソケットに接続
except Exception as e: # 例外処理発生時
print(e) # エラー内容を表示
exit() # プログラムの終了

while sock: # 永遠に繰り返す
try:
udp, udp_from = sock.recvfrom(64) # UDPパケットを取得
except KeyboardInterrupt: # キー割り込み発生時
print('\nKeyboardInterrupt') # キーボード割り込み表示
GPIO.cleanup(port) # GPIOを未使用状態に戻す
exit() # プログラムの終了
udp = udp.decode().strip() # データを文字列へ変換
if not udp.isprintable() or len(udp) != 4: # 4文字以下で表示可能
continue
print('device =', udp, udp_from[0]) # 取得値を表示
if udp == 'Ping': # 「Ping」に一致する時
thread = threading.Thread(target=chime, args=([udp])) # スレッド生成
thread.start() # スレッドchimeの起動
if udp == 'Pong': # 「Pong」に一致する時
thread = threading.Thread(target=chime, args=([udp])) # スレッド生成
thread.start() # スレッドchimeの起動
23 changes: 14 additions & 9 deletions learning/example29_chime_temp.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@
temp_lv = [ 28 , 30 , 32 ] # 警告レベル 3段階

import socket # IP通信用モジュールの組み込み
from RPi import GPIO # GPIOモジュールの取得
# from RPi import GPIO # RPi内のGPIOモジュールの取得
from gpiozero import TonalBuzzer ## GPIO Zero のTonalBuzzerを取得
from time import sleep # スリープ実行モジュールの取得
import threading # スレッド用ライブラリの取得

Expand All @@ -28,13 +29,15 @@ def chime(level): # チャイム(スレ
return # 何もせずに戻る
global pwm # グローバル変数pwm取得
if level >= 1: # 警告レベル1以上のとき
pwm.ChangeFrequency(ping_f) # PWM周波数の変更
pwm.start(50) # PWM出力を開始。50%
# pwm.ChangeFrequency(ping_f) # PWM周波数の変更
# pwm.start(50) # PWM出力を開始。50%
pwm.play(ping_f) ## ↑
sleep(0.1) # 0.1秒の待ち時間処理
pwm.stop() # PWM出力停止取得
if level >= 2: # 警告レベル2以上のとき
pwm.ChangeFrequency(pong_f) # PWM周波数の変更
pwm.start(50) # PWM出力を開始。50%
# pwm.ChangeFrequency(pong_f) # PWM周波数の変更
# pwm.start(50) # PWM出力を開始。50%
pwm.play(pong_f) ## ↑
sleep(0.2) # 0.2秒の待ち時間処理
pwm.stop() # PWM出力停止
if level >= 3: # 警告レベル3のとき
Expand All @@ -59,9 +62,10 @@ def get_val(s): # データを数値に
except ValueError: # 小数変換失敗時
return None # Noneを応答

GPIO.setmode(GPIO.BCM) # ポート番号の指定方法の設定
GPIO.setup(port, GPIO.OUT) # ポート番号portのGPIOを出力に
pwm = GPIO.PWM(port, ping_f) # PWM出力用のインスタンスを生成
# GPIO.setmode(GPIO.BCM) # ポート番号の指定方法の設定
# GPIO.setup(port, GPIO.OUT) # ポート番号portのGPIOを出力に
# pwm = GPIO.PWM(port, ping_f) # PWM出力用のインスタンスを生成
pwm = TonalBuzzer(port) ## ↑

print('Listening UDP port', 1024, '...', flush=True) # ポート番号1024表示
try:
Expand All @@ -77,7 +81,8 @@ def get_val(s): # データを数値に
udp, udp_from = sock.recvfrom(64) # UDPパケットを取得
except KeyboardInterrupt: # キー割り込み発生時
print('\nKeyboardInterrupt') # キーボード割り込み表示
GPIO.cleanup(port) # GPIOを未使用状態に戻す
# GPIO.cleanup(port) # GPIOを未使用状態に戻す
pwm.close() ## ↑
exit() # プログラムの終了
vals = udp.decode().strip().split(',') # 「,」で分割
dev = check_dev_name(vals[0]) # デバイス名を取得
Expand Down
96 changes: 96 additions & 0 deletions learning/example29_chime_temp_rpi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
#!/usr/bin/env python3
# coding: utf-8

# Example 30 IoT温度センサで熱中症予防システム
# IoT温度センサが送信する温度値情報を受信し、温度に応じたチャイム音を鳴らす

# 接続図
# [IoT温度センサ] ------> [本機]
# 温度値 チャイム音

# 機器構成
# 本機 GPIOポート4にブザー
# IoT温度センサ example15_iot_temp.py

port = 4 # GPIO ポート番号
ping_f = 587 # チャイム音の周波数1
pong_f = 699 # チャイム音の周波数2
sensors = ['temp.','temp0','humid','press','envir'] # 対応センサのデバイス名
temp_lv = [ 28 , 30 , 32 ] # 警告レベル 3段階

import socket # IP通信用モジュールの組み込み
from RPi import GPIO # GPIOモジュールの取得
from time import sleep # スリープ実行モジュールの取得
import threading # スレッド用ライブラリの取得

def chime(level): # チャイム(スレッド用)
if level <= 0 or level > 3: # 範囲外の値の時に
return # 何もせずに戻る
global pwm # グローバル変数pwm取得
if level >= 1: # 警告レベル1以上のとき
pwm.ChangeFrequency(ping_f) # PWM周波数の変更
pwm.start(50) # PWM出力を開始。50%
sleep(0.1) # 0.1秒の待ち時間処理
pwm.stop() # PWM出力停止取得
if level >= 2: # 警告レベル2以上のとき
pwm.ChangeFrequency(pong_f) # PWM周波数の変更
pwm.start(50) # PWM出力を開始。50%
sleep(0.2) # 0.2秒の待ち時間処理
pwm.stop() # PWM出力停止
if level >= 3: # 警告レベル3のとき
for i in range(23): # 下記を23回繰り返す
sleep(0.1) # 0.1秒の待ち時間処理
chime(2) # レベル2と同じ鳴音処理

def check_dev_name(s): # デバイス名を取得
if not s.isprintable(): # 表示可能な文字列で無い
return None # Noneを応答
if len(s) != 7 or s[5] != '_': # フォーマットが不一致
return None # Noneを応答
for sensor in sensors: # デバイスリスト内
if s[0:5] == sensor: # センサ名が一致したとき
return s # デバイス名を応答
return None # Noneを応答

def get_val(s): # データを数値に変換
s = s.replace(' ','') # 空白文字を削除
try: # 小数変換の例外監視
return float(s) # 小数に変換して応答
except ValueError: # 小数変換失敗時
return None # Noneを応答

GPIO.setmode(GPIO.BCM) # ポート番号の指定方法の設定
GPIO.setup(port, GPIO.OUT) # ポート番号portのGPIOを出力に
pwm = GPIO.PWM(port, ping_f) # PWM出力用のインスタンスを生成

print('Listening UDP port', 1024, '...', flush=True) # ポート番号1024表示
try:
sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)# ソケットを作成
sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # オプション
sock.bind(('', 1024)) # ソケットに接続
except Exception as e: # 例外処理発生時
print(e) # エラー内容を表示
exit() # プログラムの終了

while sock: # 永遠に繰り返す
try:
udp, udp_from = sock.recvfrom(64) # UDPパケットを取得
except KeyboardInterrupt: # キー割り込み発生時
print('\nKeyboardInterrupt') # キーボード割り込み表示
GPIO.cleanup(port) # GPIOを未使用状態に戻す
exit() # プログラムの終了
vals = udp.decode().strip().split(',') # 「,」で分割
dev = check_dev_name(vals[0]) # デバイス名を取得
if dev and len(vals) >= 2: # 取得成功かつ項目2以上
val = get_val(vals[1]) # データ1番目を取得
level = 0 # 温度超過レベル用の変数
for temp in temp_lv: # 警告レベルを取得
if val >= temp: # 温度が警告レベルを超過
level = temp_lv.index(temp) + 1 # レベルを代入
print(
'device =',vals[0],udp_from[0],\
', temperature =',val,\
', level =',level\
) # 温度取得結果を表示
thread = threading.Thread(target=chime, args=([level])) # 関数chime
thread.start() # スレッドchimeの起動
Loading

0 comments on commit e24d76d

Please sign in to comment.