thermometer, hygrometer and barometer. Using VFD for display.
Dependencies: AM2321 LPS331_I2C mbed-rtos mbed EthernetInterface
main.cpp@2:c036ba032972, 2014-11-09 (annotated)
- Committer:
- mia_0032
- Date:
- Sun Nov 09 12:03:40 2014 +0000
- Revision:
- 2:c036ba032972
- Parent:
- 1:9755b5a98ffb
- Child:
- 4:6e0a2e9fe23a
?????????VFD?????????????
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 | 2:c036ba032972 | 3 | #include "LPS331_I2C.h" |
mia_0032 | 2:c036ba032972 | 4 | #include "AM2321.h" |
mia_0032 | 0:29eeb8eaefee | 5 | |
mia_0032 | 2:c036ba032972 | 6 | //for debug |
mia_0032 | 2:c036ba032972 | 7 | DigitalOut led1(LED1, 0); |
mia_0032 | 2:c036ba032972 | 8 | DigitalOut led2(LED2, 0); |
mia_0032 | 2:c036ba032972 | 9 | DigitalOut led3(LED3, 0); |
mia_0032 | 2:c036ba032972 | 10 | DigitalOut led4(LED4, 0); |
mia_0032 | 0:29eeb8eaefee | 11 | Serial pc(USBTX, USBRX); |
mia_0032 | 0:29eeb8eaefee | 12 | |
mia_0032 | 2:c036ba032972 | 13 | // for ethernet led |
mia_0032 | 2:c036ba032972 | 14 | DigitalIn lnk(P1_25); |
mia_0032 | 2:c036ba032972 | 15 | DigitalIn spd(P1_26); |
mia_0032 | 2:c036ba032972 | 16 | DigitalOut speed(p29); |
mia_0032 | 2:c036ba032972 | 17 | DigitalOut link(p30); |
mia_0032 | 2:c036ba032972 | 18 | |
mia_0032 | 2:c036ba032972 | 19 | void flip(void const *args) { |
mia_0032 | 2:c036ba032972 | 20 | speed = !spd; |
mia_0032 | 2:c036ba032972 | 21 | link = !lnk; |
mia_0032 | 2:c036ba032972 | 22 | } |
mia_0032 | 2:c036ba032972 | 23 | |
mia_0032 | 2:c036ba032972 | 24 | // for LPS331 |
mia_0032 | 2:c036ba032972 | 25 | LPS331_I2C lps331(p9, p10, LPS331_I2C_SA0_HIGH); |
mia_0032 | 2:c036ba032972 | 26 | |
mia_0032 | 2:c036ba032972 | 27 | void setup_lps331() |
mia_0032 | 2:c036ba032972 | 28 | { |
mia_0032 | 2:c036ba032972 | 29 | if(lps331.isAvailable()) { |
mia_0032 | 2:c036ba032972 | 30 | pc.printf("LPS331 is available!\r\n"); |
mia_0032 | 2:c036ba032972 | 31 | } else { |
mia_0032 | 2:c036ba032972 | 32 | pc.printf("LPS331 is unavailable!\r\n"); |
mia_0032 | 2:c036ba032972 | 33 | } |
mia_0032 | 2:c036ba032972 | 34 | |
mia_0032 | 2:c036ba032972 | 35 | lps331.setResolution(LPS331_I2C_PRESSURE_AVG_512, LPS331_I2C_TEMP_AVG_128); |
mia_0032 | 2:c036ba032972 | 36 | lps331.setDataRate(LPS331_I2C_DATARATE_7HZ); |
mia_0032 | 2:c036ba032972 | 37 | lps331.setActive(true); |
mia_0032 | 2:c036ba032972 | 38 | } |
mia_0032 | 2:c036ba032972 | 39 | |
mia_0032 | 2:c036ba032972 | 40 | float pressure = 0; |
mia_0032 | 2:c036ba032972 | 41 | |
mia_0032 | 2:c036ba032972 | 42 | void update_pressure() |
mia_0032 | 2:c036ba032972 | 43 | { |
mia_0032 | 2:c036ba032972 | 44 | led2 = !led2; |
mia_0032 | 2:c036ba032972 | 45 | pressure = lps331.getPressure(); |
mia_0032 | 2:c036ba032972 | 46 | pc.printf("press:%f\r\n", pressure); |
mia_0032 | 2:c036ba032972 | 47 | } |
mia_0032 | 2:c036ba032972 | 48 | |
mia_0032 | 2:c036ba032972 | 49 | // for AM2321 |
mia_0032 | 2:c036ba032972 | 50 | AM2321 am2321(p9, p10); |
mia_0032 | 2:c036ba032972 | 51 | |
mia_0032 | 2:c036ba032972 | 52 | float temperature = 0; |
mia_0032 | 2:c036ba032972 | 53 | float humidity = 0; |
mia_0032 | 2:c036ba032972 | 54 | |
mia_0032 | 2:c036ba032972 | 55 | void update_temperature_and_humidity() |
mia_0032 | 2:c036ba032972 | 56 | { |
mia_0032 | 2:c036ba032972 | 57 | if(am2321.poll()) |
mia_0032 | 2:c036ba032972 | 58 | { |
mia_0032 | 2:c036ba032972 | 59 | led3 = !led3; |
mia_0032 | 2:c036ba032972 | 60 | temperature = am2321.getTemperature(); |
mia_0032 | 2:c036ba032972 | 61 | humidity = am2321.getHumidity(); |
mia_0032 | 2:c036ba032972 | 62 | pc.printf("temp:%.1f,humid:%.1f\r\n", temperature, humidity); |
mia_0032 | 2:c036ba032972 | 63 | } |
mia_0032 | 2:c036ba032972 | 64 | } |
mia_0032 | 2:c036ba032972 | 65 | |
mia_0032 | 2:c036ba032972 | 66 | // for display mode |
mia_0032 | 2:c036ba032972 | 67 | int mode = 1; // 1: temp, 2: humid, 3: press |
mia_0032 | 2:c036ba032972 | 68 | void next_mode(void const *args) |
mia_0032 | 2:c036ba032972 | 69 | { |
mia_0032 | 2:c036ba032972 | 70 | mode++; |
mia_0032 | 2:c036ba032972 | 71 | if(mode > 3) |
mia_0032 | 2:c036ba032972 | 72 | { |
mia_0032 | 2:c036ba032972 | 73 | mode = 1; |
mia_0032 | 0:29eeb8eaefee | 74 | } |
mia_0032 | 0:29eeb8eaefee | 75 | } |
mia_0032 | 2:c036ba032972 | 76 | |
mia_0032 | 2:c036ba032972 | 77 | // for VFD |
mia_0032 | 2:c036ba032972 | 78 | const int ANODE_PINS_NUM = 9; |
mia_0032 | 2:c036ba032972 | 79 | DigitalOut anode_pins[ANODE_PINS_NUM] = { |
mia_0032 | 2:c036ba032972 | 80 | DigitalOut(p28), |
mia_0032 | 2:c036ba032972 | 81 | DigitalOut(p27), |
mia_0032 | 2:c036ba032972 | 82 | DigitalOut(p26), |
mia_0032 | 2:c036ba032972 | 83 | DigitalOut(p25), |
mia_0032 | 2:c036ba032972 | 84 | DigitalOut(p24), |
mia_0032 | 2:c036ba032972 | 85 | DigitalOut(p23), |
mia_0032 | 2:c036ba032972 | 86 | DigitalOut(p22), |
mia_0032 | 2:c036ba032972 | 87 | DigitalOut(p16), |
mia_0032 | 2:c036ba032972 | 88 | DigitalOut(p21) |
mia_0032 | 2:c036ba032972 | 89 | }; |
mia_0032 | 2:c036ba032972 | 90 | |
mia_0032 | 2:c036ba032972 | 91 | const int CATHODE_PINS_NUM = 4; |
mia_0032 | 2:c036ba032972 | 92 | DigitalOut cathode_pins[CATHODE_PINS_NUM] = { |
mia_0032 | 2:c036ba032972 | 93 | DigitalOut(p17), |
mia_0032 | 2:c036ba032972 | 94 | DigitalOut(p18), |
mia_0032 | 2:c036ba032972 | 95 | DigitalOut(p19), |
mia_0032 | 2:c036ba032972 | 96 | DigitalOut(p20) |
mia_0032 | 2:c036ba032972 | 97 | }; |
mia_0032 | 2:c036ba032972 | 98 | |
mia_0032 | 2:c036ba032972 | 99 | const int DOT_PIN_POS = 8; |
mia_0032 | 2:c036ba032972 | 100 | const int VFD_LIGHT_MAP[][ANODE_PINS_NUM] = { |
mia_0032 | 2:c036ba032972 | 101 | {1, 1, 1, 1, 1, 1, 0, 0, 0}, // 0 |
mia_0032 | 2:c036ba032972 | 102 | {0, 1, 1, 0, 0, 0, 0, 0, 0}, // 1 |
mia_0032 | 2:c036ba032972 | 103 | {1, 1, 0, 1, 1, 0, 1, 0, 0}, // 2 |
mia_0032 | 2:c036ba032972 | 104 | {1, 1, 1, 1, 0, 0, 1, 0, 0}, // 3 |
mia_0032 | 2:c036ba032972 | 105 | {0, 1, 1, 0, 0, 1, 1, 1, 0}, // 4 |
mia_0032 | 2:c036ba032972 | 106 | {1, 0, 1, 1, 0, 1, 1, 0, 0}, // 5 |
mia_0032 | 2:c036ba032972 | 107 | {1, 0, 1, 1, 1, 1, 1, 0, 0}, // 6 |
mia_0032 | 2:c036ba032972 | 108 | {1, 1, 1, 0, 0, 0, 0, 0, 0}, // 7 |
mia_0032 | 2:c036ba032972 | 109 | {1, 1, 1, 1, 1, 1, 1, 0, 0}, // 8 |
mia_0032 | 2:c036ba032972 | 110 | {1, 1, 1, 1, 0, 1, 1, 0, 0}, // 9 |
mia_0032 | 2:c036ba032972 | 111 | {1, 1, 1, 0, 1, 1, 1, 0, 0}, // A |
mia_0032 | 2:c036ba032972 | 112 | {0, 0, 1, 1, 1, 1, 1, 0, 0}, // B |
mia_0032 | 2:c036ba032972 | 113 | {1, 0, 0, 1, 1, 1, 0, 0, 0}, // C |
mia_0032 | 2:c036ba032972 | 114 | {0, 1, 1, 1, 1, 0, 1, 0, 0}, // D |
mia_0032 | 2:c036ba032972 | 115 | {1, 0, 0, 1, 1, 1, 1, 0, 0}, // E |
mia_0032 | 2:c036ba032972 | 116 | {1, 0, 0, 0, 1, 1, 1, 0, 0}, // F |
mia_0032 | 2:c036ba032972 | 117 | {1, 1, 0, 0, 1, 1, 1, 0, 0}, // P |
mia_0032 | 2:c036ba032972 | 118 | {0, 0, 1, 0, 1, 1, 1, 0, 0} // h |
mia_0032 | 2:c036ba032972 | 119 | }; |
mia_0032 | 2:c036ba032972 | 120 | |
mia_0032 | 2:c036ba032972 | 121 | void vfd_display_number(int pos, int number, int add_dot) |
mia_0032 | 2:c036ba032972 | 122 | { |
mia_0032 | 2:c036ba032972 | 123 | cathode_pins[pos] = 1; |
mia_0032 | 2:c036ba032972 | 124 | for(int i = 0; i < DOT_PIN_POS; i++) { |
mia_0032 | 2:c036ba032972 | 125 | anode_pins[i] = VFD_LIGHT_MAP[number][i]; |
mia_0032 | 2:c036ba032972 | 126 | } |
mia_0032 | 2:c036ba032972 | 127 | anode_pins[DOT_PIN_POS] = add_dot; |
mia_0032 | 2:c036ba032972 | 128 | Thread::wait(2); |
mia_0032 | 2:c036ba032972 | 129 | for(int i = 0; i < ANODE_PINS_NUM; i++) { |
mia_0032 | 2:c036ba032972 | 130 | anode_pins[i] = 0; |
mia_0032 | 2:c036ba032972 | 131 | } |
mia_0032 | 2:c036ba032972 | 132 | cathode_pins[pos] = 0; |
mia_0032 | 2:c036ba032972 | 133 | } |
mia_0032 | 2:c036ba032972 | 134 | |
mia_0032 | 2:c036ba032972 | 135 | void vfd_display_numbers(void const *args) |
mia_0032 | 2:c036ba032972 | 136 | { |
mia_0032 | 2:c036ba032972 | 137 | int ones_place, tens_place, hundreds_place, thousands_place, use_dot; |
mia_0032 | 2:c036ba032972 | 138 | int display_number; |
mia_0032 | 2:c036ba032972 | 139 | led1 = !led1; |
mia_0032 | 2:c036ba032972 | 140 | |
mia_0032 | 2:c036ba032972 | 141 | switch(mode) |
mia_0032 | 2:c036ba032972 | 142 | { |
mia_0032 | 2:c036ba032972 | 143 | case 1: |
mia_0032 | 2:c036ba032972 | 144 | display_number = (int)(temperature * 10); |
mia_0032 | 2:c036ba032972 | 145 | ones_place = 12; |
mia_0032 | 2:c036ba032972 | 146 | tens_place = display_number % 10; |
mia_0032 | 2:c036ba032972 | 147 | thousands_place = (int)(display_number / 100); |
mia_0032 | 2:c036ba032972 | 148 | hundreds_place = (int)((display_number - thousands_place * 100 - tens_place) / 10); |
mia_0032 | 2:c036ba032972 | 149 | use_dot = 1; |
mia_0032 | 2:c036ba032972 | 150 | break; |
mia_0032 | 2:c036ba032972 | 151 | case 2: |
mia_0032 | 2:c036ba032972 | 152 | display_number = (int)(humidity * 10); |
mia_0032 | 2:c036ba032972 | 153 | ones_place = 16; |
mia_0032 | 2:c036ba032972 | 154 | tens_place = display_number % 10; |
mia_0032 | 2:c036ba032972 | 155 | thousands_place = (int)(display_number / 100); |
mia_0032 | 2:c036ba032972 | 156 | hundreds_place = (int)((display_number - thousands_place * 100 - tens_place) / 10); |
mia_0032 | 2:c036ba032972 | 157 | use_dot = 1; |
mia_0032 | 2:c036ba032972 | 158 | break; |
mia_0032 | 2:c036ba032972 | 159 | default: |
mia_0032 | 2:c036ba032972 | 160 | display_number = (int)pressure; |
mia_0032 | 2:c036ba032972 | 161 | if(display_number < 1000) |
mia_0032 | 2:c036ba032972 | 162 | { |
mia_0032 | 2:c036ba032972 | 163 | ones_place = 17; |
mia_0032 | 2:c036ba032972 | 164 | tens_place = display_number % 10; |
mia_0032 | 2:c036ba032972 | 165 | thousands_place = (int)(display_number / 100); |
mia_0032 | 2:c036ba032972 | 166 | hundreds_place = (int)((display_number - thousands_place * 100 - tens_place) / 10); |
mia_0032 | 2:c036ba032972 | 167 | } |
mia_0032 | 2:c036ba032972 | 168 | else |
mia_0032 | 2:c036ba032972 | 169 | { |
mia_0032 | 2:c036ba032972 | 170 | ones_place = display_number % 10; |
mia_0032 | 2:c036ba032972 | 171 | thousands_place = (int)(display_number / 1000); |
mia_0032 | 2:c036ba032972 | 172 | hundreds_place = (int)((display_number - thousands_place * 1000) / 100); |
mia_0032 | 2:c036ba032972 | 173 | tens_place = (int)((display_number - thousands_place * 1000 - hundreds_place * 100) / 10); |
mia_0032 | 2:c036ba032972 | 174 | } |
mia_0032 | 2:c036ba032972 | 175 | use_dot = 0; |
mia_0032 | 2:c036ba032972 | 176 | } |
mia_0032 | 2:c036ba032972 | 177 | |
mia_0032 | 2:c036ba032972 | 178 | vfd_display_number(3, thousands_place, 0); |
mia_0032 | 2:c036ba032972 | 179 | vfd_display_number(2, hundreds_place, use_dot); |
mia_0032 | 2:c036ba032972 | 180 | vfd_display_number(1, tens_place, 0); |
mia_0032 | 2:c036ba032972 | 181 | vfd_display_number(0, ones_place, 0); |
mia_0032 | 2:c036ba032972 | 182 | } |
mia_0032 | 2:c036ba032972 | 183 | |
mia_0032 | 2:c036ba032972 | 184 | int main() |
mia_0032 | 2:c036ba032972 | 185 | { |
mia_0032 | 2:c036ba032972 | 186 | // start ethernet |
mia_0032 | 2:c036ba032972 | 187 | RtosTimer flipper(flip, osTimerPeriodic, NULL); |
mia_0032 | 2:c036ba032972 | 188 | flipper.start(50); |
mia_0032 | 2:c036ba032972 | 189 | |
mia_0032 | 2:c036ba032972 | 190 | // start auto mode change |
mia_0032 | 2:c036ba032972 | 191 | RtosTimer mode_changer(next_mode, osTimerPeriodic, NULL); |
mia_0032 | 2:c036ba032972 | 192 | mode_changer.start(7000); |
mia_0032 | 2:c036ba032972 | 193 | |
mia_0032 | 2:c036ba032972 | 194 | // start vfd |
mia_0032 | 2:c036ba032972 | 195 | RtosTimer vfd_timer(vfd_display_numbers, osTimerPeriodic, NULL); |
mia_0032 | 2:c036ba032972 | 196 | vfd_timer.start(16); //60fps |
mia_0032 | 2:c036ba032972 | 197 | |
mia_0032 | 2:c036ba032972 | 198 | // start LPS331 |
mia_0032 | 2:c036ba032972 | 199 | setup_lps331(); |
mia_0032 | 2:c036ba032972 | 200 | Thread::wait(2000); |
mia_0032 | 2:c036ba032972 | 201 | |
mia_0032 | 2:c036ba032972 | 202 | while(1) { |
mia_0032 | 2:c036ba032972 | 203 | update_pressure(); |
mia_0032 | 2:c036ba032972 | 204 | update_temperature_and_humidity(); |
mia_0032 | 2:c036ba032972 | 205 | |
mia_0032 | 2:c036ba032972 | 206 | Thread::wait(1000); |
mia_0032 | 2:c036ba032972 | 207 | } |
mia_0032 | 2:c036ba032972 | 208 | } |