Проблема в коде стандартного скетча датчика температуры DS18B20
- Войдите на сайт для отправки комментариев
Чт, 23/10/2014 - 09:53
Решил сделать термометр с датчиком DS18B20 и выводом температуры на три семисегментные индикаторы через CD4026, но возникли ошибки на самом первом этапе- подключенеи DS18B20.
Прошу помочь, так как в эотм деле совсем новичек
Плата Arduini nano v3.0.
программа arduino-1.0.6.
датчик подключаю по следующей схеме
загружаю примеры DallasTemperature и OneWare, при компиляции выдает ошибку
Код из скетча: #include <OneWire.h> /* * получаем температуру от DS18S20 */ OneWire ds(10); // линия 1-Wire будет на pin 10 void setup(void) { Serial.begin(9600); } void loop(void) { byte i; byte present = 0; byte data[12]; byte addr[8]; if ( !ds.search(addr)) { //Serial.print("No more addresses.\n"); ds.reset_search(); return; } /*Serial.print("R="); for( i = 0; i < 8; i++) { Serial.print(addr[i], HEX); Serial.print(" "); }*/ if ( OneWire::crc8( addr, 7) != addr[7]) { Serial.print("CRC is not valid!\n"); return; } if ( addr[0] != 0x10) { Serial.print("Device is not a DS18S20 family device.\n"); return; } ds.reset(); ds.select(addr); ds.write(0x44,1); // запускаем конвертацию delay(5000); // скорее всего достаточно 750ms // we might do a ds.depower() here, but the reset will take care of it. present = ds.reset(); ds.select(addr); ds.write(0xBE); // считываем ОЗУ датчика /*Serial.print("P="); Serial.print(present,HEX); Serial.print(" ");*/ for ( i = 0; i < 9; i++) { // обрабатываем 9 байт data[i] = ds.read(); //Serial.print(data[i], HEX); //Serial.print(" "); } /*Serial.print(" CRC="); Serial.print( OneWire::crc8( data, 8), HEX); Serial.println();*/ // высчитываем температуру :) int HighByte, LowByte, TReading, Tc_100; LowByte = data[0]; //Serial.print("LB= ");Serial.print(LowByte,HEX); HighByte = data[1]; //Serial.print(" HB= ");Serial.print(HighByte,HEX); TReading = (HighByte << 8) + LowByte; Tc_100 = TReading/2; Serial.print(" T = ");Serial.print(Tc_100); Serial.println(); }
Прочтите https://www.google.ru/?gws_rd=ssl#newwindow=1&q=onewire.cpp:66:24
http://arduino.ru/forum/obshchii/problema-s-izmereniem-temperatury-ds18b...
Я пользовался такой библиотекой.
я тоже пользовался именно этой библиотекой, результат видите сами
Вам trembo уже дал ссылки на решение проблемы.
Всем спасибо за помощь)
Работает)

Достаточно среду до 1.5.* обновить :)
Непойму, что тут не так:
Этот кусок кода работал хорошо и правильно. Температура датчиков на стенде определялась корректно.
Потом собрал реальную схему. И работать перестало. Показывает температуру датчиков 195.00 и 444.00 градусов цельсия. Если этот код убрать и воспользоваться обычным с подключением библиотеки от даллас, то показывает корректно.
Что с этим кодом не так?
Библиотеку от далласа использовать не могу, с ней скетч занимает больше места. Если подключить другие датчики со стенда, то они и с этим кодом корректно работают. Почему этот код перестаёт работать, когда кабель длинный (15 метров)?
Sirocco,
1. ответ очевиден. Вы что-то неправильно сделали!
2. фрагмент программы рассматривать бессмымленно
3. непоятна цель программы и какой пример работает
4. в строке 22 ошибка: array index out of range
5. как подключено там, где не работает?
Перелопатил код. Работает. Только ооочень тормозит веб интерфейс, настолько, что невозможно использовать. Изернет шилд на 28j60 чипе
Что-то для ускорения сделать можно?
Кстати, как тут избежать переполнения счётчика?
Так правильно
Добрый день.
Если не трудно, то подскажите пожалуйста, одну меленькую вещь.
Хочу при помощи реле включать и выключать тёплый пол. То есть если темперетура упала ниже 22 включить, а если поднялась выше 25, то отключить.
Ести код
Возникла проблема, что если происходит обрыв провода датчика или Arduino по каким-то причинам перестаёт видить датчик, то реле включается на постоянку вне зависимомти от температуры. Если кто знает как програмно можно решить данную проблему (чтобы при отказе датчика, обрыве провода и тд. реле выключалось независимо от того в каком положении оно было до этого, вкл или выкл.)?
За ранее большое спасибо за помощь.
У вас реле точно с неинвертированным управлением?
Чему равна переменная
celsius
при отключении датчика?Вам следует выделить опрос датчика в отдельную функцию, и управлять реле, только если опрос был успешным. Так-же вам следует задать дефолтное состояние реле.
скорее всего при обрыве датчика показания выдают отрицательную температуру и согласно строке 89, включается реле.
Большое спасибо, что оветили на мой вопрос.
В обвязке реле есть перемычка при помощи которой можно делать реле с инвертированным или с неинвертированным управлением.
Сам я в програмировании не силён и код брал с сайта (теперь уже и не найду от куда). Сам я только дописал пару строк про реле. Я предпологая что переменная
celsius
при отключении датчика будет равна 0. Если это не так, то поправте меня, пожалуйста.Подскажите, если не трудно, как выделить опрос датчика в отдельную функцию?
Я праильно понимая, для того чтобы задать дефолтное состояние реле, нужно вписать в код вот такие строчки (2-я и последняя):
За ранее спасибо за помощь.
неинвертированное управление логически более понятное - видя в коде
digitalWrite(RELE_1, HIGH); интуитивно считаешь, что оно должно включиться.
Если использовать макросы (если реле всего одно) или выделенные функции (если их несколько), это вообще перестает быть проблемой - сразу видишь явную команду: RELAY_ON; или relay(FLOOR, ON); .
Насколько я понимаю, в данном случае "дефолтное состояние реле" - это состояние, в которое оно должно принудительно или самостоятельно возвращаться, если возникает какая-то нештатная ситуация (не читается датчик температуры в течение N минут, пропало питание и пр.).
То есть примерно так (не проверено, компилировать не на чем, главное смотри архитектуру):
Для полного забывания понятия 0 или 1 включает реле я обычно пишу так:
#define RelayON digitalWrite ( RELE_1 , LOW ) // если включаем нулём
или
#define RelayON digitalWrite ( RELE_1 , HIGH ) // если включаем единицей
Соответственно пишутся RelayOFF
Tomasina Большое спасибо за помощь. Сам бы я никогда не додумался до этого.
Скетч компелируется, но есть маленькое "но". Реле не переключается. То есть как оно стоит по умолчании вкл, так оно и остаётся вкл. при любой температуре. И постоянно горит дид на pin 13. В мониторе последовательного порта пишит:
NO DATA: Please check temp sensor.
был пропущен else :)
Попробуй, у меня работает.
По умолчанию оно выкл (если прямое управление) или вкл (если инвертированное управление).
Tomasina, Огромное спасибо за помощь.
Не могли бы Вы немного пояснить что значит строчка 19 (
enum
Error{NOT_FOUND = 111, CRC_ERROR = 112};
).А то у меня по какой-то причине постоянно идёт ошибка и диод на 13 pine моргает с частотой раз в секунду. Из-за чего реле не включается. В мониторе последовательного порта
Chip = DS18B20
enum
Error{NOT_FOUND = 111, CRC_ERROR = 112};
).если датчик не найден (строка 119), то функция возвращает число 111 вместо реальной температуры, а NOT_FOUND - это всего лишь текстовый синоним этого числа, для удобочитаемости кода (через полгода фиг вспомнишь, что означает 111, а с синонимом нагляднее).
Попробуй закомментировать строку 125, где return.
Tomasina, Болшое спасибо, что не оставляете вопросы без ответа.
Когда закомпелировал строку 125, ничего не изменилось.
По прежнему реле проходит "один цикл" (то есть реле включается при температуре ниже 22, потом выключается при темперетуре больше 25, и потом больше не включается вообще). Диод на pin 13 моргает с частотой раз в секунду. В мониторе последовательного порта показывается правильная температура и в зависимости от температуры пишится "Heat OFF" или "Heat ON". Но реле не включается.
В чём может быть причина?
Если не трубно, то дайте ответ, пожалуйста.
Спасибо.