椅子に座ったら自動点灯
最近、不便に思っていたこと。
ラズベリーパイで家の照明を自動化したのは良いものの、消灯点灯の時間が自分の不規則な活動に合わず、0時を過ぎたら再点灯、朝5時に起きたら、Siriに頼んで点灯なんてことになっていました。
ヘイSiri、部屋点灯。と言っても、滑舌が悪いせいか、 わけの分からない温泉のサイトを提示してきたり、ホームアクセサリーキットがインストールされてませんとか余計な気を回してきたりと不満は募るばかりでした。
父が寝たきりになり、直線型人感センサーフレームが不要になったことで、自部屋で再利用しようと考えました。
その名も、椅子に座ったら部屋点灯プロジェクト。
さっそく屋根裏の初代ラズパイを引っ剥がしてきました。
トイレのセンサーログをDBに記録し続けるだけになっていた 1号機
去年の7月で、スクリプトが停止していたようです。
3年間、28000件のビッグデータとさようならしました。
PICで信号コントロール
信号コントロールもラズパイでやれば良いんですけど、せっかく作ったものがあるので再利用。
1年ぶりくらいにPICライターを引っ張りだして、センサーの信号コントロールプログラムを書き込みました。
ほとんどやり方を忘れてましたけど、資料化しておいたのでスムーズにいきました。
昔、エクセルで作ったやつ
プルダウン抵抗を付けないと、ONかOFFか認識出来なくなるんでしたよね。
PIC12F683のソースコード
/*
* File: main.c
* Author: kajiy
*
* Created on 2018/07/04, 6:52
* テスト
* GP3に入力があるとGP0に出力するサンプル
*/
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <PIC12F683.h>
#pragma config MCLRE = OFF // リセットスイッチ不使用
#pragma config WDTE = OFF // ウォッチドッグタイマOFF
#pragma config PWRTE = ON // パワーアップタイマーON
#pragma config BOREN = OFF // ブラウンアウトOFF
#pragma config CP = OFF // プログラムプロテクトOFF
#pragma config IESO = OFF // 2段階クロックOFF
#pragma config FCMEN = OFF // バックアップクロックOFF
#pragma config FOSC = INTOSCIO // 3番ピンをGP4として扱う(内部クロック使用)
#define _XTAL_FREQ 1000000 // 周波数1MHz(__delay_ms用)
unsigned int adconv();
unsigned int tmp;
unsigned int i;
unsigned int cnt; // 時間カウント
unsigned int tm; // 点灯時間
unsigned int mcnt; // 再点灯防止カウント
unsigned int flag; // 点灯フラグ
/*
*
*/
int main(int argc, char** argv) {
OSCCON = 0x40; // 内部クロック1MHz
ANSEL = 0; // アナログなし
// ANSEL = 0b00001000; // GP4/AN3がアナログ入
CMCON0 = 0x07; // コンパレータOFF
TRISIO = 0b00010000; // GP4を入力として扱う
WPU4 = 1;
// GP3(一番右下)に入力があった場合、GP0(左上2番目に5V出力)
cnt = 0;
tm = 0;
while(1){
// tmp = adconv();
// GP4 = 人感センサーからの入力
// tm = 点灯していた時間だけ消灯までの時間を延長する(最長10分)
if (GP4 == 1){
GP0 = 1;
flag = 1;
cnt = 600 + tm;
if(tm < 6000)
tm++;
}else{
if(cnt == 0){
// 切れてから五秒間は点かないようにする(照度切り替わり防止)
if(flag == 1){
GP0 = 0;
flag = 0;
tm = 0;
for(mcnt=0; mcnt<50; mcnt++){
__delay_ms(100) ;
}
}
}else{
cnt--;
if(tm < 6000)
tm++;
}
}
__delay_ms(100) ; // 500ms????
}
return (EXIT_SUCCESS);
}
unsigned int adconv()
{
ADCON0 = 0b10001101; //右詰,基準電圧はVdd,GP4/AN3の入力をA/D変換
__delay_us(25);
GO=1;
while(GO);
return (ADRESH<<8)+ADRESL;
}
通りすがった場合は1分程で消えて、頻繁に活動中なら最大10分まで点灯を延長するプログラムです。
最初はディレイ関数で長時間スリープ出来ないことに悩んだんですけど、短いディレイをループで回すだけで良かったんですよね。
信号はGP4で受けて、GP0でラズパイに出力します。
出力は5Vから3.3Vに落とすために、2.2Kと3.3KΩの抵抗で分圧します。
センサーを試運転
うまくLEDを光らせることが出来ました。
見よこのセンサーフレーム、M3六角穴まで開けてます。
強力両面テープでタンスに貼り付けて、椅子を監視させます。
爆弾魔みたいなデスクトップになってしまったけど気にしない。
ラズパイ側のプログラム
照明管理のラズパイはHTTP経由でコマンドを処理できるようになっているので、初代ラズパイからローカルURLにコマンドを送信するだけです。
初代ラズパイからrequests.get(‘URL’)を呼び出し、照明管理ラズパイはそのコマンドを処理します。
流れとしては、
- 人感センサーに反応がある
- PICを挟んでラズパイ1に信号が出る。
- ラズパイ1は照明ラズパイ2にwifi経由でリクエストを出す。(requests.get(‘http://192.168.1.XX:8090/XXXX.php?command=sensoron’))
- ラズパイ2のphpがコマンドをそのままファイルとして書き出す。
- スクリプトがファイルを監視し、ファイルが存在すればコマンドを読み取り削除
- ラズパイ2はコマンドに書かれている内容のGPIOを操作する
- PICからセンサーの信号が送られてこなくなる
- ラズパイ1は照明ラズパイ2にwifi経由でリクエストを出す。(requests.get(‘http://192.168.1.XX:8090/XXXX.php?command=sensoroff’))
- 消灯
と言った流れ。
VNCViewerで2台のラズパイの動作確認をします。
問題なく動きました。
22時の自動消灯にすることで、早めに寝るときもいちいちSiriを呼び出さずに済みそうです。
結果
大体2時間ほどで完成。
布団から起き上がり、椅子に腰掛けるとピッと部屋の電気が点く。
もう最高です。
時間による点灯信号も出さなくて良いような気がしてきました。
(ずっとPC前に張り付いてるやつ)
最近のコメント