如何快速且没有不必要的芯片来规避HTU21传感器的地址不变性

向哈勃族的所有居民致以问候!


我想谈一谈通过I2C总线连接多个HTU21传感器而无需使用其他芯片的新方法。


该传感器在各种DIY大师中仍然很流行,它是实至名归的:它比以前的传感器更精确,尺寸更小(便于嵌入设备)。


最近,我和许多用户一样,由于缺乏更改此传感器地址的能力而感到困惑。 当然,谷歌发布了许多有关I2C总线的各种多路复用器的文章,从“在中国著名的在线商店购买”到“自己动手”。 没有烙铁和其他费用,没有其他选择。 这不能不让人沮丧,因为有必要在此刻解决问题(客户就是这种客户)。 我想谈谈一种更轻松,更轻松,非常简单的方法来解决这种情况。 感兴趣吗? 那我告诉你。


初始数据:Arduino mega和4个传感器HTU21。


任务:有必要通过I2C总线连接所有htu传感器并读取值。 而且,这些传感器并不是总线上唯一的从属设备(该计划还包括LCD屏幕和其他传感器)。


我们知道什么 HTU21传感器在总线上具有固定地址-0x40 1 。 在总线上具有一个具有相同地址的微控制器和4个传感器,如何在不使用额外芯片的情况下访问特定设备?


事实证明一切都很简单:


  1. 照常连接地面,scl和sda(不要忘记数据线和同步的上拉电阻);
  2. 我们将每个传感器的电源线连接到Arduino上的数字输入(您可能已经知道我要领导的方向)
  3. 将HIGH交替施加到为单独传感器供电的每个数字输入,并在延迟后从通电的传感器读取该值。
  4. 给该传感器一个低电平信号,并为其他传感器重复该循环。

当然,该方法也有缺点,例如,可能根本无法获得所需数量的免费数字或模拟输出。 但是对于项目中的使用,此原理有效,并且与微控制器之间的距离足够远。 希望本文能帮助您节省神经,金钱和时间。


难怪有人说一切都很简单!


附件清单:


/* ,        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); } 

Source: https://habr.com/ru/post/zh-CN425541/


All Articles