This is mbed part of the OOThermometer project: https://github.com/andresv/OOThermometer It displays incoming temperatures on LCD screen.

Dependencies:   TextLCD mbed

Committer:
grandmastera
Date:
Wed Jan 11 19:49:29 2012 +0000
Revision:
0:c166f2690f21
Go to public!

Who changed what in which revision?

UserRevisionLine numberNew 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 }