Помогите, пожалуйста! ds1820
- Войдите на сайт для отправки комментариев
Вс, 25/10/2015 - 11:12
Здравствуйте! Есть простенький термостат на твердотельном реле и датчике ds1820. Подскажите, как программно сделть так: если в течении часа не произошло изменение температуры то . . . отключаем реле
Запустили нагреватель, зафиксировали температуру и время, мониторим, если температура не изменялась и прошел час времени, отключили нагреватель.
Температура в контролируем интервале изменилась, зафиксировали температуру и время, мониторим. И так по кругу.
В максимальном разрешении датчика будет скорее всего изменяться всегда. Загрубить или вводить гистерезис.
Запустили нагреватель
я предлагал не запускать нагреватель - выпилили гады
Вам скорее надо сделать (если это для обогрева помещения конечно) чтобы обогреватель срабатывал в определённый промежуток температуры например 22 и выше градуса отключен меньше 22 включен.
Я так и хочу сделать, только как программно промотать этот час времени после которого я проведу сравнение?
Вы уж определитесь, что вам надо. Для поддержания температуры время не требуется, узнать, что нагреватель не работает, часа много. Самому себе попробуйте рассказать, что вы хотите, по шагам.
В яме гаража будет находиться эл. тэн подключенный через твердотельное реле, там же внизу - датчик температуры. Реле в свою очередь, как и ds18b20 подключено к ардуино. При температуре 0 градусов или ниже влючается тэн, по достижению +3 градусов - отключается. Если в течении определенного времени ( пусть 30 минут) показатели температуры не изменились, значит: включается индикация и обесточивается реле. Вот как будет. Для меня проблема завести температуру при включении в eeprom, а потом после 30 минут достать, сравнить с первоначальными показаниями температуры - вот в чем программная загвоздка для меня
А на фуя ее в EEPROM заводить? Переменные куда за это время исчезнут?
как проще сделать я не знаю, поделитесь)
завели переменную tempOld, занесли в нее температуру. По истечении интервала сверили с текущей. Eсли нет RTC в 1 часе 3 600 000 millis().
Вроде этого?
tempOld = Temp
int val = tempOld
так правильно:
#include <EEPROM2.h> #include <OneWire.h> OneWire ds(7); unsigned long currentTime; unsigned long loopTime; void setup() { Serial.begin(9600); pinMode(13, OUTPUT); } void loop() { byte data[2]; ds.reset(); ds.write(0xCC); ds.write(0x44); delay(750); ds.reset(); ds.write(0xCC); ds.write(0xBE); data[0] = ds.read(); data[1] = ds.read(); int Temp = (data[1] << 8) + data[0]; Temp = Temp >> 4; int TempOld = Temp; currentTime = millis(); if (currentTime == (loopTime + 30000)&& (TempOld = Temp)) { digitalWrite(13, HIGH); loopTime = currentTime; } }пардон
#include <OneWire.h> OneWire ds(7); unsigned long currentTime; unsigned long loopTime; void setup() { Serial.begin(9600); pinMode(13, OUTPUT); } void loop() { byte data[2]; ds.reset(); ds.write(0xCC); ds.write(0x44); delay(750); ds.reset(); ds.write(0xCC); ds.write(0xBE); data[0] = ds.read(); data[1] = ds.read(); int Temp = (data[1] << 8) + data[0]; Temp = Temp >> 4; int TempOld = Temp; currentTime = millis(); if (currentTime == (loopTime + 3600000) && (TempOld = Temp)) { digitalWrite(13, HIGH); loopTime = currentTime; } }не правильно((((
У тебя TempOld всегда равен Temp до и после 23-25
как сделать правильно?
У тебя вообще какой то компот получается. После 25 строки tempOld будет всегда равна Temp.
Инициировать как глобальную переменную, присваивать значение один раз и до истечения интервала (можно поднять флаг) или производить присваивание после каждого изменения вверх и заново запускать счетчик.
После 28 строки следующее за ней условие никогда не выполнится, т.к. переменная всегда будет равна millis().
В 29 строке при сравнении температур, вместо сравнения производишь присваивание. Там же, вместо ==, лучше ставить <=.
А главное, с какой целью производишь такую проверку? Если термостат, то надо контролировать температуру и по ней принимать решения.