thermometer, hygrometer and barometer. Using VFD for display.
Dependencies: AM2321 LPS331_I2C mbed-rtos mbed EthernetInterface
main.cpp@4:6e0a2e9fe23a, 2014-11-22 (annotated)
- 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?
User | Revision | Line number | New 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 | } |