6 ds18b20 + ардуино нано - нестабильная работа
- Войдите на сайт для отправки комментариев
Ср, 10/08/2022 - 19:30
Здравствуйте.
Подскажите пожалуйста. Ардуино нано на интернет-шилде. 6 датчиков ds18b20 с али. Сигнальные шины 3 штуки (по паре датчиков на каждой ветке - общий сигнальный провод) соединены возле ардуинки. Питание всего этого хозяйства отдельный через dc/dc преобразователь (12/5,5 в). К сигнальной шине через два 4,7 ком резистора параллельно подключена подтяжка +5 (с одним 4,7 вообще не заводится). Длина каждой ветки с датчиками не более 5 м, витая пара.
Эта сборка очень нестабильно работает. Часто прилетают -127 градусов со всех датчиков. С бубном можно запустить систему, но не на долго.
Может кто что подскажет.
Благодарю.
Скетч:
#include <Ethernet.h>
#include <SPI.h>
#include <PubSubClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Bounce2.h>
// =======================================================================
// Конфигурация устройства MQTT:
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xE8, 0xE5 };
IPAddress ip(10, 12, 10, 108);
IPAddress dnServer(10, 12, 10, 1);
IPAddress gateway(10, 12, 10, 1);
IPAddress subnet(255, 255, 255, 0);
const char *mqtt_server = "10.12.10.12"; // Имя сервера MQTT
const int mqtt_port = 1883; // Порт для подключения к серверу MQTT
const char *mqtt_user = "***"; // Логи от сервер
const char *mqtt_pass = "***"; // Пароль от сервера
EthernetClient ethClient;
PubSubClient client(ethClient);
// =======================================================================
//ds18b20
OneWire oneWire(6); // вход датчиков 18b20
DallasTemperature ds(&oneWire);
DeviceAddress ds_budka = { 0x28, 0x53, 0xD9, 0x1E, 0x00, 0x00, 0x80, 0x65 };//
DeviceAddress ds_water = { 0x28, 0xFF, 0x91, 0x2D, 0x81, 0x17, 0x05, 0xAB };
DeviceAddress ds_podval_server = { 0x28, 0xFF, 0x05, 0x2B, 0x81, 0x17, 0x05, 0x0A };
DeviceAddress ds_t_out_porch = { 0x28, 0x4B, 0x52, 0x38, 0x23, 0x20, 0x01, 0x3E };
DeviceAddress ds_kotel_out = { 0x28, 0x8a, 0xf9, 0x77, 0x91, 0x0a, 0x02, 0x98 };//
DeviceAddress ds_kotel_in = { 0x28, 0x4a, 0x34, 0x79, 0x23, 0x20, 0x01, 0xEB };//
int t_budka = 0;
int t_water = 0;
int t_podval_server = 0;
int t_kotel_out = 0;
int t_kotel_in = 0;
int t_out_porch = 0;
byte i = 0;
char buff[15];
//подсчет времени
//опрос датчиков
uint32_t previousMillis_sensor = 0; // храним время последнего опроса датчиков
uint32_t interval_sensor = 30000; //интервал
uint32_t currentMillis_sensor = 0;
//mqtt broker
uint32_t previousMillis_mqtt_connect = 0; // храним время последнего подключения
uint32_t interval_mqtt_connect = 30000; //интервал
uint32_t currentMillis_mqtt_connect = 0;
// =======================================================================
void mqtt_reconnect()
{
currentMillis_mqtt_connect = millis();
// подключаемся к MQTT серверу
if (currentMillis_mqtt_connect - previousMillis_mqtt_connect > interval_mqtt_connect)
{
String clientId = "nanotempsensorright-";
clientId += String(random(0xffff), HEX);
client.connect(clientId.c_str(), mqtt_user, mqtt_pass);
previousMillis_mqtt_connect = currentMillis_mqtt_connect;
}
}
// =======================================================================
void setup()
{
Ethernet.begin(mac, ip, dnServer, gateway, subnet);
delay(1000);
client.setServer(mqtt_server, mqtt_port);
delay(10);
ds.begin();
pinMode(inLeak, INPUT_PULLUP);
}
// =======================================================================
void loop()
{
currentMillis_sensor = millis();
//--------------------------------------------------------------------------------------
if (!client.connected())
{
mqtt_reconnect();
}
//--------------------------------------------------------------------------------------
//температура
if (currentMillis_sensor - previousMillis_sensor > interval_sensor)
{
previousMillis_sensor = currentMillis_sensor;
i++;
//dallas подготовка
if (i == 1)
{
ds.requestTemperatures(); // считываем температуру с датчиков
}
//dallas считывание
if (i == 2)
{
t_budka = ds.getTempC(ds_budka);
t_water = ds.getTempC(ds_water);
t_podval_server = ds.getTempC(ds_podval_server);
t_kotel_out = ds.getTempC(ds_kotel_out);
t_kotel_in = ds.getTempC(ds_kotel_in);
t_out_porch = ds.getTempC(ds_t_out_porch);
i = 0;
itoa(t_budka, buff, 10);
client.publish("ihouse/climat/budka/temp", buff, true);
itoa(t_water, buff, 10);
client.publish("ihouse/water/in/temp", buff, true);
itoa(t_podval_server, buff, 10);
client.publish("ihouse/climat/podval/server/temp", buff, true);
itoa(t_kotel_out, buff, 10);
client.publish("ihouse/climat/kotel/out", buff, true);
itoa(t_kotel_in, buff, 10);
client.publish("ihouse/climat/kotel/in", buff, true);
itoa(t_out_porch, buff, 10);
client.publish("ihouse/climat/outPorch2/temp", buff, true);
}
}
client.loop();
}
Добавлю.
Питание датчиков с одной клеммы что и ардуинка.
проводка
Если есть свободные выводы, чтобы подключить каждую пару к своему выводу, то работать должно надежнее. Для оригинальных датчиков пишут, что топология Звезда наиболее подвержена ошибкам. https://www.rototron.info/wp-content/uploads/Vegepod_1Wire_Reliability.pdf
Для китайских датчиков проблемы МОГУТ начаться на гораздо меньших длинах.
Для пробы снизил напряжение с 5.5 до 4,5 вольт. Вроде все подхватилось, буду наблюдать.
Почему Нано?
Esp8266 лучше. Сильно лучше и дешевле.
https://i.postimg.cc/pdxCR690/16601541469057851293166722316877.jpg
У меня, с десяток градусников на Esp8266/ds18b20. 3..4 шт в один порт стоит. Тупо, с подтягиващим резистором 4,7К.
Про минус 127 тут на форуме целая тема есть, у меня проект есть, там 7 датчиков на одном проводе и три штуки на раздельных пинах, много что перепробовали, разные библиотеки, разные датчики, но все равно иногда - 127 выходит, плюнули, программно считаем что это просто ошибка.
ЗЫ. Думаю дело в поддельных ds18b20.
ЗЫ. Думаю дело в поддельных ds18b20.
Согласен. Просто, на длинных шинах ток падает и больше ошибок. -127, вообще клкссика. -127 в любом случае обрабатывать надо.
50 см максимум до датчиков, так что дело не в расстоянии, и экранированные провода пробовали и отдельный бп для датчиков и много всего...
Поддельные китайские DS18B20, в основном быстрее и лучше работают. Я тестировал. Единственный косяк, я не уверен, что они именно с максимальным разрешением работают 12 бит.
2..3 метра, у меня без проблем провода. Длиньше, начинаются пляски.
На Гитхабе видел прожект, транзисторное усиление на 10шт ds18b20 в одну линию. Только нафига?
Развешиваем на 2..3 порта датчики. Всех делов.
Ну дЫк чЁ как, победил ds18b20?0