Ви не увійшли.
Приветствую!
Есть датчики температуры DALLAS, которые работали безупречно до тех пор, пока не попытался подключить сразу два датчика к одному экрану. После этого датчики, которые подключал одновременно, стали выдавать значения с точностью в 0.5 градуса. Хотя до этого они выдавали точность в 0.01. Единственный датчик, который остался точным тот - который я не пытался подключить с помощью библиотеки "Arduino-Temperature-Control-Library", с этим примером:
https://github.com/milesburton/Arduino- … ltiple.pde
до этого подключал с помощью библиотеки OneWire, которая идет вместе с Arduino IDE, стандартный пример отлично работал (правда только с одним датчиком): http://pastebin.com/rUPTjZeu
Вопросы, которые возникают:
1). может-ли программа "испортить" датчик таким образом, что он начал показывать в 20 раз меньшую точность (даже если подключать примитивную схему на примере где он всегда работал точно)?
2). может-ли ошибка схемы (распиновка, питание, резисторы) убить точность датчика?
3). есть-ли у этого датчика какое-то API, которым можно управлять и он запоминает режимы работы? Может быть в коде есть команды, которые переключили датчики в другой режим?
а датчики такие:
Остання редакція petrovnn (2016-12-23 19:11:42)
Неактивний
Давйте договоримся, мухи от котлет отдельно . Разрешающая способность это одно, точность это другое . Согласно даташиту на DS18B20 разрешающая способность может быть от 9 до 12 бит что соответствует разр.способности 0.5 - 0.0625 С (соответст. 0.5, 0.25, 0.125, 0.0625) .
Посмотрите на следующие строки в коде который Вы привели:
// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
#define TEMPERATURE_PRECISION 9
и
// set the resolution to 9 bit per device
sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION);
sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION);
Думаю Вы поняли что задана разрешающая способность 9 бит то есть 0.5С
Остання редакція Nefreemen (2016-12-23 23:14:40)
Неактивний
спасибо огромное, все получилось!
дело в том, что я действовал с помощью высокоинтеллектуального метода "copy&paste", не особо понимая что в этом примере происходит. Но со временем конечно и опытом ситуация будет лучше. Плюсы мне показались намного более сложным языком чем PHP или JavaScript. Код упростил http://pastebin.com/RgxKPzpj
пришлось правда написать костыль для округления до одной цифры после запятой, но по другому не смог
lcd.print((float)lrint(sensors.getTempC(cat) * 10) / 10, 1);
результат:
один датчик на улице, два дома
Неактивний
Вместо этого:
lcd.print((float)lrint(sensors.getTempC(cat) * 10) / 10, 1);
попробуйте так:
lcd.print(sensors.getTempC(cat), 1);
В ардуино не совсем С++, это Wiring . Избегайте * и / непосредственно с float насколько это возможно . Это не комьютер и не МК с модулем для действий плавающей запятой .
Неактивний
похоже я облажался второй раз. Честно говоря думал что print(var,1) просто отсекает вторую цифру, а оказалось что округляет весь мой колхоз оказался не нужен. Еще раз спасибо!
Неактивний
Непонятно зачем у Вашем новом примере висит функция
void printAddress(DeviceAddress deviceAddress)
Да, еще забыл, в даташите есть рекомендуемое время опроса датчиков, и он по моему больше 3с (я к сожалению не помню какое ). Некоторые юзеры пишут что частый опрос меньше 10с приводит к "разогреву" датчика что влияет на погрешность.
Остання редакція Nefreemen (2016-12-24 16:29:19)
Неактивний
Непонятно зачем у Вашем новом примере висит функция
void printAddress(DeviceAddress deviceAddress)
эта функция была в исходном примере, не стал сразу удалять т.к. подумал что адрес поможет с адресацией к датчикам. Но учитывая, что все показания без проблем снимаются по индексу, то адрес вроде как в текущем примере бесполезен, и действительно ее можно удалить. Ну закомментировать т.к. в будущем возможно появится задача обращения по адресу (на самом деле хз). Например нужно еще два датчика влажности приделать (пока их еще не достал), не знаю понадобится-ли там обращение по адресу или нет.
Да, еще забыл, в даташите есть рекомендуемое время опроса датчиков, и он по моему больше 3с (я к сожалению не помню какое ). Некоторые юзеры пишут что частый опрос меньше 10с приводит к "разогреву" датчика что влияет на погрешность.
насчет разогрева не слышал, спасибо что сказали, поставлю тогда 10с, такое время не критично
Неактивний
Обратите внимание на функцию
sensors.requestTemperatures();
она дает команду на измерение всем датчикам.
ф-ция
sensors.getTempCByIndex( int x)
считывает значение по индексу;
Датчики влажности типа DHT имеют свой протокол и цеплять их на шину с DS не рекомендуется.
При обращении к ним не используется адрес. Адресом служит bus. Сколько будет у Вас датчиков влажности DHT столько нужно bus /
Остання редакція Nefreemen (2016-12-24 17:00:53)
Неактивний