やりたいこと
・赤外線センサを用いて一定以下の距離になったらms teamsに通知を投稿したい
使うもの、実行環境
- ubuntu22.04
- Ardino IDE
- ESP32 WROOM
- GP2Y0E03(赤外線センサ)
準備
ESP32側
このプログラムを書き込む
isDoorLocked.ino
#include <Wire.h>
//アドレス指定
#define GP2Y0E03_ADDR 0x40
#define DISTANCE_ADDR 0x5E
void setup()
{
Serial.begin(9600); //シリアル通信を9600bpsで初期化
Wire.begin(); //I2Cを初期化
delay(500); //500msec待機(0.5秒待機)
}
void loop()
{
//変数宣言
unsigned int dac[2];
unsigned int i, distance;
Wire.beginTransmission(GP2Y0E03_ADDR); //I2Cスレーブ「Arduino Uno」のデータ送信開始
Wire.write(DISTANCE_ADDR); //距離の測定
Wire.endTransmission(); //I2Cスレーブ「Arduino Uno」のデータ送信終了
Wire.requestFrom(GP2Y0E03_ADDR, 2); //I2Cデバイス「GP2Y0E03」に2Byteのデータ要求
for (i = 0; i < 2; i++)
{
dac[i] = Wire.read(); //dacにI2Cデバイス「GP2Y0E03」のデータ読み込み
}
Wire.endTransmission(); //I2Cスレーブ「Arduino Uno」のデータ送信終了
distance = ((dac[0] * 16 + dac[1]) / 16) / (2 * 2); //距離(cm)を計算
if (distance <= 15)//任意の値。単位はcm
{
Serial.println("Locked");
}
else
{
Serial.println("NotLocked");
}
delay(1000); // 1000msec待機(1秒待機)
}
PC側
teams上のチームにwebhookを設定し、URLを発行する
ESPからのシリアルを読んでHTTP POSTする
notify.py
import serial
import requests
import json
# WebフックURLを設定
WEBHOOK_URL = "https://hogehogefugafuga"
# ESP32とのシリアルポートを開く
ser = serial.Serial("/dev/ttyUSB0", 9600) # '/dev/ttyUSB0'は適切なポートに置き換える
while True:
# ESP32からのデータを読み取る
if ser.in_waiting > 0:
data = ser.readline().decode().strip()
print("Received:", data)
# 受信したデータが指定された命令ならば、WebフックにPOSTリクエストを送信
if data == "the key was Locked!!":
payload = {"text": "the key was locked!!"}
headers = {"Content-Type": "application/json"}
response = requests.post(
WEBHOOK_URL, headers=headers, data=json.dumps(payload)
)
print("Response status code:", response.status_code)
print("Response body:", response.text)
実行してみる
ESP側は書き込んで適当に距離を近づけたり遠ざけたりしていれば良い。
pythonの実行は
sudo python3 serial_data_processor.py
import serialやimport requestsできないというようなライブラリが出た場合、ライブラリが入っていないということなのでpipコマンドでインストールする
pip install pyserial
pip install requests
pipも入っていない場合は先に
sudo apt install python3-pip
を実行してからインストールする。
参考リンク集