This is mbed part of the OOThermometer project: https://github.com/andresv/OOThermometer It displays incoming temperatures on LCD screen.
main.cpp@0:c166f2690f21, 2012-01-11 (annotated)
- Committer:
- grandmastera
- Date:
- Wed Jan 11 19:49:29 2012 +0000
- Revision:
- 0:c166f2690f21
Go to public!
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
grandmastera | 0:c166f2690f21 | 1 | #include "mbed.h" |
grandmastera | 0:c166f2690f21 | 2 | #include "TextLCD.h" |
grandmastera | 0:c166f2690f21 | 3 | |
grandmastera | 0:c166f2690f21 | 4 | # define TEMPERATURE_TIMEOUT 10*60+5 //s |
grandmastera | 0:c166f2690f21 | 5 | |
grandmastera | 0:c166f2690f21 | 6 | // https://github.com/andresv/OOThermometer |
grandmastera | 0:c166f2690f21 | 7 | // mbed shows data from serial on LCD screen |
grandmastera | 0:c166f2690f21 | 8 | |
grandmastera | 0:c166f2690f21 | 9 | TextLCD lcd(p26, p25, p24, p23, p22, p21, TextLCD::LCD16x2B); // rs, e, d4-d7 |
grandmastera | 0:c166f2690f21 | 10 | DigitalOut led1(LED1); |
grandmastera | 0:c166f2690f21 | 11 | |
grandmastera | 0:c166f2690f21 | 12 | Serial pc(USBTX, USBRX); |
grandmastera | 0:c166f2690f21 | 13 | Serial base(p9, p10); |
grandmastera | 0:c166f2690f21 | 14 | Timeout syncronizator; |
grandmastera | 0:c166f2690f21 | 15 | Timeout timeouter; |
grandmastera | 0:c166f2690f21 | 16 | |
grandmastera | 0:c166f2690f21 | 17 | Timer in_timer; |
grandmastera | 0:c166f2690f21 | 18 | Timer out_timer; |
grandmastera | 0:c166f2690f21 | 19 | |
grandmastera | 0:c166f2690f21 | 20 | enum { |
grandmastera | 0:c166f2690f21 | 21 | SERIAL_ADDR_NODE = 0x01, |
grandmastera | 0:c166f2690f21 | 22 | SERIAL_ADDR_BASE = 0x00, |
grandmastera | 0:c166f2690f21 | 23 | |
grandmastera | 0:c166f2690f21 | 24 | MSG_THERMOMETER = 0x01, |
grandmastera | 0:c166f2690f21 | 25 | MSG_REQ_THERMOMETER = 0x10 |
grandmastera | 0:c166f2690f21 | 26 | }; |
grandmastera | 0:c166f2690f21 | 27 | |
grandmastera | 0:c166f2690f21 | 28 | typedef struct { |
grandmastera | 0:c166f2690f21 | 29 | unsigned short battery; |
grandmastera | 0:c166f2690f21 | 30 | int light; |
grandmastera | 0:c166f2690f21 | 31 | int temp; |
grandmastera | 0:c166f2690f21 | 32 | char addr; |
grandmastera | 0:c166f2690f21 | 33 | char header; |
grandmastera | 0:c166f2690f21 | 34 | } __attribute__((packed)) thermometer_msg_t; |
grandmastera | 0:c166f2690f21 | 35 | |
grandmastera | 0:c166f2690f21 | 36 | typedef struct { |
grandmastera | 0:c166f2690f21 | 37 | char header; |
grandmastera | 0:c166f2690f21 | 38 | } __attribute__((packed)) req_thermometer_msg_t; |
grandmastera | 0:c166f2690f21 | 39 | |
grandmastera | 0:c166f2690f21 | 40 | char rx_buffer[50]; |
grandmastera | 0:c166f2690f21 | 41 | char* inserter = rx_buffer + sizeof(rx_buffer); |
grandmastera | 0:c166f2690f21 | 42 | unsigned int bytes_received = 0; |
grandmastera | 0:c166f2690f21 | 43 | |
grandmastera | 0:c166f2690f21 | 44 | float in_temp = 0.0; |
grandmastera | 0:c166f2690f21 | 45 | float out_temp = 0.0; |
grandmastera | 0:c166f2690f21 | 46 | |
grandmastera | 0:c166f2690f21 | 47 | void packet_received(); |
grandmastera | 0:c166f2690f21 | 48 | void check_timeout(); |
grandmastera | 0:c166f2690f21 | 49 | void update_out_temp(); |
grandmastera | 0:c166f2690f21 | 50 | void update_in_temp(); |
grandmastera | 0:c166f2690f21 | 51 | void request_temp(); |
grandmastera | 0:c166f2690f21 | 52 | |
grandmastera | 0:c166f2690f21 | 53 | //---------------------------------------------------------------------------- |
grandmastera | 0:c166f2690f21 | 54 | // Byte received from UART |
grandmastera | 0:c166f2690f21 | 55 | //---------------------------------------------------------------------------- |
grandmastera | 0:c166f2690f21 | 56 | void receive() { |
grandmastera | 0:c166f2690f21 | 57 | led1 = !led1; |
grandmastera | 0:c166f2690f21 | 58 | if (base.readable()) { |
grandmastera | 0:c166f2690f21 | 59 | // if we have not got any data for 50 ms display data |
grandmastera | 0:c166f2690f21 | 60 | // because it was probably packet end |
grandmastera | 0:c166f2690f21 | 61 | // here it is like watchdog kick: |
grandmastera | 0:c166f2690f21 | 62 | syncronizator.attach(&packet_received, 0.05); |
grandmastera | 0:c166f2690f21 | 63 | |
grandmastera | 0:c166f2690f21 | 64 | *inserter = base.getc(); |
grandmastera | 0:c166f2690f21 | 65 | inserter--; |
grandmastera | 0:c166f2690f21 | 66 | bytes_received++; |
grandmastera | 0:c166f2690f21 | 67 | |
grandmastera | 0:c166f2690f21 | 68 | if (inserter == rx_buffer) |
grandmastera | 0:c166f2690f21 | 69 | inserter = rx_buffer + sizeof(rx_buffer); |
grandmastera | 0:c166f2690f21 | 70 | } |
grandmastera | 0:c166f2690f21 | 71 | } |
grandmastera | 0:c166f2690f21 | 72 | |
grandmastera | 0:c166f2690f21 | 73 | //---------------------------------------------------------------------------- |
grandmastera | 0:c166f2690f21 | 74 | // Probabaly packet received from UART |
grandmastera | 0:c166f2690f21 | 75 | //---------------------------------------------------------------------------- |
grandmastera | 0:c166f2690f21 | 76 | void packet_received() { |
grandmastera | 0:c166f2690f21 | 77 | thermometer_msg_t* msg = (thermometer_msg_t*)(inserter+1); |
grandmastera | 0:c166f2690f21 | 78 | unsigned int i = 0; |
grandmastera | 0:c166f2690f21 | 79 | |
grandmastera | 0:c166f2690f21 | 80 | for (i=0; i<bytes_received; i++) |
grandmastera | 0:c166f2690f21 | 81 | pc.printf("%02X\n", ((char*)msg)[i]); |
grandmastera | 0:c166f2690f21 | 82 | pc.printf("\n"); |
grandmastera | 0:c166f2690f21 | 83 | |
grandmastera | 0:c166f2690f21 | 84 | if (msg->header == MSG_THERMOMETER && bytes_received == sizeof(thermometer_msg_t)) { |
grandmastera | 0:c166f2690f21 | 85 | if (msg->addr == SERIAL_ADDR_BASE) { |
grandmastera | 0:c166f2690f21 | 86 | in_temp = ((float)msg->temp)/10; |
grandmastera | 0:c166f2690f21 | 87 | in_timer.reset(); |
grandmastera | 0:c166f2690f21 | 88 | update_in_temp(); |
grandmastera | 0:c166f2690f21 | 89 | } |
grandmastera | 0:c166f2690f21 | 90 | else if (msg->addr == SERIAL_ADDR_NODE) { |
grandmastera | 0:c166f2690f21 | 91 | out_temp = ((float)msg->temp)/10; |
grandmastera | 0:c166f2690f21 | 92 | out_timer.reset(); |
grandmastera | 0:c166f2690f21 | 93 | update_out_temp(); |
grandmastera | 0:c166f2690f21 | 94 | } |
grandmastera | 0:c166f2690f21 | 95 | } |
grandmastera | 0:c166f2690f21 | 96 | |
grandmastera | 0:c166f2690f21 | 97 | bytes_received = 0; |
grandmastera | 0:c166f2690f21 | 98 | inserter = rx_buffer + sizeof(rx_buffer); |
grandmastera | 0:c166f2690f21 | 99 | } |
grandmastera | 0:c166f2690f21 | 100 | |
grandmastera | 0:c166f2690f21 | 101 | //---------------------------------------------------------------------------- |
grandmastera | 0:c166f2690f21 | 102 | // Check whether there is timeout condition |
grandmastera | 0:c166f2690f21 | 103 | //---------------------------------------------------------------------------- |
grandmastera | 0:c166f2690f21 | 104 | void check_timeout() { |
grandmastera | 0:c166f2690f21 | 105 | pc.printf("timeout!\n"); |
grandmastera | 0:c166f2690f21 | 106 | timeouter.attach(&check_timeout, TEMPERATURE_TIMEOUT+1); |
grandmastera | 0:c166f2690f21 | 107 | update_in_temp(); |
grandmastera | 0:c166f2690f21 | 108 | update_out_temp(); |
grandmastera | 0:c166f2690f21 | 109 | } |
grandmastera | 0:c166f2690f21 | 110 | |
grandmastera | 0:c166f2690f21 | 111 | void update_in_temp() { |
grandmastera | 0:c166f2690f21 | 112 | lcd.locate(2, 1); |
grandmastera | 0:c166f2690f21 | 113 | pc.printf("in timer %.1f\n", in_timer.read()); |
grandmastera | 0:c166f2690f21 | 114 | if (in_timer.read() < TEMPERATURE_TIMEOUT) { |
grandmastera | 0:c166f2690f21 | 115 | lcd.printf("%.1f\n", in_temp); |
grandmastera | 0:c166f2690f21 | 116 | } |
grandmastera | 0:c166f2690f21 | 117 | else { |
grandmastera | 0:c166f2690f21 | 118 | lcd.printf("XX.X\n"); |
grandmastera | 0:c166f2690f21 | 119 | } |
grandmastera | 0:c166f2690f21 | 120 | } |
grandmastera | 0:c166f2690f21 | 121 | |
grandmastera | 0:c166f2690f21 | 122 | void update_out_temp() { |
grandmastera | 0:c166f2690f21 | 123 | lcd.locate(10, 1); |
grandmastera | 0:c166f2690f21 | 124 | pc.printf("out timer %.1f\n", out_timer.read()); |
grandmastera | 0:c166f2690f21 | 125 | if (out_timer.read() < TEMPERATURE_TIMEOUT) { |
grandmastera | 0:c166f2690f21 | 126 | lcd.printf("%.1f\n", out_temp); |
grandmastera | 0:c166f2690f21 | 127 | } |
grandmastera | 0:c166f2690f21 | 128 | else { |
grandmastera | 0:c166f2690f21 | 129 | lcd.printf("XX.X\n"); |
grandmastera | 0:c166f2690f21 | 130 | } |
grandmastera | 0:c166f2690f21 | 131 | } |
grandmastera | 0:c166f2690f21 | 132 | |
grandmastera | 0:c166f2690f21 | 133 | //---------------------------------------------------------------------------- |
grandmastera | 0:c166f2690f21 | 134 | // Request temperature from base and node |
grandmastera | 0:c166f2690f21 | 135 | //---------------------------------------------------------------------------- |
grandmastera | 0:c166f2690f21 | 136 | void request_temp() { |
grandmastera | 0:c166f2690f21 | 137 | req_thermometer_msg_t msg; |
grandmastera | 0:c166f2690f21 | 138 | unsigned int i; |
grandmastera | 0:c166f2690f21 | 139 | |
grandmastera | 0:c166f2690f21 | 140 | msg.header = MSG_REQ_THERMOMETER; |
grandmastera | 0:c166f2690f21 | 141 | |
grandmastera | 0:c166f2690f21 | 142 | for (i=0; i<sizeof(req_thermometer_msg_t); i++) |
grandmastera | 0:c166f2690f21 | 143 | base.putc(((char*)&msg)[i]); |
grandmastera | 0:c166f2690f21 | 144 | } |
grandmastera | 0:c166f2690f21 | 145 | |
grandmastera | 0:c166f2690f21 | 146 | //---------------------------------------------------------------------------- |
grandmastera | 0:c166f2690f21 | 147 | // Main |
grandmastera | 0:c166f2690f21 | 148 | //---------------------------------------------------------------------------- |
grandmastera | 0:c166f2690f21 | 149 | int main() { |
grandmastera | 0:c166f2690f21 | 150 | base.baud(115200); |
grandmastera | 0:c166f2690f21 | 151 | pc.baud(115200); |
grandmastera | 0:c166f2690f21 | 152 | |
grandmastera | 0:c166f2690f21 | 153 | base.attach(&receive, Serial::RxIrq); |
grandmastera | 0:c166f2690f21 | 154 | lcd.printf(" IN OUT\n"); |
grandmastera | 0:c166f2690f21 | 155 | |
grandmastera | 0:c166f2690f21 | 156 | in_timer.start(); |
grandmastera | 0:c166f2690f21 | 157 | out_timer.start(); |
grandmastera | 0:c166f2690f21 | 158 | timeouter.attach(&check_timeout, TEMPERATURE_TIMEOUT+1); |
grandmastera | 0:c166f2690f21 | 159 | |
grandmastera | 0:c166f2690f21 | 160 | request_temp(); |
grandmastera | 0:c166f2690f21 | 161 | while(1) { |
grandmastera | 0:c166f2690f21 | 162 | } |
grandmastera | 0:c166f2690f21 | 163 | } |