忘備録-備忘録

技術的な備忘録

BME280センサを使用した温湿度気圧計

2017-08-09 19:19:00 | arduino

BME280センサを使用した温湿度気圧計を製作しました。マイコンにはATMEGA168をArduino化して使用しています。

DSC_0199_3

回路図

7セグメントLEDを12桁も使用するためピン数が足りず、7セグメントドライバに74HC4511を使用しました。

image

プログラム

センサの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);
}