thermometer, hygrometer and barometer. Using VFD for display.

Dependencies:   AM2321 LPS331_I2C mbed-rtos mbed EthernetInterface

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?

UserRevisionLine numberNew 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 }