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