温湿度気圧センサー MBE280

温湿度センサー SHT31



回路図
資料

MBE280温湿度気圧センサーモジュールは 秋月電子から購入する。
ATmega88Pでコントロールする。
通信方法は I2C通信である。

AVRの電源は5V  MBE280の電源は 3.6V以下である

AVRとMBE280を接続するには、I2C変換基板を使う

変換基板

MBE280基板は J3をショートしておく。 SDO端子は GNDにすると アドレスは 0X76になる
i2C双方向電圧レベル変換モジュールは SCL,SDAはプルアップしてあるので、 MBE280はプルアップする必要はない


さて、プログラムである
アドレス 0x76 は 7ビットである。 0111-0110
実際の通信コマンドは 0ビットが 0=送信 1=受信であるため
送信 1110-1100  (0xEC)
受信 1110-1101  (0xED)


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

/* 開始条件送出*/
TWCR = (1<<TWINT)|(1<<TWSTA) |(1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ーーコマンドの送出ーーー
TWDR=0xEC; //B8
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

/* 停止条件送出*/
TWCR = (1<<TWINT)|(1<<TWSTO) |(1<<TWEN);

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

このプログラムの組み合わせをおこなう。


MBE280は 0xD0コマンドを入れると 通信成功していれば 0x60 を返信する
このテストプログラムを記載しよう
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
void ONDO_ID(void)
{

     /* 開始条件送出*/
     TWCR = (1<<TWINT)|(1<<TWSTA) |(1<<TWEN);
     while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機

     TWDR=0xEC; //MBE280 アドレス
     TWCR = (1<<TWINT) | (1<<TWEN);
     while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機

     TWDR=0xD0; //ID コマンド
     TWCR = (1<<TWINT) | (1<<TWEN);
     while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機

     TWDR=0x01; //1バイト受信する
     TWCR = (1<<TWINT) | (1<<TWEN);
     while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機


      /* 停止条件送出*/
     TWCR = (1<<TWINT)|(1<<TWSTO) |(1<<TWEN);

     //終了したので 受信モードに入る
     wait_ms(1);

     /* 開始条件送出*/
     TWCR = (1<<TWINT)|(1<<TWSTA) |(1<<TWEN);
     while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機

      TWDR=0xED; //MBE280 受信
     TWCR = (1<<TWINT) | (1<<TWEN);
     while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機

     TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN); //ACK
     while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
     ans=TWDR; //TWDRに1バイト返信される
     o_data[1]=ans;

     /* 停止条件送出*/
     TWCR = (1<<TWINT)|(1<<TWSTO) |(1<<TWEN);

}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ans=0x60 が返信されている


同様に 0xF7、0x08を送ると 8バイトのデータが返信される






SHT31 温湿度モジュール




SHT31モジュールは、資料があるので、比較的簡単に簡単に温度、湿度への数値変換ができる。

/---- 読み取りREAD ondo -------------
void ONDO_READ(void)
{
int i;


TWCR = (1<<TWINT)|(1<<TWSTA) |(1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
//08を返すので、*SLA_W 書込アドレス送出
/* 開始条件送出*/

TWDR=0x88; //76
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
// 18 ACK を受け取る
/*DATA 機能コード送出 0x03 */

TWDR=0x2C; //76
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
// 18 ACK を受け取る
/*DATA 機能コード送出 0x03 */

TWDR=0x06; //76
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
// 18 ACK を受け取る


/* 停止条件送出*/
TWCR = (1<<TWINT)|(1<<TWSTO) |(1<<TWEN);

//終了したので TWSRは 0xF8を返す
wait_ms(1);

TWCR = (1<<TWINT)|(1<<TWSTA) |(1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
//08を返すので、*SLA_W 書込アドレス送出
/* 開始条件送出*/

TWDR=0x89;
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
//03データが送られたので 28 を返す


TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN); //ACK
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
ans=TWDR; //
o_data[1]=ans;


TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN); //ACK
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
ans=TWDR; //
o_data[2]=ans;


TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN); //ACK
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
ans=TWDR; //
o_data[3]=ans;


TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN); //ACK
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
ans=TWDR; //
o_data[4]=ans;


TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN); //ACK
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
ans=TWDR; //
o_data[5]=ans;


TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN); //ACK
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
ans=TWDR; //
o_data[6]=ans;




/* 停止条件送出*/
TWCR = (1<<TWINT)|(1<<TWSTO) |(1<<TWEN);

}