Ардуино нано + ds18b20
- Войдите на сайт для отправки комментариев
Сб, 20/08/2022 - 22:11
Здравствуйте.
Подскажите пожалуйста. Ардуино нано + 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(); }
Благодарю
Частоту шины изменить нельзя.
Там фиксированные таймслоты и их нельзя изменить. Соответственно и скорость тоже. Но, странно, этот протокол и 20 метров запросто осилит.
китайские поддельные датчики не выдержат
Выдержат. Я специально на бухту провода их грузил, метров 20-30 дюжат. Правда, подделка или нет - не знаю, покупал на эбээ лет 5 назад.