yuyu が 2024年09月20日16時02分57秒 に編集
コメント無し
本文の変更
![キャプションを入力できます](https://camo.elchika.com/2ff094697a71817d598bea5b70b81917822b0d63/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666337646461342d613565632d346262312d616666302d3836316631643265613939372f31336635656331322d363531322d343164662d626236662d303665393133643766366234/) # 概要 田 ん ぼ の 水 路 の 水 位 を リ ア ル タ イ ム で 監 視 し 、 大 雨 や 異 常 な 水 位 変 動が 発 生 し た 場 合 に 、農 家 や 管 理 者 に 通 知 を 送 信 す る こ と で 、適 切 な 対 策を 促 す こ と が で き る 。こ れ に よ っ て 、洪 水 の リ ス ク を 軽 減 し 、農 作 物 の保 護 と 水 管 理 の 効 率 化 を 実 現 し ま す 。 システムイメージ図↓ ![システムイメージ図](https://camo.elchika.com/b7744e50fc261b03b448f4343a2b98cbd1fd4464/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666337646461342d613565632d346262312d616666302d3836316631643265613939372f36343131383036662d383535352d343262362d626564662d623561333236616338633635/) ++追記 現段階で超音波センサで測定した値によって通知を送信することができている。今後、ラズパイを追加してLoRa通信できるように開発していく予定++ # アイデア詳細 今回製作したシステムの基本機能を紹介する - リアルタイム水位監視:超音波センサで水面までの距離を定期的に測定し、データをラズパイに送信する。 - 自動警告通知システム:測定した距離から異常な水位上昇を検知するとLineNotifyを通じて警告を通知する。 - 履 歴 デ ー タ の 記 録 : 測 定 デ ー タ を 保 存 し 、長 期 的 な 水 位 の 変 動 を可 視 化する。 全 体 の 処 理 の 流 れ と し て は 、常 時 ラ ズ パ イ と 接 続 し て い る 超 音 波 距離セン サ ー モ ジ ュ ー ル で 水 路 の 水 位 を 測 定 し 、 CSV フ ァ イ ル に 保 存 し 、1分ごとにLineに送信されます。 ま た 、 測 定 し た 値 が 基 準 値 を 超 え る と 水 位 が 危 険 な 状 態 と 判 断 し て 、LoRa で ラ ズ パ イ 間 を 通 信 し 、 ラ ズ パ イ か ら ス マ ホ へ と LineNotify を通 じ て 通 知 を 送 信 し ま す 。 # 使用した部品 今回の製作で使用した部品を紹介する - Raspberry pi 4 × 2 - 超音波センサ(AJ-SR04M) - ブレッドボード - LoRaモジュール - 配線(ジャンパー線など) # 接続 接続方法は以下の通りになっていて、ジャンパー線でブレッドボードを介して直接接続している。 |センサ側|ラズパイ側| |---|---| |AJ-SR04M|Raspberru Pi 4| |5V|5V| |Trig|Pin 15| |Echo|Pin 14| |GND|GND| 接続図↓ ![接続図](https://camo.elchika.com/459777c1c52b0e43b9872bb497c78828ba7b2af1/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666337646461342d613565632d346262312d616666302d3836316631643265613939372f31333330666636352d346361362d343236302d393735612d366463306335303735363332/) # ソースコード ラズパイのプログラムになります ```python:センサ動作プログラム import RPi.GPIO as GPIO import time import requests import csv import os # GPIOの設定 GPIO.setmode(GPIO.BCM) TRIG = 15 ECHO = 14 GPIO.setup(TRIG, GPIO.OUT) GPIO.setup(ECHO, GPIO.IN) # Line Notifyのアクセストークン LINE_NOTIFY_TOKEN = 'hOdOkw102GSfYQdMCWXzheXXobOBkV2lW2PwempGOUA' LINE_NOTIFY_URL = 'https://notify-api.line.me/api/notify' # CSVファイルの設定 csv_file = 'sensor_data.csv' # CSVファイルの初期化 with open(csv_file, mode='w', newline='') as file: writer = csv.writer(file) writer.writerow(['Time', 'Distance (cm)']) # ヘッダー def send_line_notify(message, token): headers = { 'Authorization': f'Bearer {token}', 'Content-Type': 'application/x-www-form-urlencoded' } payload = {'message': message} response = requests.post(LINE_NOTIFY_URL, headers=headers, data=payload) return response def get_distance(): GPIO.output(TRIG, False) time.sleep(2) GPIO.output(TRIG, True) time.sleep(0.00001) GPIO.output(TRIG, False) start_time = time.time() stop_time = time.time() while GPIO.input(ECHO) == 0: start_time = time.time() while GPIO.input(ECHO) == 1: stop_time = time.time() time_elapsed = stop_time - start_time distance = (time_elapsed * 34300) / 2 return distance def read_csv(): with open(csv_file, mode='r') as file: reader = csv.reader(file) next(reader) # ヘッダーをスキップ data = [row for row in reader] return data try: while True: distance = get_distance() current_time = time.strftime('%Y-%m-%d %H:%M:%S') with open(csv_file, mode='a', newline='') as file: writer = csv.writer(file) writer.writerow([current_time, distance]) # データ行の追加 print(f"距離: {distance:.2f} cm") if distance > 30: message = f"警告: 距離が {distance:.2f} cm を超えました!" response = send_line_notify(message, LINE_NOTIFY_TOKEN) if response.status_code == 200: print("通知が送信されました") else: print("通知の送信に失敗しました") # CSVの内容をLINEに送信 if time.time() % 60 < 1: # 1分ごとに送信 csv_data = read_csv() message = "センサーデータ:\n" + "\n".join([f"{row[0]}: {row[1]} cm" for row in csv_data]) response = send_line_notify(message, LINE_NOTIFY_TOKEN) if response.status_code == 200: print("データが送信されました" else: print("データ送信に失敗しました") time.sleep(1) except KeyboardInterrupt: print("プログラムが中断されました") finally: GPIO.cleanup() ``` ```python:超音波センサ動作確認プログラム import RPi.GPIO as GPIO import time # GPIOの設定 GPIO.setmode(GPIO.BCM) TRIG = 15 ECHO = 14 GPIO.setup(TRIG, GPIO.OUT) GPIO.setup(ECHO, GPIO.IN) def get_distance(): # センサーの初期化 GPIO.output(TRIG, False) time.sleep(2) # トリガー信号を発信 GPIO.output(TRIG, True) time.sleep(0.00001) GPIO.output(TRIG, False) start_time = time.time() stop_time = time.time() # エコー信号の開始と終了を計測 while GPIO.input(ECHO) == 0: start_time = time.time() while GPIO.input(ECHO) == 1: stop_time = time.time() # 時間差を計算し、距離を算出 time_elapsed = stop_time - start_time distance = (time_elapsed * 34300) / 2 return distance try: while True: distance = get_distance() print(f"距離: {distance:.2f} cm") time.sleep(1) except KeyboardInterrupt: print("プログラムが中断されました") finally: GPIO.cleanup() ```
==これから LoRaを用いた遠距離通信に挑戦していく予定==
# 参考文献 - ラズパイ搭載 長距離無線通信ドローンの作成とアドホックネットワークの構築 [https://qiita.com/YU_GENE/items/3c96d6f1a75299789700](https://qiita.com/YU_GENE/items/3c96d6f1a75299789700) - 防 水 型 超 音 波 セ ン サ モ ジ ュ ー ル J S N - S R 0 4 T と A r d u i n o U N O で 距 離 推 定 し て 遊 ん で み た [https://tmoribanner.hateblo.jp/entry/2020/03/15/211023](https://tmoribanner.hateblo.jp/entry/2020/03/15/211023)