BME280センサを使用した温湿度気圧計を製作しました。マイコンにはATMEGA168をArduino化して使用しています。
回路図
7セグメントLEDを12桁も使用するためピン数が足りず、7セグメントドライバに74HC4511を使用しました。
プログラム
センサのBME280を扱うライブラリはここのものを使用しました。
一部ATMEGA特有の表記を使用しています。ATMEGA168かATMEGA328でないと動作しません。
/* * 気温・湿度・気圧計 * BME280センサーを使用(I2Cモード) * * PD0-PD3 出力する数字 * PD4 小数点 * PD5-PD7,PB0 7セグメントLED1 * PB1-PB4 7セグメントLED2 * PC0-PC3 7セグメントLED3 */ #include <BME280.h> #include <MsTimer2.h> #define SERIAL_BAUD 9600 BME280 bme(1,1,1,3,5,0,false,0x76); bool metric = true; unsigned char LED7seg[3][5]; void printBME280Data(Stream * client); void printBME280CalculatedData(Stream* client); void display_numbers (void) { static int display_line = 0; int led = display_line / 4; int disp = display_line % 4; PORTB = PORTC = PORTD = 0; PORTD = LED7seg[led][disp]; if(LED7seg[led][4]==disp) { PORTD |= 0x10; } switch(display_line) { case 0: PORTD |= 0x20; break; case 1: PORTD |= 0x40; break; case 2: PORTD |= 0x80; break; case 3: PORTB |= 0x01; break; case 4: PORTB |= 0x02; break; case 5: PORTB |= 0x04; break; case 6: PORTB |= 0x08; break; case 7: PORTB |= 0x10; break; case 8: PORTC |= 0x01; break; case 9: PORTC |= 0x02; break; case 10: PORTC |= 0x04; break; case 11: PORTC |= 0x08; break; } display_line++; if(display_line==12) display_line = 0; } void setup() { DDRD = 0xFF; DDRB = 0x1F; DDRC = 0x0F; for(int i=0;i<3;i++) { LED7seg[i][0] = LED7seg[i][1] = LED7seg[i][2] = LED7seg[i][3] = LED7seg[i][4] = 0; } MsTimer2::set(1, display_numbers); MsTimer2::start(); while (!bme.begin()) { delay(1000); } } void loop() { float temp(NAN), hum(NAN), pres(NAN); bme.ReadData(pres, temp, hum, true, 1); LED7seg[2][0] = ((int)temp) / 10; LED7seg[2][1] = ((int)temp) % 10; LED7seg[2][2] = ((int)(temp*10.0)) % 10; LED7seg[2][3] = ((int)(temp*100.0)) % 10; LED7seg[2][4] = 1; LED7seg[0][0] = ((int)hum) / 10; LED7seg[0][1] = ((int)hum) % 10; LED7seg[0][2] = ((int)(hum*10.0)) % 10; LED7seg[0][3] = ((int)(hum*100.0)) % 10; LED7seg[0][4] = 1; LED7seg[1][0] = ((int)pres) / 1000; LED7seg[1][1] = ((int)pres)/100 % 10; LED7seg[1][2] = ((int)pres)/10 % 10; LED7seg[1][3] = ((int)pres) % 10; LED7seg[1][4] = 3; delay(1000); }