да, вы верно заметили, очень не уверенно, но все что я находил для этого датчика, используют delay, что меня абсолютно не устраивает, так как объем обрабатываемых данных большой, температура только маленькая часть проекта, и остановка кода не приемлема..
Ну и какие проблемы? В принципе библиотека DallasTemperature заточена на возможность неблокирующего чтения. Правда в ней есть ошибка из-за которой это не работает. Но ошибку легко обойти. Вот в этой теме я показывал как пользоваться DallasTemperature в неблокирующем режиме - никаких проблем.
Евгений Петрович, Вы правы идеологически, а конкретный код исключение, компилятор его обрабатывает как надо, то-есть зная что приёмником данных есть переменная типа int он и создаёт код работая с байтами во временных переменных типа int другого объяснения у меня нет
ПРо сдвиги, если хотите, может отдельно поговорить (там результат всегда int) А по моему пункту №1 у Вас есть объяснение? Про печать при каждом проходе, а считывание температуры только при нечётном?
Евгений Петрович, Вы правы идеологически, а конкретный код исключение, компилятор его обрабатывает как надо, то-есть зная что приёмником данных есть переменная типа int он и создаёт код работая с байтами во временных переменных типа int другого объяснения у меня нет
ПРо сдвиги, если хотите, может отдельно поговорить (там результат всегда int) А по моему пункту №1 у Вас есть объяснение? Про печать при каждом проходе, а считывание температуры только при нечётном?
если ТС желает получать значение температуры раз в секунду, то почему бы нет, переменная волатильная, температура будет такая жеж )))
код в принципе рабочий, без задержек, если еще убрать вывод в сериал будет еще быстрее
если ТС желает получать значение температуры раз в секунду,
Так в том-то и дело, что в том коде он получает температуру якобы раз в две секунды, но на самом деле - раз в четыре секунды, а через раз (по чётным вызовам) просто печатает старое значение, которое в прошлый раз было.
Нет, если так и было задумано, то я не против - не вопрос.
Так в том-то и дело, что в том коде он получает температуру якобы раз в две секунды, но на самом деле - раз в четыре секунды, а через раз (по чётным вызовам) просто печатает старое значение, которое в прошлый раз было.
Нет, если так и было задумано, то я не против - не вопрос.
ну так покажите как нужно! что ж вы как партизан то.. )))
ну так покажите как нужно! что ж вы как партизан то.. )))
Простите, я Вам что-то задолжал? Не припоминаю.
Писать код специально для Вас я не буду, т.к. Вам это на самом деле не нужно, Вы сами это написали
AlexZR пишет:
и все таки, кто нибудь, может предложить рабочий код ... нет времени вникать в тонкости этого долбаного датчика!
т.е. Вам не нужно научиться работать с датчиком и освоить программирование, на это у Вас "нет времени". Ну, а у меня нет времени что-то писать для людей, которым не нужно научиться писать, а нужно просто работающее устройство. Нужно - покупайте.
Вы написали код - я его покритиковал. Считаю это помощью Вам. Писать же код вместо Вас на том основании, что у Вас нет времени вникать ... извините, Вы не являетесь моим работодателем.
Вы написали код - я его покритиковал. Считаю это помощью Вам. Писать же код вместо Вас на том основании, что у Вас нет времени вникать ... извините, Вы не являетесь моим работодателем.
другого ответа и не ожидал! один пустой треп.. )))
но порядочные профи есть! помогли! за что и будут вознаграждены !
да, вы верно заметили, очень не уверенно, но все что я находил для этого датчика, используют delay, что меня абсолютно не устраивает, так как объем обрабатываемых данных большой, температура только маленькая часть проекта, и остановка кода не приемлема..
Ну и какие проблемы? В принципе библиотека DallasTemperature заточена на возможность неблокирующего чтения. Правда в ней есть ошибка из-за которой это не работает. Но ошибку легко обойти. Вот в этой теме я показывал как пользоваться DallasTemperature в неблокирующем режиме - никаких проблем.
проблем нет, но если немножко код поправить, то получим задержку в 10 миллисекунд, против 44 в Далласовской
// определение адреса датчика в сетапе, установка битности датчика
#include <OneWire.h>
OneWire ds(4); // D2 (ESP8266)
byte addr[8]; // = {0x28, 0xEC, 0xF0, 0xD5, 0x04, 0x00, 0x00, 0xF2};
volatile float temperature;
unsigned long timing;
unsigned long t1;
unsigned long t2;
void setup(void)
{
Serial.begin(115200);
label:
ds.reset(); // сброс шины
ds.search(addr); // определение адреса датчика
if (OneWire::crc8(addr, 7) != addr[7])
{ //проверка массива адреса на срц
Serial.println F("CRC ADRESS DS18B20 is not valid!");
goto label;
}
ds.reset(); // сброс шины
ds.select(addr); // выставить адрес
ds.write(0x4E); // разрешение записать конфиг
ds.write(0x7F); // Th контроль температуры макс 128грд
ds.write(0xFF); // Tl контроль температуры мин -128грд
ds.write(0x60); // 0x60 12-бит разрешение, 0x00 -9бит разрешение
ds.write(0x7F); // точность 0,5гр = 1F; 0,25гр = 3F; 0,125гр = 5F; 0,0625гр = 7F;
// запросим температуру, считывать будем по таймеру
ds.reset();
ds.write(0xCC); // Обращение ко всем датчикам
ds.write(0x44); // Команда на конвертацию
timing = millis();
}
void loop(void) {
if (millis() - timing > 1000)
{
timing = millis();
getTemperature();
Serial.print(" Temperature = ");
Serial.print(temperature, 3);
Serial.print(" Задержка в микросекундах - ");
Serial.println(t2 - t1);
}
}
void getTemperature()
{
int temp;
t1 = micros();
ds.reset();
ds.select(addr);
ds.write(0xBE); // Считывание значения с датчика
temp = (ds.read() | ds.read() << 8); // Принимаем два байта температуры
temperature = (float)temp / 16.0; // round((float)temp / 16.0);
ds.reset();
ds.write(0xCC); // Обращение ко всем датчикам
ds.write(0x44); // Команда на конвертацию
t2 = micros();
}
Александр, интересно, что там за проблема была, проверил на трёх разных ардуинах (ESP32,ESP8266, NANO (Optiboot), на твоём коде, у меня не проявилась
ну скажем так, почти решили ))) сейчас разница 0.5 градуса, прошивка другая, а вот почему, пока сам не въехал )))
сейчас буду пробовать твою последнею...
проверил, разница 0.7 градуса, считаю уже нормально )))
у тебя видимо датчик близко к ESP, я тут немножко сенситив рукой чую с расстояния 10 сантиметров, греет ESP не кисло, прибор есть но отдал сыну, можно было бы и посмотреть насколько, nano, та градусов 30-35, а ESP видимо под 50, у меня даллас в 20 сантиметрах ниже платы висит
да по коду, можно задержку уменьшить до 750, разница по времени запрос-считывание будет 750 миллисекунд, выводится всегда!!! последняя считанная
у тебя видимо датчик близко к ESP, я тут немножко сенситив рукой чую с расстояния 10 сантиметров, греет ESP не кисло, прибор есть но отдал сыну, можно было бы и посмотреть насколько, nano, та градусов 30-35, а ESP видимо под 50, у меня даллас в 20 сантиметрах ниже платы висит
да, скорее всего, датчик паяю на плату, и она чуть теплее ардуино, все, вопрос решен )))
у тебя видимо датчик близко к ESP, я тут немножко сенситив рукой чую с расстояния 10 сантиметров, греет ESP не кисло, прибор есть но отдал сыну, можно было бы и посмотреть насколько, nano, та градусов 30-35, а ESP видимо под 50, у меня даллас в 20 сантиметрах ниже платы висит
да, скорее всего, датчик паяю на плату, и она чуть теплее ардуино, все, вопрос решен )))
а я дальше поковыряю на предмет отказа датчика, код из #222
DallasTemperature возвращает -127, если датчик отклячился.
Я тоже тест провел с термоизоляцией сенсора и перебросом на ходу между ESP32 и Nano. Никаких отклонений не вижу, все эквивалентно - и скречпад и температура вычисленная.
DallasTemperature возвращает -127, если датчик отклячился.
Я тоже тест провел с термоизоляцией сенсора и перебросом на ходу между ESP32 и Nano. Никаких отклонений не вижу, все эквивалентно - и скречпад и температура вычисленная.
найти бы как LOGIС обошёл CRC 0 сейчас с оборванным датчиком температура ==0
Вопрос с all zeros тоже меня постоянно мучает. В DallasTemperature такая ситуация считается аварийной, а в даташите все нули - 0 градусов. CRC8 далласовский от всех нулей
скрэчпада вроде как тоже 0.
Проблема на шине по "onewire.reset() == 0" отслеживается.
Вопрос с all zeros тоже меня постоянно мучает. В DallasTemperature такая ситуация считается аварийной, а в даташите все нули - 0 градусов. CRC8 далласовский от всех нулей скрэчпада вроде как тоже 0. Проблема на шине по "onewire.reset() == 0" отслеживается.
Не. Он отслеживает ответ датчика на сброс шины. И это верно. Оборванный датчик не отвечает обычно. Ещё когда от датчика приезжает значение температуры, то там целых девять байт, ну по которым мы crc проверяем. Среди них есть FF. В даташите пишут что он всегда такое. Его тоже проверяю, тем самым исключаю проблемму 'все нули'
после долгих мучений, остановился на таком варианте..
Александр!
Где положительные эмоции?
Я жеж выкладывал скетч в котором замечания Евгения Петровича были устранены, время между опросами датчика, чтобы не разогревался надо ставить 1.5 секунды, время опроса порядка 14 миллисекунд, если надо меньшее время, то этот датчик не годится (это минимум) с обходом косяков при использовании Далласовской библиотеки - 44 миллисекунды, то-есть напрямую получается в три раза лучше
Если температура в 0.25 градуса не критична то частоту опроса можно уменьшить до 750 миллисекунд
PS время обработки можно уменьшить до 9 мсек, но будем получать температуру через раз, что не есть хорошо
я вечером поправлю с учётом вновь открывшихся обстоятельств (по неисправности датчика) и выложу
спасибо! ожидаю...
с этим думаю уже можно работать, прогони по температуре феном, код обработки температуры взят из #222
#include <OneWire.h>
OneWire ds(4); // D2 (ESP8266)
byte addr[8];
byte addr1[8];
byte data[12];
byte zero = 0;
volatile float temperature;
unsigned long timing;
unsigned long t1;
unsigned long t2;
uint16_t t_convert = 1500; // врененной цикл запроса температуры, мин. 750
void setup() {
Serial.begin(115200);
int ii = 0;
label:
if (ii < 6)
{
if ( !ds.search(addr))
{ // пока возвращаемый адрес == 0
Serial.println F("No more addresses.");
Serial.println(addr[8]);
ds.reset_search();
delay(250);
++ii;
goto label;
}
if (OneWire::crc8(addr, 7) != addr[7])
{ //проверка массива адреса на CRC-8
Serial.println F("CRC is not valid!");
++ii; goto label;
}
}
ds.reset(); // сброс шины
ds.select(addr); // выставить адрес
ds.write(0x4E); // разрешение записать конфиг
ds.write(0x7F); // Th контроль температуры макс 128грд
ds.write(0xFF); // Tl контроль температуры мин -128грд
ds.write(0x60); // 0x60 12-бит разрешение, 0x00 -9бит разрешение
ds.write(0x7F); // точность 0,5гр = 1F; 0,25гр = 3F; 0,125гр = 5F; 0,0625гр = 7F;
// запросим температуру, считывать будем по таймеру
ds.reset();
ds.write(0xCC); // Обращение ко всем датчикам
ds.write(0x44); // Команда на конвертацию
timing = millis();
}
void loop()
{
if (millis() - timing >= t_convert)
{
timing = millis();
getTemperature();
Serial.print(" Temperature = ");
Serial.print(temperature, 3);
Serial.print(" Задержка в микросекундах - ");
Serial.println(t2 - t1);
if(zero >= 1){ Serial.println(" *** Датчик оборван или замкнут *** "); zero = 0;}
}
}
void getTemperature()
{ // возвращает температуру с датчика
int temp;
t1 = micros();
ds.reset();
ds.select(addr);
ds.write(0xBE);
for (int i = 0; i < 9; i++) data[i] = ds.read();
if (OneWire::crc8(data, 8) != data[8])
{ // проверка CRC считанной температуры.
Serial.println F("Data CRC is not valid!");
} else {
temp = (data[1] << 8) | data[0]; // Переводим в температуру
if (data[7] == 0x10) temp = (temp & 0xFFF0) + 12 - data[6];
if((temp == 0) && (data[5] <0xFF)) zero++;
temperature = (float)temp / 16.0;
ds.reset();
ds.write(0xCC); // Обращение ко всем датчикам
ds.write(0x44); // Команда на конвертацию
t2 = micros();
}
}
Сам проверил перегрел немного датчик:
Temperature = 25.437 Задержка в микросекундах - 13680
Temperature = 25.437 Задержка в микросекундах - 13679
Temperature = 25.437 Задержка в микросекундах - 13676
Temperature = 25.437 Задержка в микросекундах - 13676
Temperature = 25.437 Задержка в микросекундах - 13680
Temperature = 25.437 Задержка в микросекундах - 13676
Temperature = 25.437 Задержка в микросекундах - 13679
Temperature = 25.437 Задержка в микросекундах - 13680
Temperature = 25.437 Задержка в микросекундах - 13676
Temperature = 25.437 Задержка в микросекундах - 13679
Temperature = 25.437 Задержка в микросекундах - 13675
Temperature = 25.437 Задержка в микросекундах - 13683
Temperature = 25.437 Задержка в микросекундах - 13675
Temperature = 25.437 Задержка в микросекундах - 13678
Temperature = 25.437 Задержка в микросекундах - 13679
Temperature = 25.437 Задержка в микросекундах - 13676
Temperature = 25.437 Задержка в микросекундах - 13679
Temperature = 25.375 Задержка в микросекундах - 13679
Temperature = 25.437 Задержка в микросекундах - 13679
Temperature = 25.375 Задержка в микросекундах - 13679
Temperature = 25.375 Задержка в микросекундах - 13679
Temperature = 25.375 Задержка в микросекундах - 13683
Temperature = 25.375 Задержка в микросекундах - 13679
Temperature = 25.375 Задержка в микросекундах - 13679
Temperature = 25.375 Задержка в микросекундах - 13683
Temperature = 25.375 Задержка в микросекундах - 13679
Temperature = 25.375 Задержка в микросекундах - 13679
Temperature = 25.312 Задержка в микросекундах - 13679
Temperature = 25.312 Задержка в микросекундах - 13681
Temperature = 25.312 Задержка в микросекундах - 13679
Temperature = 25.312 Задержка в микросекундах - 13679
Temperature = 25.312 Задержка в микросекундах - 13683
Temperature = 25.312 Задержка в микросекундах - 13679
Temperature = 25.312 Задержка в микросекундах - 13679
Temperature = 25.312 Задержка в микросекундах - 13679
Temperature = 25.312 Задержка в микросекундах - 13680
Temperature = 25.312 Задержка в микросекундах - 13679
Temperature = 25.312 Задержка в микросекундах - 13676
Temperature = 25.312 Задержка в микросекундах - 13680
Temperature = 25.312 Задержка в микросекундах - 13679
Temperature = 25.312 Задержка в микросекундах - 13679
Temperature = 25.312 Задержка в микросекундах - 13676
Temperature = 25.312 Задержка в микросекундах - 13681
Temperature = 25.312 Задержка в микросекундах - 13675
Temperature = 25.312 Задержка в микросекундах - 13676
Temperature = 25.312 Задержка в микросекундах - 13679
Temperature = 25.312 Задержка в микросекундах - 13679
Temperature = 25.312 Задержка в микросекундах - 13679
Temperature = 25.312 Задержка в микросекундах - 13683
Temperature = 25.312 Задержка в микросекундах - 13676
Temperature = 25.312 Задержка в микросекундах - 13677
Temperature = 25.312 Задержка в микросекундах - 13679
Temperature = 25.250 Задержка в микросекундах - 13683
Temperature = 25.250 Задержка в микросекундах - 13679
Temperature = 25.250 Задержка в микросекундах - 13679
Temperature = 25.250 Задержка в микросекундах - 13683
Temperature = 25.312 Задержка в микросекундах - 13676
Temperature = 25.437 Задержка в микросекундах - 13679
Temperature = 34.563 Задержка в микросекундах - 13679
Temperature = 39.188 Задержка в микросекундах - 13683
Temperature = 42.500 Задержка в микросекундах - 13679
Temperature = 54.875 Задержка в микросекундах - 13677
Temperature = 57.875 Задержка в микросекундах - 13683
Temperature = 57.688 Задержка в микросекундах - 13676
Temperature = 64.000 Задержка в микросекундах - 13675
Temperature = 71.000 Задержка в микросекундах - 13679
Temperature = 77.938 Задержка в микросекундах - 13683
Temperature = 83.375 Задержка в микросекундах - 13676
Temperature = 88.000 Задержка в микросекундах - 13676
Temperature = 89.000 Задержка в микросекундах - 13680
Temperature = 84.938 Задержка в микросекундах - 13676
Temperature = 87.938 Задержка в микросекундах - 13679
Temperature = 91.250 Задержка в микросекундах - 13680
Temperature = 93.813 Задержка в микросекундах - 13676
Temperature = 95.938 Задержка в микросекундах - 13676
Temperature = 97.625 Задержка в микросекундах - 13676
Temperature = 98.938 Задержка в микросекундах - 13680
Temperature = 99.875 Задержка в микросекундах - 13675
Temperature = 100.313 Задержка в микросекундах - 13675
Temperature = 100.250 Задержка в микросекундах - 13680
Temperature = 96.375 Задержка в микросекундах - 13676
Temperature = 94.375 Задержка в микросекундах - 13676
Temperature = 94.875 Задержка в микросекундах - 13676
Temperature = 98.875 Задержка в микросекундах - 13679
Temperature = 102.750 Задержка в микросекундах - 13679
Temperature = 104.938 Задержка в микросекундах - 13699
Temperature = 105.875 Задержка в микросекундах - 13684
Temperature = 107.688 Задержка в микросекундах - 13680
Temperature = 109.688 Задержка в микросекундах - 13676
Temperature = 109.500 Задержка в микросекундах - 13676
Temperature = 106.750 Задержка в микросекундах - 13679
Temperature = 106.438 Задержка в микросекундах - 13676
Temperature = 104.875 Задержка в микросекундах - 13675
Temperature = 101.625 Задержка в микросекундах - 13683
Temperature = 98.125 Задержка в микросекундах - 13676
Temperature = 93.188 Задержка в микросекундах - 13676
Temperature = 87.438 Задержка в микросекундах - 13684
Temperature = 82.625 Задержка в микросекундах - 13680
Temperature = 78.438 Задержка в микросекундах - 13684
Temperature = 74.813 Задержка в микросекундах - 13683
Temperature = 71.625 Задержка в микросекундах - 13680
Temperature = 68.750 Задержка в микросекундах - 13676
Temperature = 66.000 Задержка в микросекундах - 13678
Temperature = 67.875 Задержка в микросекундах - 13680
Temperature = 77.750 Задержка в микросекундах - 13676
Temperature = 88.938 Задержка в микросекундах - 13676
Temperature = 98.563 Задержка в микросекундах - 13676
Temperature = 105.188 Задержка в микросекундах - 13680
Temperature = 111.938 Задержка в микросекундах - 13676
Temperature = 117.500 Задержка в микросекундах - 13676
Temperature = 120.313 Задержка в микросекундах - 13679
Temperature = 124.438 Задержка в микросекундах - 13679
Temperature = 126.438 Задержка в микросекундах - 13676
Temperature = 123.438 Задержка в микросекундах - 13676
Temperature = 122.438 Задержка в микросекундах - 13683
Temperature = 120.625 Задержка в микросекундах - 13676
Temperature = 119.813 Задержка в микросекундах - 13676
Temperature = 121.750 Задержка в микросекундах - 13683
Temperature = 122.625 Задержка в микросекундах - 13676
Temperature = 124.688 Задержка в микросекундах - 13676
Temperature = 127.375 Задержка в микросекундах - 13679
Temperature = 127.688 Задержка в микросекундах - 13680
Temperature = 127.688 Задержка в микросекундах - 13676
Temperature = 127.688 Задержка в микросекундах - 13676
Temperature = 122.313 Задержка в микросекундах - 13679
Temperature = 115.625 Задержка в микросекундах - 13676
Temperature = 109.563 Задержка в микросекундах - 13676
Temperature = 103.813 Задержка в микросекундах - 13679
Temperature = 98.750 Задержка в микросекундах - 13676
Temperature = 94.188 Задержка в микросекундах - 13676
Temperature = 90.188 Задержка в микросекундах - 13676
Temperature = 86.375 Задержка в микросекундах - 13680
Temperature = 82.938 Задержка в микросекундах - 13676
Temperature = 79.813 Задержка в микросекундах - 13676
Temperature = 77.000 Задержка в микросекундах - 13680
Temperature = 74.250 Задержка в микросекундах - 13676
Temperature = 71.875 Задержка в микросекундах - 13680
Temperature = 69.688 Задержка в микросекундах - 13675
Temperature = 67.438 Задержка в микросекундах - 13680
Temperature = 65.438 Задержка в микросекундах - 13676
Temperature = 63.563 Задержка в микросекундах - 13676
Temperature = 61.750 Задержка в микросекундах - 13680
Temperature = 59.875 Задержка в микросекундах - 13676
Temperature = 58.375 Задержка в микросекундах - 13675
Temperature = 56.938 Задержка в микросекундах - 13676
Temperature = 55.625 Задержка в микросекундах - 13679
Temperature = 54.313 Задержка в микросекундах - 13676
Temperature = 53.125 Задержка в микросекундах - 13676
Temperature = 52.000 Задержка в микросекундах - 13680
Temperature = 51.125 Задержка в микросекундах - 13676
Temperature = 50.250 Задержка в микросекундах - 13679
Temperature = 49.438 Задержка в микросекундах - 13680
Temperature = 48.688 Задержка в микросекундах - 13676
Temperature = 47.938 Задержка в микросекундах - 13680
Temperature = 47.250 Задержка в микросекундах - 13676
Temperature = 46.500 Задержка в микросекундах - 13680
Data CRC is not valid!
Temperature = 46.500 Задержка в микросекундах - 4293480972
Temperature = 85.000 Задержка в микросекундах - 13675
Temperature = 85.000 Задержка в микросекундах - 13680
Temperature = 85.000 Задержка в микросекундах - 13679
Temperature = 43.063 Задержка в микросекундах - 13676
Temperature = 42.500 Задержка в микросекундах - 13676
Temperature = 0.000 Задержка в микросекундах - 12456
*** Датчик оборван или замкнут ***
Temperature = 0.000 Задержка в микросекундах - 12450
*** Датчик оборван или замкнут ***
Temperature = 0.000 Задержка в микросекундах - 12450
*** Датчик оборван или замкнут ***
Temperature = 0.000 Задержка в микросекундах - 12453
*** Датчик оборван или замкнут ***
Temperature = 85.000 Задержка в микросекундах - 13675
Temperature = 39.938 Задержка в микросекундах - 13675
Temperature = 39.563 Задержка в микросекундах - 13676
Temperature = 39.188 Задержка в микросекундах - 13680
Temperature = 38.875 Задержка в микросекундах - 13676
Temperature = 38.563 Задержка в микросекундах - 13676
Temperature = 38.188 Задержка в микросекундах - 13679
Temperature = 37.938 Задержка в микросекундах - 13675
Temperature = 37.625 Задержка в микросекундах - 13676
Temperature = 37.313 Задержка в микросекундах - 13680
Temperature = 37.000 Задержка в микросекундах - 13679
Temperature = 36.750 Задержка в микросекундах - 13675
Temperature = 36.500 Задержка в микросекундах - 13676
Temperature = 36.188 Задержка в микросекундах - 13680
Temperature = 35.938 Задержка в микросекундах - 13676
Temperature = 35.688 Задержка в микросекундах - 13676
Temperature = 35.375 Задержка в микросекундах - 13680
Temperature = 35.125 Задержка в микросекундах - 13679
Temperature = 34.813 Задержка в микросекундах - 13676
Temperature = 34.625 Задержка в микросекундах - 13675
Temperature = 34.375 Задержка в микросекундах - 13680
Temperature = 34.125 Задержка в микросекундах - 13676
Temperature = 33.938 Задержка в микросекундах - 13676
Temperature = 33.750 Задержка в микросекундах - 13676
Temperature = 33.563 Задержка в микросекундах - 13676
Temperature = 33.375 Задержка в микросекундах - 13675
Temperature = 33.188 Задержка в микросекундах - 13676
Temperature = 32.938 Задержка в микросекундах - 13680
Temperature = 32.750 Задержка в микросекундах - 13675
Temperature = 32.500 Задержка в микросекундах - 13676
Temperature = 32.313 Задержка в микросекундах - 13683
Temperature = 32.188 Задержка в микросекундах - 13679
Temperature = 32.000 Задержка в микросекундах - 13676
Temperature = 31.875 Задержка в микросекундах - 13683
Temperature = 31.750 Задержка в микросекундах - 13683
Temperature = 31.625 Задержка в микросекундах - 13676
Temperature = 31.500 Задержка в микросекундах - 13679
Temperature = 31.375 Задержка в микросекундах - 13682
Temperature = 31.312 Задержка в микросекундах - 13676
Temperature = 31.125 Задержка в микросекундах - 13679
Temperature = 31.062 Задержка в микросекундах - 13680
Temperature = 30.875 Задержка в микросекундах - 13676
Temperature = 30.750 Задержка в микросекундах - 13676
Temperature = 30.625 Задержка в микросекундах - 13676
Temperature = 30.500 Задержка в микросекундах - 13680
Temperature = 30.375 Задержка в микросекундах - 13676
Temperature = 30.250 Задержка в микросекундах - 13676
Temperature = 30.125 Задержка в микросекундах - 13680
Temperature = 30.062 Задержка в микросекундах - 13676
Temperature = 30.000 Задержка в микросекундах - 13675
Temperature = 29.875 Задержка в микросекундах - 13679
Temperature = 29.750 Задержка в микросекундах - 13680
Temperature = 29.687 Задержка в микросекундах - 13676
Temperature = 29.625 Задержка в микросекундах - 13676
Temperature = 29.500 Задержка в микросекундах - 13679
Temperature = 29.437 Задержка в микросекундах - 13679
Temperature = 29.312 Задержка в микросекундах - 13675
Temperature = 29.250 Задержка в микросекундах - 13676
Temperature = 29.187 Задержка в микросекундах - 13682
Temperature = 29.062 Задержка в микросекундах - 13675
Temperature = 29.000 Задержка в микросекундах - 13676
Temperature = 28.937 Задержка в микросекундах - 13680
Temperature = 28.812 Задержка в микросекундах - 13676
Temperature = 28.750 Задержка в микросекундах - 13679
Temperature = 28.687 Задержка в микросекундах - 13680
Temperature = 28.562 Задержка в микросекундах - 13679
Temperature = 28.500 Задержка в микросекундах - 13676
Temperature = 28.437 Задержка в микросекундах - 13676
Temperature = 28.375 Задержка в микросекундах - 13683
Temperature = 28.312 Задержка в микросекундах - 13676
Temperature = 28.250 Задержка в микросекундах - 13676
Temperature = 28.187 Задержка в микросекундах - 13680
Temperature = 28.125 Задержка в микросекундах - 13676
Temperature = 28.125 Задержка в микросекундах - 13679
Temperature = 28.062 Задержка в микросекундах - 13676
Temperature = 28.000 Задержка в микросекундах - 13679
Temperature = 27.937 Задержка в микросекундах - 13679
Temperature = 27.937 Задержка в микросекундах - 13676
Temperature = 27.875 Задержка в микросекундах - 13683
Temperature = 27.812 Задержка в микросекундах - 13676
Temperature = 27.750 Задержка в микросекундах - 13676
Temperature = 27.687 Задержка в микросекундах - 13679
Temperature = 27.687 Задержка в микросекундах - 13680
Temperature = 27.562 Задержка в микросекундах - 13676
Temperature = 27.562 Задержка в микросекундах - 13676
Temperature = 27.500 Задержка в микросекундах - 13679
Temperature = 27.500 Задержка в микросекундах - 13679
Temperature = 27.437 Задержка в микросекундах - 13675
Temperature = 27.375 Задержка в микросекундах - 13683
Temperature = 27.312 Задержка в микросекундах - 13680
Temperature = 27.312 Задержка в микросекундах - 13675
Temperature = 27.250 Задержка в микросекундах - 13679
Temperature = 27.250 Задержка в микросекундах - 13680
Temperature = 27.187 Задержка в микросекундах - 13676
Temperature = 27.187 Задержка в микросекундах - 13676
Temperature = 27.187 Задержка в микросекундах - 13680
Temperature = 27.125 Задержка в микросекундах - 13679
Temperature = 27.125 Задержка в микросекундах - 13676
Temperature = 27.062 Задержка в микросекундах - 13676
Temperature = 27.000 Задержка в микросекундах - 13681
Temperature = 27.000 Задержка в микросекундах - 13676
Temperature = 26.937 Задержка в микросекундах - 13676
Temperature = 26.875 Задержка в микросекундах - 13679
Temperature = 26.875 Задержка в микросекундах - 13679
Temperature = 26.812 Задержка в микросекундах - 13679
Temperature = 26.812 Задержка в микросекундах - 13676
Temperature = 26.812 Задержка в микросекундах - 13683
Temperature = 26.750 Задержка в микросекундах - 13679
Temperature = 26.687 Задержка в микросекундах - 13676
Temperature = 26.687 Задержка в микросекундах - 13683
Temperature = 26.687 Задержка в микросекундах - 13676
Temperature = 26.687 Задержка в микросекундах - 13679
Temperature = 26.625 Задержка в микросекундах - 13680
Temperature = 26.562 Задержка в микросекундах - 13683
Temperature = 26.562 Задержка в микросекундах - 13679
Temperature = 26.562 Задержка в микросекундах - 13679
Temperature = 26.562 Задержка в микросекундах - 13680
Temperature = 26.500 Задержка в микросекундах - 13679
Temperature = 26.500 Задержка в микросекундах - 13679
Temperature = 26.500 Задержка в микросекундах - 13683
Temperature = 26.437 Задержка в микросекундах - 13679
Temperature = 26.437 Задержка в микросекундах - 13679
Temperature = 26.437 Задержка в микросекундах - 13679
Temperature = 26.437 Задержка в микросекундах - 13682
Temperature = 26.375 Задержка в микросекундах - 13679
Temperature = 26.375 Задержка в микросекундах - 13679
Temperature = 26.375 Задержка в микросекундах - 13683
Temperature = 26.375 Задержка в микросекундах - 13676
Temperature = 26.312 Задержка в микросекундах - 13702
Temperature = 26.312 Задержка в микросекундах - 13683
Temperature = 26.250 Задержка в микросекундах - 13683
Temperature = 26.250 Задержка в микросекундах - 13683
Temperature = 26.250 Задержка в микросекундах - 13679
Temperature = 26.250 Задержка в микросекундах - 13683
Temperature = 26.250 Задержка в микросекундах - 13675
Temperature = 26.187 Задержка в микросекундах - 13679
Temperature = 26.187 Задержка в микросекундах - 13680
Temperature = 26.187 Задержка в микросекундах - 13683
Temperature = 26.187 Задержка в микросекундах - 13676
Temperature = 26.125 Задержка в микросекундах - 13676
Temperature = 26.125 Задержка в микросекундах - 13681
Temperature = 26.125 Задержка в микросекундах - 13679
Temperature = 26.125 Задержка в микросекундах - 13679
Temperature = 26.062 Задержка в микросекундах - 13680
Temperature = 26.062 Задержка в микросекундах - 13676
Temperature = 26.062 Задержка в микросекундах - 13679
Temperature = 26.062 Задержка в микросекундах - 13676
Temperature = 26.062 Задержка в микросекундах - 13679
Temperature = 26.000 Задержка в микросекундах - 13679
Temperature = 26.000 Задержка в микросекундах - 13679
Temperature = 26.000 Задержка в микросекундах - 13683
Temperature = 26.000 Задержка в микросекундах - 13679
Temperature = 26.000 Задержка в микросекундах - 13675
Temperature = 26.000 Задержка в микросекундах - 13679
Temperature = 25.937 Задержка в микросекундах - 13683
Temperature = 25.937 Задержка в микросекундах - 13679
Temperature = 25.937 Задержка в микросекундах - 13679
Temperature = 25.937 Задержка в микросекундах - 13680
Temperature = 25.937 Задержка в микросекундах - 13679
Temperature = 25.937 Задержка в микросекундах - 13678
Temperature = 25.875 Задержка в микросекундах - 13676
Temperature = 25.875 Задержка в микросекундах - 13680
Temperature = 25.937 Задержка в микросекундах - 13676
эффект по температуре 40-42 градуса имеет место быть, как в букваре сказано )))
не знал такого, у меня контроль температуры в основном 25-55 градусов, больше 60 отключение, радиатор транзистора, т.е. опять что то не так, или как быть ?
эффект по температуре 40-42 градуса имеет место быть, как в букваре сказано )))
не знал такого, у меня контроль температуры в основном 25-55 градусов, больше 60 отключение, радиатор транзистора, т.е. опять что то не так, или как быть ?
так я его перегрел, там в выводе видно, компьютеры как испытывают после сборки, в термокамеру на сутки, то, что диагностика показывает, что посыпалось - меняют и тестируют далее, 40-42 это особенная температура, если не перегревать думаю должен работать нормально...
у тебя есть возможность потестировать и выложить результаты тестов )))
так я его перегрел, там в выводе видно, компьютеры как испытывают после сборки, в термокамеру на сутки, то, что диагностика показывает, что посыпалось - меняют и тестируют далее, 40-42 это особенная температура, если не перегревать думаю должен работать нормально...
у тебя есть возможность потестировать и выложить результаты тестов )))
temperature обьяви как int8_t, тогда вместо всего, что науеверчено в 31 строке можно написать
temperature = (data[1] << 4) | (data[0] >> 4);
Ну и, хорошо бы читать весь scrachpad, и считать контрольную сумму, для достоверности, тем более, что для этого даже напрягацца не надо, у OneWire есть для этого спицальная static функция
bool ReadData(void) {
FOneWire->reset();
FOneWire->write(CMD_SKIP_ROM);
FOneWire->write(CMD_READ_RAM);
FOneWire->read_bytes(FDallasMemory, DALLAS_MEMORY_SIZE); // читаем ВСЮ память даччика
FOneWire->reset();
startConversion(); // после сразу запускаем конверсию для след. считывания
uint8_t crc = OneWire::crc8(FDallasMemory, DALLAS_MEMORY_SIZE - 1); // CRC вычисленная
return (crc == FDallasMemory[DALLAS_MEMORY_SIZE - 1]); // сравнивается с прочитанной
}
temperature обьяви как int8_t, тогда вместо всего, что науеверчено в 31 строке можно написать
temperature = (data[1] << 4) | (data[0] >> 4);
благодарю! изменил, переменную объявил как uint8_t, код уменьшился до 2 кб! не критично, но приятно ))) а вот код для проверки контрольной суммы куда вставить, мне не понятно, не программист я (((
Вот в этом то и весь прикол, шо если нога отвалицца и будут нули - будет ноль. Можешь сам проверить, есть жеж даччики с дунькой))) А вот ежли пользоваццо правилом шины адын_провад , то после каждого инита устройство ОБЯЗАНО прижать шину на NNN времени. Можш папробовать, если_ниверишш)))
Что будет, если ему во время работы ногу оторвать, проверю вечером (если протрезвею к тому времени). Ненавижу НГ, после него обмен веществ без олкаголя вапще не идёт. :(
Дет, црц - это заибок, а есть ли там фича, шо даччик апосля ресета или инита ответил на шину?
Столь далеко мои компетенции не простираюца.
а куда он денется с подводной лодки...с августа по начало января отработало три датчика, опрос раз в полторы минуты, ни одного сбоя...всё писалось в базу SQL на днях почистил, начал снова...
да, вы верно заметили, очень не уверенно, но все что я находил для этого датчика, используют delay, что меня абсолютно не устраивает, так как объем обрабатываемых данных большой, температура только маленькая часть проекта, и остановка кода не приемлема..
Ну и какие проблемы? В принципе библиотека DallasTemperature заточена на возможность неблокирующего чтения. Правда в ней есть ошибка из-за которой это не работает. Но ошибку легко обойти. Вот в этой теме я показывал как пользоваться DallasTemperature в неблокирующем режиме - никаких проблем.
Евгений Петрович, Вы правы идеологически, а конкретный код исключение, компилятор его обрабатывает как надо, то-есть зная что приёмником данных есть переменная типа int он и создаёт код работая с байтами во временных переменных типа int другого объяснения у меня нет
ПРо сдвиги, если хотите, может отдельно поговорить (там результат всегда int) А по моему пункту №1 у Вас есть объяснение? Про печать при каждом проходе, а считывание температуры только при нечётном?
и все таки, кто нибудь, может предложить рабочий код для esp32 без задержек ? готов оплатить! нет времени вникать в тонкости этого долбаного датчика!
Евгений Петрович, Вы правы идеологически, а конкретный код исключение, компилятор его обрабатывает как надо, то-есть зная что приёмником данных есть переменная типа int он и создаёт код работая с байтами во временных переменных типа int другого объяснения у меня нет
ПРо сдвиги, если хотите, может отдельно поговорить (там результат всегда int) А по моему пункту №1 у Вас есть объяснение? Про печать при каждом проходе, а считывание температуры только при нечётном?
если ТС желает получать значение температуры раз в секунду, то почему бы нет, переменная волатильная, температура будет такая жеж )))
код в принципе рабочий, без задержек, если еще убрать вывод в сериал будет еще быстрее
и все таки, кто нибудь, может предложить рабочий код для esp32 без задержек ? готов оплатить! нет времени вникать в тонкости этого долбаного датчика!
а дальше что с температурой делаешь?
вывод на индикатор, и при превышении определенного градуса включение сигнала..
Т.е. Вы хотите сказать, что код, который я процитировал в #338 печатает температуру только после её чтения и вообще, с вообще, мои два пункта - бред?
Там температура хранится в глобальной переменной, потому при четных обращениях просто считывается предыдущее значение, а при нечетных оно обновляется
А по второму пункту не совсем ясно. Собственно, эта строка взята из кода в нулевом посте и температуру выдает исправно
ЗЫ: процедуру getTemperatue я AlexZR из своего рабочего проекта выдрал ))
а вот зачем он temperature объявил как uint8_t - я не знаю. Хотя, может быть у него отрицательных температур не будет в принципе... )))
а вот зачем он temperature объявил как uint8_t - я не знаю. Хотя, может быть у него отрицательных температур не будет в принципе... )))
минуса не будет, но меня еще волнует вопрос, почему этот код в Proteus не работает ?
а так, меня ваш код вполне устраивает, спасибо!
если ТС желает получать значение температуры раз в секунду,
Так в том-то и дело, что в том коде он получает температуру якобы раз в две секунды, но на самом деле - раз в четыре секунды, а через раз (по чётным вызовам) просто печатает старое значение, которое в прошлый раз было.
Нет, если так и было задумано, то я не против - не вопрос.
Так в том-то и дело, что в том коде он получает температуру якобы раз в две секунды, но на самом деле - раз в четыре секунды, а через раз (по чётным вызовам) просто печатает старое значение, которое в прошлый раз было.
Нет, если так и было задумано, то я не против - не вопрос.
ну так покажите как нужно! что ж вы как партизан то.. )))
AlexZR, см.email
ничего нет, рз1зр английскими на майл.ру
ну так покажите как нужно! что ж вы как партизан то.. )))
Простите, я Вам что-то задолжал? Не припоминаю.
Писать код специально для Вас я не буду, т.к. Вам это на самом деле не нужно, Вы сами это написали
и все таки, кто нибудь, может предложить рабочий код ... нет времени вникать в тонкости этого долбаного датчика!
Вы написали код - я его покритиковал. Считаю это помощью Вам. Писать же код вместо Вас на том основании, что у Вас нет времени вникать ... извините, Вы не являетесь моим работодателем.
другого ответа и не ожидал! один пустой треп.. )))
но порядочные профи есть! помогли! за что и будут вознаграждены !
и проблему с двумя градусами решили )))
да, вы верно заметили, очень не уверенно, но все что я находил для этого датчика, используют delay, что меня абсолютно не устраивает, так как объем обрабатываемых данных большой, температура только маленькая часть проекта, и остановка кода не приемлема..
Ну и какие проблемы? В принципе библиотека DallasTemperature заточена на возможность неблокирующего чтения. Правда в ней есть ошибка из-за которой это не работает. Но ошибку легко обойти. Вот в этой теме я показывал как пользоваться DallasTemperature в неблокирующем режиме - никаких проблем.
проблем нет, но если немножко код поправить, то получим задержку в 10 миллисекунд, против 44 в Далласовской
Александр, интересно, что там за проблема была, проверил на трёх разных ардуинах (ESP32,ESP8266, NANO (Optiboot), на твоём коде, у меня не проявилась
ну скажем так, почти решили ))) сейчас разница 0.5 градуса, прошивка другая, а вот почему, пока сам не въехал )))
сейчас буду пробовать твою последнею...
проверил, разница 0.7 градуса, считаю уже нормально )))
ну скажем так, почти решили ))) сейчас разница 0.5 градуса, прошивка другая, а вот почему, пока сам не въехал )))
сейчас буду пробовать твою последнею...
проверил, разница 0.7 градуса, считаю уже нормально )))
у тебя видимо датчик близко к ESP, я тут немножко сенситив рукой чую с расстояния 10 сантиметров, греет ESP не кисло, прибор есть но отдал сыну, можно было бы и посмотреть насколько, nano, та градусов 30-35, а ESP видимо под 50, у меня даллас в 20 сантиметрах ниже платы висит
да по коду, можно задержку уменьшить до 750, разница по времени запрос-считывание будет 750 миллисекунд, выводится всегда!!! последняя считанная
да, скорее всего, датчик паяю на плату, и она чуть теплее ардуино, все, вопрос решен )))
да, скорее всего, датчик паяю на плату, и она чуть теплее ардуино, все, вопрос решен )))
а я дальше поковыряю на предмет отказа датчика, код из #222
да, мне эта функция бы тоже не помешала )))
DallasTemperature возвращает -127, если датчик отклячился.
Я тоже тест провел с термоизоляцией сенсора и перебросом на ходу между ESP32 и Nano. Никаких отклонений не вижу, все эквивалентно - и скречпад и температура вычисленная.
Частое измерение температуры разогревает датчик. Где то в даташите написано.
Частое измерение температуры разогревает датчик. Где то в даташите написано.
у себя измеряю раз в полторы минуты, чтобы поймать неисправность автоматики кондиционера
DallasTemperature возвращает -127, если датчик отклячился.
Я тоже тест провел с термоизоляцией сенсора и перебросом на ходу между ESP32 и Nano. Никаких отклонений не вижу, все эквивалентно - и скречпад и температура вычисленная.
найти бы как LOGIС обошёл CRC 0 сейчас с оборванным датчиком температура ==0
Вопрос с all zeros тоже меня постоянно мучает. В DallasTemperature такая ситуация считается аварийной, а в даташите все нули - 0 градусов. CRC8 далласовский от всех нулей
скрэчпада вроде как тоже 0.
Проблема на шине по "onewire.reset() == 0" отслеживается.
отслеживают стойкий 0?
Не. Он отслеживает ответ датчика на сброс шины. И это верно. Оборванный датчик не отвечает обычно. Ещё когда от датчика приезжает значение температуры, то там целых девять байт, ну по которым мы crc проверяем. Среди них есть FF. В даташите пишут что он всегда такое. Его тоже проверяю, тем самым исключаю проблемму 'все нули'
А, ну точно:
SCRATCHPAD (POWER-UP STATE)
BYTE 5 - RESERVED (FFh)
BYTE 7 - RESERVED (10h)
Т.е. если весь скрэчпад в нулях приехал, значит шина упала на землю.
А, ну точно:
SCRATCHPAD (POWER-UP STATE)
BYTE 5 - RESERVED (FFh)
BYTE 7 - RESERVED (10h)
Т.е. если весь скрэчпад в нулях приехал, значит шина упала на землю.
расчёт температуры из поста #222
после долгих мучений, остановился на таком варианте..
после долгих мучений, остановился на таком варианте..
Александр!
Где положительные эмоции?
Я жеж выкладывал скетч в котором замечания Евгения Петровича были устранены, время между опросами датчика, чтобы не разогревался надо ставить 1.5 секунды, время опроса порядка 14 миллисекунд, если надо меньшее время, то этот датчик не годится (это минимум) с обходом косяков при использовании Далласовской библиотеки - 44 миллисекунды, то-есть напрямую получается в три раза лучше
Если температура в 0.25 градуса не критична то частоту опроса можно уменьшить до 750 миллисекунд
PS время обработки можно уменьшить до 9 мсек, но будем получать температуру через раз, что не есть хорошо
Виктор, это который в посте 365 ?
Виктор, это который в посте 365 ?
я вечером поправлю с учётом вновь открывшихся обстоятельств (по неисправности датчика) и выложу
спасибо! ожидаю...
спасибо! ожидаю...
с этим думаю уже можно работать, прогони по температуре феном, код обработки температуры взят из #222
Сам проверил перегрел немного датчик:
эффект по температуре 40-42 градуса имеет место быть, как в букваре сказано )))
так я его перегрел, там в выводе видно, компьютеры как испытывают после сборки, в термокамеру на сутки, то, что диагностика показывает, что посыпалось - меняют и тестируют далее, 40-42 это особенная температура, если не перегревать думаю должен работать нормально...
у тебя есть возможность потестировать и выложить результаты тестов )))
у тебя есть возможность потестировать и выложить результаты тестов )))
хорошо, я понял, спасибо!
А, ну точно:
SCRATCHPAD (POWER-UP STATE)
BYTE 5 - RESERVED (FFh)
BYTE 7 - RESERVED (10h)
Т.е. если весь скрэчпад в нулях приехал, значит шина упала на землю.
расчёт температуры из поста #222
Это типа 'Спакойно, проверка конечно есть' ? И шо, помогает?
Спасибо, поржал.
упростил до минимума, наверное, работает )))
temperature обьяви как int8_t, тогда вместо всего, что науеверчено в 31 строке можно написать
Ну и, хорошо бы читать весь scrachpad, и считать контрольную сумму, для достоверности, тем более, что для этого даже напрягацца не надо, у OneWire есть для этого спицальная static функция
Дет, црц - это заибок, а есть ли там фича, шо даччик апосля ресета или инита ответил на шину?
Дет, црц - это заибок, а есть ли там фича, шо даччик апосля ресета или инита ответил на шину?
Столь далеко мои компетенции не простираюца.
благодарю! изменил, переменную объявил как uint8_t, код уменьшился до 2 кб! не критично, но приятно ))) а вот код для проверки контрольной суммы куда вставить, мне не понятно, не программист я (((
Столь далеко мои компетенции не простираюца.
Вот в этом то и весь прикол, шо если нога отвалицца и будут нули - будет ноль. Можешь сам проверить, есть жеж даччики с дунькой))) А вот ежли пользоваццо правилом шины адын_провад , то после каждого инита устройство ОБЯЗАНО прижать шину на NNN времени. Можш папробовать, если_ниверишш)))
Вот в этом то и весь прикол, шо если нога отвалицца и будут нули - будет ноль. Можешь сам проверить
Проверяю я наличие даччика только 1 раз, при старте
Что будет, если ему во время работы ногу оторвать, проверю вечером (если протрезвею к тому времени). Ненавижу НГ, после него обмен веществ без олкаголя вапще не идёт. :(
не программист я (((
Я тоже.
Дет, црц - это заибок, а есть ли там фича, шо даччик апосля ресета или инита ответил на шину?
Столь далеко мои компетенции не простираюца.
а куда он денется с подводной лодки...с августа по начало января отработало три датчика, опрос раз в полторы минуты, ни одного сбоя...всё писалось в базу SQL на днях почистил, начал снова...