次にAHT25の読み取り関数です。インターネットのあちこちからかき集めて試行錯誤して作ったものです。
unsigned char dig0;
uint32_t dig1;
uint32_t dig2;
uint32_t dig3;
uint32_t dig33;
uint32_t dig4;
uint32_t dig5;
unsigned char dig6;
void readData(void){
int i = 0;
long int x;
byte digraw[6];
char tempera[15];
char humidi[15];
char data_t[] = "Temp:";
char data_h[] = "Humi:";
char data2;
char data3 = "dC";
char par = "%";
uint32_t hum_low, temp_low;
double T;
double H;
char t_data[5];
char h_data[5];
//for(i=0; i < 7; i++){digraw[i] = 0x00;}
Wire.beginTransmission(AHT25_ADDRESS);
Wire.write(0xAC);
Wire.write(0x33);
Wire.write(0x00);
Wire.endTransmission();
do {
delay(80);
Wire.requestFrom(AHT25_ADDRESS, 7);
if (Wire.available() >= 7){
for(i = 0; i < 7; i++){digraw[i] = Wire.read();}
}
} while((digraw[0] & 0x80) != 0);
hum_low = ((uint32_t)digraw[1] << 12) | ((uint32_t)digraw[2] << 4) |
(((uint32_t)digraw[3] >> 4) & 0x0F);
temp_low = (((uint32_t)digraw[3] & 0x0F) << 16) | ((uint32_t)digraw[4] << 8) |
(uint32_t)digraw[5];
T = ((temp_low / 1048576.0) * 200) - 50;
H = (hum_low / 1048576.0) * 100;
dtostrf(T,3,1,t_data);
dtostrf(H,3,1,h_data);
sprintf(tempera, "T:%sdC H:%s%s ", t_data, h_data, "%");
writeCommand(0x02);
for (i = 0; i < sizeof(tempera); i++) {writeData(tempera[i]); }
}
結構めんどくさいし、一発で関数に纏めるには、時間が掛かりました。
バグってはまったところが幾つかありました。
Tの計算中1048576.0を1048576で計算するとバグり良い数値が出てきません。これはNanoも同様でした。
同様にHの計算も1048576.0を1048576で計算するとバグり良い数値が出てきません。
長いこと悩みました。
ちなみにraspberry pi picoのコンパイラではprintf()だけで表示出来ました。