thermometer, hygrometer and barometer. Using VFD for display.
Dependencies: AM2321 LPS331_I2C mbed-rtos mbed EthernetInterface
Diff: main.cpp
- Revision:
- 2:c036ba032972
- Parent:
- 1:9755b5a98ffb
- Child:
- 4:6e0a2e9fe23a
--- a/main.cpp Sat May 24 14:53:11 2014 +0000 +++ b/main.cpp Sun Nov 09 12:03:40 2014 +0000 @@ -1,14 +1,208 @@ #include "mbed.h" +#include "rtos.h" +#include "LPS331_I2C.h" +#include "AM2321.h" -// use LM35D thermo senser IC -AnalogIn thermo_ic(p20); +//for debug +DigitalOut led1(LED1, 0); +DigitalOut led2(LED2, 0); +DigitalOut led3(LED3, 0); +DigitalOut led4(LED4, 0); Serial pc(USBTX, USBRX); -int main() { - while(1) { - //0.0V <= Vout <= 1.0V at 0C to 100C - float temperature = thermo_ic.read()*3.3*100; - pc.printf("temperature=%f\n", temperature); - wait(1); +// for ethernet led +DigitalIn lnk(P1_25); +DigitalIn spd(P1_26); +DigitalOut speed(p29); +DigitalOut link(p30); + +void flip(void const *args) { + speed = !spd; + link = !lnk; +} + +// for LPS331 +LPS331_I2C lps331(p9, p10, LPS331_I2C_SA0_HIGH); + +void setup_lps331() +{ + if(lps331.isAvailable()) { + pc.printf("LPS331 is available!\r\n"); + } else { + pc.printf("LPS331 is unavailable!\r\n"); + } + + lps331.setResolution(LPS331_I2C_PRESSURE_AVG_512, LPS331_I2C_TEMP_AVG_128); + lps331.setDataRate(LPS331_I2C_DATARATE_7HZ); + lps331.setActive(true); +} + +float pressure = 0; + +void update_pressure() +{ + led2 = !led2; + pressure = lps331.getPressure(); + pc.printf("press:%f\r\n", pressure); +} + +// for AM2321 +AM2321 am2321(p9, p10); + +float temperature = 0; +float humidity = 0; + +void update_temperature_and_humidity() +{ + if(am2321.poll()) + { + led3 = !led3; + temperature = am2321.getTemperature(); + humidity = am2321.getHumidity(); + pc.printf("temp:%.1f,humid:%.1f\r\n", temperature, humidity); + } +} + +// for display mode +int mode = 1; // 1: temp, 2: humid, 3: press +void next_mode(void const *args) +{ + mode++; + if(mode > 3) + { + mode = 1; } } + +// for VFD +const int ANODE_PINS_NUM = 9; +DigitalOut anode_pins[ANODE_PINS_NUM] = { + DigitalOut(p28), + DigitalOut(p27), + DigitalOut(p26), + DigitalOut(p25), + DigitalOut(p24), + DigitalOut(p23), + DigitalOut(p22), + DigitalOut(p16), + DigitalOut(p21) +}; + +const int CATHODE_PINS_NUM = 4; +DigitalOut cathode_pins[CATHODE_PINS_NUM] = { + DigitalOut(p17), + DigitalOut(p18), + DigitalOut(p19), + DigitalOut(p20) +}; + +const int DOT_PIN_POS = 8; +const int VFD_LIGHT_MAP[][ANODE_PINS_NUM] = { + {1, 1, 1, 1, 1, 1, 0, 0, 0}, // 0 + {0, 1, 1, 0, 0, 0, 0, 0, 0}, // 1 + {1, 1, 0, 1, 1, 0, 1, 0, 0}, // 2 + {1, 1, 1, 1, 0, 0, 1, 0, 0}, // 3 + {0, 1, 1, 0, 0, 1, 1, 1, 0}, // 4 + {1, 0, 1, 1, 0, 1, 1, 0, 0}, // 5 + {1, 0, 1, 1, 1, 1, 1, 0, 0}, // 6 + {1, 1, 1, 0, 0, 0, 0, 0, 0}, // 7 + {1, 1, 1, 1, 1, 1, 1, 0, 0}, // 8 + {1, 1, 1, 1, 0, 1, 1, 0, 0}, // 9 + {1, 1, 1, 0, 1, 1, 1, 0, 0}, // A + {0, 0, 1, 1, 1, 1, 1, 0, 0}, // B + {1, 0, 0, 1, 1, 1, 0, 0, 0}, // C + {0, 1, 1, 1, 1, 0, 1, 0, 0}, // D + {1, 0, 0, 1, 1, 1, 1, 0, 0}, // E + {1, 0, 0, 0, 1, 1, 1, 0, 0}, // F + {1, 1, 0, 0, 1, 1, 1, 0, 0}, // P + {0, 0, 1, 0, 1, 1, 1, 0, 0} // h +}; + +void vfd_display_number(int pos, int number, int add_dot) +{ + cathode_pins[pos] = 1; + for(int i = 0; i < DOT_PIN_POS; i++) { + anode_pins[i] = VFD_LIGHT_MAP[number][i]; + } + anode_pins[DOT_PIN_POS] = add_dot; + Thread::wait(2); + for(int i = 0; i < ANODE_PINS_NUM; i++) { + anode_pins[i] = 0; + } + cathode_pins[pos] = 0; +} + +void vfd_display_numbers(void const *args) +{ + int ones_place, tens_place, hundreds_place, thousands_place, use_dot; + int display_number; + led1 = !led1; + + switch(mode) + { + case 1: + display_number = (int)(temperature * 10); + ones_place = 12; + tens_place = display_number % 10; + thousands_place = (int)(display_number / 100); + hundreds_place = (int)((display_number - thousands_place * 100 - tens_place) / 10); + use_dot = 1; + break; + case 2: + display_number = (int)(humidity * 10); + ones_place = 16; + tens_place = display_number % 10; + thousands_place = (int)(display_number / 100); + hundreds_place = (int)((display_number - thousands_place * 100 - tens_place) / 10); + use_dot = 1; + break; + default: + display_number = (int)pressure; + if(display_number < 1000) + { + ones_place = 17; + tens_place = display_number % 10; + thousands_place = (int)(display_number / 100); + hundreds_place = (int)((display_number - thousands_place * 100 - tens_place) / 10); + } + else + { + ones_place = display_number % 10; + thousands_place = (int)(display_number / 1000); + hundreds_place = (int)((display_number - thousands_place * 1000) / 100); + tens_place = (int)((display_number - thousands_place * 1000 - hundreds_place * 100) / 10); + } + use_dot = 0; + } + + vfd_display_number(3, thousands_place, 0); + vfd_display_number(2, hundreds_place, use_dot); + vfd_display_number(1, tens_place, 0); + vfd_display_number(0, ones_place, 0); +} + +int main() +{ + // start ethernet + RtosTimer flipper(flip, osTimerPeriodic, NULL); + flipper.start(50); + + // start auto mode change + RtosTimer mode_changer(next_mode, osTimerPeriodic, NULL); + mode_changer.start(7000); + + // start vfd + RtosTimer vfd_timer(vfd_display_numbers, osTimerPeriodic, NULL); + vfd_timer.start(16); //60fps + + // start LPS331 + setup_lps331(); + Thread::wait(2000); + + while(1) { + update_pressure(); + update_temperature_and_humidity(); + + Thread::wait(1000); + } +}