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 Jun 03 15:38:22 2011 +0000
Revision:
19:69b77f9e0446
Parent:
18:9286e5010c14

        

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