Відповісти

Введіть повідомлення і натисніть Надіслати
Параметри

Назад

Огляд теми (нові повідомленні вгорі)

Nefreemen
2016-12-24 16:44:53

Обратите внимание на функцию
sensors.requestTemperatures();
она дает команду на измерение всем датчикам.
ф-ция
sensors.getTempCByIndex( int x)
считывает значение по индексу;
Датчики влажности типа DHT имеют свой протокол и цеплять их на шину с DS не рекомендуется.
При обращении к ним не используется адрес. Адресом служит bus. Сколько будет у Вас датчиков влажности DHT столько нужно bus  sad /

petrovnn
2016-12-24 16:38:45
Nefreemen пише:

Непонятно зачем у Вашем новом примере висит функция
void printAddress(DeviceAddress deviceAddress)

эта функция была в исходном примере, не стал сразу удалять т.к. подумал что адрес поможет с адресацией к датчикам. Но учитывая, что все показания без проблем снимаются по индексу, то адрес вроде как в текущем примере бесполезен, и действительно ее можно удалить. Ну закомментировать т.к. в будущем возможно появится задача обращения по адресу (на самом деле хз). Например нужно еще два датчика влажности приделать (пока их еще не достал), не знаю понадобится-ли там обращение по адресу или нет.

Nefreemen пише:

Да, еще забыл, в даташите есть рекомендуемое время опроса датчиков, и он по моему больше 3с (я к сожалению не помню какое sad ). Некоторые юзеры пишут что частый опрос меньше 10с приводит к "разогреву" датчика что влияет на погрешность.

насчет разогрева не слышал, спасибо что сказали, поставлю тогда 10с, такое время не критично smile

Nefreemen
2016-12-24 16:23:26

Непонятно зачем у Вашем новом примере висит функция
void printAddress(DeviceAddress deviceAddress)  roll  roll
Да, еще забыл, в даташите есть рекомендуемое время опроса датчиков, и он по моему больше 3с (я к сожалению не помню какое sad ). Некоторые юзеры пишут что частый опрос меньше 10с приводит к "разогреву" датчика что влияет на погрешность.

petrovnn
2016-12-24 16:21:40

похоже я облажался второй раз. Честно говоря думал что print(var,1) просто отсекает вторую цифру, а оказалось что округляет smile весь мой колхоз оказался не нужен. Еще раз спасибо!  smile

Nefreemen
2016-12-24 15:41:44

Вместо этого:
lcd.print((float)lrint(sensors.getTempC(cat) * 10) / 10, 1);
попробуйте так:
lcd.print(sensors.getTempC(cat), 1);
smile
В ардуино  не совсем С++, это Wiring smile. Избегайте * и / непосредственно с float насколько это возможно smile. Это не комьютер и не МК с модулем для действий плавающей запятой smile.

petrovnn
2016-12-24 13:46:47

спасибо огромное, все получилось!

дело в том, что я действовал с помощью высокоинтеллектуального метода "copy&paste", не особо понимая что в этом примере происходит. Но со временем конечно и опытом ситуация будет лучше. Плюсы мне показались намного более сложным языком чем PHP или JavaScript. Код упростил  http://pastebin.com/RgxKPzpj

пришлось правда написать костыль для округления до одной цифры после запятой, но по другому не смог
lcd.print((float)lrint(sensors.getTempC(cat) * 10) / 10, 1);

результат:
4CqqumJ.png

один датчик на улице, два дома

Nefreemen
2016-12-23 22:59:36

Давйте договоримся, мухи от котлет отдельно smile. Разрешающая способность это одно, точность это другое smile. Согласно даташиту на 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С

petrovnn
2016-12-23 19:10:41

Приветствую!

Есть датчики температуры 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, которым можно управлять и он запоминает режимы работы? Может быть в коде есть команды, которые переключили датчики в другой режим?

а датчики такие:
dXeGTDT.png

Підвал форуму