Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: EthernetInterface HTTPClient NTPClient mbed-rtos mbed
Revision 1:9e88b2508768, committed 2013-01-03
- Comitter:
- wkinkeldei
- Date:
- Thu Jan 03 18:50:43 2013 +0000
- Parent:
- 0:53f05303850a
- Commit message:
- added switch sensor
Changed in this revision
--- a/collector_proxy.cpp Mon Dec 31 12:08:24 2012 +0000
+++ b/collector_proxy.cpp Thu Jan 03 18:50:43 2013 +0000
@@ -3,8 +3,7 @@
#include <cstring>
-CollectorProxy::CollectorProxy(char *url) :base_url(url) {
-}
+CollectorProxy::CollectorProxy(const char *url) :base_url(url) {}
int CollectorProxy::send_measure(char *path_part, int value) {
HTTPClient http;
--- a/collector_proxy.h Mon Dec 31 12:08:24 2012 +0000
+++ b/collector_proxy.h Thu Jan 03 18:50:43 2013 +0000
@@ -6,11 +6,11 @@
class CollectorProxy {
public:
- CollectorProxy(char *url);
+ CollectorProxy(const char *url);
int send_measure(char *path_part, int value); // result 1:OK, 0:fail
private:
- char *base_url;
+ const char *base_url;
};
#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/local_time.cpp Thu Jan 03 18:50:43 2013 +0000
@@ -0,0 +1,32 @@
+#include "local_time.h"
+
+LocalTime::LocalTime() {}
+
+struct tm *LocalTime::tm() {
+ time_t seconds = time(NULL);
+
+ struct tm *t = localtime(&seconds);
+ if (seconds > last_sunday(t->tm_year, 3) && seconds < last_sunday(t->tm_year, 10)) {
+ seconds += 7200;
+ } else {
+ seconds += 3600;
+ }
+
+ return localtime(&seconds);
+}
+
+time_t LocalTime::last_sunday(int year, int month) {
+ struct tm t1;
+
+ t1.tm_sec = 0; t1.tm_min = 0; t1.tm_hour = month == 10 ? 3 : 2;
+ t1.tm_mday = 31; t1.tm_mon = month; t1.tm_year = year;
+
+ // convert to seconds since epoch
+ time_t seconds = mktime(&t1);
+
+ // convert back to tm because we need to know the week day
+ struct tm *t2 = localtime(&seconds);
+
+ // subtract weekday to get back last sunday of month requested
+ return seconds - 86400 * t2->tm_wday;
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/local_time.h Thu Jan 03 18:50:43 2013 +0000
@@ -0,0 +1,16 @@
+#ifndef LOCALTIME_H
+#define LOCALTIME_H
+
+#include "mbed.h"
+
+class LocalTime {
+public:
+ LocalTime();
+
+ struct tm *tm();
+
+private:
+ time_t last_sunday(int year, int month);
+};
+
+#endif
--- a/main.cpp Mon Dec 31 12:08:24 2012 +0000
+++ b/main.cpp Thu Jan 03 18:50:43 2013 +0000
@@ -9,6 +9,8 @@
#include "collector_proxy.h"
#include "sensor.h"
#include "temperature_sensor.h"
+#include "switch_sensor.h"
+#include "local_time.h"
SparkFun display(p28);
list<Sensor *> sensors;
@@ -27,7 +29,7 @@
ntp Thread: poll NTP Server every 3 hours
*/
void ntp_thread(void const *args) {
- NtpProxy ntp;
+ NtpProxy ntp((const char *) args);
while (true) {
display.show_ntp_status('t');
@@ -49,7 +51,7 @@
void display_thread(void const *args) {
char buffer[20];
int last_minute = -1;
- time_t seconds;
+ LocalTime l;
struct tm *t;
list<Sensor *>::iterator it = sensors.begin();
@@ -60,8 +62,7 @@
if (it == sensors.end()) it = sensors.begin();
// display time if minute is different from displayed value
- seconds = time(NULL) + 3600; // FIXME: time-zone calculations wanted -- toggle switch?
- t = localtime(&seconds);
+ t = l.tm();
if (last_minute != t->tm_min) {
last_minute = t->tm_min;
strftime(buffer, 20, "%H:%M", t);
@@ -101,10 +102,10 @@
send Thread: post measures to Statistics Collector every 15 minutes
*/
void send_thread(void const *args) {
- CollectorProxy collector("http://kinkeldei-net.de:81/sensor");
+ CollectorProxy collector((const char *) args);
while (true) {
- // 10 minute delay with feedback in the last 9 minutes
+ // 11 minute delay with feedback in the last 10 minutes
for (int i=10; i>=0; i--) {
display.show_network_status(i > 9 ? ' ' : '0' + i);
wait_minutes(1);
@@ -123,31 +124,32 @@
/*
main Thread: initialize and flash a LED
+
+ TODO: check or modify string constants
*/
int main() {
display.print_init_message();
- // ConfigReader c('config.ini');
- // c.read_config();
-
- sensors.push_back((Sensor *) new TemperatureSensor(p21, "erlangen/temperatur/demo", "demo"));
+ // testing only:
+ sensors.push_back((Sensor *) new TemperatureSensor(p21, "erlangen/temperatur/demo", "Temperatur"));
+ sensors.push_back((Sensor *) new SwitchSensor( p25, "erlangen/schalter/demo", "Schalter"));
- /*
- sensors.push_back((Sensor *) new TemperatureSensor(p21, "trainmeusel/temperatur/heizung", "heizung"));
- sensors.push_back((Sensor *) new TemperatureSensor(p22, "trainmeusel/temperatur/keller", "keller"));
- sensors.push_back((Sensor *) new TemperatureSensor(p23, "trainmeusel/temperatur/flur", "flur"));
- sensors.push_back((Sensor *) new TemperatureSensor(p24, "trainmeusel/temperatur/aussen", "aussen"));
+ /* live setting:
+ sensors.push_back((Sensor *) new TemperatureSensor(p21, "trainmeusel/heizung/temperatur", "Heizung"));
+ sensors.push_back((Sensor *) new TemperatureSensor(p22, "trainmeusel/waschkueche/temperatur", "Waschkueche"));
+ sensors.push_back((Sensor *) new TemperatureSensor(p23, "trainmeusel/flur/temperatur", "Flur"));
+ sensors.push_back((Sensor *) new TemperatureSensor(p24, "trainmeusel/aussen/temperatur", "Aussen"));
+ sensors.push_back((Sensor *) new SwitchSensor( p25, "trainmeusel/oel/schwimmer", "Oel"));
*/
- // must come from configreader later, then remove:
EthernetInterface eth;
eth.init("192.168.2.175", "255.255.255.0", "192.168.2.1");
eth.connect();
- Thread t1(ntp_thread);
+ Thread t1(ntp_thread, (void *)"time.apple.com");
Thread t2(display_thread);
Thread t3(measure_thread);
- Thread t4(send_thread);
+ Thread t4(send_thread, (void *)"http://kinkeldei-net.de:81/sensor");
// a periodical flash should indicate "we are alive"
DigitalOut led(LED1);
--- a/ntp_proxy.cpp Mon Dec 31 12:08:24 2012 +0000
+++ b/ntp_proxy.cpp Thu Jan 03 18:50:43 2013 +0000
@@ -1,10 +1,10 @@
#include "ntp_proxy.h"
-NtpProxy::NtpProxy(void) {
+NtpProxy::NtpProxy(const char * timeserver) : timeserver(timeserver) {
ntp_client = new NTPClient();
}
int NtpProxy::set_time(void) {
- NTPResult r = ntp_client->setTime("time.apple.com");
+ NTPResult r = ntp_client->setTime(timeserver);
return r == NTP_OK;
}
--- a/ntp_proxy.h Mon Dec 31 12:08:24 2012 +0000
+++ b/ntp_proxy.h Thu Jan 03 18:50:43 2013 +0000
@@ -8,9 +8,12 @@
NTPClient *ntp_client;
public:
- NtpProxy(void);
+ NtpProxy(const char *timeserver);
int set_time(void);
+
+private:
+ const char *timeserver;
};
#endif
--- a/one_wire.h Mon Dec 31 12:08:24 2012 +0000 +++ b/one_wire.h Thu Jan 03 18:50:43 2013 +0000 @@ -1,5 +1,5 @@ -#ifndef _ONE_WIRE_H -#define _ONE_WIRE_H +#ifndef ONE_WIRE_H +#define ONE_WIRE_H #include "mbed.h"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/switch_sensor.cpp Thu Jan 03 18:50:43 2013 +0000
@@ -0,0 +1,14 @@
+#include "switch_sensor.h"
+
+SwitchSensor::SwitchSensor(PinName pin, char *url_part, char *name): Sensor('S', pin, url_part, name), input(pin) {
+}
+
+void SwitchSensor::measure(void) {
+ value = input;
+}
+
+char *SwitchSensor::last_measure(void) {
+ sprintf(buffer, "%s", value ? "EIN" : "AUS");
+
+ return buffer;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/switch_sensor.h Thu Jan 03 18:50:43 2013 +0000
@@ -0,0 +1,18 @@
+#ifndef SWITCH_SENSOR_H
+#define SWITCH_SENSOR_H
+
+#include "sensor.h"
+
+class SwitchSensor : public Sensor {
+public:
+ SwitchSensor(PinName pin, char *url_part, char *name);
+
+ virtual void measure(void);
+ virtual char *last_measure(void);
+
+protected:
+ DigitalIn input;
+ char buffer[5];
+};
+
+#endif
--- a/temperature_sensor.cpp Mon Dec 31 12:08:24 2012 +0000
+++ b/temperature_sensor.cpp Thu Jan 03 18:50:43 2013 +0000
@@ -1,7 +1,7 @@
#include "temperature_sensor.h"
#include "rtos.h"
-TemperatureSensor::TemperatureSensor(PinName pin, char *url_part, char *name) : Sensor('T', pin, url_part, name), one_wire(pin) {
+TemperatureSensor::TemperatureSensor(PinName pin, char *url_part, char *name): Sensor('T', pin, url_part, name), one_wire(pin) {
}
void TemperatureSensor::prepare_measure(void) {