¡Saludos a todos los residentes de Habr!
Quiero hablar sobre una forma nueva e inesperada de conectar varios sensores HTU21 a través del bus I2C sin usar chips adicionales.
Este sensor sigue siendo popular entre varios maestros de bricolaje, y se lo merece: es más preciso que su predecesor y de tamaño pequeño (lo cual es conveniente para incrustar en dispositivos).
Más recientemente, yo, como muchos usuarios, estaba desconcertado por la falta de la capacidad de cambiar la dirección de este sensor. Google, por supuesto, publicó un montón de artículos sobre todo tipo de multiplexores para el bus I2C desde "comprar en la conocida tienda en línea china" hasta "hágalo usted mismo". En ninguna parte había opciones sin un soldador y costos adicionales. Esto no pudo sino molestarse, ya que era necesario resolver el problema aquí y ahora (los clientes son tales clientes). Quiero hablar sobre una forma más fácil y más relajada, muy simple de salir de esta situación. Intrigado? Entonces te digo.
Datos iniciales: Arduino mega y 4 sensores HTU21.
Tarea: es necesario conectar todos los sensores htu a través del bus I2C y leer los valores. Además, estos sensores no son los únicos dispositivos esclavos en este bus (los planes también incluyen una pantalla LCD y otros sensores).
Que sabemos El sensor HTU21 tiene una dirección fija en el bus: 0x40 1 . ¿Cómo, teniendo un microcontrolador y 4 sensores con las mismas direcciones en el bus, cómo acceder a un dispositivo específico sin chips adicionales?
Todo resulta ser bastante simple:
- conecte la tierra, scl y sda como de costumbre (no se olvide de las resistencias pull-up para la línea de datos y la sincronización);
- conectamos el cable de alimentación de cada sensor a una entrada digital en el Arduino (probablemente ya entiendas a dónde me dirijo)
- aplique alternativamente ALTO a cada entrada digital que alimenta un sensor separado y, después de un retraso, lea el valor del sensor alimentado.
- dé una señal BAJA para este sensor y repita el ciclo para otros sensores.
Por supuesto, este método también tiene inconvenientes, por ejemplo, simplemente puede faltar el número requerido de salidas digitales o analógicas gratuitas. Pero para su uso en proyectos, este principio funciona, y funciona a distancias suficientes del microcontrolador. Espero que este artículo te ayude a salvar tus nervios, dinero y tiempo.
¡No es de extrañar que se diga que todo lo ingenioso es simple!
Listado adjunto:
/* , 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); }