Доброго времени суток уважаемые форумчане. Столкнулся со следующей проблемой: к ArduinoUno через микросхему TCA9548A подключено 2 датчика HDC1080, TCA9548A запитана от 5В, датчики HDC1080 от 3.3В Arduino соответственно. Микросхема подключена к соответствующим выходам SDA и SCL микроконтроллера. Схема подключения: Наблюдается следующая проблема, при загрузке скетча показания выдаются правильные (но тоже не всегда, от чего это зависит пока не понял): При отключении питания от контроллера и включении, один и иногда и оба датчика выдают не правильные показания (преимущественно первый не правильно работает а второй даёт верные показания, что интересно не правильно показывает показывает температуру, влажность отображает верно) очень редко когда датчики ведут себя нормально после отключения питания: Код: Код (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("%"); } } Подскажите, куда копать?
Ну так какое решение было и почему возникала такая проблема? - Знаешь как заинтриговать идиота? - Как? - Завтра расскажу..
Проблема была программная. Код (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); Теперь всё работает стабильно.