Ви не увійшли.
Работаю над неким проэктом где очень важно максимально точно поддерживать температуру. Столкнулся с проблемой очень медленной работы, из-за чего появляются колебания температуры.
Для примера есть следующий код. Программа снимает температуру с двух датчиков и выдает количество затраченного времени для 9, 10, 11 и 12 bit разрешения.
Используются библиотеки OneWire и DallasTemperature.
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer = {0x28, 0xFA, 0xAB, 0x8C, 0x06, 0x00, 0x00, 0xFA};
DeviceAddress outsideThermometer = {0x28, 0x17, 0x1C, 0x8C, 0x06, 0x00, 0x00, 0x87};
void setup() {
Serial.begin(9600);
sensors.begin();
}
//Мигнуть диодом 100000 раз и вывести инфо о времени исполнения
void loop() {
double temp1;
double temp2;
unsigned long start ;
unsigned long i ;
Serial.print("requestTemperaturesByAddress + getTempC test, 12 bit: ") ;
sensors.setResolution(insideThermometer, 12);
sensors.setResolution(outsideThermometer, 12);
start = millis() ;
for (i = 0 ; i < 10 ; i++)
{
sensors.requestTemperaturesByAddress(insideThermometer);
temp1 = sensors.getTempC(insideThermometer);
sensors.requestTemperaturesByAddress(outsideThermometer);
temp2 = sensors.getTempC(outsideThermometer);
}
Serial.print(millis() - start) ;
Serial.println(" msec (10 calls)") ;
delay(2000);
Serial.print("requestTemperaturesByAddress + getTempC test, 11 bit: ") ;
sensors.setResolution(insideThermometer, 11);
sensors.setResolution(outsideThermometer, 11);
start = millis() ;
for (i = 0 ; i < 10 ; i++)
{
sensors.requestTemperaturesByAddress(insideThermometer);
temp1 = sensors.getTempC(insideThermometer);
sensors.requestTemperaturesByAddress(outsideThermometer);
temp2 = sensors.getTempC(outsideThermometer);
}
Serial.print(millis() - start) ;
Serial.println(" msec (10 calls)") ;
delay(2000);
Serial.print("requestTemperaturesByAddress + getTempC test, 10 bit: ") ;
sensors.setResolution(insideThermometer, 10);
sensors.setResolution(outsideThermometer, 10);
start = millis() ;
for (i = 0 ; i < 10 ; i++)
{
sensors.requestTemperaturesByAddress(insideThermometer);
temp1 = sensors.getTempC(insideThermometer);
sensors.requestTemperaturesByAddress(outsideThermometer);
temp2 = sensors.getTempC(outsideThermometer);
}
Serial.print(millis() - start) ;
Serial.println(" msec (10 calls)") ;
delay(2000);
Serial.print("requestTemperaturesByAddress + getTempC test, 9 bit: ") ;
sensors.setResolution(insideThermometer, 9);
sensors.setResolution(outsideThermometer, 9);
start = millis() ;
for (i = 0 ; i < 10 ; i++)
{
sensors.requestTemperaturesByAddress(insideThermometer);
temp1 = sensors.getTempC(insideThermometer);
sensors.requestTemperaturesByAddress(outsideThermometer);
temp2 = sensors.getTempC(outsideThermometer);
}
Serial.print(millis() - start) ;
Serial.println(" msec (10 calls)") ;
delay(2000);
}
Что из этого имеем:
requestTemperaturesByAddress + getTempC test, 12 bit: 16166 msec (10 calls) - 808,3 msec на снятие температуры с 1 датчика
requestTemperaturesByAddress + getTempC test, 11 bit: 8666 msec (10 calls) - 433,3 msec на снятие температуры с 1 датчика
requestTemperaturesByAddress + getTempC test, 10 bit: 4927 msec (10 calls) - 246.35 msec на снятие температуры с 1 датчика
requestTemperaturesByAddress + getTempC test, 9 bit: 3046 msec (10 calls) - 152,3 msec на снятие температуры с 1 датчика
Необходимо добиться чтобы при разрешении в 12 bit температура измерялась намного быстрее.
Прошу помощи!
Неактивний
Подсказали на другом форуме:
В библиотеке можно подправить
// Wait a fix number of cycles till conversion is complete (based on IC datasheet)
switch (*bitResolution)
{
case 9:
delay(94);
break;
case 10:
delay(188);
break;
case 11:
delay(375);
break;
case 12:
default:
delay(750);
break;
}
Сменил задержку до 100 мсек. Полет нормальный, прибор быстро набирает температуру и быстро стабилизирует ее до максимальных +/-0,06 градуса.
Температуру вроде бы показывает правильную. Интересно, как повлияло на работу программы датчика такое изменение температуры.
Неактивний
то что подправили - время ожидания до полного цикла измерения температуры ) // Wait a fix number of cycles till conversion is complete (based on IC datasheet)
ставьте защиту на данные ( например скользящее среднее, и сравнение результата с ним, но это плохо повлияет на работу ) , будут выбросы ( вероятно ) , а что греете? если 1 Гц не хватает?
может нагревательный механизм поправите ( уменьшить мощность?)?
ПИДом стабилизируете?
Неактивний
покажите результаты, интересно ведь
"возюкался" когда то такой темой
видел работу "буржуйских" объектов, впечатляет качество реализации, но и цена была не "детская" )
как Ваши успехи?
Неактивний