方法 | 参考URLなど | 不安点 |
タイマー式リモコンを使う | エアコン汎用リモコン / オーム電機 http://www.ohm-direct.com/shopdetail/010025000001/ |
計画停電で時間の決まっているときにしか使えない 夕立の雷での停電など突然の停電には対応できない |
専用機器をネットに繋ぐ | HOVICA / 三洋電機 http://www.nabit-ch.jp/sec/sec_remote_rev.html (WEBカメラで温度計を映す) |
機器がもう販売されていない 頻繁にアクセスして確認する必要がある 停電と同時にルータもAPも切断されるため、ネットが不通になるかも・・・ |
HMS-350Y / クールテクノロジーズ http://www.qool-tech.co.jp/product/h350y/index.html |
上記同様、ネットが不通になるかも・・・ 頻繁にメールを確認する必要がある |
・・・ Error [984] C:\Program Files\HI-TECH Software\PICC\9.81\include\pic16f887.h; 439.13 type redeclared Error [1098] C:\Program Files\HI-TECH Software\PICC\9.81\include\pic16f887.h; 439.13 conflicting declarations for variable "T1CONbits" (C:\Program Files\HI-TECH Software\PICC\9.81\include\pic16f886.h:408) Error [984] C:\Program Files\HI-TECH Software\PICC\9.81\include\pic16f887.h; 472.13 type redeclared Advisory[1] too many errors (21) ********** Build failed! ********** |
・・・ Loaded C:\・・・\・・・.cof. ←出来上がったプログラムのパス ********** Build successful! ********** |
Dipスイッチ | 変更前動作 | ⇒ | 変更後動作 |
OFF / OFF | ボタン押下で定義されているコードを送信 | ⇒ | ボタン押下で定義されているコードを送信(コード変更) |
ON / OFF | 受信したコードを保存 | ⇒ | 電源ONになったら自動でコードを送信 |
OFF / ON | 保存したコードを送信 | ||
ON / ON | 受信したコードを表示(NEC:4byte、家電協:6byte 固定) | ⇒ | 受信したコードを表示(24byteまで可変) |
/*==============================================================================*/ /* グローバル変数宣言 */ /*==============================================================================*/ unsigned char rcv_data[TBL_CODE_SIZE]; /* 受信データ */ unsigned char pre_data[TBL_CODE_SIZE]; /* 受信データ比較用 */ unsigned char rx_format; /* 受信データフォーマット種別 */ unsigned char eep_rdata[EEPROM_TABLE_SIZE]; /* EEPROM読出し用RAM領域 */ EEP_DATA eep_wdata; /* EEPROM保存用 RAM領域 */ unsigned char rcv_data_all[24]; // ADD 受信データ24byte対応 ←追加 unsigned char rcvnum; // ADD 受信データ数 ←追加 |
/*==============================================================================*/ /* グローバル変数宣言 */ /*==============================================================================*/ extern unsigned char rcv_data[TBL_CODE_SIZE]; /* IR 受信受信データ */ extern unsigned char pre_data[TBL_CODE_SIZE]; /* IR 比較用データ */ extern unsigned char rx_format; /* IR フォーマット種別 */ extern unsigned char rcv_data_all[24]; // ADD 受信データ24byte対応 ←追加 extern unsigned char rcvnum; // ADD 受信データ数 ←追加 ・・・ /*============================================================================== * MODULE : ir_recieve * FUNCTION : 赤外線受信処理 * ARGUMENT : none * RETURN : 受信状態 * : 対応可能な赤外線フォーマット -> 受信成功 * : 未対応の赤外線フォーマット -> 不明なフォーマット * : リーダーコードの部分が1ms以下 -> ノイズ or リピートコード * NOTE : 受信側では信号が反転しています * : 送信側で Hi の部分が 受信側では Low になります *===============================================================================*/ unsigned char ir_recieve(void) { ・・・ /* 受信データ初期化 */ memset(&rcv_data, 0x00, sizeof(rcv_data)); memset(&rcv_data_all, 0x00, sizeof(rcv_data_all)); ←追加 ・・・ } |
/*============================================================================== * MODULE : ir_recieve * FUNCTION : 赤外線受信処理 * ARGUMENT : none * RETURN : 受信状態 * : 対応可能な赤外線フォーマット -> 受信成功 * : 未対応の赤外線フォーマット -> 不明なフォーマット * : リーダーコードの部分が1ms以下 -> ノイズ or リピートコード * NOTE : 受信側では信号が反転しています * : 送信側で Hi の部分が 受信側では Low になります *===============================================================================*/ unsigned char ir_recieve(void) { unsigned char i, j; ←jを追加 ・・・ /*********************************************************** * データコード判定(デコード) ************************************************************/ s_data = 0x01; /* Shift Data 2byte以上の Shift が出来ない */ /* NEC format */ if (rx_format == FORM_NEC) { // /* 32bit分繰り返す */ // for (i = 0; i < 32; i++) { ←コメントアウト for (i = 0; i < 192; i++) { ←追加(24byte=192bitに変更) ・・・ /* Hi が 1ms 以上続いた -> 1b */ if (TMR1H >= 0x04) { // /* 1byte */ ←コメントアウト(ここから) // if (i<8) { // rcv_data[0] |= ((s_data & 0x01) << (7 - i)); // } // /* 2byte */ // else if (i<16) { // rcv_data[1] |= ((s_data & 0x01) << (7 - (i-8))); // } // /* 3byte */ // else if (i<24) { // rcv_data[2] |= ((s_data & 0x01) << (7 - (i-16))); // } // /* 4byte */ // else { // rcv_data[3] |= ((s_data & 0x01) << (7 - (i-24))); // } ←コメントアウト(ここまで) j = i/8; ←追加 rcv_data_all[j] |= ((s_data & 0x01) << (7 - (i-j*8))); ←追加 } else { ; /* 0b */ } } } /* 家電協 format */ else if (rx_format == FORM_KDN) { // /* 48bit */ // for (i = 0; i < 48; i++) { ←コメントアウト for (i = 0; i < 192; i++) { ←追加(24byte=192bitに変更) ・・・ /* Hi が 800us 以上続いた -> 1b */ if (TMR1H >= 0x03) { // /* 1byte */ ←コメントアウト(ここから) // if (i<8) { // rcv_data[0] |= ((s_data & 0x01) << (7 - i)); // } // /* 2byte */ // else if (i<16) { // rcv_data[1] |= ((s_data & 0x01) << (7 - (i-8))); // } // /* 3byte */ // else if (i<24) { // rcv_data[2] |= ((s_data & 0x01) << (7 - (i-16))); // } // /* 4byte */ // else if (i<32) { // rcv_data[3] |= ((s_data & 0x01) << (7 - (i-24))); // } // /* 5byte */ // else if (i<40) { // rcv_data[4] |= ((s_data & 0x01) << (7 - (i-32))); // } // /* 6byte */ // else { // rcv_data[5] |= ((s_data & 0x01) << (7 - (i-40))); // } ←コメントアウト(ここまで) j = i/8; ←追加 rcv_data_all[j] |= ((s_data & 0x01) << (7 - (i-j*8))); ←追加 } else { ; /* 0b */ } } } ・・・ } |
unsigned char ir_recieve(void) { unsigned char i, j, k; ←kも追加 ・・・ /*********************************************************** * データコード判定(デコード) ************************************************************/ s_data = 0x01; /* Shift Data 2byte以上の Shift が出来ない */ /* NEC format */ if (rx_format == FORM_NEC) { // /* 32bit分繰り返す */ // for (i = 0; i < 32; i++) { // for (i = 0; i < 192; i++) { ←コメントアウト i = 0; ←追加 for(j = 0; j < 24; j++){ ←追加 for(k = 0; k < 8; k++){ ←追加 ・・・ /* Hi が 1ms 以上続いた -> 1b */ if (TMR1H >= 0x04) { // /* 1byte */ ・・・ // j = i/8; ←コメントアウト // rcv_data_all[j] |= ((s_data & 0x01) << (7 - (i-j*8))); ←コメントアウト rcv_data_all[j] |= ((s_data & 0x01) << (7 - (i-(j<<3)))); ←追加 } else { ; /* 0b */ } i++; ←追加 } ←追加 } } /* 家電協 format */ else if (rx_format == FORM_KDN) { // /* 48bit */ // for (i = 0; i < 48; i++) { // for (i = 0; i < 192; i++) { ←コメントアウト i = 0; ←追加 for(j = 0; j < 24; j++){ ←追加 for(k = 0; k < 8; k++){ ←追加 ・・・ /* Hi が 800us 以上続いた -> 1b */ if (TMR1H >= 0x03) { // /* 1byte */ ・・・ // j = i/8; ←コメントアウト // rcv_data_all[j] |= ((s_data & 0x01) << (7 - (i-j*8))); ←コメントアウト rcv_data_all[j] |= ((s_data & 0x01) << (7 - (i-(j<<3)))); ←追加 } else { ; /* 0b */ } i++; ←追加 } ←追加 } } ・・・ } |
unsigned char ir_recieve(void) { unsigned char i, j, k; unsigned char s_data; unsigned char time_out; unsigned long count; ←追加 ・・・ /* NEC format */ if (rx_format == FORM_NEC) { ・・・ i = 0; for(j = 0; j < 24; j++){ for(k = 0; k < 8; k++){ /* 家電協 format は IR_IN : Hi 時間で bit 判定 */ /* 従って、IR_IN の Lo を読み飛ばす */ // while (!(PORTC & 0x01)); ←コメントアウト // Loが8ms以上 -> フレーム終了 ←追加(ここから) count = 0; while(!(PORTC & 0x01)){ count++; if(count >= 3200) goto in_end_nec; } ←追加(ここまで) /* Hi 時間測定開始 -> Timer Reset */ Timer_Reset(); // while (PORTC & 0x01); ←コメントアウト // Loが8ms以上 -> フレーム終了 ←追加(ここから) count = 0; while(PORTC & 0x01){ count++; if(count >= 3200) goto in_end_nec; } ←追加(ここまで) /* Hi が 1ms 以上続いた -> 1b */ ・・・ } } in_end_nec: ←追加 } /* 家電協 format */ else if (rx_format == FORM_KDN) { ・・・ i = 0; for(j = 0; j < 24; j++){ for(k = 0; k < 8; k++){ /* 家電協 format は IR_IN : Hi 時間で bit 判定 */ /* 従って、IR_IN の Lo を読み飛ばす */ // while (!(PORTC & 0x01)); ←コメントアウト // Loが8ms以上 -> フレーム終了 ←追加(ここから) count = 0; while(!(PORTC & 0x01)){ count++; if(count >= 3200) goto in_end_kdn; } ←追加(ここまで) /* Hi 時間測定開始 -> Timer Reset */ Timer_Reset(); // while (PORTC & 0x01); ←コメントアウト // Loが8ms以上 -> フレーム終了 ←追加(ここから) count = 0; while(PORTC & 0x01){ count++; if(count >= 3200) goto in_end_kdn; } ←追加(ここまで) /* Hi が 800us 以上続いた -> 1b */ ・・・ } } in_end_kdn: ←追加 } ・・・ } |
unsigned char ir_recieve(void) { ・・・ /* NEC format */ if (rx_format == FORM_NEC) { ・・・ in_end_nec: rcvnum = i-1; ←追加 } /* 家電協 format */ else if (rx_format == FORM_KDN) { ・・・ in_end_kdn: rcvnum = i-1; ←追加 } // /* IR_IN の Lo を読み飛ばす (STOP Bit) */ ←コメントアウト(ここから) // while (!(PORTC & 0x01)); // /* Hi 時間測定開始 -> Timer Reset */ // Timer_Reset(); // /* STOP bit 以降の Data 送信有無確認 */ // while (PORTC & 0x01) { // /* 規定時間内に Data 無し -> 正常 */ // if (TMR1H >= 0x08) { // return SUCCESS; // } // }; ←コメントアウト(ここまで) // return UNKNOWN; ←コメントアウト return SUCCESS; ←追加 } |
/*============================================================================== * MODULE : lcd_put_text1 * FUNCTION : テキスト を LCD 1行目 へ表示 * ARGUMENT : text : テキスト先頭アドレス * RETURN : none * NOTE : 1行目の左端へ表示 *===============================================================================*/ void lcd_put_text1(unsigned char* text) { unsigned char i; lcd_goto_posi(0x00); for(i = 0; i < 20; i++){ if(text[i] == 0) break; lcd_put_char(text[i]); } return; } |
/*============================================================================== * MODULE : lcd_put_bit * FUNCTION : bit数を 2行目 へ表示 * ARGUMENT : num : bit数(u_char) * RETURN : none *===============================================================================*/ void lcd_put_bit(unsigned char num) { unsigned char i, n; lcd_goto_posi(0x40); if(num >= 100) lcd_put_char(num/100+0x30); if(num >= 10) lcd_put_char((num/10)%10+0x30); lcd_put_char(num%10+0x30); lcd_put_char(' '); lcd_put_char('b'); lcd_put_char('i'); lcd_put_char('t'); return; } |
/*==========================================================================*/ /* プロトタイプ宣言 */ /*==========================================================================*/ ・・・ void toggle_E(void); void lcd_put_text1(unsigned char* text); ←追加 void lcd_put_bit(unsigned char num); ←追加 |
/*============================================================================== * MODULE : main * FUNCTION : IR Remocon リモコンメイン関数 * ARGUMENT : none * RETURN : none * NOTE : none *===============================================================================*/ void main() { ・・・ unsigned char rcvbyte; ←追加 ・・・ /****************************************************************/ /* Dip SW 1:Lo Dip SW 2:Lo ⇒ LCD表示モード */ /****************************************************************/ if ((PORTA & MODE_MASK) == RUN_MODE_4) { /* LCD Initialize */ lcd_init(); // /* IR 比較データ初期化 */ ←コメントアウト // memset(&pre_data, 0x00, sizeof(pre_data)); ←コメントアウト for (;;) { ・・・・ if (ir_state == SUCCESS) { lcd_clear(); /* LCD All Clear */ lcd_put_ir_format(rx_format); /* IR format Type 表示 */ switch (rx_format) { case FORM_NEC: /* 受信コード = NEC format */ /* NEC format の IR 受信データ表示 */ // lcd_put_ir_data(&rcv_data, FORMAT_DISP_SIZE_NEC); ←コメントアウト // break; ←コメントアウト(NECも家電協も同じ処理) case FORM_KDN: /* 受信コード = 家電協 format */ /* 家電協 format の IR 受信データ表示 */ // lcd_put_ir_data(&rcv_data, FORMAT_DISP_SIZE_KDN); ←コメントアウト // 受信バイト数を表示 ←追加(ここから) rcvbyte = (rcvnum+7)/8; lcd_put_bit(rcvnum); for(;;){ /* Key Check */ key_code = key_input_check(); /* Key 押下なし -> CPU Sleep */ if (key_code == KEY_OFF) { /* CPU Sleep -> Wake Up */ cpu_sleep(); } /* Key 押下あり -> 何れかの動作 */ else { // 1〜8byte if(key_code == KEY_CODE05){ lcd_clear(); lcd_put_text1("1-8byte:"); if(rcvbyte > 8) lcd_put_ir_data(&rcv_data_all[0], 8); else lcd_put_ir_data(&rcv_data_all[0], rcvbyte); } // 9〜16byte else if(key_code == KEY_CODE06){ lcd_clear(); lcd_put_text1("9-16byte:"); if(rcvbyte > 16) lcd_put_ir_data(&rcv_data_all[8], 8); else if(rcvbyte > 8) lcd_put_ir_data(&rcv_data_all[8], rcvbyte-8); } // 17〜24byte else if(key_code == KEY_CODE07){ lcd_clear(); lcd_put_text1("17-24byte:"); if(rcvbyte > 24) lcd_put_ir_data(&rcv_data_all[16], 8); else if(rcvbyte > 16) lcd_put_ir_data(&rcv_data_all[16], rcvbyte-16); } // 再度フォーマットと受信bit数を表示 else if(key_code == KEY_CODE08){ lcd_clear(); lcd_put_ir_format(rx_format); lcd_put_bit(rcvnum); } // 次の受信を待つ else if(key_code == KEY_CODE16){ lcd_clear(); break; } } } ←追加(ここまで) break; default: /* 受信コード = 未対応 format */ break; } } else if (ir_state == UNKNOWN) { /* 未対応 format の IR 受信データ表示 */ lcd_clear(); /* LCD All Clear */ lcd_put_ir_format(FORM_UKN); /* IR format Type 表示 */ // lcd_put_ir_data(&rcv_data, FORMAT_DISP_SIZE_UKN); } else { ; /* ノイズの為、もう一度受信処理 */ } /* IR 比較データ保持 */ memcpy(&pre_data, &rcv_data, sizeof(rcv_data)); } } } |
・・・ PICkit 2 Ready |
void main() { ・・・ unsigned char data_on[15] = {0x28, 0xc6, 0x00, 0x08, 0x08, 0x3f, 0x10, 0x0c, 0x86, 0x80, 0x00, 0x00, 0x00, 0x00, 0x76}; // 電源ON ←追加(例) unsigned char data_power[6] = {0x28, 0xc6, 0x00, 0x08, 0x08, 0x90}; // 省エネ ←追加(例) unsigned char data_off[6] = {0x28, 0xc6, 0x00, 0x08, 0x08, 0x40}; // 電源OFF ←追加(例) ・・・ } |
・・・ ↓ 下記2つの関数を追加 /*============================================================================== * MODULE : IR_NEC_format_num * FUNCTION : Dataを NEC formatで 任意byte数出力 * ARGUMENT : *tbl_p : Data の先頭アドレス num : byte数 * RETURN : none * NOTE : none *===============================================================================*/ void IR_NEC_format_num(unsigned char* tbl_p, unsigned char num) { unsigned char i, j; /* Reader Code Output */ IR_NEC_ReaderCode_Send(); /* カスタムコード/データコード (4byte) 出力 */ for (i=0;i<num;i++) { /* 1bit毎にデータ出力 */ for(j=0;j |
/*==============================================================================*/ /* プロトタイプ宣言 */ /*==============================================================================*/ /* NEC format 関連 */ ・・・ void IR_NEC_format_num(unsigned char* tbl_p, unsigned char num); ←追加 /* 家電協 format 関連 */ ・・・ void IR_KDN_format_num(unsigned char* tbl_p, unsigned char num); ←追加 ・・・ |
void main() { ・・・ unsigned char rcvbyte; ←追加 ・・・ /****************************************************************/ /* Dip SW が両方 Hi ⇒ 送信モード */ /****************************************************************/ if ((PORTA & MODE_MASK) == RUN_MODE_1) { /* Function Type Init (Function 1 で初期化) */ func_key_type = KEY_CODE01; /* Function1 LED On */ led_control(LED_MASK); for (;;) { /* Key Check */ key_code = key_input_check(); /* Key 押下なし -> CPU Sleep */ if (key_code == KEY_OFF) { /* CPU Sleep -> Wake Up */ cpu_sleep(); } /* Key 押下あり -> 何れかの動作 */ else { // /* Function Key 押下された */ ←コメントアウト(ここから) // if (key_code <= KEY_CODE04) { // /* Function Type 保持 */ // func_key_type = key_code; // /* 対応した LED On */ // led_control((LED_MASK << key_code)); // } // /* 動作キーが押下された */ // else { // /* 対応したコードを送信 */ // ir_out_start(func_key_type, key_code); // } ←コメントアウト(ここまで) // 電源ON ←追加(ここから) if(key_code == KEY_CODE05){ IR_KDN_format_num(data_on, sizeof(data_on)); } // 省エネ else if(key_code == KEY_CODE06){ IR_KDN_format_num(data_power, sizeof(data_power)); } // 電源OFF else if(key_code == KEY_CODE07){ IR_KDN_format_num(data_off, sizeof(data_off)); } ←追加(ここまで) } } } ・・・ } |
void main() { ・・・ #if 0 ←追加 /****************************************************************/ /* Dip SW 1:Lo Dip SW 2:Hi ⇒ 受信モード (EEPROMへの保存) */ /****************************************************************/ if ((PORTA & MODE_MASK) == RUN_MODE_2) { ・・・ } /****************************************************************/ /* Dip SW 1:Hi Dip SW 2:Lo ⇒ 学習モード (EEPROM Data 送信) */ /****************************************************************/ if ((PORTA & MODE_MASK) == RUN_MODE_3) { ・・・ } #else ←追加 /****************************************************************/ ←追加(ここから) /* Dip SW 1:Lo Dip SW 2:Hi ⇒ 停電対応 */ /* Dip SW 1:Hi Dip SW 2:Lo ⇒ 停電対応 */ /****************************************************************/ if (((PORTA & MODE_MASK) == RUN_MODE_2) || ((PORTA & MODE_MASK) == RUN_MODE_3)) { } ←追加(ここまで) #endif ←追加 ・・・ } |
void main() { ・・・ unsigned long ul; // カウンタ ←追加 unsigned char tmptxt[20]; // LCD表示用テキスト ←追加 unsigned char data_on[15] = {0x28, 0xc6, 0x00, 0x08, 0x08, 0x3f, 0x10, 0x0c, 0x8e, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7a}; // add 電源ON unsigned char data_power[6] = {0x28, 0xc6, 0x00, 0x08, 0x08, 0x90}; // add 省エネ unsigned char data_off[6] = {0x28, 0xc6, 0x00, 0x08, 0x08, 0x40}; // add 電源OFF ・・・ /****************************************************************/ /* Dip SW 1:Lo Dip SW 2:Hi ⇒ 停電対応 */ /* Dip SW 1:Hi Dip SW 2:Lo ⇒ 停電対応 */ /****************************************************************/ if (((PORTA & MODE_MASK) == RUN_MODE_2) || ((PORTA & MODE_MASK) == RUN_MODE_3)) { led_control(ALL_OFF); // LED OFF ←追加(ここから) // LCD表示 lcd_init(); strcpy(tmptxt, "AUTOSW READY"); lcd_put_text1(tmptxt); // 10秒待つ for(ul=0; ul<100; ul++){ __delay_ms(100); } // 電源OFF送信(エラー対応) led_control((LED_MASK << KEY_CODE03)); // LED3 ON IR_KDN_format_num(data_off, sizeof(data_off)); // 電源OFF led_control(ALL_OFF); // LED OFF // 10秒待つ for(ul=0; ul<100; ul++){ __delay_ms(100); } // 電源ON送信 led_control((LED_MASK << KEY_CODE01)); // LED1 ON IR_KDN_format_num(data_on, sizeof(data_on)); // 電源ON led_control(ALL_OFF); // LED OFF // 10分待つ for(ul=0; ul<6000; ul++){ __delay_ms(100); } // 省電力モード送信 led_control((LED_MASK << KEY_CODE02)); // LED2 ON IR_KDN_format_num(data_power, sizeof(data_power)); // 省電力モード led_control(ALL_OFF); // LED OFF // 1時間毎にON送信 for(;;){ // 1時間待つ for(ul=0; ul<36000; ul++){ __delay_ms(100); } // 電源ON送信 led_control((LED_MASK << KEY_CODE01)); // LED1 ON IR_KDN_format_num(data_on, sizeof(data_on)); // 電源ON led_control(ALL_OFF); // LED OFF } ←追加(ここまで) } ・・・ } |
void main() { ・・・ unsigned char cnt; ←追加 ・・・ /****************************************************************/ /* Dip SW が両方 Hi ⇒ 送信モード */ /****************************************************************/ if ((PORTA & MODE_MASK) == RUN_MODE_1) { ・・・ for (;;) { ・・・ /* Key 押下あり -> 何れかの動作 */ else { ・・・ // カウンターリセット ←追加(ここから) else if(key_code == KEY_CODE16){ EEPROM_WRITE(0, 0); } ←追加(ここまで) } } } ・・・ /****************************************************************/ /* Dip SW 1:Lo Dip SW 2:Hi ⇒ 停電対応 */ /* Dip SW 1:Hi Dip SW 2:Lo ⇒ 停電対応 */ /****************************************************************/ if (((PORTA & MODE_MASK) == RUN_MODE_2) || ((PORTA & MODE_MASK) == RUN_MODE_3)) { led_control(ALL_OFF); // LED OFF cnt = EEPROM_READ(0) + 1; // 回数カウンタ ←追加 // LCD表示 lcd_init(); strcpy(tmptxt, "AUTOSW READY"); lcd_put_text1(tmptxt); lcd_put_ir_data(&cnt, 1); ←追加 EEPROM_WRITE(0, cnt); // ON回数をEEPROMに書込 ←追加 ・・・ } ・・・ } |