はじめに
プログラミングとはほぼ無縁な職業についているのですが、学生のころからプログラミングに興味があり、少しずついろいろなものをかじってきました。
最近、「インターホンが押されたらDiscordに通知を送る」装置の記事を何かで読み、これなら私でも作れそうかも、と思い立ってESP32開発ボードを購入しました。
最終的な目標は「設定された時刻にDHT22で温度と湿度を計測し、LINEで通知する」ものの作成です。
まずは手始めに「BOOTボタンを押したらLINE通知」を作成してみました。
その1 環境設定
これについては省略します。Windowsとmacの両方で環境を作りました。
macでやっているとなんだかかっこよく思えたためです。
その2 コード設計
これも、いろいろなサイトを巡回して使えそうなものをかき集め、あとは少しだけ手を加えただけで完成しました。
便利な時代になったものです。
#include <WiFi.h>
#include <WiFiClientSecure.h>
// WiFi設定
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PW";
// Bootボタンを設定
const int swPin = 0;
// LINE Notify設定
const char* host = "notify-api.line.me";
const char* token = "YOUR_TOKEN";
const char* message = "押されたぜ!";
// もろもろ設定
void setup()
{
Serial.begin(115200);
delay(10);
// WiFi接続
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
// Bootボタンを入力状態にする
pinMode(swPin, INPUT_PULLUP);
}
// line通知
void send_line() {
// HTTPSへアクセス(SSL通信)するためのライブラリ
WiFiClientSecure client;
// サーバー証明書の検証を行わずに接続する場合に必要
client.setInsecure();
Serial.println("Try");
//LineのAPIサーバにSSL接続(ポート443:https)
if (!client.connect(host, 443)) {
Serial.println("Connection failed");
return;
}
Serial.println("Connected");
// リクエスト送信
String query = String("message=") + String(message);
String request = String("") +
"POST /api/notify HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Authorization: Bearer " + token + "\r\n" +
"Content-Length: " + String(query.length()) + "\r\n" +
"Content-Type: application/x-www-form-urlencoded\r\n\r\n" +
query + "\r\n";
client.print(request);
// 受信完了まで待機
while (client.connected()) {
String line = client.readStringUntil('\n');
if (line == "\r") {
break;
}
}
String line = client.readStringUntil('\n');
Serial.println(line);
}
// スイッチの変数宣言
int sw_val = 0;
void loop()
{
// put your main code here, to run repeatedly:
int sw_state = digitalRead(swPin);
if (sw_state==LOW){
send_line();
}
}
その3 書き込み
とりあえず、これを書き込んでからBOOTボタンを押すと、設定したLINEの宛先にメッセージが飛ぶはずです。
あとは、これを「設定した時刻に」「DHT22で計測した温度と湿度を」送信するように直せば当初の思惑通りのものができるはず、です。
その4 謎
- 通信速度?を115200に設定するのはなぜ?文字化けするから?