親愛なるハブロヴィッツ、こんにちは。私は今、あなたを助けています。
興味深いデバイスの開発中に問題が発生しました。いくつかの htu 21 センサーをすばやく arduinka に接続し、読み取り値を記録する必要がありました。センサーは i2c バスの存在に満足していましたが、アドレスが静的であるため、問題がありました。内部のarduinoの天才は、センサーの切り替えとポーリングを交互に行う賢い方法を考え出し、手のひらをこすって、コントローラーが時々フリーズするのを見ました。グーグルで見つけたのは、これと同じ天才ですが、ポートの保護ダイオードを流れる貫通電流のために数分間以上動作しないため、バンドルをテストしなかったようです。
コメントでは、賢明な人々がさまざまな方法を提案しました。そうです、最も簡単で安価な方法は、cd4051be アナログ マルチプレクサを使用することでした。コメントを引用します。
「はい、その方が簡単です。そして、レッグが少なく、I2C ハードウェア (SCL をどんな足でも持ち出せるコントローラーについて話しているのではありませんか?) - 先史時代の CD4051 などのアナログ マルチプレクサー、SDA も直接インストールされます。すべてのチップ、マルチプレクサを介した SCL。3 つの追加のレッグ、8 つの追加のチャネル。SCL プルアップをマルチプレクサの前ではなく、後ろに置くことを忘れないでください。」
ここからのスキームに従って接続しましたが、マルチプレクサの出力のみがA0ではなくA5に接続されています。3 つの SCL センサーは、レッグ 15、13、および 1、SDA コモンに接続されています。
状態遷移表に基づく最も単純なインドのコード
アドレスバスは digitalWrite () を介して有効化されます (ヒットしないでください、探し回らないでください)
int temp1;
int hum1;
int temp2;
int hum2;
int temp3;
int hum3;
#include <HTU21D.h>
HTU21D myHTU21D(HTU21D_RES_RH12_TEMP14);
void setup() {
pinMode(8, OUTPUT); // CD4051 pin 11 (A)
pinMode(9, OUTPUT); // CD4051 pin 10 (B)
pinMode(10, OUTPUT); // CD4051 pin 9 (C)
Serial.begin(9600);
while (myHTU21D.begin() != true)
{
Serial.println(F("Sensor is faild or not connected")); //(F()) saves string to flash & keeps dynamic memory free
delay (200);
// 9600 .
}
}
void loop() {
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
myHTU21D.begin();
delay (150);
temp1 = myHTU21D.readTemperature();
hum1 = myHTU21D.readCompensatedHumidity();
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
myHTU21D.begin();
delay (150);
temp2 = myHTU21D.readTemperature();
hum2 = myHTU21D.readCompensatedHumidity();
digitalWrite(8, LOW);
digitalWrite(9, HIGH);
digitalWrite(10, LOW);
myHTU21D.begin();
delay (150);
temp3 = myHTU21D.readTemperature();
hum3 = myHTU21D.readCompensatedHumidity();
Serial.print(" T1: "); Serial.print(temp1 );
Serial.print(" H1: "); Serial.print(hum1 );
Serial.print(" T2: "); Serial.print(temp2 );
Serial.print(" 2: "); Serial.print(hum2 );
Serial.print(" 3: "); Serial.print(temp3 );
Serial.print(" 3: "); Serial.print(hum3 );