yet another 18B20 Temperature sensor. variable number of sensors working in parasite mode, serial 16x2 display with diagnostic output and post to a rest web service
Dependencies: EthernetInterface HTTPClient NTPClient mbed-rtos mbed
main.cpp@1:9e88b2508768, 2013-01-03 (annotated)
- Committer:
- wkinkeldei
- Date:
- Thu Jan 03 18:50:43 2013 +0000
- Revision:
- 1:9e88b2508768
- Parent:
- 0:53f05303850a
added switch sensor
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
wkinkeldei | 0:53f05303850a | 1 | #include "mbed.h" |
wkinkeldei | 0:53f05303850a | 2 | #include "rtos.h" |
wkinkeldei | 0:53f05303850a | 3 | #include "EthernetInterface.h" |
wkinkeldei | 0:53f05303850a | 4 | |
wkinkeldei | 0:53f05303850a | 5 | #include <list> |
wkinkeldei | 0:53f05303850a | 6 | |
wkinkeldei | 0:53f05303850a | 7 | #include "sparkfun.h" |
wkinkeldei | 0:53f05303850a | 8 | #include "ntp_proxy.h" |
wkinkeldei | 0:53f05303850a | 9 | #include "collector_proxy.h" |
wkinkeldei | 0:53f05303850a | 10 | #include "sensor.h" |
wkinkeldei | 0:53f05303850a | 11 | #include "temperature_sensor.h" |
wkinkeldei | 1:9e88b2508768 | 12 | #include "switch_sensor.h" |
wkinkeldei | 1:9e88b2508768 | 13 | #include "local_time.h" |
wkinkeldei | 0:53f05303850a | 14 | |
wkinkeldei | 0:53f05303850a | 15 | SparkFun display(p28); |
wkinkeldei | 0:53f05303850a | 16 | list<Sensor *> sensors; |
wkinkeldei | 0:53f05303850a | 17 | |
wkinkeldei | 0:53f05303850a | 18 | void wait_minutes(int m = 1) { |
wkinkeldei | 0:53f05303850a | 19 | while (m-- > 0) |
wkinkeldei | 0:53f05303850a | 20 | Thread::wait(1000 * 60); |
wkinkeldei | 0:53f05303850a | 21 | } |
wkinkeldei | 0:53f05303850a | 22 | |
wkinkeldei | 0:53f05303850a | 23 | void wait_seconds(int s = 1) { |
wkinkeldei | 0:53f05303850a | 24 | while (s-- > 0) |
wkinkeldei | 0:53f05303850a | 25 | Thread::wait(1000); |
wkinkeldei | 0:53f05303850a | 26 | } |
wkinkeldei | 0:53f05303850a | 27 | |
wkinkeldei | 0:53f05303850a | 28 | /* |
wkinkeldei | 0:53f05303850a | 29 | ntp Thread: poll NTP Server every 3 hours |
wkinkeldei | 0:53f05303850a | 30 | */ |
wkinkeldei | 0:53f05303850a | 31 | void ntp_thread(void const *args) { |
wkinkeldei | 1:9e88b2508768 | 32 | NtpProxy ntp((const char *) args); |
wkinkeldei | 0:53f05303850a | 33 | |
wkinkeldei | 0:53f05303850a | 34 | while (true) { |
wkinkeldei | 0:53f05303850a | 35 | display.show_ntp_status('t'); |
wkinkeldei | 0:53f05303850a | 36 | if (ntp.set_time()) { |
wkinkeldei | 0:53f05303850a | 37 | // successful: wait 3 hours |
wkinkeldei | 0:53f05303850a | 38 | display.show_ntp_status('T'); |
wkinkeldei | 0:53f05303850a | 39 | wait_minutes(180); |
wkinkeldei | 0:53f05303850a | 40 | } else { |
wkinkeldei | 0:53f05303850a | 41 | // failure: retry after 5 minutes |
wkinkeldei | 0:53f05303850a | 42 | display.show_ntp_status('?'); |
wkinkeldei | 0:53f05303850a | 43 | wait_minutes(5); |
wkinkeldei | 0:53f05303850a | 44 | } |
wkinkeldei | 0:53f05303850a | 45 | } |
wkinkeldei | 0:53f05303850a | 46 | } |
wkinkeldei | 0:53f05303850a | 47 | |
wkinkeldei | 0:53f05303850a | 48 | /* |
wkinkeldei | 0:53f05303850a | 49 | display Thread: show a sensor every 2 seconds and current time |
wkinkeldei | 0:53f05303850a | 50 | */ |
wkinkeldei | 0:53f05303850a | 51 | void display_thread(void const *args) { |
wkinkeldei | 0:53f05303850a | 52 | char buffer[20]; |
wkinkeldei | 0:53f05303850a | 53 | int last_minute = -1; |
wkinkeldei | 1:9e88b2508768 | 54 | LocalTime l; |
wkinkeldei | 0:53f05303850a | 55 | struct tm *t; |
wkinkeldei | 0:53f05303850a | 56 | list<Sensor *>::iterator it = sensors.begin(); |
wkinkeldei | 0:53f05303850a | 57 | |
wkinkeldei | 0:53f05303850a | 58 | while (true) { |
wkinkeldei | 0:53f05303850a | 59 | // display next sensor's measure (if any) |
wkinkeldei | 0:53f05303850a | 60 | if (it != sensors.end()) display.show_sensor_measure((*it)->get_name(), (*it)->last_measure()); |
wkinkeldei | 0:53f05303850a | 61 | it++; |
wkinkeldei | 0:53f05303850a | 62 | if (it == sensors.end()) it = sensors.begin(); |
wkinkeldei | 0:53f05303850a | 63 | |
wkinkeldei | 0:53f05303850a | 64 | // display time if minute is different from displayed value |
wkinkeldei | 1:9e88b2508768 | 65 | t = l.tm(); |
wkinkeldei | 0:53f05303850a | 66 | if (last_minute != t->tm_min) { |
wkinkeldei | 0:53f05303850a | 67 | last_minute = t->tm_min; |
wkinkeldei | 0:53f05303850a | 68 | strftime(buffer, 20, "%H:%M", t); |
wkinkeldei | 0:53f05303850a | 69 | display.show_time_text(buffer); |
wkinkeldei | 0:53f05303850a | 70 | } |
wkinkeldei | 0:53f05303850a | 71 | |
wkinkeldei | 0:53f05303850a | 72 | wait_seconds(2); |
wkinkeldei | 0:53f05303850a | 73 | } |
wkinkeldei | 0:53f05303850a | 74 | } |
wkinkeldei | 0:53f05303850a | 75 | |
wkinkeldei | 0:53f05303850a | 76 | /* |
wkinkeldei | 0:53f05303850a | 77 | measure Thread: read all sensors every 10 seconds |
wkinkeldei | 0:53f05303850a | 78 | */ |
wkinkeldei | 0:53f05303850a | 79 | void measure_thread(void const *args) { |
wkinkeldei | 0:53f05303850a | 80 | while (true) { |
wkinkeldei | 0:53f05303850a | 81 | list<Sensor *>::iterator it; |
wkinkeldei | 0:53f05303850a | 82 | int nr = 0; |
wkinkeldei | 0:53f05303850a | 83 | for (it = sensors.begin(); it != sensors.end(); it++) { |
wkinkeldei | 0:53f05303850a | 84 | display.show_current_sensor((*it)->get_kind(), nr, '<'); |
wkinkeldei | 0:53f05303850a | 85 | |
wkinkeldei | 0:53f05303850a | 86 | (*it)->prepare_measure(); |
wkinkeldei | 0:53f05303850a | 87 | display.show_current_status('>'); |
wkinkeldei | 0:53f05303850a | 88 | (*it)->measure(); |
wkinkeldei | 0:53f05303850a | 89 | display.show_current_status('='); // oder '?' falls falsch |
wkinkeldei | 0:53f05303850a | 90 | |
wkinkeldei | 0:53f05303850a | 91 | wait_seconds(1); |
wkinkeldei | 0:53f05303850a | 92 | |
wkinkeldei | 0:53f05303850a | 93 | nr++; |
wkinkeldei | 0:53f05303850a | 94 | } |
wkinkeldei | 0:53f05303850a | 95 | display.clear_current_sensor(); |
wkinkeldei | 0:53f05303850a | 96 | |
wkinkeldei | 0:53f05303850a | 97 | wait_seconds(10); // FIXME: increase to 60 seconds |
wkinkeldei | 0:53f05303850a | 98 | } |
wkinkeldei | 0:53f05303850a | 99 | } |
wkinkeldei | 0:53f05303850a | 100 | |
wkinkeldei | 0:53f05303850a | 101 | /* |
wkinkeldei | 0:53f05303850a | 102 | send Thread: post measures to Statistics Collector every 15 minutes |
wkinkeldei | 0:53f05303850a | 103 | */ |
wkinkeldei | 0:53f05303850a | 104 | void send_thread(void const *args) { |
wkinkeldei | 1:9e88b2508768 | 105 | CollectorProxy collector((const char *) args); |
wkinkeldei | 0:53f05303850a | 106 | |
wkinkeldei | 0:53f05303850a | 107 | while (true) { |
wkinkeldei | 1:9e88b2508768 | 108 | // 11 minute delay with feedback in the last 10 minutes |
wkinkeldei | 0:53f05303850a | 109 | for (int i=10; i>=0; i--) { |
wkinkeldei | 0:53f05303850a | 110 | display.show_network_status(i > 9 ? ' ' : '0' + i); |
wkinkeldei | 0:53f05303850a | 111 | wait_minutes(1); |
wkinkeldei | 0:53f05303850a | 112 | } |
wkinkeldei | 0:53f05303850a | 113 | |
wkinkeldei | 0:53f05303850a | 114 | list<Sensor *>::iterator it; |
wkinkeldei | 0:53f05303850a | 115 | for (it = sensors.begin(); it != sensors.end(); it++) { |
wkinkeldei | 0:53f05303850a | 116 | display.show_network_status('P'); |
wkinkeldei | 0:53f05303850a | 117 | int ret = collector.send_measure((*it)->get_url_part(), (*it)->get_value()); |
wkinkeldei | 0:53f05303850a | 118 | |
wkinkeldei | 0:53f05303850a | 119 | display.show_network_status(ret ? 'O' : 'E'); |
wkinkeldei | 0:53f05303850a | 120 | wait_seconds(2); |
wkinkeldei | 0:53f05303850a | 121 | } |
wkinkeldei | 0:53f05303850a | 122 | } |
wkinkeldei | 0:53f05303850a | 123 | } |
wkinkeldei | 0:53f05303850a | 124 | |
wkinkeldei | 0:53f05303850a | 125 | /* |
wkinkeldei | 0:53f05303850a | 126 | main Thread: initialize and flash a LED |
wkinkeldei | 1:9e88b2508768 | 127 | |
wkinkeldei | 1:9e88b2508768 | 128 | TODO: check or modify string constants |
wkinkeldei | 0:53f05303850a | 129 | */ |
wkinkeldei | 0:53f05303850a | 130 | int main() { |
wkinkeldei | 0:53f05303850a | 131 | display.print_init_message(); |
wkinkeldei | 0:53f05303850a | 132 | |
wkinkeldei | 1:9e88b2508768 | 133 | // testing only: |
wkinkeldei | 1:9e88b2508768 | 134 | sensors.push_back((Sensor *) new TemperatureSensor(p21, "erlangen/temperatur/demo", "Temperatur")); |
wkinkeldei | 1:9e88b2508768 | 135 | sensors.push_back((Sensor *) new SwitchSensor( p25, "erlangen/schalter/demo", "Schalter")); |
wkinkeldei | 0:53f05303850a | 136 | |
wkinkeldei | 1:9e88b2508768 | 137 | /* live setting: |
wkinkeldei | 1:9e88b2508768 | 138 | sensors.push_back((Sensor *) new TemperatureSensor(p21, "trainmeusel/heizung/temperatur", "Heizung")); |
wkinkeldei | 1:9e88b2508768 | 139 | sensors.push_back((Sensor *) new TemperatureSensor(p22, "trainmeusel/waschkueche/temperatur", "Waschkueche")); |
wkinkeldei | 1:9e88b2508768 | 140 | sensors.push_back((Sensor *) new TemperatureSensor(p23, "trainmeusel/flur/temperatur", "Flur")); |
wkinkeldei | 1:9e88b2508768 | 141 | sensors.push_back((Sensor *) new TemperatureSensor(p24, "trainmeusel/aussen/temperatur", "Aussen")); |
wkinkeldei | 1:9e88b2508768 | 142 | sensors.push_back((Sensor *) new SwitchSensor( p25, "trainmeusel/oel/schwimmer", "Oel")); |
wkinkeldei | 0:53f05303850a | 143 | */ |
wkinkeldei | 0:53f05303850a | 144 | |
wkinkeldei | 0:53f05303850a | 145 | EthernetInterface eth; |
wkinkeldei | 0:53f05303850a | 146 | eth.init("192.168.2.175", "255.255.255.0", "192.168.2.1"); |
wkinkeldei | 0:53f05303850a | 147 | eth.connect(); |
wkinkeldei | 0:53f05303850a | 148 | |
wkinkeldei | 1:9e88b2508768 | 149 | Thread t1(ntp_thread, (void *)"time.apple.com"); |
wkinkeldei | 0:53f05303850a | 150 | Thread t2(display_thread); |
wkinkeldei | 0:53f05303850a | 151 | Thread t3(measure_thread); |
wkinkeldei | 1:9e88b2508768 | 152 | Thread t4(send_thread, (void *)"http://kinkeldei-net.de:81/sensor"); |
wkinkeldei | 0:53f05303850a | 153 | |
wkinkeldei | 0:53f05303850a | 154 | // a periodical flash should indicate "we are alive" |
wkinkeldei | 0:53f05303850a | 155 | DigitalOut led(LED1); |
wkinkeldei | 0:53f05303850a | 156 | while (true) { |
wkinkeldei | 0:53f05303850a | 157 | led = !led; |
wkinkeldei | 0:53f05303850a | 158 | wait_seconds(1); |
wkinkeldei | 0:53f05303850a | 159 | } |
wkinkeldei | 0:53f05303850a | 160 | } |