赤外線信号を送信し、家電のコントロールを行うためのプログラム。 動作には、赤外線LEDとコントロール用のHTMLが必要です。 注:今のところ安定して動作していません。 朝に電源を入れて、夕方にはサーバが死んでいる状況が続いています。 とりあえず、公開していますが原因究明している段階のモノです。
Dependencies: EthernetNetIf HTTPServer RPCInterface RemoteIR mbed
注:今のところ安定して動作していません。 朝に電源を入れて、夕方にはサーバが死んでいる状況が続いています。 とりあえず、公開していますが原因究明している段階のモノです。
回路図(Circuit)
Ethernetのコネクタの周りが適当です。 自分はスイッチサイエンスさんのmbed用イーサネット接続キットを使用して回路を作りました。
HTML
このプログラムを使用する際に必要なHTMLです。 mbedにプログラムを書き込む際に同じフォルダ下に入れてください。
html
<html> <head> <script src="mbedRPC.js" language="javascript"></script> <script type="text/javascript"> mbed = new HTTPRPC(); light1 = new RPCFunction(mbed,"light1"); light2 = new RPCFunction(mbed,"light2"); aircon = new RPCFunction(mbed,"aircon"); </script> </head> <body> <br> <input type="button" name="Light1 ON" value="Light1 ON" onClick="buttonClicked()"><br> <input type="button" name="Light2 ON" value="Light2 ON" onClick="buttonClicked2()"><br> <input type="button" name="Air-Con ON" value="Air-Con ON" onClick="buttonClickedAir()"><br> <script language="javascript"> function buttonClicked(){ /*alert("送信")*/ light1.run(" "); } function buttonClicked2(){ /*alert("送信")*/ light2.run(" "); } function buttonClickedAir(){ /*alert("送信")*/ aircon.run(" "); } </script> </body> </html>
Diff: main.cpp
- Revision:
- 0:79a0104e2c51
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Mar 02 13:34:04 2014 +0000 @@ -0,0 +1,152 @@ +/** + * RPC Remote + * + * 赤外線信号の送信をRPCを介して送信するプログラム + * (2014年3月2日公開) + * Takumi Okamoto + * 注意:現在の所、安定した動作をしていません。 + * 朝電源を入れて、夕方頃には動作をしていないことが多々あります。 + */ + + +#include "mbed.h" +#include "EthernetNetIf.h" +#include "HTTPServer.h" +#include "TransmitterIR.h" +#include "RPCFunction.h" +#include "RPCVariable.h" + +TransmitterIR ir_tx(p21); +DigitalOut led1(LED1); +DigitalOut led2(LED2); +DigitalOut led3(LED3); +DigitalOut led4(LED4); + +LocalFileSystem fs("webfs"); + + +/* +EthernetNetIf m_Ether( + IpAddr( 192,168, 0, 7 ), // IP Address + IpAddr( 255,255,255, 0 ), // Mask + IpAddr( 192,168, 0, 1 ), // Default Gateway + IpAddr( 192,168, 0, 1 ) // DNS +); +*/ +EthernetNetIf eth; + +HTTPServer svr; + + +/** + * RPCに登録する関数野プロトタイプ宣言 + * RPCに登録できる関数は + * void funtion(char * input, char * output) + * の形 + */ +void irSend(char * input, char * output); +void irSignalSend(char * input , char * output); +void turnONLight1(char * input, char * output); +void turnONLight2(char * input, char * output); +void turnONAirConditioner(char* input,char* output); + +/** + * RPCへの関数の登録 + * RPCFunction rpc_TurnONLight1(関数アドレス,"コールする際のテキスト"); + * TODO sscanf等を使用して、汎用的な赤外線信号の送信関数を作る + */ +RPCFunction rpc_TurnONLight1(&turnONLight1,"light1"); +RPCFunction rpc_TurnONLight2(&turnONLight2,"light2"); +RPCFunction rpc_turnONAirConditioner(&turnONAirConditioner,"aircon"); + +void turnONLight1(char * input, char * output){ + + RemoteIR::Format format = RemoteIR::NEC; + uint8_t buf[] = { 0x82, 0xE8, 0x80, 0x7F };//結局ベタ書きしてます。 + int bitcount = 32; + for(int i=0; i<3 ;i++){ + if (ir_tx.getState() == TransmitterIR::Idle) { + bitcount = ir_tx.setData(format, buf, bitcount); + } + } + led4=1; + wait(0.5); + led4=0; + + printf("light1"); +} + +void turnONLight2(char * input, char * output){ + RemoteIR::Format format = RemoteIR::NEC; + uint8_t buf[] = { 0x82, 0xE8, 0x81, 0x7E };// + int bitcount = 32; + for(int i=0; i<3 ;i++){ + if (ir_tx.getState() == TransmitterIR::Idle) { + bitcount = ir_tx.setData(format, buf, bitcount); + } + } + led4=1; + wait(0.5); + led4=0; + + printf("light2"); +} + +void turnONAirConditioner(char* input,char* output){ + RemoteIR::Format format = RemoteIR::AEHA; + uint8_t buf[] = { + 0x23, 0xCB, 0x26, 0x01, + 0x00, 0x20, 0x08,0x0A, + 0x30, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0xB7 };// + int bitcount = 144; + for(int i=0; i<3 ;i++){ + if (ir_tx.getState() == TransmitterIR::Idle) { + bitcount = ir_tx.setData(format, buf, bitcount); + } + } + led4=1; + wait(0.5); + led4=0; + + printf("aircon"); +} + +/** + * メイン関数 + * + */ +int main() +{ + Base::add_rpc_class<DigitalOut>(); + Base::add_rpc_class<AnalogIn>(); + Base::add_rpc_class<PwmOut>(); + + printf("Setting up...\n"); + + EthernetErr ethErr = eth.setup(); + if(ethErr) { + printf("Error %d in setup.\n", ethErr); + return -1; + } + printf("Setup OK\n"); + IpAddr ip = eth.getIp() ; //IP Address Read + printf(" [%d.%d.%d.%d]\r\n", ip[0], ip[1], ip[2], ip[3] ) ; + + FSHandler::mount("/webfs", "/files"); //Mount /webfs path on /files web path + FSHandler::mount("/webfs", "/"); //Mount /webfs path on web root path + + svr.addHandler<RPCHandler>("/rpc");// /rpcをRPCのパスとして設定 + svr.addHandler<FSHandler>("/files"); + svr.addHandler<FSHandler>("/"); //Default handler + svr.bind(80);// + + printf("Listening...\n"); + + led1 = 0; + while(true) { + Net::poll(); + } +} +