赤外線信号を送信し、家電のコントロールを行うためのプログラム。 動作には、赤外線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>
main.cpp@0:79a0104e2c51, 2014-03-02 (annotated)
- Committer:
- MrBearing
- Date:
- Sun Mar 02 13:34:04 2014 +0000
- Revision:
- 0:79a0104e2c51
First Commit this program
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MrBearing | 0:79a0104e2c51 | 1 | /** |
MrBearing | 0:79a0104e2c51 | 2 | * RPC Remote |
MrBearing | 0:79a0104e2c51 | 3 | * |
MrBearing | 0:79a0104e2c51 | 4 | * 赤外線信号の送信をRPCを介して送信するプログラム |
MrBearing | 0:79a0104e2c51 | 5 | * (2014年3月2日公開) |
MrBearing | 0:79a0104e2c51 | 6 | * Takumi Okamoto |
MrBearing | 0:79a0104e2c51 | 7 | * 注意:現在の所、安定した動作をしていません。 |
MrBearing | 0:79a0104e2c51 | 8 | * 朝電源を入れて、夕方頃には動作をしていないことが多々あります。 |
MrBearing | 0:79a0104e2c51 | 9 | */ |
MrBearing | 0:79a0104e2c51 | 10 | |
MrBearing | 0:79a0104e2c51 | 11 | |
MrBearing | 0:79a0104e2c51 | 12 | #include "mbed.h" |
MrBearing | 0:79a0104e2c51 | 13 | #include "EthernetNetIf.h" |
MrBearing | 0:79a0104e2c51 | 14 | #include "HTTPServer.h" |
MrBearing | 0:79a0104e2c51 | 15 | #include "TransmitterIR.h" |
MrBearing | 0:79a0104e2c51 | 16 | #include "RPCFunction.h" |
MrBearing | 0:79a0104e2c51 | 17 | #include "RPCVariable.h" |
MrBearing | 0:79a0104e2c51 | 18 | |
MrBearing | 0:79a0104e2c51 | 19 | TransmitterIR ir_tx(p21); |
MrBearing | 0:79a0104e2c51 | 20 | DigitalOut led1(LED1); |
MrBearing | 0:79a0104e2c51 | 21 | DigitalOut led2(LED2); |
MrBearing | 0:79a0104e2c51 | 22 | DigitalOut led3(LED3); |
MrBearing | 0:79a0104e2c51 | 23 | DigitalOut led4(LED4); |
MrBearing | 0:79a0104e2c51 | 24 | |
MrBearing | 0:79a0104e2c51 | 25 | LocalFileSystem fs("webfs"); |
MrBearing | 0:79a0104e2c51 | 26 | |
MrBearing | 0:79a0104e2c51 | 27 | |
MrBearing | 0:79a0104e2c51 | 28 | /* |
MrBearing | 0:79a0104e2c51 | 29 | EthernetNetIf m_Ether( |
MrBearing | 0:79a0104e2c51 | 30 | IpAddr( 192,168, 0, 7 ), // IP Address |
MrBearing | 0:79a0104e2c51 | 31 | IpAddr( 255,255,255, 0 ), // Mask |
MrBearing | 0:79a0104e2c51 | 32 | IpAddr( 192,168, 0, 1 ), // Default Gateway |
MrBearing | 0:79a0104e2c51 | 33 | IpAddr( 192,168, 0, 1 ) // DNS |
MrBearing | 0:79a0104e2c51 | 34 | ); |
MrBearing | 0:79a0104e2c51 | 35 | */ |
MrBearing | 0:79a0104e2c51 | 36 | EthernetNetIf eth; |
MrBearing | 0:79a0104e2c51 | 37 | |
MrBearing | 0:79a0104e2c51 | 38 | HTTPServer svr; |
MrBearing | 0:79a0104e2c51 | 39 | |
MrBearing | 0:79a0104e2c51 | 40 | |
MrBearing | 0:79a0104e2c51 | 41 | /** |
MrBearing | 0:79a0104e2c51 | 42 | * RPCに登録する関数野プロトタイプ宣言 |
MrBearing | 0:79a0104e2c51 | 43 | * RPCに登録できる関数は |
MrBearing | 0:79a0104e2c51 | 44 | * void funtion(char * input, char * output) |
MrBearing | 0:79a0104e2c51 | 45 | * の形 |
MrBearing | 0:79a0104e2c51 | 46 | */ |
MrBearing | 0:79a0104e2c51 | 47 | void irSend(char * input, char * output); |
MrBearing | 0:79a0104e2c51 | 48 | void irSignalSend(char * input , char * output); |
MrBearing | 0:79a0104e2c51 | 49 | void turnONLight1(char * input, char * output); |
MrBearing | 0:79a0104e2c51 | 50 | void turnONLight2(char * input, char * output); |
MrBearing | 0:79a0104e2c51 | 51 | void turnONAirConditioner(char* input,char* output); |
MrBearing | 0:79a0104e2c51 | 52 | |
MrBearing | 0:79a0104e2c51 | 53 | /** |
MrBearing | 0:79a0104e2c51 | 54 | * RPCへの関数の登録 |
MrBearing | 0:79a0104e2c51 | 55 | * RPCFunction rpc_TurnONLight1(関数アドレス,"コールする際のテキスト"); |
MrBearing | 0:79a0104e2c51 | 56 | * TODO sscanf等を使用して、汎用的な赤外線信号の送信関数を作る |
MrBearing | 0:79a0104e2c51 | 57 | */ |
MrBearing | 0:79a0104e2c51 | 58 | RPCFunction rpc_TurnONLight1(&turnONLight1,"light1"); |
MrBearing | 0:79a0104e2c51 | 59 | RPCFunction rpc_TurnONLight2(&turnONLight2,"light2"); |
MrBearing | 0:79a0104e2c51 | 60 | RPCFunction rpc_turnONAirConditioner(&turnONAirConditioner,"aircon"); |
MrBearing | 0:79a0104e2c51 | 61 | |
MrBearing | 0:79a0104e2c51 | 62 | void turnONLight1(char * input, char * output){ |
MrBearing | 0:79a0104e2c51 | 63 | |
MrBearing | 0:79a0104e2c51 | 64 | RemoteIR::Format format = RemoteIR::NEC; |
MrBearing | 0:79a0104e2c51 | 65 | uint8_t buf[] = { 0x82, 0xE8, 0x80, 0x7F };//結局ベタ書きしてます。 |
MrBearing | 0:79a0104e2c51 | 66 | int bitcount = 32; |
MrBearing | 0:79a0104e2c51 | 67 | for(int i=0; i<3 ;i++){ |
MrBearing | 0:79a0104e2c51 | 68 | if (ir_tx.getState() == TransmitterIR::Idle) { |
MrBearing | 0:79a0104e2c51 | 69 | bitcount = ir_tx.setData(format, buf, bitcount); |
MrBearing | 0:79a0104e2c51 | 70 | } |
MrBearing | 0:79a0104e2c51 | 71 | } |
MrBearing | 0:79a0104e2c51 | 72 | led4=1; |
MrBearing | 0:79a0104e2c51 | 73 | wait(0.5); |
MrBearing | 0:79a0104e2c51 | 74 | led4=0; |
MrBearing | 0:79a0104e2c51 | 75 | |
MrBearing | 0:79a0104e2c51 | 76 | printf("light1"); |
MrBearing | 0:79a0104e2c51 | 77 | } |
MrBearing | 0:79a0104e2c51 | 78 | |
MrBearing | 0:79a0104e2c51 | 79 | void turnONLight2(char * input, char * output){ |
MrBearing | 0:79a0104e2c51 | 80 | RemoteIR::Format format = RemoteIR::NEC; |
MrBearing | 0:79a0104e2c51 | 81 | uint8_t buf[] = { 0x82, 0xE8, 0x81, 0x7E };// |
MrBearing | 0:79a0104e2c51 | 82 | int bitcount = 32; |
MrBearing | 0:79a0104e2c51 | 83 | for(int i=0; i<3 ;i++){ |
MrBearing | 0:79a0104e2c51 | 84 | if (ir_tx.getState() == TransmitterIR::Idle) { |
MrBearing | 0:79a0104e2c51 | 85 | bitcount = ir_tx.setData(format, buf, bitcount); |
MrBearing | 0:79a0104e2c51 | 86 | } |
MrBearing | 0:79a0104e2c51 | 87 | } |
MrBearing | 0:79a0104e2c51 | 88 | led4=1; |
MrBearing | 0:79a0104e2c51 | 89 | wait(0.5); |
MrBearing | 0:79a0104e2c51 | 90 | led4=0; |
MrBearing | 0:79a0104e2c51 | 91 | |
MrBearing | 0:79a0104e2c51 | 92 | printf("light2"); |
MrBearing | 0:79a0104e2c51 | 93 | } |
MrBearing | 0:79a0104e2c51 | 94 | |
MrBearing | 0:79a0104e2c51 | 95 | void turnONAirConditioner(char* input,char* output){ |
MrBearing | 0:79a0104e2c51 | 96 | RemoteIR::Format format = RemoteIR::AEHA; |
MrBearing | 0:79a0104e2c51 | 97 | uint8_t buf[] = { |
MrBearing | 0:79a0104e2c51 | 98 | 0x23, 0xCB, 0x26, 0x01, |
MrBearing | 0:79a0104e2c51 | 99 | 0x00, 0x20, 0x08,0x0A, |
MrBearing | 0:79a0104e2c51 | 100 | 0x30, 0x40, 0x00, 0x00, |
MrBearing | 0:79a0104e2c51 | 101 | 0x00, 0x00, 0x00, 0x00, |
MrBearing | 0:79a0104e2c51 | 102 | 0x00, 0xB7 };// |
MrBearing | 0:79a0104e2c51 | 103 | int bitcount = 144; |
MrBearing | 0:79a0104e2c51 | 104 | for(int i=0; i<3 ;i++){ |
MrBearing | 0:79a0104e2c51 | 105 | if (ir_tx.getState() == TransmitterIR::Idle) { |
MrBearing | 0:79a0104e2c51 | 106 | bitcount = ir_tx.setData(format, buf, bitcount); |
MrBearing | 0:79a0104e2c51 | 107 | } |
MrBearing | 0:79a0104e2c51 | 108 | } |
MrBearing | 0:79a0104e2c51 | 109 | led4=1; |
MrBearing | 0:79a0104e2c51 | 110 | wait(0.5); |
MrBearing | 0:79a0104e2c51 | 111 | led4=0; |
MrBearing | 0:79a0104e2c51 | 112 | |
MrBearing | 0:79a0104e2c51 | 113 | printf("aircon"); |
MrBearing | 0:79a0104e2c51 | 114 | } |
MrBearing | 0:79a0104e2c51 | 115 | |
MrBearing | 0:79a0104e2c51 | 116 | /** |
MrBearing | 0:79a0104e2c51 | 117 | * メイン関数 |
MrBearing | 0:79a0104e2c51 | 118 | * |
MrBearing | 0:79a0104e2c51 | 119 | */ |
MrBearing | 0:79a0104e2c51 | 120 | int main() |
MrBearing | 0:79a0104e2c51 | 121 | { |
MrBearing | 0:79a0104e2c51 | 122 | Base::add_rpc_class<DigitalOut>(); |
MrBearing | 0:79a0104e2c51 | 123 | Base::add_rpc_class<AnalogIn>(); |
MrBearing | 0:79a0104e2c51 | 124 | Base::add_rpc_class<PwmOut>(); |
MrBearing | 0:79a0104e2c51 | 125 | |
MrBearing | 0:79a0104e2c51 | 126 | printf("Setting up...\n"); |
MrBearing | 0:79a0104e2c51 | 127 | |
MrBearing | 0:79a0104e2c51 | 128 | EthernetErr ethErr = eth.setup(); |
MrBearing | 0:79a0104e2c51 | 129 | if(ethErr) { |
MrBearing | 0:79a0104e2c51 | 130 | printf("Error %d in setup.\n", ethErr); |
MrBearing | 0:79a0104e2c51 | 131 | return -1; |
MrBearing | 0:79a0104e2c51 | 132 | } |
MrBearing | 0:79a0104e2c51 | 133 | printf("Setup OK\n"); |
MrBearing | 0:79a0104e2c51 | 134 | IpAddr ip = eth.getIp() ; //IP Address Read |
MrBearing | 0:79a0104e2c51 | 135 | printf(" [%d.%d.%d.%d]\r\n", ip[0], ip[1], ip[2], ip[3] ) ; |
MrBearing | 0:79a0104e2c51 | 136 | |
MrBearing | 0:79a0104e2c51 | 137 | FSHandler::mount("/webfs", "/files"); //Mount /webfs path on /files web path |
MrBearing | 0:79a0104e2c51 | 138 | FSHandler::mount("/webfs", "/"); //Mount /webfs path on web root path |
MrBearing | 0:79a0104e2c51 | 139 | |
MrBearing | 0:79a0104e2c51 | 140 | svr.addHandler<RPCHandler>("/rpc");// /rpcをRPCのパスとして設定 |
MrBearing | 0:79a0104e2c51 | 141 | svr.addHandler<FSHandler>("/files"); |
MrBearing | 0:79a0104e2c51 | 142 | svr.addHandler<FSHandler>("/"); //Default handler |
MrBearing | 0:79a0104e2c51 | 143 | svr.bind(80);// |
MrBearing | 0:79a0104e2c51 | 144 | |
MrBearing | 0:79a0104e2c51 | 145 | printf("Listening...\n"); |
MrBearing | 0:79a0104e2c51 | 146 | |
MrBearing | 0:79a0104e2c51 | 147 | led1 = 0; |
MrBearing | 0:79a0104e2c51 | 148 | while(true) { |
MrBearing | 0:79a0104e2c51 | 149 | Net::poll(); |
MrBearing | 0:79a0104e2c51 | 150 | } |
MrBearing | 0:79a0104e2c51 | 151 | } |
MrBearing | 0:79a0104e2c51 | 152 |