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);
}