HTU31 - 2 шт через TCA95548A на ESP8266

let4ik
Offline
Зарегистрирован: 15.05.2020

Всем, доброго дня!

Помогите разобраться, есть ESP8266  к ней прикручен TCA95548A, чтобы подключить два новых датчика температуры и влажности HTU31. Нигде особо примеров нет, как их встраивать и использовать. Для них написана библиотека Adafruit_HTU31D. С одним датчиком подключенным напрямую к плате всё работало, но мне то нужно подключить два.

Код который написан выдает:

6Temp: -40.00 C
6Humidity: 0.00 % RH
7Temp: -40.00 C
7Humidity: 0.00 % RH
 
что неверное, помогите понять, как правильно обратиться к датчикам на шине
 
Заранее спасибо большое добрые люди
 
 
let4ik
Offline
Зарегистрирован: 15.05.2020
#include <ESP8266WiFi.h>
#include "Adafruit_HTU31D.h"
#include <Wire.h>


// добавлено
Adafruit_HTU31D htu1 = Adafruit_HTU31D();
Adafruit_HTU31D htu2 = Adafruit_HTU31D();

uint32_t timestamp;
bool heaterEnabled = false;

//функция для легкого выбора необходимой шины: устройство на шине 0: TCA9548A (0), устройство на шине 6: TCA9548A (6)
void TCA9548A(uint8_t bus)
{
 Wire.beginTransmission(0x70); // TCA9548A адрес 0x70
 Wire.write(1 << bus); // отправляем байт на выбранную шину
 Wire.endTransmission();
 Serial.print(bus);
}

// Функция переводит относительную влажность в абсолютную
// t-температура в градусах Цельсия h-относительная влажность в процентах

float calculationAbsH(float t, float h)
{ float temp;
  temp = pow(2.718281828, (17.67 * t) / (t + 243.5));
  return (6.112 * temp * h * 2.1674) / (273.15 + t);
}


void setup() {
  Serial.begin(115200);
  Wire.begin();
  Serial.println("Тест датчиков");



while (!Serial) {
    delay(10); // wait till serial port opens
  }
  Serial.println("Adafruit HTU31D test");

  if (!htu1.begin(0x70)) {
    Serial.println("Couldn't find sensor!");
    while (1);
  }
  timestamp = millis();
  
}


void loop(){
byte address;
 sensors_event_t humidity, temp;            


            TCA9548A(7);
              Serial.print("0");
            Serial.print(address,HEX);
            Serial.println(" !");
           
            htu1.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data
            Serial.print("7Temp: "); 
            Serial.print(temp.temperature);
            Serial.println(" C");

            
            Serial.print("7Humidity: ");
            Serial.print(humidity.relative_humidity);
            Serial.println(" \% RH");
           
            delay(500);
  

            TCA9548A(6); 

              Serial.print("0");
            Serial.print(address,HEX);
            Serial.println(" !");
                        
            htu2.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data
            Serial.print("6Temp: "); 
            Serial.print(temp.temperature);
            Serial.println(" C");
  
            Serial.print("6Humidity: ");
            Serial.print(humidity.relative_humidity);
            Serial.println(" \% RH");
 delay(500);
 
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Я бы оставил в исходнике один Adafruit_HTU31D htu1 и дергал его, переключая TCA95548A.

let4ik
Offline
Зарегистрирован: 15.05.2020

так тоже было, не помогло

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

я чего то не понял, зачем тут свитч, если два датчика можно включить напрямую

let4ik
Offline
Зарегистрирован: 15.05.2020

если можно, то я включу, но насколько я знаю у них одинаковые адреса и они не включаться

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

let4ik пишет:

если можно, то я включу, но насколько я знаю у них одинаковые адреса и они не включаться

HTU31D RH/T SENSOR IC

Digital Relative Humidity sensor with Temperature output

TE CONNECTIVITY SENSORS /// HTU31D RH/T SENSOR IC 05/2020 Page 8

COMMUNICATION AND OPERATION

I2C Address

The HTU31 series has the capability to answer 2 distinct I2C addresses. This can be used to use multiple sensors on the same

I2C network and avoid any address conflict with other components.

Hardwired Dynamic address

The hardwired address is defined by the IC_ADD pin level (it set the LSB value). It can be used to have 2 sensors on the same

I2C network (one wired to VDD, the other to VSS). The other option to use more than 2 sensors on the same I2C network is to

use individual IC_ADD lines to the sensors.

IC_ADD Pin level Sensor I2C address (Hex)

GND 0x40

VDD 0x41

Table 7 Sensor I2C Address

let4ik
Offline
Зарегистрирован: 15.05.2020

Спасибо, что прояснили. Пошел читать и сравнивать.

У меня 4 выхода (PIN) на плате от HTU31: VCC, GND, SDA, SCL

Согласно таблице в техническом описании, у самой микросхемы 6 выходов (PIN) и один из них IC_ADD

The hardwired address is defined by the IC_ADD pin level (it sets the LSB value). It can be used to connect 2 sensors on the same I²C network (one wired to VDD, the other to GND). To connect more than 2 sensors on the same I²C network, individual IC_ADD lines can be used

IC_ADD Pin level   Sensor I2C address (Hex)

GND                      0x40

VDD                      0x41

Получается, что мне нужно подавать + или - на эту ногу для изменения адреса, но в текущем форм факторе это невозможно, т.к. у меня 4 выхода и нет выхода IC_ADD, верно? 

 

 

 

 

mixail844
Offline
Зарегистрирован: 30.04.2012

let4ik пишет:

Получается, что мне нужно подавать + или - на эту ногу для изменения адреса, но в текущем форм факторе это невозможно, т.к. у меня 4 выхода и нет выхода IC_ADD, верно? 


не совсем , 4 выхода на самом модуле. доступ же к ножкам микросхемы есть ко всем. достаточно определить номер ноги отвечающую за адресс (перерезать существующуие дорожки на модуле) и подтянуть ее к нужному значению пайкой

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

есть. на гнд посажена. перерезать дорожку и кинуть просволочку на питание

let4ik
Offline
Зарегистрирован: 15.05.2020

Как вариант можно купить другой датчик типа BME280 и посадить их оба с HTU31 на одну шину I2C. У микросхему HTU 31 нога IC_ADD замкнута на VCC, но через резистор на плате (при прозвоне видно, что есть сопротивление ), так что не особо там провода паять можно, резистор маленький совсем. Да и дорожек с правой стороны отходит две, а д.б. 3.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

let4ik пишет:

Как вариант можно купить другой датчик типа BME280 и посадить их оба с HTU31 на одну шину I2C. У микросхему HTU 31 нога IC_ADD замкнута на VCC, но через резистор на плате (при прозвоне видно, что есть сопротивление ), так что не особо там провода паять можно, резистор маленький совсем. Да и дорожек с правой стороны отходит две, а д.б. 3.

что-то ты лётчик наимпровизировал с глиссадой, если плата именно та, что дал ссылку то там всего два резистора, подтяжка шины I2C и конденсатор по питанию, адрес датчика на GND

По красной линии отрезать, по синей - соединить:

sadman41
Offline
Зарегистрирован: 19.10.2016

У библиотеки есть такая функция:

bool Adafruit_HTU31D::begin(uint8_t i2c_addr, TwoWire *theWire)

А SoftwareWire в бранче v1.5.1 наследуется от TwoWire.

То есть можно взять это: https://github.com/Testato/SoftwareWire/tree/v1.5.1
Создать инстансы TwoWire для двух пар шин Wire и скормить их адафруиту.

P.S. сорян, забыл что тут ESP. Мой метод под Arduino