Motoo Tanaka
/
KL25Z_UART_EDGE_180115
Test Program for Multi Adapter
edge.cpp
- Committer:
- Rhyme
- Date:
- 2018-01-15
- Revision:
- 0:4c6961cb6ccf
- Child:
- 1:b97b4f4e5adb
File content as of revision 0:4c6961cb6ccf:
/** * KL25Z UART EDGE * Temp Sensor test for FRDM-KL25Z and SigFox *****/ #include "mbed.h" #define PIN_AN0 PTB0 #define PIN_AN1 PTB1 #define PIN_AN2 PTB2 #define PIN_AN3 PTB3 #define PIN_LEDR PTB18 #define PIN_LEDG PTB19 #define PIN_LEDB PTD1 #define UART_TX PTE0 #define UART_RX PTE1 #define BAUD_RATE 9600 #define MODE_IDLE 0 #define MODE_ALART 1 #define MODE_DATA 2 #define ACK (0x3E) // #define ACK (0x06) #define TILDE '~' // R0=5.0, float R1=4.95, float B=3324, float T0=298.15 #define R0 5.0 #define R1 4.95 #define B 3324 #define T0 298.15 DigitalOut *led_r = 0 ; DigitalOut *led_g = 0 ; DigitalOut *led_b = 0 ; AnalogIn *an[4] = { 0, 0, 0, 0 } ; #define NUM_ANIN 4 Serial *tty = 0 ; int mode = MODE_IDLE ; void init_hardware(void) { tty = new Serial(UART_TX, UART_RX, BAUD_RATE) ; led_r = new DigitalOut(PIN_LEDR, 1) ; led_g = new DigitalOut(PIN_LEDG, 1) ; led_b = new DigitalOut(PIN_LEDB, 1) ; an[0] = new AnalogIn(PIN_AN0) ; an[1] = new AnalogIn(PIN_AN1) ; an[2] = new AnalogIn(PIN_AN2) ; an[3] = new AnalogIn(PIN_AN3) ; } void knock(void) { uint8_t c = '\r' ; printf("Knocking on the host's door\n") ; printf("Sending 0x%02X\n", c) ; // tty->putc('A') ; tty->putc(c) ; wait(0.5) ; } int wait_ack(void) { char c ; printf("Waiting for ACK\n") ; c = tty->getc() ; if (c == ACK) { printf("ACK received\n") ; } else { printf("Unexpected char [0x%02X] received\n", c) ; } return( c ) ; } float getTemp(int n) { float result = 0.0 ; float f, raw, rr1, t ; if (an[n]) { f = an[n]->read() ; raw = f * 3.3 ; rr1 = R1 * raw / (3.3 - raw) ; t = 1.0 / (log(rr1 / R0) / B + (1/T0)) ; result = t - 273.15 ; } return( result ) ; } void send_data(void) { int i, dummy ; float temp[4] ; int8_t data[10] ; data[0] = TILDE ; for (i = 0 ; i < 4 ; i++ ) { temp[i] = getTemp(i) ; printf("temp[%d] = %.2f\n", i, temp[i]) ; dummy = 100 * temp[i] ; data[i * 2+1] = (int8_t)(dummy / 100) ; data[i * 2 + 2] = (int8_t)(dummy % 100) ; } data[9] = 0 ; printf("Sending data ...") ; for (i = 0 ; i < 10 ; i++ ) { /* data must be 10bytes including the header */ tty->putc(data[i]) ; wait(0.1) ; } printf("Done\n") ; } void doLED(void) { switch(mode) { case MODE_IDLE: *led_r = 1 ; *led_g = 1 ; *led_b = 0 ; break ; case MODE_ALART: *led_r = 0 ; *led_g = 1 ; *led_b = 1 ; break ; case MODE_DATA: *led_r = 1 ; *led_g = 0 ; *led_b = 1 ; break ; default: *led_r = 1 ; *led_g = 1 ; *led_b = 1 ; break ; } } int main() { init_hardware() ; printf("Edge Started\n") ; while(1) { doLED() ; switch(mode) { case MODE_IDLE: knock() ; mode = MODE_ALART ; break ; case MODE_ALART: if (wait_ack() == ACK) { mode = MODE_DATA ; } else { mode = MODE_IDLE ; } break ; case MODE_DATA: send_data() ; wait_ack() ; mode = MODE_IDLE ; printf("Sleeping ...") ; fflush(stdout) ; wait(20.0) ; /* minimum 15 sec */ printf("Done\n") ; break ; default: printf("Unexpected mode [%d]\n", mode) ; mode = MODE_IDLE ; break ; } wait(0.1) ; } }