温度ロガーに秋月のマイクロSDカードスロットDIP化キット(写真左上に写ってます)を繋いで、ログを記録できるようにしました。
PIC電子工作ブログ
https://pic-garage.blogspot.com/
2025年9月16日火曜日
2ch温度ロガーの製作(2;MicroSDに記録)
2025年9月14日日曜日
2ch温度ロガーの製作
ESP32を使っていますがntpで日付と時刻を取得するためだけで、温度データをWiFiで送るつもりはありません。まだ実装していませんがmicroSDに記録しようと思っています。精度もそれほど必要ではなく、簡易的なロガーです。
温度センサはMCP9700Aという3端子のアナログ出力のものを試しています。温度に比例した電圧がでてくるのでAD変換します。ESP32はAD変換のキャリブレーションがあるようですがまだ調べ切れていません。当初、室内にある温度計より低めの温度がでてきたので、本来の電圧範囲の3.3Vを勝手に3.5Vとして計算してみたらそれっぽい温度を示しました。上の写真はノートパソコンの上に置いたのでちょっと高めになっています。
こんな場当たり的な対策ではダメだと思いますが、取り合えず大まかな温度変化がとれればよいのでひとまずこれで。
2025年9月13日土曜日
丸形蛍光灯をLEDタイプに交換
購入した丸形LEDは、丸形蛍光管の価格とほぼ同じ価格で、30Wが16Wになって約半分の省エネにもなってよい。寿命も通常なら長いはず。照明器具がグロー式(点灯管式)ならグロー管を外すだけで交換可能というもの。
led蛍光灯 丸型 30形 FCL30W代替 30W形相当 G10q口金 丸型蛍光灯 LED グロー式 工事不要
点灯も瞬時になるというが、これまでも電子点灯管を使っていてすぐに点灯していたので、そこはそれほどメリットはない。
カバーをとって蛍光管と点灯管を取り外してみると、内部が蛍光灯の紫外線で結構日焼けしているのが目立つ。このままだとちょっと残念なので、白いラッカースプレーで塗装することにしました。丁度、以前の工作の残っていたスプレーがあったので。
2025年9月7日日曜日
LINEに通知する見守りセンサ(その3;部品配置検討)
2025年9月4日木曜日
タカチのケースを色々購入
久しぶりの雨で少し涼しくなりました。と言っても30度だけど、昨日まで暑すぎたのでこれでも涼しく感じる。
見守りセンサ を入れるために購入したタカチのケースが届いた。右上のケースが第一候補だが、送料を薄めるためにいつか使うだろうと色々買ってみた。幾つかは使わないでデッドストックになりそうだけど。
ショップのメニュー画面では、全て難燃性ABSとなっていたけどパッケージは赤色のみに記載があり、黒文字のものは特に記載なし。本当にすべて難燃性なのか?
今週末は工作の時間が取れるか微妙なので、完成はもうしばらく先になると思う。見守り動作がちゃんと活きているかの確認のためにプログラムも一部見直したい。電源が切れていたり、WiFiの不具合などでメッセージが飛ばないと困る。月に1回程度は人感センサが感知したタイミングで見守り中であることをLINEにメッセージすることで少しは安心。
他にも作りたくなったものがでてきており、頭の中で構想中。週末に手持ちの部品の在庫を確認して具体化するつもり。
2025年8月24日日曜日
LINEに通知する見守りセンサ(その2;プロトタイプ)
久しぶりの電子工作は、テレビドラマにもなっている ひとりでしにたい を読んでから孤独死が気になりだして作った、24時間ひとの動きが無かったときにLINEに通知する見守りセンサです。24時間だと心配なら12時間でもよいけど、ぐっすり寝ていたり冬の寒い時期は12時間くらい動き出さないことがあるかも。まぁこの辺は活動時間などをみて適宜調整。
- お盆のこの時期、見守りセンサを考える 25.08.12
- LINEに通知する見守りセンサ(その1;人感センサ確認) 25.08.23
電源を入れると最初に以下のようなメッセージがLINEに届きます。
以下はテストのために、動きが検出できないまま 1H経過で黄色LED点灯、2H経過で赤色LED点灯とLINEメッセージ送信に設定しています。本番では12H、24Hにします。
//----------------------------------------------------------------------------- // 2025.08.24 naka // LINE通知する見守りセンサ // ・人感センサで活動をモニタリング // ・起動時に見守り開始のメッセージをLINEに送る // ・一定時間(24H)活動がないとメッセージをLINEに送る // ・その後も活動がないと一定時間(24H)毎にメッセージを送り続ける // ・旅行などで不在になる場合は「不在」スイッチを押すと見守り停止 // ・不在から復帰(人感センサが反応)したら、自動的に見守り再開 // ・LED表示で見守り状態を示す // - 緑LED点灯:見守り中、緑LED点滅:不在(見守り停止中) // - 黄LED点灯:12H活動反応なし // - 赤LED点灯:24H活動反応なし、LINEメッセージ送信 //----------------------------------------------------------------------------- #define SENSOR 4 #define SW 5 #define LED_GREEN 15 #define LED_YELLOW 16 #define LED_RED 17 #include <WiFi.h> #include <HTTPClient.h> // LINE messaging API const String token_url = "https://api.line.me/oauth2/v3/token"; const String msg_url = "https://api.line.me/v2/bot/message/broadcast"; const char ssid[] = "XXXXXXXX"; const char password[] = "XXXXXXXXXXXX"; const char channel_id[] = "XXXXXXXXXX"; const char channel_pw[] = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; const String messageBegin = "見守りを開始します。"; const String messageNoactive = "お母さんの活動が24時間不明です。至急連絡してください。"; // Timer setting volatile uint32_t count = 0; volatile uint32_t waitingTimeCount = 0; volatile int status = 0; // 0:見守り中, 1:12時間経過、2:24時間活動なし(メッセージ送信)、3:不在中 //const uint32_t LimitRed = 60 * 60 * 24; // 24時間 //const uint32_t LimitYellow = 60 * 60 * 12; // 12時間 //const uint32_t WaitingTime = 60 * 30; // 30分 不在スイッチを押してからの退出までの待ち時間(不在スイッチを押した直後に人感センサが反応しないように) const uint32_t LimitRed = 60 * 60 * 2; // 2時間 const uint32_t LimitYellow = 60 * 60 * 1; // 1時間 const uint32_t WaitingTime = 60; // 1分 不在スイッチを押してからの退出までの待ち時間(不在スイッチを押した直後に人感センサが反応しないように) hw_timer_t * timer = NULL; void IRAM_ATTR countUp() { if (status<3) count++; // 見守り中, 3:不在中 else if(status==3 && waitingTimeCount>0) waitingTimeCount--; // 不在スイッチを押してからの退出までの待ち時間カウントダウン } void setup() { pinMode(SENSOR, INPUT); pinMode(SW, INPUT); pinMode(LED_GREEN, OUTPUT); pinMode(LED_YELLOW, OUTPUT); pinMode(LED_RED, OUTPUT); digitalWrite(LED_GREEN, LOW); digitalWrite(LED_YELLOW, LOW); digitalWrite(LED_RED, LOW); status = 0; // タイマ割り込み設定 timer = timerBegin(1000000); // Attach onTimer function to our timer. timerAttachInterrupt(timer, &countUp); // Set alarm to call onTimer function every second (value in microseconds). // Repeat the alarm (third parameter) with unlimited count = 0 (fourth parameter). timerAlarm(timer, 1000000, true, 0); // 動作確認のために動作開始メッセージを送る wifi_connect(); // WiFi接続 send_msg2line(messageBegin); // LINE notifyに見守り開始メッセージを送る wifi_disconnect(); // WiFi接続解除 } void loop() { if (waitingTimeCount>0) {} else if (digitalRead(SENSOR)==HIGH) { count = 0; status = 0; } else if (count>LimitYellow && status==0) { status = 1; } else if (count>LimitRed) { count = 0; status = 2; wifi_connect(); // WiFi接続 send_msg2line(messageNoactive); // LINE notifyに活動がない旨のメッセージを送る wifi_disconnect(); // WiFi接続解除 } if (status==0) { digitalWrite(LED_GREEN, HIGH); digitalWrite(LED_YELLOW,LOW); digitalWrite(LED_RED, LOW); } else if (status==1) { digitalWrite(LED_GREEN, LOW); digitalWrite(LED_YELLOW,HIGH); digitalWrite(LED_RED, LOW); } else if (status==2) { digitalWrite(LED_GREEN, LOW); digitalWrite(LED_YELLOW,LOW); digitalWrite(LED_RED, HIGH); } else if (status==3) { blinkLED(LED_GREEN); } // 不在スイッチ確認 if (digitalRead(SW)==LOW) { while(digitalRead(SW)==LOW) delay(10); // チャタリング対策 count = 0; status = 3; waitingTimeCount = WaitingTime; // 待ち時間設定 } } void blinkLED(int LED) { digitalWrite(LED,HIGH); delay(50); digitalWrite(LED,LOW); delay(900); } void wifi_connect() { WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); } // 以下5行は、普通は不要なハズ(我が家のアクセスポイントは無いと繋がらない) IPAddress gateway(192,168,0,1); IPAddress subnet(255,255,255,0); IPAddress dns1(8, 8, 8, 8); // Google DNS primery server IPAddress dns2(8, 8, 4, 4); // Google DNS secondary server WiFi.config(WiFi.localIP(),gateway,subnet,dns1,dns2); } void wifi_disconnect() { WiFi.disconnect(true); } String get_token() { HTTPClient http; http.begin(token_url); http.addHeader("Content-Type","application/x-www-form-urlencoded"); String body = "grant_type=client_credentials&"; body += "client_id=" + String(channel_id) + "&"; body += "client_secret=" + String(channel_pw); int httpCode = http.POST(body); String token=""; if(httpCode == 200){ String S = http.getString(); int i = S.indexOf("\"access_token\""); if((i>0) && (S.substring(i+15, i+16).equals("\""))){ token = S.substring(i+16, i+16+174); } } else{ // エラー:黄色LED 5点滅 blinkLED(LED_YELLOW); blinkLED(LED_YELLOW); blinkLED(LED_YELLOW); blinkLED(LED_YELLOW); blinkLED(LED_YELLOW); } http.end(); return token; } void send_msg2line(String message) { String token = get_token(); if (token.length()!=174) { // エラー:赤色LED 5回点滅 blinkLED(LED_RED); blinkLED(LED_RED); blinkLED(LED_RED); blinkLED(LED_RED); blinkLED(LED_RED); return; } HTTPClient http; http.begin(msg_url); http.addHeader("Content-Type","application/json"); http.addHeader("Authorization","Bearer " + token); String json = "{\"messages\":[{\"type\":\"text\",\"text\":\"" + message + "\"}]}"; http.POST(json); http.end(); } //--------------------------------------------------------------- // EOF //---------------------------------------------------------------
2025年8月23日土曜日
LINEに通知する見守りセンサ(その1;人感センサ確認)
先日思いついたLINEに通知する見守りセンサを作ってみようと、アマゾンで注文した人感センサが届きました。3個で645円なので1個当たり 215円。その昔はパナソニックのNapionというセンサを使いましたが、当時1,000円位していた。精確な特性などは分からないけど、個人の電子工作なら安いモノで十分。
取り合えず人感センサが動くことが分かったので、明日の朝、見守りのプログラムを書いてみようと思います。最近、加齢のためか朝4:00頃に目が覚めてしまう。