Добрый день! Пытаюсь понять, как подключить 2 датчика. Перечитал кучу статей и вычитал, что нужно использовать шину I2C. Вроде как с точки зрения теории всё понятно, а вот на практике как-то всё плохо. У меня есть 2 скетча, каждый по отдельности работает корректно. Может кто-нибудь подсказать как происходит объединение двух разных датчиков в одном программном коде?
По очереди.
Показывайте.
Только, пожалуйста, вставляйте код с использованием тегов кода.
Скетч для датчика 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 сидят на одних и тех же пинах !
Подтяжку линий SCL SDA к питанию не пробовали добавить? - попробуйте
Лучше расскажи, зачем тебе два датчика одной и той же величины в одном приборе.
Покажите и его заодно тоже
#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();
}
Запуск датчиков в сетапе проходит нормально?
Умный человек говорил, а Вы не ответили. Ай-яй-яй
Я нашёл какой-то онлайн редактор схем, надеюсь будет понятно.
Лампочки здесь - модули (я просто не нашёл там ничего более подходящего, простите). Питание - красный провод, земля - черный провод, SCL - жёлтый провод, который идёт в пин A5, SDA - зелёный провод, который идёт в пин A4.
При такой схеме, работает только левый модуль, а правый нет. Если поменять их местами, то так же данные возвращает только левый модуль
Присобачьте крутилку типа карусели, которая будет вращать датчики. И на каждом полуобороте считывайте данные с того датчика, что ближе к ардуине. Делов то!
Зря надеялись
Я просто гуглил, что за подтяжки. Я попробую сделать это, как только раздобуду резисторы
Старайтесь отвечать на все вопросы, иначе интерес помогать Вам ослабнет.
Вы еще не ответили на сообщения 7 и 10
Что значит одной и той же величины? Имеется в виду рабочее напряжение?
Можете объяснить для чего нужно линии SCL и SDA подтягивать к питанию?
Стандарт такой ! Устройства умеют прижимать к 0, а 1 должен обеспечиваться из вне …
Это значит что оба ваших датчика измеряют температуру и влажность. Нафига два? Берите все данные с одного