РЕШЕНО Подключение двух HDC1080 с помощью TCA9548A

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Ermine882, 10 ноя 2019.

Метки:
  1. Ermine882

    Ermine882 Нерд

    Доброго времени суток уважаемые форумчане. Столкнулся со следующей проблемой:
    к ArduinoUno через микросхему TCA9548A подключено 2 датчика HDC1080, TCA9548A запитана от 5В, датчики HDC1080 от 3.3В Arduino соответственно. Микросхема подключена к соответствующим выходам SDA и SCL микроконтроллера.

    Схема подключения:
    IMG_20191110_181000.jpg

    Наблюдается следующая проблема, при загрузке скетча показания выдаются правильные (но тоже не всегда, от чего это зависит пока не понял):
    img-2019-11-10-18-34-13.png

    При отключении питания от контроллера и включении, один и иногда и оба датчика выдают не правильные показания (преимущественно первый не правильно работает а второй даёт верные показания, что интересно не правильно показывает показывает температуру, влажность отображает верно) очень редко когда датчики ведут себя нормально после отключения питания:
    img-2019-11-10-18-35-04.png

    Код:
    Код (C++):

    #include<Arduino.h>
    #include<Wire.h>
    #include"ClosedCube_HDC1080.h"

    ClosedCube_HDC1080 hdc1080;

    float t, h;
    uint32_t myTimer;

    // Функция TCA9548A
    void tcaselect(uint8_ti) {
    if (i >7) return;
    Wire.beginTransmission(0x70);
    Wire.write(1<< i);
    Wire.endTransmission();
    }

    // Формула расчета количества граммы воды в одном кубометре воздуха.
    float CalcAbsH(float t, float h) {
    double tmp = pow(2.718281828,(17.67*t)/(t+243.5));
    return (6.112*tmp*h*2.1674)/(273.15+t);
    }

    void setup()
    {
    Serial.begin(9600);
    hdc1080.begin(0x40);
    }

    void loop()
    {
    if (millis() - myTimer >= 2000) { // Задержка опроса датчиков 2 сек.
    myTimer = millis();

    tcaselect(6);
    t = hdc1080.readTemperature();
    h = hdc1080.readHumidity();
    Serial.print("Грамм воды в кубе (Датчик 1) = ");
    Serial.println(CalcAbsH(t, h));
    Serial.print("T = ");
    Serial.print(t);
    Serial.print("C, RH = ");
    Serial.print(h);
    Serial.println("%");

    tcaselect(7);
    t = hdc1080.readTemperature();
    h = hdc1080.readHumidity();
    Serial.print("Грамм воды в кубе (Датчик 2) = ");
    Serial.println(CalcAbsH(t, h));
    Serial.print("T = ");
    Serial.print(t);
    Serial.print("C, RH = ");
    Serial.print(h);
    Serial.println("%");
    }
    }
     
    Подскажите, куда копать?
     
    Последнее редактирование: 14 ноя 2019
  2. Ermine882

    Ermine882 Нерд

    Всем спасибо за предложенные решения. Проблема решена.
     
  3. NikitOS

    NikitOS Король шутов Администратор

    Улыбнуло :)
    Я тут даже ни одного ответа не вижу...
     
  4. parovoZZ

    parovoZZ Гуру

    Ответ где-то рядом)
     
  5. DetSimen

    DetSimen Guest

    Этта сарказм был, видимо.
     
    Andrey12 и Ermine882 нравится это.
  6. zRirez

    zRirez Нерд

    Ну так какое решение было и почему возникала такая проблема?

    - Знаешь как заинтриговать идиота?
    - Как?
    - Завтра расскажу..
     
    DetSimen и parovoZZ нравится это.
  7. Ermine882

    Ermine882 Нерд

    Проблема была программная.
    Код (C++):
    #include <Arduino.h>
    #include <Wire.h>
    #include "ClosedCube_HDC1080.h"

    ClosedCube_HDC1080 hdc1080;

    float t, h;
    uint32_t myTimer;


    // Функция TCA9548A
    void tcaselect(uint8_t i) {
      if (i > 7) return;
      Wire.beginTransmission(0x70);
      Wire.write(1 << i);
      Wire.endTransmission();
    }

    // Формула расчета количества граммы воды в одном кубометре воздуха.
    float CalcAbsH(float t, float h) {
        double tmp = pow(2.718281828,(17.67*t)/(t+243.5));
        return (6.112*tmp*h*2.1674)/(273.15+t);
    }

    void setup()
    {
      Serial.begin(9600);
      hdc1080.begin(0x40);

      tcaselect(2);
      hdc1080.begin(0x40);

      tcaselect(3);
      hdc1080.begin(0x40);
    }

    void loop()
    {
        if (millis() - myTimer >= 5000) {   // Задержка опроса датчиков 5 сек.
        myTimer = millis();          

        tcaselect(2);
        t = hdc1080.readTemperature();
        h = hdc1080.readHumidity();
        Serial.print("Грамм воды в кубе (Датчик 1) = ");
        Serial.println(CalcAbsH(t, h));
        Serial.print("T = ");
        Serial.print(t);
        Serial.print("C, RH = ");
        Serial.print(h);
        Serial.println("%");

        tcaselect(3);
        t = hdc1080.readTemperature();
        h = hdc1080.readHumidity();
        Serial.print("Грамм воды в кубе (Датчик 2) = ");
        Serial.println(CalcAbsH(t, h));
        Serial.print("T = ");
        Serial.print(t);
        Serial.print("C, RH = ");
        Serial.print(h);
        Serial.println("%");
      }
    }
    Добавил в setup (даташит на TCA9548A):
    Код (C++):
    tcaselect(2);
      hdc1080.begin(0x40);
    tcaselect(3);
      hdc1080.begin(0x40);
    Теперь всё работает стабильно.
     
    Последнее редактирование: 19 ноя 2019
  8. parovoZZ

    parovoZZ Гуру

    токмо это не даташит, а инструкция))
     
  9. Ermine882

    Ermine882 Нерд

    Да, всё верно, спасибо за очень конструктивное замечание.
    P.S. Пост ради поста.