脚を撃たずにHTU21センサーのアドレスの不変性を素早く回避する方法

親愛なるハブロヴィッツ、こんにちは。私は今、あなたを助けています。





興味深いデバイスの開発中に問題が発生しました。いくつかの 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 );


      
      






All Articles