Grüße an alle Bewohner von Habr!
Ich möchte über eine neue und unerwartete Möglichkeit sprechen, mehrere HTU21-Sensoren über den I2C-Bus ohne Verwendung zusätzlicher Chips zu verbinden.
Dieser Sensor ist immer noch bei verschiedenen Heimwerkern beliebt und verdient: Er ist genauer als sein Vorgänger und klein (was zum Einbetten in Geräte praktisch ist).
In letzter Zeit war ich, wie viele Benutzer, verwirrt über die mangelnde Möglichkeit, die Adresse dieses Sensors zu ändern. Google hat natürlich eine Reihe von Artikeln über alle Arten von Multiplexern für den I2C-Bus herausgegeben, von "Kaufen im bekannten chinesischen Online-Shop" bis "Do it yourself". Nirgendwo gab es Optionen ohne Lötkolben und zusätzliche Kosten. Dies konnte nur verärgert sein, da es notwendig war, das Problem hier und jetzt zu lösen (Kunden sind solche Kunden). Ich möchte über einen einfacheren und entspannteren, sehr einfachen Ausweg aus dieser Situation sprechen. Fasziniert? Dann sage ich es dir.
Anfangsdaten: Arduino Mega und 4 Sensoren HTU21.
Aufgabe: Es ist notwendig, alle htu-Sensoren über den I2C-Bus anzuschließen und die Werte zu lesen. Darüber hinaus sind diese Sensoren nicht die einzigen Slave-Geräte auf diesem Bus (die Pläne enthalten auch einen LCD-Bildschirm und andere Sensoren).
Was wissen wir Der HTU21-Sensor hat eine feste Adresse am Bus - 0x40 1 . Wie kann man mit einem Mikrocontroller und 4 Sensoren mit denselben Adressen am Bus auf ein bestimmtes Gerät ohne zusätzliche Chips zugreifen?
Alles stellt sich als recht einfach heraus:
- Verbinden Sie Masse, scl und sda wie gewohnt (vergessen Sie nicht die Pull-up-Widerstände für die Datenleitung und die Synchronisation);
- Wir verbinden das Stromkabel jedes Sensors mit einem digitalen Eingang am Arduino (Sie verstehen wahrscheinlich bereits, wohin ich führe).
- Wenden Sie abwechselnd HIGH an jeden Digitaleingang an, der einen separaten Sensor speist, und lesen Sie nach einer Verzögerung den Wert vom Sensor mit Stromversorgung ab.
- Geben Sie ein LOW-Signal für diesen Sensor und wiederholen Sie den Zyklus für andere Sensoren.
Natürlich hat dieses Verfahren auch Nachteile, zum Beispiel ist die erforderliche Anzahl freier digitaler oder analoger Ausgänge möglicherweise einfach nicht verfügbar. Für die Verwendung in Projekten funktioniert dieses Prinzip jedoch in ausreichenden Abständen vom Mikrocontroller. Ich hoffe, dieser Artikel hilft Ihnen dabei, Nerven, Geld und Zeit zu sparen.
Kein Wunder, dass alles Geniale einfach ist!
Auflistung im Anhang:
/* , HTU21 BME280 */ void greenhouseHT() { delay(30); rooms[3].TempA = bme.readTemperature(); delay(30); rooms[3].HumA = bme.readHumidity(); delay(30); for (int i=0; i<3; i++) { digitalWrite(HTU21_pins[i], HIGH); delay(30); rooms[i].HumA = myGreenhouseHumidity.readHumidity(); rooms[i].TempA = myGreenhouseHumidity.readTemperature(); delay(30); digitalWrite(HTU21_pins[i], LOW); delay(30); } digitalWrite(pin_HTU21_1, HIGH); }