IRremote
IRremote.cpp@0:fe20e27c6295, 2013-11-08 (annotated)
- Committer:
- leejong87
- Date:
- Fri Nov 08 05:09:02 2013 +0000
- Revision:
- 0:fe20e27c6295
- Child:
- 1:e12749a24efd
IR Remote Control (38Khz)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
leejong87 | 0:fe20e27c6295 | 1 | #include "IRremote.h" |
leejong87 | 0:fe20e27c6295 | 2 | #include "mbed.h" |
leejong87 | 0:fe20e27c6295 | 3 | |
leejong87 | 0:fe20e27c6295 | 4 | //IR Timer |
leejong87 | 0:fe20e27c6295 | 5 | int IR_cnt, IR_state, IR_bit_cnt, IR_temp; |
leejong87 | 0:fe20e27c6295 | 6 | char IR_buf[4]; |
leejong87 | 0:fe20e27c6295 | 7 | |
leejong87 | 0:fe20e27c6295 | 8 | void IR_check() |
leejong87 | 0:fe20e27c6295 | 9 | { |
leejong87 | 0:fe20e27c6295 | 10 | if(IR_cnt<150) { |
leejong87 | 0:fe20e27c6295 | 11 | IR_cnt++; |
leejong87 | 0:fe20e27c6295 | 12 | } |
leejong87 | 0:fe20e27c6295 | 13 | if(IR_cnt>=150) { |
leejong87 | 0:fe20e27c6295 | 14 | IR_state=1; |
leejong87 | 0:fe20e27c6295 | 15 | } |
leejong87 | 0:fe20e27c6295 | 16 | } |
leejong87 | 0:fe20e27c6295 | 17 | |
leejong87 | 0:fe20e27c6295 | 18 | //ReceiveIR |
leejong87 | 0:fe20e27c6295 | 19 | void IR_start() |
leejong87 | 0:fe20e27c6295 | 20 | { |
leejong87 | 0:fe20e27c6295 | 21 | |
leejong87 | 0:fe20e27c6295 | 22 | switch(IR_state) { |
leejong87 | 0:fe20e27c6295 | 23 | case 1: |
leejong87 | 0:fe20e27c6295 | 24 | if((IR_cnt>85)&&(IR_cnt<140)) { |
leejong87 | 0:fe20e27c6295 | 25 | IR_state=2; // Lead |
leejong87 | 0:fe20e27c6295 | 26 | IR_bit_cnt=IR_temp=0; |
leejong87 | 0:fe20e27c6295 | 27 | } |
leejong87 | 0:fe20e27c6295 | 28 | break; |
leejong87 | 0:fe20e27c6295 | 29 | case 2: |
leejong87 | 0:fe20e27c6295 | 30 | if(IR_cnt> 25) { |
leejong87 | 0:fe20e27c6295 | 31 | IR_state=1; // Error |
leejong87 | 0:fe20e27c6295 | 32 | break; |
leejong87 | 0:fe20e27c6295 | 33 | } else if(IR_cnt>=15) { |
leejong87 | 0:fe20e27c6295 | 34 | IR_temp|=0x80; // Data 1 : 2.250ms(22)(0.56ms+1.69ms ) / 2ms |
leejong87 | 0:fe20e27c6295 | 35 | } else if(IR_cnt>= 8) { |
leejong87 | 0:fe20e27c6295 | 36 | IR_temp|=0x00; // Data 0 : 1.125ms(12)(0.56ms+0.565ms) / 1ms |
leejong87 | 0:fe20e27c6295 | 37 | } else { |
leejong87 | 0:fe20e27c6295 | 38 | IR_state=1; // Error |
leejong87 | 0:fe20e27c6295 | 39 | break; |
leejong87 | 0:fe20e27c6295 | 40 | } |
leejong87 | 0:fe20e27c6295 | 41 | if((++IR_bit_cnt%8)==0) { |
leejong87 | 0:fe20e27c6295 | 42 | IR_buf[(IR_bit_cnt/8)-1]=IR_temp; |
leejong87 | 0:fe20e27c6295 | 43 | IR_temp=0; |
leejong87 | 0:fe20e27c6295 | 44 | if(IR_bit_cnt>=32) { |
leejong87 | 0:fe20e27c6295 | 45 | IR_state=1; |
leejong87 | 0:fe20e27c6295 | 46 | IR_bit_cnt=0; |
leejong87 | 0:fe20e27c6295 | 47 | } |
leejong87 | 0:fe20e27c6295 | 48 | } |
leejong87 | 0:fe20e27c6295 | 49 | IR_temp>>=1; |
leejong87 | 0:fe20e27c6295 | 50 | break; |
leejong87 | 0:fe20e27c6295 | 51 | } |
leejong87 | 0:fe20e27c6295 | 52 | IR_cnt=0; |
leejong87 | 0:fe20e27c6295 | 53 | } |
leejong87 | 0:fe20e27c6295 | 54 | |
leejong87 | 0:fe20e27c6295 | 55 | IRremote::IRremote(PinName pin) : _pin(pin) |
leejong87 | 0:fe20e27c6295 | 56 | { |
leejong87 | 0:fe20e27c6295 | 57 | _pin.mode(PullUp); |
leejong87 | 0:fe20e27c6295 | 58 | _pin.fall(&IR_start); |
leejong87 | 0:fe20e27c6295 | 59 | IR_timer.attach_us(&IR_check, 100.0); |
leejong87 | 0:fe20e27c6295 | 60 | } |
leejong87 | 0:fe20e27c6295 | 61 | |
leejong87 | 0:fe20e27c6295 | 62 | char IRremote::read(int ir_i) |
leejong87 | 0:fe20e27c6295 | 63 | { |
leejong87 | 0:fe20e27c6295 | 64 | char IR_rx; |
leejong87 | 0:fe20e27c6295 | 65 | if(ir_i<4) { |
leejong87 | 0:fe20e27c6295 | 66 | IR_rx=IR_buf[ir_i]; |
leejong87 | 0:fe20e27c6295 | 67 | IR_buf[ir_i]=0xFF; |
leejong87 | 0:fe20e27c6295 | 68 | } else { |
leejong87 | 0:fe20e27c6295 | 69 | IR_rx=0xFF;; |
leejong87 | 0:fe20e27c6295 | 70 | } |
leejong87 | 0:fe20e27c6295 | 71 | return IR_rx; |
leejong87 | 0:fe20e27c6295 | 72 | } |