忘備録-備忘録

技術的な備忘録

広告

※このエリアは、60日間投稿が無い場合に表示されます。記事を投稿すると、表示されなくなります。

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);
}
コメント

binbono arduino互換機を作る

2015-12-04 17:31:43 | arduino
マイコンはarduinoをよく使用します。本体を使いまわせば良いのですが、何かの機器に組み込む場合、1台あたりの値段が結構かかります。AVRマイコン自身は安価なので、なるべく安く組み込めるように考えてみました。

書き込み器とマイコンを分け、マイコン部分を少ない部品で作ることとしました。

マイコン部回路


これだけシンプルになりました。水晶振動子を使用していないのでクロックは内臓の8MHzとなります。また、電源電圧は2.7V~5Vの間で自由に使えます。

書き込み器回路図


マイコン部をシンプルにしたために書き込み器に細かい回路が来ています。書き込み器は使いまわしがきくので問題ないでしょう。ピン配置はaitendoで取り扱っているUSB-TTL変換キットと同じにしました。このキットでも書き込みできると思います。

使用時の写真



ブートローダーの設定
ATmega168  ATmegaBOOT_168_pro_8MHz.hex arduinoをインストールしたフォルダの中にあります。
       ヒューズビット EXTENDED:0xF8  HIGHT:0xFD  LOW:0xE2  LOCKBIT:0xCF

ATmega328  ATmegaBOOT_168_atmega328_pro_8MHz.hex arduinoをインストールしたフォルダの中にあります。
       ヒューズビット EXTENDED:0xFD  HIGHT:0xDA  LOW:0xE2  LOCKBIT:0xCF

IDEでの設定
 IDE上ではArduino Pro or Pro Miniを選びます。



参考サイト
  Arduinoのヒューズ設定
  あちゃんでいいの
コメント