スマホで家電をON/OFFする


PiMoteと いう製品を見つけました。
この製品は電波を使って、離れたところのコンセントをON/OFFできる製品ですが、日本には電波法があるので
国内で使えるかどうか不明です。

そこで、リモコンコンセント(OCR-05)を使ったリモート電源制御を紹介し ます。


リモコンの学習や赤外線赤外部の回路図はこちらと同じです。

スマホから「WebIOPi」を使ってGPIOをON/OFFし、Raspberry側ではGPIOの状態を監視して
GPIOの状態に応じて、irsendコマンドを実行すれば、電源のON/OFFを行うことができます。
また、最近「Blynk」というスマホのアプリが発表されて話題になっていますが、
こちらでも簡単にGPIOをON/OFFすることができます。

「WebIOPi」はこ ちらのページに詳しく紹介されています。

参考までにGPIO23(16番ピン)を監視してリモコンコンセントをON/OFFするコードを以下に紹介します。
無駄に永久ループするのが嫌だったので、セマフォと割り込み処理を使っています。

このプログラムを動かした後、「WebIOPi」を使ってGPIO23(16番ピン)を出力モードに変更し、
GPIO23(16番ピン)をON/OFFするとリモコンコンセントがON/OFFします。





/*
cc -o ocr05 ocr05.c -lwiringPi
*/
#include <stdlib.h>
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <string.h>
#include <signal.h>
#include <wiringPi.h>

// Define Button Pin
#define BUTTON    23      // rsp board pin:16

int semid;

//排他処理開始(ロック開始)
//自分よりも先にロックされていた場合にはロック解除されるまでスリープします
void lock(int semid){
    struct sembuf sb[1];
    sb[0].sem_num=0;
    sb[0].sem_op=-1;
    sb[0].sem_flg=0;
    if(EOF==semop(semid,sb,1)){
      printf("%s\n","lock ERR");
      exit(1);
    }
}

//排他処理終了(ロック解除)
void unlock(int semid){
    struct sembuf sb[1];
    sb[0].sem_num=0;
    sb[0].sem_op=1;
    sb[0].sem_flg=0;
    if(EOF==semop(semid,sb,1)){
      printf("%s\n","unlock ERR");
      exit(1);
    }
}

//セマフォ値のセット
void SemSetValue(int semid, int semnum, int semval) {
    union semun {
      int              val;     /* SETVAL の値 */
      struct semid_ds  *buf;    /* IPC_STAT, IPC_SET 用のバッファ */
      unsigned short   *array;  /* GETALL, SETALL 用の配列 */
    } ctl_arg;

    ctl_arg.val = semval;
    if((semctl(semid,semnum,SETVAL,ctl_arg))==EOF){
      printf("%s\n","semctl ERR");
      exit(1);
    }
}

//割り込み処理
void signal0(void){
    unlock(semid);
}

int main(int argc, char **argv) {
    int val;
    char on[40];
    char off[40];

    //セマフォを割り付けます
    semid=semget(IPC_PRIVATE,1,0666);
    if(semid==EOF){
      printf("%s\n","semget ERR");
      exit(1);
    }

    //セマフォに初期値を書き込みます
    SemSetValue(semid,0,0);

    //リモコンコマンド
    strcpy(on,"irsend SEND_ONCE OCR05 ON");
    strcpy(off,"irsend SEND_ONCE OCR05 OFF");

    if (wiringPiSetupGpio() == -1){
      printf("wiringPiSetup init error\n");
      exit(1);
    }
    pinMode(BUTTON, OUTPUT);

    //割り込みを設定します
    wiringPiISR( BUTTON, INT_EDGE_BOTH, signal0 );

    while(1){
      lock(semid); // Wait Unlock
      val=digitalRead(BUTTON);
      if (val == 0) system(off);
      if (val == 1) system(on);
    }

    //セマフォの削除
    if((semctl(semid,0,IPC_RMID,0))==EOF){
        printf("%s\n","semctl ERR");
        exit(1);
    }

    exit(0);
}

これでWifiが届く範囲にある家電はスマホなどからRaspberry経由で電源をON/OFFできるようになります。