• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Глупые вопросы от Новичка - NodeMCU v3 и Умному Дому

Semedney

Member
Добра всем.
Итак я Новичок в этой теме. Хочу разобраться и понять, что бы построить некоторую систему.

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

1. Потянет ли одна NodeMCU v3 целый зоопарк датчиков?
2. Какое количество датчиков возможно подключить ? Каких сколько из моего списка ?
3. Какая возможна длина провода подключения датчика непосредственно к NodeMCU ? Какой провод лучше?
4. Есть ли примеры подключения большого количества датчиков (схема) ?

Прикупил я платку NodeMCU v3 и несколько датчиков, а именно:
1. Простые магнитные герконы
2. Датчики температуры, влажности, давления BME-280
3. Датчики движения HC-SR501
4. Датчики дыма MQ-2
5. Плату расширения TCA9548A

Минимальный набор подключения к одной NodeMCU v3 для меня это - Два геркона и по одному датчику из моего списка, но хотелось бы больше, что бы не использовать много NodeMCU v3.

За ранее спасибо Всем гуру кто откликниться и пожет разобраться.
 

Юрий Ботов

Moderator
Команда форума
1. Потянет ли одна NodeMCU v3 целый зоопарк датчиков?
Зоопарк вряд-ли но "уголок юного зверовода" - вполне.
2. Какое количество датчиков возможно подключить ? Каких сколько из моего списка ?
герконы и/или датчики движения HC-SR501 - по количеству цифровых входов/выходов за вычетом ног которые используются для i2c ( -2 ноги ). Кстати GPIO16 не работает как вход.
i2c устройства - BME280, TCA9548A - теоретически до 255 :) но несколько штук точно будут работать без проблем - там другая проблема, у одинаковых устройств как правило одинаковый адрес. И его можно менять в весьма ограниченных рамках, иногда нельзя менять вообще. Разумеется несколько устройств с одним адресом на шине будут работать неправильно.
датчик дыма MQ-2 - по количеству аналоговых входов... то есть один.
3. Какая возможна длина провода подключения датчика непосредственно к NodeMCU ? Какой провод лучше?
чем короче тем лучше. Для герконов и HC-SR501 можно и подлиннее, но исключительно экранированной витой парой (коаксиал тоже подойдет но это уже чересчур).
4. Есть ли примеры подключения большого количества датчиков (схема) ?
В гугле полно, просто у всех разные комбинации датчиков и как таковая схема не даст ничего нового.

А вообще обратите внимание на питание. Источник питания должен быть хорошим. А MQ-2 нельзя питать "через NodeMCU" - только напрямую от источника питания. Там нагреватель и он может перегружать встроенный в NodeMCU стабилизатор.
 
Последнее редактирование:

nikolz

Well-known member
Добра всем.
Итак я Новичок в этой теме. Хочу разобраться и понять, что бы построить некоторую систему.

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

1. Потянет ли одна NodeMCU v3 целый зоопарк датчиков?
2. Какое количество датчиков возможно подключить ? Каких сколько из моего списка ?
3. Какая возможна длина провода подключения датчика непосредственно к NodeMCU ? Какой провод лучше?
4. Есть ли примеры подключения большого количества датчиков (схема) ?

Прикупил я платку NodeMCU v3 и несколько датчиков, а именно:
1. Простые магнитные герконы
2. Датчики температуры, влажности, давления BME-280
3. Датчики движения HC-SR501
4. Датчики дыма MQ-2
5. Плату расширения TCA9548A

Минимальный набор подключения к одной NodeMCU v3 для меня это - Два геркона и по одному датчику из моего списка, но хотелось бы больше, что бы не использовать много NodeMCU v3.

За ранее спасибо Всем гуру кто откликниться и пожет разобраться.
Количество подключаемых датчиков и работоспособность системы в первую очередь ограничивается Вашими знаниями.
Начните с одного датчика температуры и влажности и одной кнопки.
Когда у Вас это все будет работать, то Вам станут понятны ответы на все ваши вопросы.
 

Semedney

Member
1. Потянет ли одна NodeMCU v3 целый зоопарк датчиков?
Зоопарк вряд-ли но "уголок юного зверовода" - вполне.
2. Какое количество датчиков возможно подключить ? Каких сколько из моего списка ?
герконы и/или датчики движения HC-SR501 - по количеству цифровых входов/выходов за вычетом ног которые используются для i2c ( -2 ноги ). Кстати GPIO16 не работает как вход.
i2c устройства - BME280, TCA9548A - теоретически до 255 :) но несколько штук точно будут работать без проблем - там другая проблема, у одинаковых устройств как правило одинаковый адрес. И его можно менять в весьма ограниченных рамках, иногда нельзя менять вообще. Разумеется несколько устройств с одним адресом на шине будут работать неправильно.
датчик дыма MQ-2 - по количеству аналоговых входов... то есть один.
3. Какая возможна длина провода подключения датчика непосредственно к NodeMCU ? Какой провод лучше?
чем короче тем лучше. Для герконов и HC-SR501 можно и подлиннее, но исключительно экранированной витой парой (коаксиал тоже подойдет но это уже чересчур).
4. Есть ли примеры подключения большого количества датчиков (схема) ?
В гугле полно, просто у всех разные комбинации датчиков и как таковая схема не даст ничего нового.

А вообще обратите внимание на питание. Источник питания должен быть хорошим. А MQ-2 нельзя питать "через NodeMCU" - только напрямую от источника питания. Там нагреватель и он может перегружать встроенный в NodeMCU стабилизатор.
Спасибо, за ответы.
Буду пробовать.
Результат буду описывать тут.

Я правильно понимаю что подключая TCA9548A по i2c можно расширить количество цифровых входов ? На 8 шт ?
Насчет длинны хоть и экранированного провода, сколько это в метрах ? - тут дело в том что есть разные помещения расстояние между NodeMCU и датчиком (геркон, кнопка, датчик движения) будет не менее 5-7 метров, возможна такая длинна ?
 

Юрий Ботов

Moderator
Команда форума
Подключите второй датчик "параллельно" с первым. В примерах Ардуино (Wire) есть скетч i2c_scanner. Запустите его. В сериал мониторе будет сыпаться информация об адресах подключенных устройств.
 

Semedney

Member
Подключите второй датчик "параллельно" с первым. В примерах Ардуино (Wire) есть скетч i2c_scanner. Запустите его. В сериал мониторе будет сыпаться информация об адресах подключенных устройств.
Подключил, в примерах я такого не нашел, но нашел в паутине.
Загрузил, но появляется только один адрес 0x76.
 

Юрий Ботов

Moderator
Команда форума
Дайте фото своего датчика. На разных адрес меняется по разному. У некоторых надо перемычку перекинуть, у других есть пин SDO который для смены адреса надо подтянуть к земле или питанию.
 

Semedney

Member
Дайте фото своего датчика. На разных адрес меняется по разному. У некоторых надо перемычку перекинуть, у других есть пин SDO который для смены адреса надо подтянуть к земле или питанию.
Спасибо.
Датчики как фото по ссылке что я выкладывал выше. Перемычек на них нет, а вот контакт SDO есть, попробую его подтянуть.
 

svs2007m

Active member
Датчик MQ-2 греется как "утюг". Близко c BME280 показания последнего будут от "балды" .
 

Semedney

Member
Дайте фото своего датчика. На разных адрес меняется по разному. У некоторых надо перемычку перекинуть, у других есть пин SDO который для смены адреса надо подтянуть к земле или питанию.
Подтяжка SDO к плюсу дала второй адрес датчика 0x77
Но вот как получить информацию с обоих я пока не понимаю. Тот пример что я сначала залил видимо не поддерживает это.
 

Юрий Ботов

Moderator
Команда форума
Выложите свой код (есть специальный инструмент для вставки кода, там где "вставить" троеточие-стрелка вниз).
 

Semedney

Member
Выложите свой код (есть специальный инструмент для вставки кода, там где "вставить" троеточие-стрелка вниз).
Вот код который работает с одним датчиком на адресе 0x76.
#include <BME280I2C.h>
#include <Wire.h>


BME280I2C bme;

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Wire.begin();
while(!bme.begin())
{
Serial.println("Could not find BME280 sensor!");
delay(1000);
}

}

void loop() {
// put your main code here, to run repeatedly:
float temp(NAN), hum(NAN), pres(NAN);

BME280::TempUnit tempUnit(BME280::TempUnit_Celsius);
BME280::presUnit presUnit(BME280::presUnit_Pa);

bme.read(pres,temp,hum,tempUnit,presUnit);

Serial.print("Temp: ");
Serial.print(temp);
Serial.println("°C");
Serial.print("Humidity: ");
Serial.print(hum);
Serial.println("% RH");
Serial.print("Pressure: ");
Serial.print(pres*0.00750062,2);
Serial.println(" mmHg");

delay(1000);

}


Так же я пробовал вот этот код, который использует другие библиотеки, но при нем почему то данные приходят только с датчика с адресом 0x77, а данные первого датчика всегда ноль.

#include <Seeed_BME280_77.h>
#include <Seeed_BME280.h>
#include <Wire.h>


BME280 bme280;
BME280_77 bme280_77;

#define pin_sda D1 // default sda pin //вставить свое значение
#define pin_scl D2 // default scl pin //вставить свое значение

void setup()
{
Serial.begin(115200);
if(!bme280.init()){
Serial.println("Device error!");
}
if(!bme280_77.init()){
Serial.println("Device error!");
}
delay(10);


}

void loop()
{

float t = (bme280.getTemperature());
float p = (bme280.getPressure()*0.00750063);
float h = (bme280.getHumidity());


float t_77 = (bme280_77.getTemperature());
float p_77 = (bme280_77.getPressure()*0.00750063);
float h_77 = (bme280_77.getHumidity());

//get and print temperatures
Serial.print("Temp: ");
Serial.print(t);
Serial.println(" C");//The unit for Celsius because original arduino don't support speical symbols

//get and print temperatures_77
Serial.print("Temp_77: ");
Serial.print(t_77);
Serial.println(" C");//The unit for Celsius because original arduino don't support speical symbols

//get and print atmospheric pressure data
Serial.print("Pressure: ");
Serial.print(p);
Serial.println(" mm.Hg");

//get and print atmospheric pressure data_77
Serial.print("Pressure_77: ");
Serial.print(p_77);
Serial.println(" mm.Hg");

//get and print humidity data
Serial.print("Humidity: ");
Serial.print(h);
Serial.println(" %");

//get and print humidity data_77
Serial.print("Humidity_77: ");
Serial.print(h_77);
Serial.println(" %");

delay(1000);

}


Еще я пробовал подключать датчик движения HC-SR501 используя код ниже, но при нем датчик всегда в состоянии сработки, сам датчик я менял на другой, но может подключил не верно

#define INTERVAL_GET_DATA 2000 // интервала измерений, мс
// пин, к которому подключен датчик
#define HCSR501PIN D6
// счетчик срабатыаний
int counterHCSR501=0;


// переменная для интервала измерений
unsigned long millis_int1=0;

void setup() {
Serial.begin(9600);
attachInterrupt(HCSR501PIN,incCounterHCSR501,RISING);
}

void loop() {
if(millis()-millis_int1 >= INTERVAL_GET_DATA) {
// получение данных счетчика срабатываний HC-SR501
int counter= get_data_counterHCSR501();
// выводим значения газа в ppm
Serial.print("counter=");
Serial.println(counter);
// старт интервала отсчета
millis_int1=millis();
}
}

// получение данных счетчика срабатываний HC-SR501
int get_data_counterHCSR501() {
// вернуть значение счетчика срабатываний HC-SR501
return counterHCSR501;
}

void incCounterHCSR501() {
// инкремент счетчика
counterHCSR501=counterHCSR501+1;
}
 

Semedney

Member
Выложите свой код (есть специальный инструмент для вставки кода, там где "вставить" троеточие-стрелка вниз).
Удалось запустить два датчика BME-280 и один HC-SR501 вот с этим кодом, но почему то сообщение о том что есть сработка приходит в монитор пачками, посмотрите может как можно доработать.

#include <BME280I2C.h>
#include <Wire.h>
#define motionSensorD6 D6 // пин, к которому подключен датчик


BME280I2C::Settings settings77(
BME280::OSR_X1,
BME280::OSR_X1,
BME280::OSR_X1,
BME280::Mode_Forced,
BME280::StandbyTime_1000ms,
BME280::Filter_Off,
BME280::SpiEnable_False,
0x77 // I2C address. I2C specific.
);

BME280I2C bme77(settings77);


BME280I2C::Settings settings76(
BME280::OSR_X1,
BME280::OSR_X1,
BME280::OSR_X1,
BME280::Mode_Forced,
BME280::StandbyTime_1000ms,
BME280::Filter_Off,
BME280::SpiEnable_False,
0x76 // I2C address. I2C specific.
);

BME280I2C bme76(settings76);


void IRAM_ATTR detectsMovementD6() { // Функция при обнаружении движения на D6
Serial.println("Движение на D6!!!");
}

void setup() {
// put your setup code here, to run once:
Serial.begin(115200);


Wire.begin();
while(!bme76.begin())
{
Serial.println("Could not find BME280 sensor 76!");
delay(1000);
}

while(!bme77.begin())
{
Serial.println("Could not find BME280 sensor 77!");
delay(1000);
}

pinMode(motionSensorD6, INPUT_PULLUP); // уставливаем пин D6 на прием и включаем внутренний подтягивающий резистор
attachInterrupt(motionSensorD6, detectsMovementD6, RISING); // Прерывание для датчика движения запуск функции detectsMovementD6

}

void loop() {
BME280::TempUnit tempUnit(BME280::TempUnit_Celsius);
BME280::presUnit presUnit(BME280::presUnit_Pa);

// Датчик температуры на адресе 0х76
float temp76(NAN), hum76(NAN), pres76(NAN);
bme76.read(pres76,temp76,hum76,tempUnit,presUnit);
Serial.print("Temp76: ");
Serial.print(temp76);
Serial.println("°C");
Serial.print("Humidity76: ");
Serial.print(hum76);
Serial.println("% RH");
Serial.print("Pressure76: ");
Serial.print(pres76*0.00750062,2);
Serial.println(" mmHg");
delay(1000);

// Датчик температуры на адресе 0х77
float temp77(NAN), hum77(NAN), pres77(NAN);
bme77.read(pres77,temp77,hum77,tempUnit,presUnit);
Serial.print("Temp77: ");
Serial.print(temp77);
Serial.println("°C");
Serial.print("Humidity77: ");
Serial.print(hum77);
Serial.println("% RH");
Serial.print("Pressure77: ");
Serial.print(pres77*0.00750062,2);
Serial.println(" mmHg");
delay(3000);
Serial.println("-------------------------------------------------");
}

Еще хотелось бы понять как использовать плату TCA9548A ?
 

Semedney

Member
Выложите свой код (есть специальный инструмент для вставки кода, там где "вставить" троеточие-стрелка вниз).
Юрий, очень признателен за ваши ответы.
Есть еще один вопрос от ответа на который зависит вся разработка.
Как ранее говорил вся эта затея для умного дома, а в нем (да и в других случаях) два датчика температуры в одной точке абсолютно не нужны.
Так же как мне указали ранее датчик температуры и датчик дыма не могут быть рядом, потому как первый будет врать
Так же нет смысла размещать датчик движения в углу или у окна (по мне так ближе к середине)

Поиск дал информацию что для i2c расстояние критично, а так как помещения не маленькие то между датчиками температуры будет минимально около 8 метров, даже если ESP будет по середине это уже тоже много, а значит нет необходимости подключать два датчика к одной ESP а использовать для каждого свою.
Получается что для каждого помещения нужно будет ставить свою ESP и ее максимальный набор датчиков будет:
1. Датчик температуры
2. Датчик движения
3. Геркон окна 1
4. Геркон окна 2
5. Датчик дыма (кстати я решил отказаться от установки MQ-2 и попробовать прикрутить обычный ИП212-142)

Отступление: Датчик ИП212-142 питается от кроны 9В, в оповещении есть динамик и светодиод, вот с последнего я и хочу взять сигнал (возможно через опто развязку) на ESP - получиться что то простое типа кнопки.

Предположим комната у меня 4 на 4 метра, ставить все это хозяйство планирую на потолок, а значит датчик движения должен быть где то по середине (ну не совсем есть же еще и люстра) то есть от окна это будет удаление около 2 метров, вы говорили что провод для них "можно и подлиннее " - но не понятно 2 метра это как ?

Для i2c 2 метра это точно много.
От ответа на данный вопрос собственно зависит дальнейшая разработка того усройства которое будет размещено на потолке.
 

Юрий Ботов

Moderator
Команда форума
датчик движения HC-SR501 используя код ниже, но при нем датчик всегда в состоянии сработки,
Причин может быть две:
1. датчик не настроен (вернее настроен на какой то бред). На нем есть пара подстроечных резисторов, один из которых регулирует чувствительность, а второй время на которое датчик включается после срабатывания. Разберитесь с ними.
2. датчик настроен, но поскольку вы постоянно рядом с ним - он постоянно видит вас.
но почему то сообщение о том что есть сработка приходит в монитор пачками,
Странно. Попробуй 2 вещи:
1. В конце строк вставить принудительный перевод строки: "выводимая строка \n\r"
2. После каждого сообщения вызывать принудительно Serial.flush()
Еще хотелось бы понять как использовать плату TCA9548A ?
Как то так: https://zizibot.ru/articles/electronics/tca9548a/
Поиск дал информацию что для i2c расстояние критично,
Разумеется. Но для тяжелых случаев есть хитрость: как правило частота с которой работает i2c около 100КГц, есть быстрый вариант 400КГц и даже супербыстрый 1МГц. Ясно что при таких частотах длина проводов не должна быть более 10-20 см. Но можно использовать и медленные режимы (да, придется поковыряться в настройках библиотеки) 40 и 10 КГц. Последний будет нормально работать и на 1-2 метра (экранированной витой пары разумеется).
а значит нет необходимости подключать два датчика к одной ESP а использовать для каждого свою.
В общем-то изначально esp8266 для этого и задумывался - дешевый беспроводной транспорт. По одному датчику на одну esp. Но сейчас народ хочет забить каждый контроллер "под завязку". Впрочем истина она где-то посередине.
прикрутить обычный ИП212-142
Разумно
это будет удаление около 2 метров, вы говорили что провод для них "можно и подлиннее " - но не понятно 2 метра это как ?
Для экранированной витой пары или коаксиала (телевизионный кабель) - можно метров 5-6 для простых цифровых датчиков вкл/выкл. То есть герконы, кнопки и др.

Заранее обдумайте чем и как будете все это питать. esp8266 чувствительна к качеству источника питания. В пике бывает жрет > 100мА что может сильно осложнить батарейное питание, при этом тянуть питание везде параллельно с сигнальными проводами может оказаться плохой идеей.
 

svs2007m

Active member
MQ-2 газовый датчик, а ИП212-142 дымовой. Один вешают на управление вытяжкой допустим над плитой в кухне, другой по потолку охраняемого объекта. Ну и если вы хотите не просто смотреть, то лучше еще предусмотреть элементы активной защиты ну допустим вентиляция или элементы пожаротушения. Да и чем Вас обычные датчик охранно-пожарной сигнализации не устраивают или свой велосипед ?
 

nikolz

Well-known member
Предположим комната у меня 4 на 4 метра, ставить все это хозяйство планирую на потолок, а значит датчик движения должен быть где то по середине (ну не совсем есть же еще и люстра) то есть от окна это будет удаление около 2 метров, вы говорили что провод для них "можно и подлиннее " - но не понятно 2 метра это как ?

Для i2c 2 метра это точно много.
От ответа на данный вопрос собственно зависит дальнейшая разработка того усройства которое будет размещено на потолке.
Разумеется. Но для тяжелых случаев есть хитрость: как правило частота с которой работает i2c около 100КГц, есть быстрый вариант 400КГц и даже супербыстрый 1МГц. Ясно что при таких частотах длина проводов не должна быть более 10-20 см. Но можно использовать и медленные режимы (да, придется поковыряться в настройках библиотеки) 40 и 10 КГц. Последний будет нормально работать и на 1-2 метра (экранированной витой пары разумеется).
Юрий Ботов,
Вам должно быть стыдно за такие "потолочные" рассуждения.
Полагаю, что если Вам лень читать документацию,
то Ваш уровень знаний позволяет Вам рассчитать задержки на линии и определить допустимую длину.
----------------
новичкам рекомендую читать документацию.
-----------------------
Например для интерфейса i2C читаем внимательно документ P82B96 Dual bidirectional bus buffer
и с радостью узнаем, что I2C работает
400 kHz operation over at least 20 meters of wire
т е на частоте 400 kHz длина кабеля ограничена 20(двадцать) метров, а не 2
--------------------------------
В документе AN10148 PCA9564 – I2 C-bus controller
для чипа PCA9564 читаем:
This would allow a maximum cable length of 28 m, for full 400 kHz operation.
сие означает, что имеем 28 метров на 400kHz
---------------------
если 28 метров мало, то читаем далее
At the nominal 330 kHz a typical cable could be over 70 meters long.
сие означает - более 70 метров при частоте 330 kHz
------------------------------------
рекомендую самостоятельно рассчитать допустимую длину кабеля для частот 40 и 10 kГц.
 
Сверху Снизу