Подключение двух устройств SHT3X и BME-280

Добрый день! Пытаюсь понять, как подключить 2 датчика. Перечитал кучу статей и вычитал, что нужно использовать шину I2C. Вроде как с точки зрения теории всё понятно, а вот на практике как-то всё плохо. У меня есть 2 скетча, каждый по отдельности работает корректно. Может кто-нибудь подсказать как происходит объединение двух разных датчиков в одном программном коде?

По очереди.

1 лайк

Показывайте.
Только, пожалуйста, вставляйте код с использованием тегов кода.

1 лайк

Скетч для датчика BME-280

#include <GyverBME280.h>
GyverBME280 bme;
void setup() {
  Serial.begin(9600);
  
  // запуск датчика и проверка на работоспособность
  if (!bme.begin(0x76)) Serial.println("Error!");
}
void loop() {
  Serial.print("Pressure: ");
  Serial.println(bme.readPressure());
  Serial.println();
  delay(1000);
}

Скетч для датчика SHT3X

#include <Arduino.h>
#include <Wire.h>
#include "Adafruit_SHT31.h"
Adafruit_SHT31 sht31 = Adafruit_SHT31();
void setup() {
  Serial.begin(9600);
  Serial.println("SHT31 test");
  if (! sht31.begin(0x44)) Serial.println("Couldn't find SHT31"); // Set to 0x45 for alternate i2c addr
}
void loop() {
  float t = sht31.readTemperature();
  float h = sht31.readHumidity();
  if (! isnan(t)) {  // check if 'is not a number'
    Serial.print("Temp *C = "); Serial.println(t);
  } else { 
    Serial.println("Failed to read temperature");
  }
  if (! isnan(h)) {  // check if 'is not a number'
    Serial.print("Hum. % = "); Serial.println(h);
  } else { 
    Serial.println("Failed to read humidity");
  }
  Serial.println();
  delay(1000);
}

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

Все устройства на I2C сидят на одних и тех же пинах !

1 лайк

Подтяжку линий SCL SDA к питанию не пробовали добавить? - попробуйте

1 лайк

Лучше расскажи, зачем тебе два датчика одной и той же величины в одном приборе.

2 лайка

Покажите и его заодно тоже

1 лайк
#include <GyverBME280.h>
#include <Arduino.h>
#include <Wire.h>
#include "Adafruit_SHT31.h"
Adafruit_SHT31 sht31 = Adafruit_SHT31();
GyverBME280 bme;
void setup() {
  Serial.begin(9600);
  
  // запуск датчика и проверка на работоспособность
  if (!bme.begin(0x76)) Serial.println("Error!");
  if (!sht31.begin(0x44)) Serial.println("Couldn't find SHT31");   // Set to 0x45 for alternate i2c addr
}
void loop() {
  Serial.print("Pressure: ");
  Serial.println(bme.readPressure());
  Serial.println();
  delay(1000);
  float t = sht31.readTemperature();
  float h = sht31.readHumidity();
  if (! isnan(t)) {  // check if 'is not a number'
    Serial.print("Temp *C = "); Serial.println(t);
  } else { 
    Serial.println("Failed to read temperature");
  }
  if (! isnan(h)) {  // check if 'is not a number'
    Serial.print("Hum. % = "); Serial.println(h);
  } else { 
    Serial.println("Failed to read humidity");
  }
  Serial.println();
}

Запуск датчиков в сетапе проходит нормально?

1 лайк

Умный человек говорил, а Вы не ответили. Ай-яй-яй

1 лайк

Я нашёл какой-то онлайн редактор схем, надеюсь будет понятно.
Лампочки здесь - модули (я просто не нашёл там ничего более подходящего, простите). Питание - красный провод, земля - черный провод, SCL - жёлтый провод, который идёт в пин A5, SDA - зелёный провод, который идёт в пин A4.
При такой схеме, работает только левый модуль, а правый нет. Если поменять их местами, то так же данные возвращает только левый модуль

Присобачьте крутилку типа карусели, которая будет вращать датчики. И на каждом полуобороте считывайте данные с того датчика, что ближе к ардуине. Делов то!

2 лайка

Зря надеялись :frowning:

Я просто гуглил, что за подтяжки. Я попробую сделать это, как только раздобуду резисторы

Старайтесь отвечать на все вопросы, иначе интерес помогать Вам ослабнет.
Вы еще не ответили на сообщения 7 и 10

1 лайк

Что значит одной и той же величины? Имеется в виду рабочее напряжение?

Можете объяснить для чего нужно линии SCL и SDA подтягивать к питанию?

Стандарт такой ! Устройства умеют прижимать к 0, а 1 должен обеспечиваться из вне …

1 лайк

Это значит что оба ваших датчика измеряют температуру и влажность. Нафига два? Берите все данные с одного

1 лайк