Gitakichi Tokyo / Mbed 2 deprecated IR-remote

Dependencies:   mbed

Committer:
gitakichi
Date:
Thu Feb 13 12:06:03 2020 +0000
Revision:
7:47e8eccc7a01
Parent:
6:9a905505f955
Child:
8:9c0161fd67e2
moved

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gitakichi 0:a3131d121a8f 1 //reference from
gitakichi 0:a3131d121a8f 2 //https://www.hiramine.com/physicalcomputing/mbed/irreceiver.html
gitakichi 4:ab83633679f4 3 //http://elm-chan.org/docs/ir_format.html
gitakichi 0:a3131d121a8f 4 #include "mbed.h"
gitakichi 0:a3131d121a8f 5
gitakichi 4:ab83633679f4 6 //compatible
gitakichi 4:ab83633679f4 7 //http://akizukidenshi.com/catalog/g/gM-07245/
gitakichi 3:31c005437fa5 8
gitakichi 6:9a905505f955 9 //{customer code 16bit,data 8bit data_n 8bit,none 1bit}
gitakichi 3:31c005437fa5 10 #define OPT_PWR "000010001111011100011011111001001"
gitakichi 3:31c005437fa5 11 #define OPT_A "000010001111011100011111111000001"
gitakichi 3:31c005437fa5 12 #define OPT_B "000010001111011100011110111000011"
gitakichi 3:31c005437fa5 13 #define OPT_C "000010001111011100011010111001011"
gitakichi 3:31c005437fa5 14 #define OPT_CENTRE "000010001111011100000100111110111"
gitakichi 3:31c005437fa5 15 #define OPT_TOP "000010001111011100000101111110101"
gitakichi 3:31c005437fa5 16 #define OPT_UNDER "000010001111011100000000111111111"
gitakichi 3:31c005437fa5 17 #define OPT_LEFT "000010001111011100001000111101111"
gitakichi 3:31c005437fa5 18 #define OPT_RIGHT "000010001111011100000001111111101"
gitakichi 3:31c005437fa5 19
gitakichi 7:47e8eccc7a01 20 #define DARK 1
gitakichi 7:47e8eccc7a01 21 #define BRIGHT 0
gitakichi 7:47e8eccc7a01 22
gitakichi 7:47e8eccc7a01 23 DigitalIn ir_in(D2);
gitakichi 7:47e8eccc7a01 24 Serial pc(USBTX, USBRX);
gitakichi 4:ab83633679f4 25 DigitalOut myled(LED1);
gitakichi 5:5bf6cd9dffb7 26 DigitalOut ir_out(D3);
gitakichi 5:5bf6cd9dffb7 27
gitakichi 5:5bf6cd9dffb7 28 Timer timer;
gitakichi 5:5bf6cd9dffb7 29
gitakichi 6:9a905505f955 30 int IR_transmitte(char tx_data[])
gitakichi 5:5bf6cd9dffb7 31 {
gitakichi 7:47e8eccc7a01 32 timer.start();
gitakichi 7:47e8eccc7a01 33
gitakichi 5:5bf6cd9dffb7 34 //flame
gitakichi 5:5bf6cd9dffb7 35 int t_start = timer.read_us();
gitakichi 5:5bf6cd9dffb7 36 ir_out = 1;
gitakichi 5:5bf6cd9dffb7 37 while( timer.read_us() - t_start < 625*16 );//16T
gitakichi 5:5bf6cd9dffb7 38 t_start = timer.read_us();
gitakichi 5:5bf6cd9dffb7 39 ir_out = 0;
gitakichi 5:5bf6cd9dffb7 40 while( timer.read_us() - t_start < 625*8 );//8T
gitakichi 5:5bf6cd9dffb7 41
gitakichi 5:5bf6cd9dffb7 42 //data
gitakichi 5:5bf6cd9dffb7 43 for(int i=0; tx_data[i] != '\0'; i++ ) {
gitakichi 5:5bf6cd9dffb7 44 t_start = timer.read_us();
gitakichi 5:5bf6cd9dffb7 45 while( timer.read_us() - t_start < 625 ) ir_out = 1;
gitakichi 5:5bf6cd9dffb7 46 t_start = timer.read_us();
gitakichi 5:5bf6cd9dffb7 47 ir_out = 0;
gitakichi 5:5bf6cd9dffb7 48 if( tx_data[i] == '1') {
gitakichi 5:5bf6cd9dffb7 49 while( timer.read_us() - t_start < 625 );//1T
gitakichi 5:5bf6cd9dffb7 50 } else {
gitakichi 5:5bf6cd9dffb7 51 while( timer.read_us() - t_start < 625*3 );//3T
gitakichi 5:5bf6cd9dffb7 52 }
gitakichi 5:5bf6cd9dffb7 53 }
gitakichi 5:5bf6cd9dffb7 54 return 0;
gitakichi 5:5bf6cd9dffb7 55 }
gitakichi 0:a3131d121a8f 56
gitakichi 6:9a905505f955 57 int IR_receive(char rx_data[])
gitakichi 0:a3131d121a8f 58 {
gitakichi 7:47e8eccc7a01 59 int t_negedge,t_posedge,t_delta,iState;
gitakichi 4:ab83633679f4 60 int iState_prev = 1;
gitakichi 6:9a905505f955 61 int busy = 0;
gitakichi 7:47e8eccc7a01 62 int data_en = 0;
gitakichi 7:47e8eccc7a01 63
gitakichi 7:47e8eccc7a01 64 timer.start();
gitakichi 7:47e8eccc7a01 65 memset(rx_data, '\0', sizeof(rx_data));
gitakichi 6:9a905505f955 66
gitakichi 6:9a905505f955 67 while(busy == 0) {
gitakichi 7:47e8eccc7a01 68 iState = ir_in;
gitakichi 7:47e8eccc7a01 69 if(iState_prev == DARK && iState == BRIGHT) {//detect negedge
gitakichi 6:9a905505f955 70 t_negedge = timer.read_us();//start(detect negedge
gitakichi 7:47e8eccc7a01 71 t_delta = t_negedge - t_posedge;
gitakichi 6:9a905505f955 72
gitakichi 6:9a905505f955 73 if(data_en == 1) {
gitakichi 6:9a905505f955 74 data_en = 0;
gitakichi 7:47e8eccc7a01 75 if(t_delta > 1523) strcat(rx_data, "1");//625*2.5
gitakichi 6:9a905505f955 76 else strcat(rx_data, "0");
gitakichi 6:9a905505f955 77
gitakichi 7:47e8eccc7a01 78 if(strlen(rx_data) == 33) {
gitakichi 7:47e8eccc7a01 79 busy = 1;
gitakichi 7:47e8eccc7a01 80 pc.printf("\r\n");
gitakichi 7:47e8eccc7a01 81 }
gitakichi 6:9a905505f955 82 }
gitakichi 7:47e8eccc7a01 83 } else if(iState_prev == BRIGHT && iState == DARK) {//detect posedge
gitakichi 6:9a905505f955 84 t_posedge = timer.read_us();
gitakichi 7:47e8eccc7a01 85 t_delta = t_posedge - t_negedge;
gitakichi 7:47e8eccc7a01 86 if(t_delta > 500 && t_delta < 750) {//16T
gitakichi 7:47e8eccc7a01 87 data_en = 1; //This is flame
gitakichi 7:47e8eccc7a01 88 }
gitakichi 6:9a905505f955 89 }
gitakichi 6:9a905505f955 90 iState_prev = iState;
gitakichi 6:9a905505f955 91 }
gitakichi 6:9a905505f955 92 return busy;
gitakichi 6:9a905505f955 93 }
gitakichi 6:9a905505f955 94
gitakichi 7:47e8eccc7a01 95
gitakichi 6:9a905505f955 96 int main()
gitakichi 6:9a905505f955 97 {
gitakichi 7:47e8eccc7a01 98 char rx_data[64],tx_data[64];
gitakichi 4:ab83633679f4 99 int busy = 0;
gitakichi 7:47e8eccc7a01 100 int tx_delay,tx_en;
gitakichi 4:ab83633679f4 101
gitakichi 7:47e8eccc7a01 102 pc.baud(115200);
gitakichi 3:31c005437fa5 103
gitakichi 1:4847c54eed20 104 while(1) {
gitakichi 4:ab83633679f4 105 if(busy == 1) {
gitakichi 7:47e8eccc7a01 106 pc.printf("%s\r\n",rx_data);
gitakichi 7:47e8eccc7a01 107
gitakichi 7:47e8eccc7a01 108 if (strcmp(rx_data,OPT_PWR) == 0) {
gitakichi 7:47e8eccc7a01 109 tx_delay = 5;
gitakichi 7:47e8eccc7a01 110 tx_en = 1;
gitakichi 7:47e8eccc7a01 111 strcpy(tx_data, OPT_PWR);//enter Arbitrary Values
gitakichi 7:47e8eccc7a01 112 } else {
gitakichi 7:47e8eccc7a01 113 tx_delay = 0;
gitakichi 7:47e8eccc7a01 114 tx_en = 0;
gitakichi 7:47e8eccc7a01 115 }
gitakichi 5:5bf6cd9dffb7 116 myled = 1;
gitakichi 5:5bf6cd9dffb7 117 for(int i=0; i<tx_delay; i++) {
gitakichi 4:ab83633679f4 118 wait_ms(1000);
gitakichi 4:ab83633679f4 119 }
gitakichi 4:ab83633679f4 120 //tx IR
gitakichi 7:47e8eccc7a01 121 if(tx_en == 1) IR_transmitte(tx_data);
gitakichi 7:47e8eccc7a01 122 tx_en = 0;
gitakichi 4:ab83633679f4 123 myled = 0;
gitakichi 4:ab83633679f4 124 busy = 0;
gitakichi 4:ab83633679f4 125 } else {
gitakichi 6:9a905505f955 126 busy = IR_receive(rx_data);
gitakichi 2:eca0702650ca 127 }
gitakichi 0:a3131d121a8f 128 }
gitakichi 0:a3131d121a8f 129 }