6 ds18b20 + ардуино нано - нестабильная работа

yden
Offline
Зарегистрирован: 30.01.2016

Здравствуйте.

Подскажите пожалуйста. Ардуино нано на интернет-шилде. 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();
}

 

 

yden
Offline
Зарегистрирован: 30.01.2016

Добавлю.

Питание датчиков с одной клеммы что и ардуинка.

rkit
Offline
Зарегистрирован: 23.11.2016

проводка

Upper
Offline
Зарегистрирован: 23.06.2020

Если есть свободные выводы, чтобы подключить каждую пару к своему выводу, то работать должно надежнее. Для оригинальных датчиков пишут, что топология Звезда наиболее подвержена ошибкам. https://www.rototron.info/wp-content/uploads/Vegepod_1Wire_Reliability.pdf
Для китайских датчиков проблемы МОГУТ начаться на гораздо меньших длинах.

yden
Offline
Зарегистрирован: 30.01.2016

Для пробы снизил напряжение с 5.5 до 4,5 вольт. Вроде все подхватилось, буду наблюдать.

IvanAltay
Offline
Зарегистрирован: 29.10.2019

Почему Нано?

IvanAltay
Offline
Зарегистрирован: 29.10.2019

Esp8266 лучше. Сильно лучше и дешевле.

Iv_
Iv_ аватар
Offline
Зарегистрирован: 06.04.2022
Iv_
Iv_ аватар
Offline
Зарегистрирован: 06.04.2022

У меня, с десяток градусников на Esp8266/ds18b20. 3..4 шт в один порт стоит. Тупо, с подтягиващим резистором 4,7К.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Про минус 127 тут на форуме целая тема есть, у меня проект есть, там 7 датчиков на одном проводе и три штуки на раздельных пинах, много что перепробовали, разные библиотеки, разные датчики, но все равно иногда - 127 выходит, плюнули, программно считаем что это просто ошибка.
ЗЫ. Думаю дело в поддельных ds18b20.

Iv_
Iv_ аватар
Offline
Зарегистрирован: 06.04.2022

andycat пишет:
Про минус 127 тут на форуме целая тема есть, у меня проект есть, там 7 датчиков на одном проводе и три штуки на раздельных пинах, много что перепробовали, разные библиотеки, разные датчики, но все равно иногда - 127 выходит, плюнули, программно считаем что это просто ошибка.
ЗЫ. Думаю дело в поддельных ds18b20.

Согласен. Просто, на длинных шинах ток падает и больше ошибок. -127, вообще клкссика. -127 в любом случае обрабатывать надо.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

50 см максимум до датчиков, так что дело не в расстоянии, и экранированные провода пробовали и отдельный бп для датчиков и много всего...

Iv_
Iv_ аватар
Offline
Зарегистрирован: 06.04.2022

Поддельные китайские DS18B20, в основном быстрее и лучше работают. Я тестировал. Единственный косяк, я не уверен, что они именно с максимальным разрешением работают 12 бит.

Iv_
Iv_ аватар
Offline
Зарегистрирован: 06.04.2022

andycat пишет:
50 см максимум до датчиков, так что дело не в расстоянии, и экранированные провода пробовали и отдельный бп для датчиков и много всего...

2..3 метра, у меня без проблем провода. Длиньше, начинаются пляски.

Iv_
Iv_ аватар
Offline
Зарегистрирован: 06.04.2022

На Гитхабе видел прожект, транзисторное усиление на 10шт ds18b20 в одну линию. Только нафига?

Iv_
Iv_ аватар
Offline
Зарегистрирован: 06.04.2022

Развешиваем на 2..3 порта датчики. Всех делов.

IvanAltay
Offline
Зарегистрирован: 29.10.2019

Ну дЫк чЁ как, победил ds18b20?0