mbed Weather Platform firmware http://mbed.org/users/okini3939/notebook/mbed-weather-platform-firmware/

Dependencies:   EthernetNetIf SDHCFileSystem I2CLEDDisp Agentbed NTPClient_NetServices mbed BMP085 HTTPClient ConfigFile I2CLCD

Committer:
okini3939
Date:
Fri Apr 01 23:37:04 2011 +0000
Revision:
16:df39da7bef98
Parent:
15:07bfa25ba6ae
Child:
17:7c9d111a5d45

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:4265d973a98f 1 /*
okini3939 0:4265d973a98f 2 * mbed Weather Platform
okini3939 6:060cb9725ce3 3 * Copyright (c) 2011 Hiroshi Suga
okini3939 0:4265d973a98f 4 * Released under the MIT License: http://mbed.org/license/mit
okini3939 0:4265d973a98f 5 */
okini3939 1:86d4b7431fbe 6
okini3939 1:86d4b7431fbe 7 /** @file
okini3939 1:86d4b7431fbe 8 * @brief mbed Weather Platform
okini3939 0:4265d973a98f 9 */
okini3939 3:60f5f6d5f765 10
okini3939 14:ee6cc1632166 11 #define VERSION "mbed Weather Platform 0.2.1 (C) 2011 Suga koubou Co.,Ltd."
okini3939 10:848a2205aed1 12
okini3939 3:60f5f6d5f765 13 //#define NONBLOCKING // ethernet function non-bloking
okini3939 3:60f5f6d5f765 14
okini3939 0:4265d973a98f 15 #include "mbed.h"
okini3939 0:4265d973a98f 16 #include "BMP085.h"
okini3939 0:4265d973a98f 17 #include "SHT.h"
okini3939 0:4265d973a98f 18 #include "WeatherMeters.h"
okini3939 0:4265d973a98f 19 #include "SDFileSystem.h"
okini3939 2:4125fe2283ef 20 #include "MSCFileSystem.h"
okini3939 0:4265d973a98f 21 #include "EthernetNetIf.h"
okini3939 0:4265d973a98f 22 #include "NTPClient.h"
okini3939 0:4265d973a98f 23 #include "HTTPClient.h"
okini3939 5:9fa79cb5ec98 24 #include "Agentbed.h"
okini3939 7:0d3484dc13a9 25 #include "conf.h"
okini3939 3:60f5f6d5f765 26 #include "I2CLEDDisp.h"
okini3939 10:848a2205aed1 27 #include "I2CLCD.h"
okini3939 0:4265d973a98f 28
okini3939 9:8c63e4f3edab 29 Serial pc(USBTX, USBRX), xbee(p13, p14);
okini3939 0:4265d973a98f 30 int seq = 0;
okini3939 0:4265d973a98f 31 char filename[20];
okini3939 14:ee6cc1632166 32 struct Config conf;
okini3939 1:86d4b7431fbe 33 DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4);
okini3939 14:ee6cc1632166 34 LocalFileSystem local("local");
okini3939 0:4265d973a98f 35 SDFileSystem sd(p5, p6, p7, p8, "sd");
okini3939 2:4125fe2283ef 36 MSCFileSystem *usb;
okini3939 0:4265d973a98f 37
okini3939 0:4265d973a98f 38 // Sensors
okini3939 14:ee6cc1632166 39 struct Sensor sensor, offset, sensor_old;
okini3939 0:4265d973a98f 40 I2C i2c(p9, p10);
okini3939 0:4265d973a98f 41 BMP085 bmp085(i2c, BMP085_oss4);
okini3939 0:4265d973a98f 42 SHT sht15(p12, p11, SHT_high); // sclock, data
okini3939 0:4265d973a98f 43 WeatherMeters wmeters(p21, p15, p22); // anemo, vane, rain
okini3939 11:c6356e5949cd 44 AnalogIn ailight(p16), aiuv(p17);
okini3939 11:c6356e5949cd 45 AnalogIn *aimoist;
okini3939 11:c6356e5949cd 46 InterruptIn *intcounter;
okini3939 13:20c0f845df68 47 int count_counter;
okini3939 11:c6356e5949cd 48 unsigned long lastCountTime;
okini3939 0:4265d973a98f 49
okini3939 8:bab92fb7ef97 50 DigitalOut swout1(p29), swout2(p30);
okini3939 10:848a2205aed1 51 I2CLEDDisp *leddisp;
okini3939 10:848a2205aed1 52 I2CLCD *lcd;
okini3939 10:848a2205aed1 53 int ledpos, ledflg;
okini3939 10:848a2205aed1 54 char ledbuf[200];
okini3939 8:bab92fb7ef97 55 Ticker ticker;
okini3939 8:bab92fb7ef97 56
okini3939 0:4265d973a98f 57 // Ethernet
okini3939 0:4265d973a98f 58 EthernetNetIf *eth;
okini3939 0:4265d973a98f 59 NTPClient *ntp;
okini3939 1:86d4b7431fbe 60 HTTPClient *clientP, *clientT;
okini3939 13:20c0f845df68 61 DigitalOut led_g2(p24),led_g(p25), led_y(p26);
okini3939 0:4265d973a98f 62 DigitalIn eth_link(P1_25), eth_speed(P1_26);
okini3939 0:4265d973a98f 63
okini3939 5:9fa79cb5ec98 64 extern AgentbedClass Agentbed;
okini3939 5:9fa79cb5ec98 65 extern uint32_t locUpTime;
okini3939 5:9fa79cb5ec98 66
okini3939 1:86d4b7431fbe 67 void writefile (char *);
okini3939 1:86d4b7431fbe 68 void pachube (char *);
okini3939 10:848a2205aed1 69 char *fmtstr (char *, char *, int);
okini3939 15:07bfa25ba6ae 70 void twitter (int);
okini3939 5:9fa79cb5ec98 71 void weatherstations ();
okini3939 1:86d4b7431fbe 72 void ntpdate ();
okini3939 1:86d4b7431fbe 73 int check_action (char);
okini3939 5:9fa79cb5ec98 74 void pduReceived ();
okini3939 0:4265d973a98f 75
okini3939 0:4265d973a98f 76 float get_photo (AnalogIn &ain) {
okini3939 0:4265d973a98f 77 float f;
okini3939 0:4265d973a98f 78
okini3939 0:4265d973a98f 79 f = ain * 5.0 / 1000; // A
okini3939 0:4265d973a98f 80 return f / 0.0000026; // lx
okini3939 0:4265d973a98f 81 }
okini3939 0:4265d973a98f 82
okini3939 0:4265d973a98f 83 float get_moist (AnalogIn &ain) {
okini3939 0:4265d973a98f 84 float f;
okini3939 0:4265d973a98f 85
okini3939 0:4265d973a98f 86 f = ain * 5.0; // V
okini3939 2:4125fe2283ef 87 f = f / ((3.3 - f) / 10.0); // k ohm
okini3939 2:4125fe2283ef 88 if (f < 0) f = 0;
okini3939 2:4125fe2283ef 89 return f;
okini3939 0:4265d973a98f 90 }
okini3939 0:4265d973a98f 91
okini3939 0:4265d973a98f 92 float get_uv (AnalogIn &ain) {
okini3939 0:4265d973a98f 93 float f;
okini3939 0:4265d973a98f 94
okini3939 0:4265d973a98f 95 f = ain * 5.0 / 100000; // A
okini3939 2:4125fe2283ef 96 f = f / 0.000384; // mW/cm2
okini3939 2:4125fe2283ef 97 if (f < 0) f = 0;
okini3939 2:4125fe2283ef 98 return f;
okini3939 0:4265d973a98f 99 }
okini3939 0:4265d973a98f 100
okini3939 11:c6356e5949cd 101 void int_counter () {
okini3939 11:c6356e5949cd 102 count_counter ++;
okini3939 11:c6356e5949cd 103 }
okini3939 11:c6356e5949cd 104
okini3939 11:c6356e5949cd 105 float get_counter (char flg) {
okini3939 11:c6356e5949cd 106 float t;
okini3939 11:c6356e5949cd 107
okini3939 11:c6356e5949cd 108 if (flg) {
okini3939 11:c6356e5949cd 109 t = (float)count_counter;
okini3939 11:c6356e5949cd 110 } else {
okini3939 11:c6356e5949cd 111 if (locUpTime > lastCountTime) {
okini3939 13:20c0f845df68 112 t = (float)(locUpTime - lastCountTime) / 6000.0;
okini3939 11:c6356e5949cd 113 } else {
okini3939 13:20c0f845df68 114 t = (float)(0xffffffff - lastCountTime + locUpTime) / 6000.0;
okini3939 11:c6356e5949cd 115 }
okini3939 11:c6356e5949cd 116 t = (float)count_counter / t;
okini3939 11:c6356e5949cd 117 }
okini3939 11:c6356e5949cd 118 lastCountTime = locUpTime;
okini3939 11:c6356e5949cd 119 count_counter = 0;
okini3939 11:c6356e5949cd 120 return t;
okini3939 11:c6356e5949cd 121 }
okini3939 11:c6356e5949cd 122
okini3939 11:c6356e5949cd 123
okini3939 8:bab92fb7ef97 124 void ledscroll () {
okini3939 3:60f5f6d5f765 125
okini3939 10:848a2205aed1 126 if (conf.leddisp_mesg[0]) {
okini3939 10:848a2205aed1 127 int i, addr, len;
okini3939 10:848a2205aed1 128
okini3939 10:848a2205aed1 129 len = strlen(ledbuf);
okini3939 10:848a2205aed1 130 leddisp->locate(0, 0);
okini3939 10:848a2205aed1 131 for (i = 0; i < 4; i ++) {
okini3939 10:848a2205aed1 132 addr = ledpos + i;
okini3939 10:848a2205aed1 133 if (addr >= 0 && addr < len) {
okini3939 10:848a2205aed1 134 leddisp->putc(ledbuf[addr]);
okini3939 10:848a2205aed1 135 } else {
okini3939 10:848a2205aed1 136 leddisp->putc(' ');
okini3939 10:848a2205aed1 137 }
okini3939 10:848a2205aed1 138 }
okini3939 10:848a2205aed1 139 ledpos ++;
okini3939 10:848a2205aed1 140 if (ledpos >= len + 4) {
okini3939 10:848a2205aed1 141 ledpos = -4;
okini3939 3:60f5f6d5f765 142 }
okini3939 3:60f5f6d5f765 143 }
okini3939 3:60f5f6d5f765 144
okini3939 8:bab92fb7ef97 145 locUpTime = locUpTime + 40; // 0.4s
okini3939 9:8c63e4f3edab 146 led_y = 1;
okini3939 8:bab92fb7ef97 147 }
okini3939 8:bab92fb7ef97 148
okini3939 1:86d4b7431fbe 149 void action (char *buf) {
okini3939 15:07bfa25ba6ae 150 int i;
okini3939 15:07bfa25ba6ae 151
okini3939 8:bab92fb7ef97 152 if (check_action('h')) {
okini3939 8:bab92fb7ef97 153 swout1 = 1;
okini3939 9:8c63e4f3edab 154 led3 = 1;
okini3939 8:bab92fb7ef97 155 }
okini3939 8:bab92fb7ef97 156 if (check_action('l')) {
okini3939 8:bab92fb7ef97 157 swout1 = 0;
okini3939 9:8c63e4f3edab 158 led3 = 0;
okini3939 8:bab92fb7ef97 159 }
okini3939 1:86d4b7431fbe 160 if (check_action('H')) {
okini3939 8:bab92fb7ef97 161 swout2 = 1;
okini3939 1:86d4b7431fbe 162 led4 = 1;
okini3939 0:4265d973a98f 163 }
okini3939 1:86d4b7431fbe 164 if (check_action('L')) {
okini3939 8:bab92fb7ef97 165 swout2 = 0;
okini3939 1:86d4b7431fbe 166 led4 = 0;
okini3939 0:4265d973a98f 167 }
okini3939 1:86d4b7431fbe 168 if (check_action('P')) {
okini3939 1:86d4b7431fbe 169 if (conf.ipaddr[0] && conf.pachube_apikey[0] && conf.pachube_feedid[0]) {
okini3939 1:86d4b7431fbe 170 pachube(buf);
okini3939 1:86d4b7431fbe 171 }
okini3939 0:4265d973a98f 172 }
okini3939 15:07bfa25ba6ae 173 i = check_action('T');
okini3939 15:07bfa25ba6ae 174 if (i) {
okini3939 1:86d4b7431fbe 175 if (conf.ipaddr[0] && conf.twitter_user[0] && conf.twitter_pwd[0]) {
okini3939 15:07bfa25ba6ae 176 twitter(i == ' ' ? 0 : i - '0');
okini3939 1:86d4b7431fbe 177 }
okini3939 1:86d4b7431fbe 178 }
okini3939 5:9fa79cb5ec98 179 if (check_action('S')) {
okini3939 5:9fa79cb5ec98 180 if (conf.ipaddr[0] && conf.stations_id[0] && conf.stations_pin[0]) {
okini3939 5:9fa79cb5ec98 181 weatherstations();
okini3939 5:9fa79cb5ec98 182 }
okini3939 5:9fa79cb5ec98 183 }
okini3939 9:8c63e4f3edab 184 if (check_action('X')) {
okini3939 9:8c63e4f3edab 185 xbee.printf(buf);
okini3939 9:8c63e4f3edab 186 }
okini3939 14:ee6cc1632166 187 sensor_old = sensor;
okini3939 0:4265d973a98f 188 }
okini3939 0:4265d973a98f 189
okini3939 0:4265d973a98f 190 void init () {
okini3939 0:4265d973a98f 191 FILE *fp;
okini3939 0:4265d973a98f 192
okini3939 14:ee6cc1632166 193 if (config("/sd/" CONFIG_FILE) == -1) {
okini3939 14:ee6cc1632166 194 pc.printf("local strage\r\n", conf.interval);
okini3939 14:ee6cc1632166 195 config("/local/" CONFIG_FILE);
okini3939 14:ee6cc1632166 196 }
okini3939 0:4265d973a98f 197
okini3939 14:ee6cc1632166 198 pc.printf("\r\nInterval: %d sec\r\n", conf.interval);
okini3939 2:4125fe2283ef 199
okini3939 16:df39da7bef98 200 if (conf.lcd_mesg[0]) {
okini3939 16:df39da7bef98 201 // use I2C LCD
okini3939 16:df39da7bef98 202 lcd = new I2CLCD(i2c, I2CLCD_ADDR, conf.lcdtype, conf.lcdconf);
okini3939 16:df39da7bef98 203 }
okini3939 16:df39da7bef98 204
okini3939 16:df39da7bef98 205 if (conf.leddisp_mesg[0]) {
okini3939 16:df39da7bef98 206 // use I2C LED Display
okini3939 16:df39da7bef98 207 leddisp = new I2CLEDDisp(i2c);
okini3939 16:df39da7bef98 208 }
okini3939 16:df39da7bef98 209
okini3939 0:4265d973a98f 210 if (conf.ipaddr[0]) {
okini3939 0:4265d973a98f 211 // use ethernet
okini3939 0:4265d973a98f 212
okini3939 0:4265d973a98f 213 eth_link.mode(PullUp);
okini3939 0:4265d973a98f 214 eth_speed.mode(PullUp);
okini3939 0:4265d973a98f 215 led_g = eth_link ? 1 : 0;
okini3939 13:20c0f845df68 216 led_g2 = 1;
okini3939 9:8c63e4f3edab 217 led_y = 0;
okini3939 0:4265d973a98f 218 if (conf.ipaddr[0] == 255) {
okini3939 0:4265d973a98f 219 // dhcp
okini3939 0:4265d973a98f 220 eth = new EthernetNetIf;
okini3939 0:4265d973a98f 221 } else {
okini3939 0:4265d973a98f 222 // static
okini3939 0:4265d973a98f 223 eth = new EthernetNetIf(conf.ipaddr, conf.netmask, conf.gateway, conf.nameserver);
okini3939 0:4265d973a98f 224 }
okini3939 0:4265d973a98f 225
okini3939 0:4265d973a98f 226 EthernetErr ethErr = eth->setup();
okini3939 0:4265d973a98f 227 if(ethErr) {
okini3939 0:4265d973a98f 228 // error
okini3939 0:4265d973a98f 229 conf.ipaddr = IpAddr(0, 0, 0, 0);
okini3939 0:4265d973a98f 230 } else
okini3939 0:4265d973a98f 231 if (conf.ipaddr[0] == 255) {
okini3939 0:4265d973a98f 232 // succeed dhcp
okini3939 0:4265d973a98f 233 conf.ipaddr = eth->getIp();
okini3939 0:4265d973a98f 234 }
okini3939 0:4265d973a98f 235 pc.printf("Ethernet: %d.%d.%d.%d\r\n", eth->getIp()[0], eth->getIp()[1], eth->getIp()[2], eth->getIp()[3]);
okini3939 0:4265d973a98f 236
okini3939 5:9fa79cb5ec98 237 if (conf.ipaddr[0]) {
okini3939 5:9fa79cb5ec98 238
okini3939 5:9fa79cb5ec98 239 if (conf.ntpserver[0]) {
okini3939 5:9fa79cb5ec98 240 // ntp
okini3939 5:9fa79cb5ec98 241 pc.printf("Ntp: %s\r\n", conf.ntpserver);
okini3939 5:9fa79cb5ec98 242 ntpdate();
okini3939 5:9fa79cb5ec98 243 }
okini3939 0:4265d973a98f 244
okini3939 0:4265d973a98f 245 clientP = new HTTPClient;
okini3939 1:86d4b7431fbe 246 clientT = new HTTPClient;
okini3939 5:9fa79cb5ec98 247
okini3939 5:9fa79cb5ec98 248 if (conf.snmp_commname[0]) {
okini3939 5:9fa79cb5ec98 249 Agentbed.begin(conf.snmp_commname, "None", SNMP_DEFAULT_PORT, eth);
okini3939 5:9fa79cb5ec98 250 Agentbed.onPduReceive(pduReceived);
okini3939 5:9fa79cb5ec98 251 pc.printf("Snmp community name: %s\r\n", conf.snmp_commname);
okini3939 5:9fa79cb5ec98 252 }
okini3939 0:4265d973a98f 253 }
okini3939 16:df39da7bef98 254 } else {
okini3939 16:df39da7bef98 255 // not use ethernet
okini3939 16:df39da7bef98 256 led_g = eth_link ? 0 : 1;
okini3939 16:df39da7bef98 257 led_g2 = 0;
okini3939 0:4265d973a98f 258 }
okini3939 0:4265d973a98f 259
okini3939 0:4265d973a98f 260 if (conf.filetype) {
okini3939 0:4265d973a98f 261 // seq num
okini3939 2:4125fe2283ef 262
okini3939 2:4125fe2283ef 263 if (conf.filetype == 1) {
okini3939 2:4125fe2283ef 264 strcpy(filename, "/sd");
okini3939 2:4125fe2283ef 265 } else
okini3939 2:4125fe2283ef 266 if (conf.filetype == 2) {
okini3939 2:4125fe2283ef 267 usb = new MSCFileSystem("usb");
okini3939 2:4125fe2283ef 268 strcpy(filename, "/usb");
okini3939 2:4125fe2283ef 269 }
okini3939 2:4125fe2283ef 270 strcat(filename, "/weather.seq");
okini3939 2:4125fe2283ef 271
okini3939 2:4125fe2283ef 272 // load
okini3939 2:4125fe2283ef 273 fp = fopen(filename, "r");
okini3939 0:4265d973a98f 274 if (fp) {
okini3939 0:4265d973a98f 275 fscanf(fp, "%d", &seq);
okini3939 0:4265d973a98f 276 fclose(fp);
okini3939 0:4265d973a98f 277 }
okini3939 0:4265d973a98f 278 seq ++;
okini3939 2:4125fe2283ef 279 // save
okini3939 2:4125fe2283ef 280 fp = fopen(filename, "w");
okini3939 0:4265d973a98f 281 if (fp) {
okini3939 0:4265d973a98f 282 fprintf(fp, "%d", seq);
okini3939 0:4265d973a98f 283 fclose(fp);
okini3939 2:4125fe2283ef 284 // csv filename
okini3939 0:4265d973a98f 285 if (conf.filetype == 1) {
okini3939 0:4265d973a98f 286 sprintf(filename, "/sd/w%05d.csv", seq);
okini3939 0:4265d973a98f 287 } else
okini3939 0:4265d973a98f 288 if (conf.filetype == 2) {
okini3939 0:4265d973a98f 289 sprintf(filename, "/usb/w%05d.csv", seq);
okini3939 0:4265d973a98f 290 }
okini3939 0:4265d973a98f 291 pc.printf("Filename: %s\r\n", filename);
okini3939 0:4265d973a98f 292 led2 = 1;
okini3939 0:4265d973a98f 293 }
okini3939 0:4265d973a98f 294 }
okini3939 13:20c0f845df68 295
okini3939 13:20c0f845df68 296 pc.printf("Actions: %d\r\n", conf.actionscount);
okini3939 13:20c0f845df68 297
okini3939 16:df39da7bef98 298 if (conf.inputtype == INPUT_FALL) {
okini3939 16:df39da7bef98 299 intcounter = new InterruptIn(p18);
okini3939 16:df39da7bef98 300 intcounter->fall(&int_counter);
okini3939 16:df39da7bef98 301 } else
okini3939 16:df39da7bef98 302 if (conf.inputtype == INPUT_RISE) {
okini3939 16:df39da7bef98 303 intcounter = new InterruptIn(p18);
okini3939 16:df39da7bef98 304 intcounter->rise(&int_counter);
okini3939 16:df39da7bef98 305 } else {
okini3939 16:df39da7bef98 306 aimoist = new AnalogIn(p18);
okini3939 13:20c0f845df68 307 }
okini3939 16:df39da7bef98 308
okini3939 13:20c0f845df68 309 count_counter = 0;
okini3939 13:20c0f845df68 310 lastCountTime = 0;
okini3939 0:4265d973a98f 311 }
okini3939 0:4265d973a98f 312
okini3939 0:4265d973a98f 313 int main () {
okini3939 0:4265d973a98f 314 Timer timer;
okini3939 0:4265d973a98f 315 time_t sec;
okini3939 0:4265d973a98f 316 char buf[100];
okini3939 0:4265d973a98f 317
okini3939 8:bab92fb7ef97 318 swout1 = 0;
okini3939 8:bab92fb7ef97 319 swout2 = 0;
okini3939 0:4265d973a98f 320 led1 = 1;
okini3939 10:848a2205aed1 321 ledpos = -4;
okini3939 3:60f5f6d5f765 322 ledflg = 0;
okini3939 3:60f5f6d5f765 323 strcpy(ledbuf, VERSION);
okini3939 3:60f5f6d5f765 324 ticker.attach(&ledscroll, 0.4);
okini3939 0:4265d973a98f 325 init();
okini3939 10:848a2205aed1 326 pc.printf("%s\r\n\r\n", VERSION);
okini3939 0:4265d973a98f 327
okini3939 0:4265d973a98f 328 if (conf.filetype) {
okini3939 0:4265d973a98f 329 strcpy(buf, "date,pres(hPa),temp(`C),humi(%%),anemo(m/s),vane(`),rain(mm),light(lx),uv(mW/cm2),moist(kohm),\r\n");
okini3939 0:4265d973a98f 330 writefile(buf);
okini3939 0:4265d973a98f 331 }
okini3939 0:4265d973a98f 332
okini3939 10:848a2205aed1 333 if (conf.leddisp_mesg[0]) {
okini3939 10:848a2205aed1 334 ledpos = -4;
okini3939 10:848a2205aed1 335 sec = time(NULL);
okini3939 10:848a2205aed1 336 strftime(ledbuf, sizeof(ledbuf), "%H:%M", localtime(&sec));
okini3939 10:848a2205aed1 337 sprintf(&ledbuf[5], " %ds %s", conf.interval, filename);
okini3939 10:848a2205aed1 338 if (conf.ipaddr[0]) {
okini3939 10:848a2205aed1 339 sprintf(&ledbuf[strlen(ledbuf)], " %d.%d.%d.%d", conf.ipaddr[0], conf.ipaddr[1], conf.ipaddr[2], conf.ipaddr[3]);
okini3939 10:848a2205aed1 340 if (conf.pachube_apikey[0] && conf.pachube_feedid[0]) {
okini3939 10:848a2205aed1 341 strcat(ledbuf, " P");
okini3939 10:848a2205aed1 342 }
okini3939 10:848a2205aed1 343 if (conf.twitter_user[0] && conf.twitter_pwd[0]) {
okini3939 10:848a2205aed1 344 strcat(ledbuf, " T");
okini3939 10:848a2205aed1 345 }
okini3939 3:60f5f6d5f765 346 }
okini3939 3:60f5f6d5f765 347 }
okini3939 3:60f5f6d5f765 348
okini3939 0:4265d973a98f 349 timer.start();
okini3939 0:4265d973a98f 350 #ifdef NONBLOCKING
okini3939 0:4265d973a98f 351 while (timer.read() < 5) {
okini3939 13:20c0f845df68 352 wait_ms(1);
okini3939 0:4265d973a98f 353 Net::poll();
okini3939 0:4265d973a98f 354 }
okini3939 0:4265d973a98f 355 timer.reset();
okini3939 0:4265d973a98f 356 #endif
okini3939 3:60f5f6d5f765 357
okini3939 0:4265d973a98f 358 while(1) {
okini3939 0:4265d973a98f 359 led1 = 0;
okini3939 0:4265d973a98f 360
okini3939 0:4265d973a98f 361 sec = time(NULL);
okini3939 0:4265d973a98f 362 strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", localtime(&sec));
okini3939 0:4265d973a98f 363
okini3939 0:4265d973a98f 364 // sensors
okini3939 9:8c63e4f3edab 365 __disable_irq();
okini3939 0:4265d973a98f 366 bmp085.update();
okini3939 14:ee6cc1632166 367 sensor.pres = bmp085.get_pressure() + offset.pres;
okini3939 14:ee6cc1632166 368 sensor.temp2 = bmp085.get_temperature();
okini3939 0:4265d973a98f 369
okini3939 0:4265d973a98f 370 sht15.update(SHT_high);
okini3939 14:ee6cc1632166 371 sensor.temp = sht15.get_temperature() + offset.temp;
okini3939 14:ee6cc1632166 372 sensor.humi = sht15.get_humidity() + offset.humi;
okini3939 0:4265d973a98f 373
okini3939 14:ee6cc1632166 374 sensor.anemo = wmeters.get_windspeed();
okini3939 14:ee6cc1632166 375 sensor.vane = wmeters.get_windvane();
okini3939 14:ee6cc1632166 376 sensor.rain = wmeters.get_raingauge();
okini3939 0:4265d973a98f 377
okini3939 14:ee6cc1632166 378 sensor.light = get_photo(ailight);
okini3939 11:c6356e5949cd 379 if (conf.inputtype == INPUT_MOIST) {
okini3939 14:ee6cc1632166 380 sensor.moist = get_moist(*aimoist);
okini3939 11:c6356e5949cd 381 } else {
okini3939 14:ee6cc1632166 382 sensor.moist = get_counter(0);
okini3939 11:c6356e5949cd 383 }
okini3939 14:ee6cc1632166 384 sensor.uv = get_uv(aiuv);
okini3939 0:4265d973a98f 385
okini3939 14:ee6cc1632166 386 sprintf(&buf[strlen(buf)], ",%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f\r\n",
okini3939 14:ee6cc1632166 387 sensor.pres, sensor.temp, sensor.humi, sensor.anemo, sensor.vane, sensor.rain, sensor.light, sensor.uv, sensor.moist, sensor.temp2);
okini3939 0:4265d973a98f 388 if (conf.filetype) {
okini3939 0:4265d973a98f 389 // csv
okini3939 0:4265d973a98f 390 writefile(buf);
okini3939 0:4265d973a98f 391 }
okini3939 9:8c63e4f3edab 392 __enable_irq();
okini3939 9:8c63e4f3edab 393 pc.printf(buf);
okini3939 3:60f5f6d5f765 394
okini3939 1:86d4b7431fbe 395 action(&buf[20]);
okini3939 3:60f5f6d5f765 396
okini3939 10:848a2205aed1 397 if (conf.leddisp_mesg[0]) {
okini3939 10:848a2205aed1 398 if (ledflg) {
okini3939 10:848a2205aed1 399 ledpos = -4;
okini3939 10:848a2205aed1 400 fmtstr(conf.leddisp_mesg, ledbuf, sizeof(ledbuf));
okini3939 10:848a2205aed1 401 }
okini3939 10:848a2205aed1 402 ledflg = 1;
okini3939 0:4265d973a98f 403 }
okini3939 10:848a2205aed1 404 if (conf.lcd_mesg[0]) {
okini3939 10:848a2205aed1 405 fmtstr(conf.lcd_mesg, buf, sizeof(buf));
okini3939 10:848a2205aed1 406 lcd->cls();
okini3939 10:848a2205aed1 407 lcd->puts(buf);
okini3939 10:848a2205aed1 408 }
okini3939 10:848a2205aed1 409
okini3939 0:4265d973a98f 410 led1 = 1;
okini3939 0:4265d973a98f 411
okini3939 0:4265d973a98f 412 while (timer.read() < conf.interval) {
okini3939 0:4265d973a98f 413 // wait(1);
okini3939 0:4265d973a98f 414 // pc.putc('.');
okini3939 13:20c0f845df68 415 wait_ms(1);
okini3939 13:20c0f845df68 416 if (conf.ipaddr[0]) {
okini3939 13:20c0f845df68 417 led_g = eth_link ? 1 : 0;
okini3939 13:20c0f845df68 418 led_g2 = 1;
okini3939 13:20c0f845df68 419 } else {
okini3939 13:20c0f845df68 420 led_g = eth_link ? 0 : 1;
okini3939 13:20c0f845df68 421 led_g2 = 0;
okini3939 13:20c0f845df68 422 }
okini3939 0:4265d973a98f 423 Net::poll();
okini3939 13:20c0f845df68 424
okini3939 13:20c0f845df68 425 if (pc.readable()) {
okini3939 13:20c0f845df68 426 int i;
okini3939 13:20c0f845df68 427 i = pc.getc();
okini3939 13:20c0f845df68 428 if (i == ' ') {
okini3939 13:20c0f845df68 429 break;
okini3939 13:20c0f845df68 430 } else {
okini3939 13:20c0f845df68 431 pc.printf("( %d )\r\n", (int)timer.read());
okini3939 13:20c0f845df68 432 }
okini3939 13:20c0f845df68 433 }
okini3939 0:4265d973a98f 434 }
okini3939 0:4265d973a98f 435 timer.reset();
okini3939 0:4265d973a98f 436 }
okini3939 0:4265d973a98f 437 }