bwn, если вы помните -эти строчки в начале топика я писал, стало быть немножко в курсе что за что отвечает :) Там засада в последовательности операций. Невозможно запрограмммировать разрядность не запрограммировав предварительно обе температуры. Поэтому в данном случаен (с закоментированными пердыдщими строками) 17 строка устанавливает верхнюю температуру аларма :) Поэтому я написал снять ВСЕ ремарки. А товарищ пренебрёг этим..
ds.write(0x60); // 0x60 12-бит разрешение, 0x00 -9бит разрешение
там так и написано.
Если раскоментирую все строки
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бит разрешение
По датущиту погрешность 0.5°C а разрядность запилить можно 0.0625°C.
Для чего???? Толку 0 с такой погрешностью.
PS. dimax, разобрался с выводом в сериал, но помоему эффект нулевой последние разряды вообще не меняютя. СПС за совет,
По изменению разрядности, в данном случае обе строки идентичны (меняем 5 и 6 бит), но применяем какую то одну.
Погрешность и точность не одно и тоже. Погрешность величина всегда постоянная для конкретного экземпляра, любой измерительный прибор ее имеет. Для получения идентичных результатов каждый прибор проходит периодическую поверку, полученный результат отклонения учитывается при последующих измерениях. Требуемая точность зависит от задачи, для измерения уличной температуры достаточно целых градусов, комнатной - 0,5гр., в ректификаторе мне потребовалась вся шкала.
С сериалом, ищите ошибку, все должно выводиться правильно.
Диод заряжает конденсатор и не даёт ему разряжаться когда в линии проскакивают "нули".
Поэтому датчик превращается из двухпроводного в как-бы трёхпроводный.
Но по двум проводам.
Другая особенность DS18B20 - способность работать без внешнего питания.
Эта возможность предоставляется через подтягивающий резистор.
Высокий сигнал шины заряжает внутренний конденсатор (CPP), который питает прибор,
когда на шине низкий уровень .
Этот метод носит название « Паразитное питание ».
При этом максимальная измеряемая температура при этом + 100 °C.
Для расширения диапазона температур до + 125 °C необходимо использовать внешнее питание.
Вот попробовал сваять с проверками и прочим. Чтобы при работе с датчиком не было проблем "потери сигнала" от датчика. Как показала практика, если этого не делать, то на груглосуточно работающем девайсе, с проверкой раз в 3 минуты температуры - раз в месяц или реже но прилетает тревога -0,06С
Новый код работает, но думаю есть огрехи которые я не вижу. что можно в коде еще улучшить?
float getTemp() {int ii; ii = 0; label: //Serial.println(ci);
if (ii < 6) { // возвращает температуру с датчика
byte data[12]; // и останавливает программу на секунду
byte addr[8];
if ( !ds.search(addr)) {
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]) { //проверка массива адреса на срц
Serial.println F("CRC is not valid!");
++ii; goto label;
}
ds.search(addr); //
ds.reset_search();
ds.reset();
ds.select(addr);
ds.write(0x44);
delay(1000); wdt_reset();
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]) { // проверка црц считанной температуры.
Serial.println F("Data CRC is not valid!");
++ii; goto label;
}
int raw = (data[1] << 8) | data[0]; // Переводим в температуру
if (data[7] == 0x10) raw = (raw & 0xFFF0) + 12 - data[6];
return raw / 16.0;
}
}
Во-первых, мелкая ошибка - в описании массива DoorsWindows (строка 55) - вы берете размер по числу датчиков температуры, а не по числу датчиков окон.
А вот дальше более серьезно. Не думаю, что мысль засунуть опрос четырех датчиков температуры и двадцать ! опросов датчиков окон в один вектор прерывания - это здравая идея. А с учетом того, что прерывание ватчдога имеет один из высших приоритетов, подозреваю, что совместно с этим кодом ничего другого на МК уже исполнятся не сможет.
Критика приветствуется. Спасибо за мелкую ошибку. исправил. И да, согласен на счет прерывания. Но у меня система модульная, ничего другого данный мк, в общем то и не делает. Имеет смысл переложить просто на миллис. Остальное думаю может кого заинтересует. Имею ввиду проверка CRC и считывание PIO ds2406.
Подскажите какую библиотеку использовать. Нужно обращатся к датчикам по сирийному номеру , я так понимаю с начала сирийные номера нужно саписать в еепром микроконтролера (ESP8266) чтобы если из групы датчиков один отключить то остальные оставались на своих местах .
Подскажите какую библиотеку использовать. Нужно обращатся к датчикам по сирийному номеру , я так понимаю с начала сирийные номера нужно саписать в еепром микроконтролера (ESP8266) чтобы если из групы датчиков один отключить то остальные оставались на своих местах .
Если речь идет о датчиках DS на протоколе One Wire, то и библиотеку нужно OneWire.h, чтобы записать в EEPROM - библиотеку EEPROM.h. Адрес датчика занимает 8 байт. В программе желательно предусмотреть возможность считывания адреса датчика и записи ее в EEPROM. Про библиотеки почитайте в гугле.
Подскажите какую библиотеку использовать. Нужно обращатся к датчикам по сирийному номеру , я так понимаю с начала сирийные номера нужно саписать в еепром микроконтролера (ESP8266) чтобы если из групы датчиков один отключить то остальные оставались на своих местах .
а зачем для этого в еепром писать? ну отключите вы один, ничего особо и не изменится. Вот, например, можно так опрашивать далласы #24. Дополнительных библиотек не нужно, только Onewire.h
У датчиков OneWire нет номеров, у них есть идентификаторы, которые выжжены в них на заводе. Они не могут измениться от отключения или подключения доп. датчиков.
У датчиков OneWire нет номеров, у них есть идентификаторы, которые выжжены в них на заводе. Они не могут измениться от отключения или подключения доп. датчиков.
Я хотел сказать например у меня в програме какой то датчик меряет температуру чего то - это будет датчик скажем номер один итд., вот эти номера я имел ввиду. И при замене какого то датчика остальные оставались на своих местах.
Гарантированно неизменны только ID в термометрах. Вся остальная относительная нумерация и её валидность - на совести программиста. Если таковой задачи не стояло при создании ПО, то внутрипрограммные индексы могут перестать соответствовать идентификаторам (а следовательно - местам установки) термометров. Так же - для получения проблем достаточно просто изъять один и поставить другое устройство OneWire.
Друзья, а не кажется Вам, что данная тема не предназначена для обучения работы с далласами?
То olegkaras, предлагаю создать СВОЮ тему в песочнице и там задать все интересующие вопросы. ИМХО.
Если я отключу какойто датчик или заменю его другим то остальные датчки останутся под своими номерами как и до отключения или замены ?
полагаю вы имеете ввиду, что определённые адреса датчиков так и останутся привязаны к определённым переменным температуры? в любом случае, отключение или замена одного из датчиков никак не повлияет на привязанность адресов датчиков к переменным (по крайней мере в моем примере).
Гражданин начальник ругается, конечно, и скоро ссаными тряпками нас гонять будет, как алегира, но сошлюсь на datasheet: "Each DS18B20-PAR has a unique 64-bit identification code...". Там же написано, что "The match ROM command followed by a 64–bit ROM code sequence allows the bus master to address a specific" - отсюда и простонародный "адрес", как я понимаю.
Меняю в скетче 15 строку на паразитное питание с изменением в схеме, температура не измеряется.
Стандартный пример из библиотеки OneWare работает с паразитным питанием прекрасно.
Сделать на delay вместо millis не вариант, т.к. есть много кода, который должен в это время исполняться.
Помогите, пожалуйста, разобраться в причине.
Сильно не пинайте, начинающий я.
И еще: aruino pro ide уже можно использовать или он слишком сырой пока?
#include <OneWire.h>
OneWire ds(6); // На каком пине Создаем объект OneWire для шины 1-Wire, с помощью которого будет осуществляться работа с датчиком температуры
float temperature = 0; // Переменная для хранения значение температуры с датчика DS18B20
uint32_t LastTempUpdateTime = 0; // Переменная для хранения времени последнего считывания с датчика
const int TempUpdateTime = 1000; // Определяем периодичность проверок температуры. ПРОЦЕДУРА ПРОИСХОДИТ ДОЛЬШЕ ОСТАЛЬНЫХ, НА НЕЕ НЕОБХОДИМО ПРИМЕРНО 750 МС.
void setup(){
Serial.begin(9600);
}
void detectTemperature() {
byte data[2]; // Место для значения температуры
ds.reset(); // Начинаем взаимодействие со сброса всех предыдущих команд и параметров
ds.write(0xCC); // Даем датчику DS18b20 команду пропустить поиск по адресу. В нашем случае только одно устрйоство
ds.write(0x44, 1); // Даем датчику DS18b20 команду измерить температуру. Само значение температуры мы еще не получаем - датчик его положит во внутреннюю память
ds.reset(); // Теперь готовимся получить значение измеренной температуры
ds.write(0xCC);
ds.write(0xBE); // Просим передать нам значение регистров со значением температуры
data[0] = ds.read(); // Читаем младший байт значения температуры
data[1] = ds.read(); // А теперь старший
// Формируем итоговое значение: "склеиваем" значение, затем умножаем его на коэффициент, соответсвующий разрешающей способности (для 12 бит по умолчанию - это 0,0625)
temperature = round(((data[1] << 8) | data[0]) * 0.0625 * 10) / 10.0; // умножить на 10 и округлить для избавления от сотых, затем разделить на 10
}
void loop(){
if (millis() - LastTempUpdateTime > TempUpdateTime) // отсчитываем временной интервал для измерения температуры
{
LastTempUpdateTime = millis();
detectTemperature(); // Определяем температуру от датчика DS18b20
}
Serial.println(temperature); // Выводим полученное значение температуры
}
ну так у вас паразитное питание включается в строке 15 и практически мгновенно сразу выключается в 17. Этого недостаточно, так работать не будет.
это потому что вы запрос и чтение температуры делаете подряд.
Возьмите код Димакса из первого сообщения ветки - там запрос и чтение делается в два захода. Нужно в конце запроса на температуру включить паразитное питание, а в начале чтения значений - выключить.
Код чисто тест, меняю константу в сторону увеличения с 0.0625 на 0.0672. То есть с 25.00 подогнал к фактической 26.88 °C. Или я заблуждаюсь?
#include <Wire.h>
#include <OneWire.h>
OneWire ds(5);
float temperature = 0 ;
void setup() {
// put your setup code here, to run once:
Serial.begin(57600);
}
void loop() {
// put your main code here, to run repeatedly:
//----- Определяем температуру на датчике.
byte data[2]; // Место для значения температуры
ds.reset(); // Начинаем взаимодействие со сброса всех предыдущих команд и параметров
ds.write(0xCC); // Даем датчику DS18b20 команду пропустить поиск по адресу. В нашем случае только одно устрйоство
ds.write(0x44); // Даем датчику DS18b20 команду измерить температуру. Само значение температуры мы еще не получаем - датчик его положит во внутреннюю память
ds.reset(); // Теперь готовимся получить значение измеренной температуры
ds.write(0xCC);
ds.write(0xBE); // Просим передать нам значение регистров со значением температуры
data[0] = ds.read(); // Читаем младший байт значения температуры
data[1] = ds.read(); // А теперь старший
temperature = ((data[1] << 8) | data[0]) * 0.0672; //----- Определяем температуру на датчике и подгоняем температуру под эталонную (0.0672) < Так!.
Serial.println(temperature);
}
Кстати по датчикам, Левыми оказались только с гильзами!
Поддельный датчик не поддерживает 9,10-битное разрешение и не сохраняет значения в регистрах аварийных сигналов. Кроме того, у моего поддельного датчика одно и тоже время преобразования - 487 мс при всех режимах преобразования, обычному датчику требуется около ~ 750 мс при 12 бит.
попробовал с адресом, не работает.
ds.write(0x3F); // точность 0,5гр = 1F; 0,25гр = 3F; 0,125гр = 5F; 0,0625гр = 7F тоже не работает
see_watson, если вы зашили в том виде, в котором сейчас скетч -то 17ой строчкой вы установили аларм -предел макс. температуры
see_watson, если вы зашили в том виде, в котором сейчас скетч -то 17ой строчкой вы установили аларм -предел макс. температуры
Отнюдь, 17-я как раз 12 бит разрешение.
see_watson, а что на монитор выводит?
bwn, если вы помните -эти строчки в начале топика я писал, стало быть немножко в курсе что за что отвечает :) Там засада в последовательности операций. Невозможно запрограмммировать разрядность не запрограммировав предварительно обе температуры. Поэтому в данном случаен (с закоментированными пердыдщими строками) 17 строка устанавливает верхнюю температуру аларма :) Поэтому я написал снять ВСЕ ремарки. А товарищ пренебрёг этим..
ОК, упустил.(((
Чет показалось, что одной строчкой менял, давно это было.)))
dimax и bwn, пробовал из примера dimax , пост 4 -
там так и написано.
Если раскоментирую все строки
и добавляю
вродебы сдвиги есть,
но в сериал выдает до сотых(25.78, 25.66 и тд итп)
see_watson, изучите внимаьтельно аргументы функции http://arduino.ru/Reference/Serial/Print
и добавляю
Откуда вы эту строку выкопали?
и добавляю
Откуда вы эту строку выкопали?
пост 177.
Закрадывается вопрос???
По датущиту погрешность 0.5°C а разрядность запилить можно 0.0625°C.
Для чего???? Толку 0 с такой погрешностью.
Тогда получается что поставил по умолчанию до десятых ( азм есть) и забыл .
PS. dimax, разобрался с выводом в сериал, но помоему эффект нулевой последние разряды вообще не меняютя. СПС за совет,
PS2
Плюнул, оствил до десятых с такой погрешностью.
По датущиту погрешность 0.5°C а разрядность запилить можно 0.0625°C.Для чего???? Толку 0 с такой погрешностью.
Иногда относительная точность важнее абсолютной. Например рассчитывать перспективы изменения температуры, оценивая тенденцию за более короткий период.
По датущиту погрешность 0.5°C а разрядность запилить можно 0.0625°C.
Для чего???? Толку 0 с такой погрешностью.
PS. dimax, разобрался с выводом в сериал, но помоему эффект нулевой последние разряды вообще не меняютя. СПС за совет,
По изменению разрядности, в данном случае обе строки идентичны (меняем 5 и 6 бит), но применяем какую то одну.
Погрешность и точность не одно и тоже. Погрешность величина всегда постоянная для конкретного экземпляра, любой измерительный прибор ее имеет. Для получения идентичных результатов каждый прибор проходит периодическую поверку, полученный результат отклонения учитывается при последующих измерениях. Требуемая точность зависит от задачи, для измерения уличной температуры достаточно целых градусов, комнатной - 0,5гр., в ректификаторе мне потребовалась вся шкала.
С сериалом, ищите ошибку, все должно выводиться правильно.
BWN СПАСИБО за объяснение , чё-то сглупил.
допилил вот так. вроде работает.
Вы только строки 12-18 закомментируйте обратно, не надо при каждом запуске ROM скрести.
Попробовал применить, и кроме считывания температуры еще добавил, что нужно было, с контролем времени. Все работает, спасибо
По времени 1.5 и 3 миллисекунды. Ардуина в принципе ничем не занимается почти все время
*конденсатор желательно с низким ESR
а какую роль выполяет диод?? роль RC цепочки по питанию? иногда плюс и минус датчика можно спутать, датчик греется, в нем диод..
Диод заряжает конденсатор и не даёт ему разряжаться когда в линии проскакивают "нули".
Поэтому датчик превращается из двухпроводного в как-бы трёхпроводный.
Но по двум проводам.
ааа.. разве что так.. но стоит ли экономить на одном проводнике?
схема вверху какой практически дает результат по дальности?
Датчик рассчитан на работу по двухпроводной схеме с паразитным питанием.
Там внутри и конденсатор и диод есть.
Зачем городить схему? Упростить код?
Первое :
Другая особенность DS18B20 - способность работать без внешнего питания.
Эта возможность предоставляется через подтягивающий резистор.
Высокий сигнал шины заряжает внутренний конденсатор (CPP), который питает прибор,
когда на шине низкий уровень .
Этот метод носит название « Паразитное питание ».
При этом максимальная измеряемая температура при этом + 100 °C.
Для расширения диапазона температур до + 125 °C необходимо использовать внешнее питание.
Ну схему то все равно городить придется, если даташиту верить.
Вот попробовал сваять с проверками и прочим. Чтобы при работе с датчиком не было проблем "потери сигнала" от датчика. Как показала практика, если этого не делать, то на груглосуточно работающем девайсе, с проверкой раз в 3 минуты температуры - раз в месяц или реже но прилетает тревога -0,06С
Новый код работает, но думаю есть огрехи которые я не вижу. что можно в коде еще улучшить?
Тоже сделал проверку контрольной суммы, а то изредка , но бывают глюки показаний.
так как датчиков много переменные и адреса датчиков сделал в массивы, иначе код большой получается.
Также у меня используются датчики открытия дверей и окон на основе DS2406 и герконов. Написал код совместной работы с DS18B20.
За основу взят код автора темы.
MaksVV - критика принимается?
Во-первых, мелкая ошибка - в описании массива DoorsWindows (строка 55) - вы берете размер по числу датчиков температуры, а не по числу датчиков окон.
А вот дальше более серьезно. Не думаю, что мысль засунуть опрос четырех датчиков температуры и двадцать ! опросов датчиков окон в один вектор прерывания - это здравая идея. А с учетом того, что прерывание ватчдога имеет один из высших приоритетов, подозреваю, что совместно с этим кодом ничего другого на МК уже исполнятся не сможет.
Критика приветствуется. Спасибо за мелкую ошибку. исправил. И да, согласен на счет прерывания. Но у меня система модульная, ничего другого данный мк, в общем то и не делает. Имеет смысл переложить просто на миллис. Остальное думаю может кого заинтересует. Имею ввиду проверка CRC и считывание PIO ds2406.
пример на миллис
Подскажите какую библиотеку использовать. Нужно обращатся к датчикам по сирийному номеру , я так понимаю с начала сирийные номера нужно саписать в еепром микроконтролера (ESP8266) чтобы если из групы датчиков один отключить то остальные оставались на своих местах .
Подскажите какую библиотеку использовать. Нужно обращатся к датчикам по сирийному номеру , я так понимаю с начала сирийные номера нужно саписать в еепром микроконтролера (ESP8266) чтобы если из групы датчиков один отключить то остальные оставались на своих местах .
Если речь идет о датчиках DS на протоколе One Wire, то и библиотеку нужно OneWire.h, чтобы записать в EEPROM - библиотеку EEPROM.h. Адрес датчика занимает 8 байт. В программе желательно предусмотреть возможность считывания адреса датчика и записи ее в EEPROM. Про библиотеки почитайте в гугле.
Подскажите какую библиотеку использовать. Нужно обращатся к датчикам по сирийному номеру , я так понимаю с начала сирийные номера нужно саписать в еепром микроконтролера (ESP8266) чтобы если из групы датчиков один отключить то остальные оставались на своих местах .
а зачем для этого в еепром писать? ну отключите вы один, ничего особо и не изменится. Вот, например, можно так опрашивать далласы #24. Дополнительных библиотек не нужно, только Onewire.h
Если я отключу какойто датчик или заменю его другим то остальные датчки останутся под своими номерами как и до отключения или замены ?
У датчиков OneWire нет номеров, у них есть идентификаторы, которые выжжены в них на заводе. Они не могут измениться от отключения или подключения доп. датчиков.
да
У датчиков OneWire нет номеров, у них есть идентификаторы, которые выжжены в них на заводе. Они не могут измениться от отключения или подключения доп. датчиков.
Я хотел сказать например у меня в програме какой то датчик меряет температуру чего то - это будет датчик скажем номер один итд., вот эти номера я имел ввиду. И при замене какого то датчика остальные оставались на своих местах.
Да, забыл, если какой то татчик сломался или его отключили в этом примере есть вывод аварии датчика через терминал?
Гарантированно неизменны только ID в термометрах. Вся остальная относительная нумерация и её валидность - на совести программиста. Если таковой задачи не стояло при создании ПО, то внутрипрограммные индексы могут перестать соответствовать идентификаторам (а следовательно - местам установки) термометров. Так же - для получения проблем достаточно просто изъять один и поставить другое устройство OneWire.
Друзья, а не кажется Вам, что данная тема не предназначена для обучения работы с далласами?
То olegkaras, предлагаю создать СВОЮ тему в песочнице и там задать все интересующие вопросы. ИМХО.
полагаю вы имеете ввиду, что определённые адреса датчиков так и останутся привязаны к определённым переменным температуры? в любом случае, отключение или замена одного из датчиков никак не повлияет на привязанность адресов датчиков к переменным (по крайней мере в моем примере).
номер, адрес, индентификатор .... все нормальные разборки начинаются с однозначных опредлений понятий.
А то помню, как мы с дружком раз играли в шахматы в слепую, и как потом оказалось, оба белыми
Гражданин начальник ругается, конечно, и скоро ссаными тряпками нас гонять будет, как алегира, но сошлюсь на datasheet: "Each DS18B20-PAR has a unique 64-bit identification code...". Там же написано, что "The match ROM command followed by a 64–bit ROM code sequence allows the bus master to address a specific" - отсюда и простонародный "адрес", как я понимаю.
Гражданин начальник ругается, конечно, и скоро ссаными тряпками нас гонять будет, как алегира,
Неа, здесь dimax главный, ему решать.
Здравствуйте!
Меняю в скетче 15 строку на паразитное питание с изменением в схеме, температура не измеряется.
Стандартный пример из библиотеки OneWare работает с паразитным питанием прекрасно.
Сделать на delay вместо millis не вариант, т.к. есть много кода, который должен в это время исполняться.
Помогите, пожалуйста, разобраться в причине.
Сильно не пинайте, начинающий я.
И еще: aruino pro ide уже можно использовать или он слишком сырой пока?
Меняю в скетче 15 строку на паразитное питание с изменением в схеме, температура не измеряется.
И что вы изменили? Единичку после 0х44 поставили. что ли?
Меняю в скетче 15 строку на паразитное питание с изменением в схеме, температура не измеряется.
И что вы изменили? Единичку после 0х44 поставили. что ли?
да
ну так у вас паразитное питание включается в строке 15 и практически мгновенно сразу выключается в 17. Этого недостаточно, так работать не будет.
это потому что вы запрос и чтение температуры делаете подряд.
Возьмите код Димакса из первого сообщения ветки - там запрос и чтение делается в два захода. Нужно в конце запроса на температуру включить паразитное питание, а в начале чтения значений - выключить.
ну так у вас паразитное питание включается в строке 15 и практически мгновенно сразу выключается в 17. Этого недостаточно, так работать не будет.
это потому что вы запрос и чтение температуры делаете подряд.
Спасибо! Помогли разобраться.
Всем привет.
Пришли три разные партии датчиков (c гильзой и без, все с али) все с ядром С4.
Решил проверить их на погрешность при 25 *С и мал мал офигел от результата, все врут в минус от 0,6 до 1,3 *С, китай однако отжигает в 2020.
Вопрос:
Можно влезть в 12 битный режим и поправить там переменную 0,0625 не добавляя к результату константу коррекции?
Или есть биты для коррекции датчика в + или -?
Чем черевато сие вмешательство? Проверил, меняя переменную можно подогнать РЛО к реальной температуре!
Как подгоняете?
Код чисто тест, меняю константу в сторону увеличения с 0.0625 на 0.0672. То есть с 25.00 подогнал к фактической 26.88 °C. Или я заблуждаюсь?
Кстати по датчикам, Левыми оказались только с гильзами!
Поддельный датчик не поддерживает 9,10-битное разрешение и не сохраняет значения в регистрах аварийных сигналов. Кроме того, у моего поддельного датчика одно и тоже время преобразования - 487 мс при всех режимах преобразования, обычному датчику требуется около ~ 750 мс при 12 бит.
Тестировал по данной методе, вернее кодом) - https://github.com/Deimos1994/Ds_Fake_Tester
Мой мод :)
Что скажете?