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

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?

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