Ардуино нано + ds18b20

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

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

Подскажите пожалуйста. Ардуино нано + 4 датчика ds18b20 (по 2 на каждой шине 1-ware, отдельный пин на ардуинке, длина шины - не более 5 м, витая пара). Сборка работает нестабильно. Более-менее стабильности удалось добиться только с подтяжкой к шине двух 4,7 ком резисторов (параллель).

На просторах интернета прочитал, что можно уменьшить частоту шины и настроить очередность опроса датчиков. Можете поделиться примером, кто в теме?

Мой код:

#include <OneWire.h>
#include <DallasTemperature.h>


// =======================================================================
//ds18b20
OneWire oneWire1(4); // вход датчиков 18b20
DallasTemperature ds1(&oneWire1);
DeviceAddress ds1_budka = { 0x28, 0x53, 0xD9, 0x1E, 0x00, 0x00, 0x80, 0x65 };//
DeviceAddress ds1_t_out_porch = { 0x28, 0x4B, 0x52, 0x38, 0x23, 0x20, 0x01, 0x3E };

OneWire oneWire3(6); // вход датчиков 18b20
DallasTemperature ds3(&oneWire3);
DeviceAddress ds3_kotel_out = { 0x28, 0x8a, 0xf9, 0x77, 0x91, 0x0a, 0x02, 0x98 };//
DeviceAddress ds3_kotel_in = { 0x28, 0x4a, 0x34, 0x79, 0x23, 0x20, 0x01, 0xEB };//

int t_budka = 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 = 60000;     //интервал
uint32_t currentMillis_sensor = 0;

// =======================================================================
void setup()
{
  
  ds1.begin();
  ds3.begin();

}

// =======================================================================
void loop()
{
  currentMillis_sensor = millis();

  //--------------------------------------------------------------------------------------
  //температура
  if (currentMillis_sensor - previousMillis_sensor > interval_sensor)
  {
    previousMillis_sensor = currentMillis_sensor;

    ds1.requestTemperatures(); // считываем температуру с датчиков
    ds3.requestTemperatures(); // считываем температуру с датчиков

    t_budka = ds1.getTempC(ds1_budka);
    if (t_budka > -60)
    {
      itoa(t_budka, buff, 10);
      client.publish("ihouse/climat/budka/temp", buff);
      client.publish("ihouse/climat/budka/error", "0");
    }
    else client.publish("ihouse/climat/budka/error", "1");

    t_kotel_out = ds3.getTempC(ds3_kotel_out);
    if (t_kotel_out > -60)
    {
      itoa(t_kotel_out, buff, 10);
      client.publish("ihouse/climat/kotel/out/temp", buff);
      client.publish("ihouse/climat/kotel/out/error", "0");
    }
    else client.publish("ihouse/climat/kotel/out/error", "1");

    t_kotel_in = ds3.getTempC(ds3_kotel_in);
    if (t_kotel_in > -60)
    {
      itoa(t_kotel_in, buff, 10);
      client.publish("ihouse/climat/kotel/in/temp", buff);
      client.publish("ihouse/climat/kotel/in/error", "0");
    }
    else client.publish("ihouse/climat/kotel/in/error", "1");

    t_out_porch = ds1.getTempC(ds1_t_out_porch);
    if (t_out_porch > -60)
    {
      itoa(t_out_porch, buff, 10);
      client.publish("ihouse/climat/outPorch2/temp", buff);
      client.publish("ihouse/climat/outPorch2/error", "0");
    }
    else client.publish("ihouse/climat/outPorch2/error", "1");
  }

  client.loop();
}

Благодарю

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

Частоту шины изменить нельзя.

-NMi-
Offline
Зарегистрирован: 20.08.2018

Там фиксированные таймслоты и их нельзя изменить. Соответственно и скорость тоже. Но, странно, этот протокол и 20 метров запросто осилит.

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

китайские поддельные датчики не выдержат

-NMi-
Offline
Зарегистрирован: 20.08.2018

Выдержат. Я специально на бухту провода их грузил, метров 20-30 дюжат. Правда, подделка или нет - не знаю, покупал на эбээ лет 5 назад.