Motoo Tanaka
/
KL25Z_UART_EDGE_180115
Test Program for Multi Adapter
Embed:
(wiki syntax)
Show/hide line numbers
edge.cpp
00001 /** 00002 * KL25Z UART EDGE 00003 * Temp Sensor test for FRDM-KL25Z and SigFox 00004 *****/ 00005 00006 #include "mbed.h" 00007 00008 #define PIN_AN0 PTB0 00009 #define PIN_AN1 PTB1 00010 #define PIN_AN2 PTB2 00011 #define PIN_AN3 PTB3 00012 00013 #define PIN_LEDR PTB18 00014 #define PIN_LEDG PTB19 00015 #define PIN_LEDB PTD1 00016 00017 #define UART_TX PTE0 00018 #define UART_RX PTE1 00019 #define BAUD_RATE 9600 00020 00021 #define MODE_IDLE 0 00022 #define MODE_ALART 1 00023 #define MODE_DATA 2 00024 #define ACK (0x3E) 00025 // #define ACK (0x06) 00026 #define TILDE '~' 00027 #define CR '\r' 00028 #define DOT '.' 00029 #define SPACE ' ' 00030 00031 // R0=5.0, float R1=4.95, float B=3324, float T0=298.15 00032 #define R0 5.0 00033 #define R1 4.95 00034 #define B 3324 00035 #define T0 298.15 00036 00037 DigitalOut *led_r = 0 ; 00038 DigitalOut *led_g = 0 ; 00039 DigitalOut *led_b = 0 ; 00040 00041 AnalogIn *an[4] = { 0, 0, 0, 0 } ; 00042 #define NUM_ANIN 4 00043 00044 Serial *tty = 0 ; 00045 00046 int mode = MODE_IDLE ; 00047 00048 void init_hardware(void) 00049 { 00050 tty = new Serial(UART_TX, UART_RX, BAUD_RATE) ; 00051 led_r = new DigitalOut(PIN_LEDR, 1) ; 00052 led_g = new DigitalOut(PIN_LEDG, 1) ; 00053 led_b = new DigitalOut(PIN_LEDB, 1) ; 00054 an[0] = new AnalogIn(PIN_AN0) ; 00055 an[1] = new AnalogIn(PIN_AN1) ; 00056 an[2] = new AnalogIn(PIN_AN2) ; 00057 an[3] = new AnalogIn(PIN_AN3) ; 00058 } 00059 00060 void knock(void) 00061 { 00062 uint8_t c = CR ; 00063 printf("Knocking on the host's door\n") ; 00064 printf("Sending 0x%02X\n", c) ; 00065 tty->putc(c) ; 00066 wait(0.5) ; 00067 } 00068 00069 int wait_ack(void) 00070 { 00071 char c = 0xFF ; 00072 printf("Waiting for ACK ") ; 00073 for (int i = 0 ; i < 3 ; i++ ) { 00074 if (tty->readable()) { 00075 c = tty->getc() ; 00076 } else { 00077 printf(".") ; 00078 } 00079 wait(1) ; 00080 } 00081 printf(" ") ; 00082 if (c == ACK) { 00083 printf("ACK received\n") ; 00084 } else { 00085 printf("Unexpected char [0x%02X] received\n", c) ; 00086 } 00087 return( c ) ; 00088 } 00089 00090 float getTemp(int n) 00091 { 00092 float result = 0.0 ; 00093 float f, raw, rr1, t ; 00094 if (an[n]) { 00095 f = an[n]->read() ; 00096 // printf("AN[%d] = %.2f\n",n, f) ; 00097 raw = f * 3.3 ; 00098 rr1 = R1 * raw / (3.3 - raw) ; 00099 t = 1.0 / (log(rr1 / R0) / B + (1/T0)) ; 00100 result = t - 273.15 ; 00101 } 00102 return( result ) ; 00103 } 00104 00105 void send_data(void) 00106 { 00107 int i, dummy ; 00108 float temp[4] ; 00109 int8_t data[10] ; 00110 data[0] = TILDE ; 00111 for (i = 0 ; i < 4 ; i++ ) { 00112 temp[i] = getTemp(i) ; 00113 printf("temp[%d] = %.2f\n", i, temp[i]) ; 00114 dummy = (int)(100.0 * temp[i] + 0.5) ; 00115 data[i * 2 + 1] = (int8_t)(dummy / 100) ; 00116 data[i * 2 + 2] = (int8_t)(dummy % 100) ; 00117 } 00118 data[9] = 0 ; 00119 printf("Sending data ...") ; 00120 for (i = 0 ; i < 10 ; i++ ) { /* data must be 10bytes including the header */ 00121 tty->putc(data[i]) ; 00122 wait(0.1) ; 00123 } 00124 printf("Done\n") ; 00125 } 00126 00127 void doLED(void) 00128 { 00129 switch(mode) { 00130 case MODE_IDLE: *led_r = 1 ; *led_g = 1 ; *led_b = 0 ; break ; 00131 case MODE_ALART: *led_r = 0 ; *led_g = 1 ; *led_b = 1 ; break ; 00132 case MODE_DATA: *led_r = 1 ; *led_g = 0 ; *led_b = 1 ; break ; 00133 default: *led_r = 1 ; *led_g = 1 ; *led_b = 1 ; break ; 00134 } 00135 } 00136 00137 int main() { 00138 init_hardware() ; 00139 printf("Edge Started\n") ; 00140 while(1) { 00141 doLED() ; 00142 switch(mode) { 00143 case MODE_IDLE: 00144 knock() ; 00145 mode = MODE_ALART ; 00146 break ; 00147 case MODE_ALART: 00148 if (wait_ack() == ACK) { 00149 mode = MODE_DATA ; 00150 } else { 00151 mode = MODE_IDLE ; 00152 } 00153 break ; 00154 case MODE_DATA: 00155 send_data() ; 00156 wait_ack() ; 00157 mode = MODE_IDLE ; 00158 printf("Sleeping ...") ; 00159 fflush(stdout) ; 00160 wait(20.0) ; /* minimum 15 sec */ 00161 printf("Done\n") ; 00162 break ; 00163 default: 00164 printf("Unexpected mode [%d]\n", mode) ; 00165 mode = MODE_IDLE ; 00166 break ; 00167 } 00168 wait(0.1) ; 00169 } 00170 }
Generated on Thu Jul 28 2022 02:19:45 by 1.7.2