thermometer, hygrometer and barometer. Using VFD for display.

Dependencies:   AM2321 LPS331_I2C mbed-rtos mbed EthernetInterface

Committer:
mia_0032
Date:
Sat Nov 22 15:11:00 2014 +0000
Revision:
4:6e0a2e9fe23a
Parent:
2:c036ba032972
fluentd?POST???????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mia_0032 0:29eeb8eaefee 1 #include "mbed.h"
mia_0032 2:c036ba032972 2 #include "rtos.h"
mia_0032 4:6e0a2e9fe23a 3 #include "EthernetInterface.h"
mia_0032 2:c036ba032972 4 #include "LPS331_I2C.h"
mia_0032 2:c036ba032972 5 #include "AM2321.h"
mia_0032 4:6e0a2e9fe23a 6 #include <string>
mia_0032 0:29eeb8eaefee 7
mia_0032 2:c036ba032972 8 //for debug
mia_0032 2:c036ba032972 9 DigitalOut led1(LED1, 0);
mia_0032 2:c036ba032972 10 DigitalOut led2(LED2, 0);
mia_0032 2:c036ba032972 11 DigitalOut led3(LED3, 0);
mia_0032 2:c036ba032972 12 DigitalOut led4(LED4, 0);
mia_0032 0:29eeb8eaefee 13 Serial pc(USBTX, USBRX);
mia_0032 0:29eeb8eaefee 14
mia_0032 4:6e0a2e9fe23a 15 // data
mia_0032 4:6e0a2e9fe23a 16 float pressure = 0;
mia_0032 4:6e0a2e9fe23a 17 float temperature = 0;
mia_0032 4:6e0a2e9fe23a 18 float humidity = 0;
mia_0032 4:6e0a2e9fe23a 19
mia_0032 4:6e0a2e9fe23a 20 // for ethernet
mia_0032 4:6e0a2e9fe23a 21 EthernetInterface eth;
mia_0032 2:c036ba032972 22 DigitalIn lnk(P1_25);
mia_0032 2:c036ba032972 23 DigitalIn spd(P1_26);
mia_0032 2:c036ba032972 24 DigitalOut speed(p29);
mia_0032 2:c036ba032972 25 DigitalOut link(p30);
mia_0032 2:c036ba032972 26
mia_0032 2:c036ba032972 27 void flip(void const *args) {
mia_0032 2:c036ba032972 28 speed = !spd;
mia_0032 2:c036ba032972 29 link = !lnk;
mia_0032 2:c036ba032972 30 }
mia_0032 2:c036ba032972 31
mia_0032 4:6e0a2e9fe23a 32 // for fluentd in_http
mia_0032 4:6e0a2e9fe23a 33 void send_fluentd(const string host, const int port)
mia_0032 4:6e0a2e9fe23a 34 {
mia_0032 4:6e0a2e9fe23a 35 TCPSocketConnection sock;
mia_0032 4:6e0a2e9fe23a 36 sock.connect(host.c_str(), port);
mia_0032 4:6e0a2e9fe23a 37
mia_0032 4:6e0a2e9fe23a 38 char post_data[128];
mia_0032 4:6e0a2e9fe23a 39 sprintf(post_data, "json={\"humid\":%d,\"temp\":%d,\"press\":%d}", (int)humidity, (int)temperature, (int)pressure);
mia_0032 4:6e0a2e9fe23a 40 pc.printf("POST Data:\r\n%s\r\n%d", post_data, strlen(post_data));
mia_0032 4:6e0a2e9fe23a 41 char http_cmd[512];
mia_0032 4:6e0a2e9fe23a 42 sprintf(http_cmd, "POST /mbed.climate HTTP/1.1\r\nHost: %s:%d\r\nAccept: */*\r\nContent-Length: %d\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\n%s\r\n\r\n", host.c_str(), port, strlen(post_data), post_data);
mia_0032 4:6e0a2e9fe23a 43 pc.printf("Request:\r\n%s\r\n", http_cmd);
mia_0032 4:6e0a2e9fe23a 44 sock.send_all(http_cmd, sizeof(http_cmd)-1);
mia_0032 4:6e0a2e9fe23a 45
mia_0032 4:6e0a2e9fe23a 46 char buffer[1024];
mia_0032 4:6e0a2e9fe23a 47 int ret;
mia_0032 4:6e0a2e9fe23a 48 while (true) {
mia_0032 4:6e0a2e9fe23a 49 ret = sock.receive(buffer, sizeof(buffer)-1);
mia_0032 4:6e0a2e9fe23a 50 if (ret <= 0)
mia_0032 4:6e0a2e9fe23a 51 break;
mia_0032 4:6e0a2e9fe23a 52 buffer[ret] = '\0';
mia_0032 4:6e0a2e9fe23a 53 pc.printf("Received %d chars from server:\r\n%s\r\n", ret, buffer);
mia_0032 4:6e0a2e9fe23a 54 }
mia_0032 4:6e0a2e9fe23a 55
mia_0032 4:6e0a2e9fe23a 56 sock.close();
mia_0032 4:6e0a2e9fe23a 57 }
mia_0032 4:6e0a2e9fe23a 58
mia_0032 4:6e0a2e9fe23a 59
mia_0032 2:c036ba032972 60 // for LPS331
mia_0032 2:c036ba032972 61 LPS331_I2C lps331(p9, p10, LPS331_I2C_SA0_HIGH);
mia_0032 2:c036ba032972 62
mia_0032 2:c036ba032972 63 void setup_lps331()
mia_0032 2:c036ba032972 64 {
mia_0032 2:c036ba032972 65 if(lps331.isAvailable()) {
mia_0032 2:c036ba032972 66 pc.printf("LPS331 is available!\r\n");
mia_0032 2:c036ba032972 67 } else {
mia_0032 2:c036ba032972 68 pc.printf("LPS331 is unavailable!\r\n");
mia_0032 2:c036ba032972 69 }
mia_0032 2:c036ba032972 70
mia_0032 2:c036ba032972 71 lps331.setResolution(LPS331_I2C_PRESSURE_AVG_512, LPS331_I2C_TEMP_AVG_128);
mia_0032 2:c036ba032972 72 lps331.setDataRate(LPS331_I2C_DATARATE_7HZ);
mia_0032 2:c036ba032972 73 lps331.setActive(true);
mia_0032 2:c036ba032972 74 }
mia_0032 2:c036ba032972 75
mia_0032 2:c036ba032972 76 void update_pressure()
mia_0032 2:c036ba032972 77 {
mia_0032 2:c036ba032972 78 led2 = !led2;
mia_0032 2:c036ba032972 79 pressure = lps331.getPressure();
mia_0032 2:c036ba032972 80 pc.printf("press:%f\r\n", pressure);
mia_0032 2:c036ba032972 81 }
mia_0032 2:c036ba032972 82
mia_0032 2:c036ba032972 83 // for AM2321
mia_0032 2:c036ba032972 84 AM2321 am2321(p9, p10);
mia_0032 2:c036ba032972 85
mia_0032 2:c036ba032972 86 void update_temperature_and_humidity()
mia_0032 2:c036ba032972 87 {
mia_0032 2:c036ba032972 88 if(am2321.poll())
mia_0032 2:c036ba032972 89 {
mia_0032 2:c036ba032972 90 led3 = !led3;
mia_0032 2:c036ba032972 91 temperature = am2321.getTemperature();
mia_0032 2:c036ba032972 92 humidity = am2321.getHumidity();
mia_0032 2:c036ba032972 93 pc.printf("temp:%.1f,humid:%.1f\r\n", temperature, humidity);
mia_0032 2:c036ba032972 94 }
mia_0032 2:c036ba032972 95 }
mia_0032 2:c036ba032972 96
mia_0032 2:c036ba032972 97 // for display mode
mia_0032 2:c036ba032972 98 int mode = 1; // 1: temp, 2: humid, 3: press
mia_0032 2:c036ba032972 99 void next_mode(void const *args)
mia_0032 2:c036ba032972 100 {
mia_0032 2:c036ba032972 101 mode++;
mia_0032 2:c036ba032972 102 if(mode > 3)
mia_0032 2:c036ba032972 103 {
mia_0032 2:c036ba032972 104 mode = 1;
mia_0032 0:29eeb8eaefee 105 }
mia_0032 0:29eeb8eaefee 106 }
mia_0032 2:c036ba032972 107
mia_0032 2:c036ba032972 108 // for VFD
mia_0032 2:c036ba032972 109 const int ANODE_PINS_NUM = 9;
mia_0032 2:c036ba032972 110 DigitalOut anode_pins[ANODE_PINS_NUM] = {
mia_0032 2:c036ba032972 111 DigitalOut(p28),
mia_0032 2:c036ba032972 112 DigitalOut(p27),
mia_0032 2:c036ba032972 113 DigitalOut(p26),
mia_0032 2:c036ba032972 114 DigitalOut(p25),
mia_0032 2:c036ba032972 115 DigitalOut(p24),
mia_0032 2:c036ba032972 116 DigitalOut(p23),
mia_0032 2:c036ba032972 117 DigitalOut(p22),
mia_0032 2:c036ba032972 118 DigitalOut(p16),
mia_0032 2:c036ba032972 119 DigitalOut(p21)
mia_0032 2:c036ba032972 120 };
mia_0032 2:c036ba032972 121
mia_0032 2:c036ba032972 122 const int CATHODE_PINS_NUM = 4;
mia_0032 2:c036ba032972 123 DigitalOut cathode_pins[CATHODE_PINS_NUM] = {
mia_0032 2:c036ba032972 124 DigitalOut(p17),
mia_0032 2:c036ba032972 125 DigitalOut(p18),
mia_0032 2:c036ba032972 126 DigitalOut(p19),
mia_0032 2:c036ba032972 127 DigitalOut(p20)
mia_0032 2:c036ba032972 128 };
mia_0032 2:c036ba032972 129
mia_0032 2:c036ba032972 130 const int DOT_PIN_POS = 8;
mia_0032 2:c036ba032972 131 const int VFD_LIGHT_MAP[][ANODE_PINS_NUM] = {
mia_0032 2:c036ba032972 132 {1, 1, 1, 1, 1, 1, 0, 0, 0}, // 0
mia_0032 2:c036ba032972 133 {0, 1, 1, 0, 0, 0, 0, 0, 0}, // 1
mia_0032 2:c036ba032972 134 {1, 1, 0, 1, 1, 0, 1, 0, 0}, // 2
mia_0032 2:c036ba032972 135 {1, 1, 1, 1, 0, 0, 1, 0, 0}, // 3
mia_0032 2:c036ba032972 136 {0, 1, 1, 0, 0, 1, 1, 1, 0}, // 4
mia_0032 2:c036ba032972 137 {1, 0, 1, 1, 0, 1, 1, 0, 0}, // 5
mia_0032 2:c036ba032972 138 {1, 0, 1, 1, 1, 1, 1, 0, 0}, // 6
mia_0032 2:c036ba032972 139 {1, 1, 1, 0, 0, 0, 0, 0, 0}, // 7
mia_0032 2:c036ba032972 140 {1, 1, 1, 1, 1, 1, 1, 0, 0}, // 8
mia_0032 2:c036ba032972 141 {1, 1, 1, 1, 0, 1, 1, 0, 0}, // 9
mia_0032 2:c036ba032972 142 {1, 1, 1, 0, 1, 1, 1, 0, 0}, // A
mia_0032 2:c036ba032972 143 {0, 0, 1, 1, 1, 1, 1, 0, 0}, // B
mia_0032 2:c036ba032972 144 {1, 0, 0, 1, 1, 1, 0, 0, 0}, // C
mia_0032 2:c036ba032972 145 {0, 1, 1, 1, 1, 0, 1, 0, 0}, // D
mia_0032 2:c036ba032972 146 {1, 0, 0, 1, 1, 1, 1, 0, 0}, // E
mia_0032 2:c036ba032972 147 {1, 0, 0, 0, 1, 1, 1, 0, 0}, // F
mia_0032 2:c036ba032972 148 {1, 1, 0, 0, 1, 1, 1, 0, 0}, // P
mia_0032 2:c036ba032972 149 {0, 0, 1, 0, 1, 1, 1, 0, 0} // h
mia_0032 2:c036ba032972 150 };
mia_0032 2:c036ba032972 151
mia_0032 2:c036ba032972 152 void vfd_display_number(int pos, int number, int add_dot)
mia_0032 2:c036ba032972 153 {
mia_0032 2:c036ba032972 154 cathode_pins[pos] = 1;
mia_0032 2:c036ba032972 155 for(int i = 0; i < DOT_PIN_POS; i++) {
mia_0032 2:c036ba032972 156 anode_pins[i] = VFD_LIGHT_MAP[number][i];
mia_0032 2:c036ba032972 157 }
mia_0032 2:c036ba032972 158 anode_pins[DOT_PIN_POS] = add_dot;
mia_0032 2:c036ba032972 159 Thread::wait(2);
mia_0032 2:c036ba032972 160 for(int i = 0; i < ANODE_PINS_NUM; i++) {
mia_0032 2:c036ba032972 161 anode_pins[i] = 0;
mia_0032 2:c036ba032972 162 }
mia_0032 2:c036ba032972 163 cathode_pins[pos] = 0;
mia_0032 2:c036ba032972 164 }
mia_0032 2:c036ba032972 165
mia_0032 2:c036ba032972 166 void vfd_display_numbers(void const *args)
mia_0032 2:c036ba032972 167 {
mia_0032 2:c036ba032972 168 int ones_place, tens_place, hundreds_place, thousands_place, use_dot;
mia_0032 2:c036ba032972 169 int display_number;
mia_0032 2:c036ba032972 170 led1 = !led1;
mia_0032 2:c036ba032972 171
mia_0032 2:c036ba032972 172 switch(mode)
mia_0032 2:c036ba032972 173 {
mia_0032 2:c036ba032972 174 case 1:
mia_0032 2:c036ba032972 175 display_number = (int)(temperature * 10);
mia_0032 2:c036ba032972 176 ones_place = 12;
mia_0032 2:c036ba032972 177 tens_place = display_number % 10;
mia_0032 2:c036ba032972 178 thousands_place = (int)(display_number / 100);
mia_0032 2:c036ba032972 179 hundreds_place = (int)((display_number - thousands_place * 100 - tens_place) / 10);
mia_0032 2:c036ba032972 180 use_dot = 1;
mia_0032 2:c036ba032972 181 break;
mia_0032 2:c036ba032972 182 case 2:
mia_0032 2:c036ba032972 183 display_number = (int)(humidity * 10);
mia_0032 2:c036ba032972 184 ones_place = 16;
mia_0032 2:c036ba032972 185 tens_place = display_number % 10;
mia_0032 2:c036ba032972 186 thousands_place = (int)(display_number / 100);
mia_0032 2:c036ba032972 187 hundreds_place = (int)((display_number - thousands_place * 100 - tens_place) / 10);
mia_0032 2:c036ba032972 188 use_dot = 1;
mia_0032 2:c036ba032972 189 break;
mia_0032 2:c036ba032972 190 default:
mia_0032 2:c036ba032972 191 display_number = (int)pressure;
mia_0032 2:c036ba032972 192 if(display_number < 1000)
mia_0032 2:c036ba032972 193 {
mia_0032 2:c036ba032972 194 ones_place = 17;
mia_0032 2:c036ba032972 195 tens_place = display_number % 10;
mia_0032 2:c036ba032972 196 thousands_place = (int)(display_number / 100);
mia_0032 2:c036ba032972 197 hundreds_place = (int)((display_number - thousands_place * 100 - tens_place) / 10);
mia_0032 2:c036ba032972 198 }
mia_0032 2:c036ba032972 199 else
mia_0032 2:c036ba032972 200 {
mia_0032 2:c036ba032972 201 ones_place = display_number % 10;
mia_0032 2:c036ba032972 202 thousands_place = (int)(display_number / 1000);
mia_0032 2:c036ba032972 203 hundreds_place = (int)((display_number - thousands_place * 1000) / 100);
mia_0032 2:c036ba032972 204 tens_place = (int)((display_number - thousands_place * 1000 - hundreds_place * 100) / 10);
mia_0032 2:c036ba032972 205 }
mia_0032 2:c036ba032972 206 use_dot = 0;
mia_0032 2:c036ba032972 207 }
mia_0032 2:c036ba032972 208
mia_0032 2:c036ba032972 209 vfd_display_number(3, thousands_place, 0);
mia_0032 2:c036ba032972 210 vfd_display_number(2, hundreds_place, use_dot);
mia_0032 2:c036ba032972 211 vfd_display_number(1, tens_place, 0);
mia_0032 2:c036ba032972 212 vfd_display_number(0, ones_place, 0);
mia_0032 2:c036ba032972 213 }
mia_0032 2:c036ba032972 214
mia_0032 2:c036ba032972 215 int main()
mia_0032 2:c036ba032972 216 {
mia_0032 2:c036ba032972 217 // start ethernet
mia_0032 2:c036ba032972 218 RtosTimer flipper(flip, osTimerPeriodic, NULL);
mia_0032 2:c036ba032972 219 flipper.start(50);
mia_0032 4:6e0a2e9fe23a 220 eth.init();
mia_0032 4:6e0a2e9fe23a 221 eth.connect();
mia_0032 2:c036ba032972 222
mia_0032 2:c036ba032972 223 // start auto mode change
mia_0032 2:c036ba032972 224 RtosTimer mode_changer(next_mode, osTimerPeriodic, NULL);
mia_0032 2:c036ba032972 225 mode_changer.start(7000);
mia_0032 2:c036ba032972 226
mia_0032 2:c036ba032972 227 // start vfd
mia_0032 2:c036ba032972 228 RtosTimer vfd_timer(vfd_display_numbers, osTimerPeriodic, NULL);
mia_0032 2:c036ba032972 229 vfd_timer.start(16); //60fps
mia_0032 2:c036ba032972 230
mia_0032 2:c036ba032972 231 // start LPS331
mia_0032 2:c036ba032972 232 setup_lps331();
mia_0032 2:c036ba032972 233 Thread::wait(2000);
mia_0032 2:c036ba032972 234
mia_0032 2:c036ba032972 235 while(1) {
mia_0032 4:6e0a2e9fe23a 236 for(int i=0;i < 30;i++){
mia_0032 4:6e0a2e9fe23a 237 update_pressure();
mia_0032 4:6e0a2e9fe23a 238 update_temperature_and_humidity();
mia_0032 4:6e0a2e9fe23a 239 Thread::wait(1000);
mia_0032 4:6e0a2e9fe23a 240 }
mia_0032 4:6e0a2e9fe23a 241 send_fluentd("192.168.10.100", 8888);
mia_0032 2:c036ba032972 242 }
mia_0032 2:c036ba032972 243 }