Помогите, пожалуйста! ds1820

romiras
Offline
Зарегистрирован: 12.07.2015

Здравствуйте! Есть простенький термостат на твердотельном реле и датчике ds1820. Подскажите, как программно сделть так: если в течении часа не произошло изменение температуры то . . . отключаем реле

bwn
Offline
Зарегистрирован: 25.08.2014

Запустили нагреватель, зафиксировали температуру и время, мониторим, если температура не изменялась и прошел час времени, отключили нагреватель.
Температура в контролируем интервале изменилась, зафиксировали температуру и время, мониторим. И так по кругу.
В максимальном разрешении датчика будет скорее всего изменяться всегда. Загрубить или вводить гистерезис.

Клапауций 911
Offline
Зарегистрирован: 18.10.2015

bwn пишет:

Запустили нагреватель

я предлагал не запускать нагреватель - выпилили гады

sergeyovs1980
Offline
Зарегистрирован: 20.09.2015

Вам скорее надо сделать (если это для обогрева помещения конечно) чтобы обогреватель срабатывал в определённый промежуток температуры например 22 и выше градуса отключен меньше 22 включен.

romiras
Offline
Зарегистрирован: 12.07.2015

Я так и хочу сделать, только как программно промотать этот час времени после которого я проведу сравнение?

bwn
Offline
Зарегистрирован: 25.08.2014

Вы уж определитесь, что вам надо. Для поддержания температуры время не требуется, узнать, что нагреватель не работает, часа много. Самому себе попробуйте рассказать, что вы хотите, по шагам.

romiras
Offline
Зарегистрирован: 12.07.2015

В яме гаража будет находиться эл. тэн подключенный через твердотельное реле, там же внизу  - датчик температуры. Реле в свою очередь, как и ds18b20 подключено к ардуино. При температуре 0 градусов или ниже влючается тэн, по достижению +3 градусов - отключается. Если в течении определенного времени ( пусть 30 минут) показатели температуры не изменились, значит: включается индикация и обесточивается реле. Вот как будет. Для меня проблема завести температуру при включении в eeprom, а потом после 30 минут достать, сравнить с первоначальными показаниями температуры - вот в чем программная загвоздка для меня

bwn
Offline
Зарегистрирован: 25.08.2014

А на фуя ее в EEPROM заводить? Переменные куда за это время исчезнут?

romiras
Offline
Зарегистрирован: 12.07.2015

как проще сделать я не знаю, поделитесь)

bwn
Offline
Зарегистрирован: 25.08.2014

завели переменную tempOld, занесли в нее температуру. По истечении интервала сверили с текущей. Eсли нет RTC в 1 часе 3 600 000 millis().

romiras
Offline
Зарегистрирован: 12.07.2015

 

Вроде этого?

 

 

tempOld = Temp

int val = tempOld

 

      currentTime = millis();
  if(currentTime >= (loopTime + 3600000) && (TempOld=Temp)){
 .......выключаем
romiras
Offline
Зарегистрирован: 12.07.2015

так правильно:

#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;
  }

}

 

romiras
Offline
Зарегистрирован: 12.07.2015

пардон

#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;
  }

}

 

romiras
Offline
Зарегистрирован: 12.07.2015

 

не правильно((((

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

У тебя TempOld всегда равен Temp до и после 23-25

romiras
Offline
Зарегистрирован: 12.07.2015

как сделать правильно?

bwn
Offline
Зарегистрирован: 25.08.2014

У тебя вообще какой то компот получается. После 25 строки tempOld будет всегда равна Temp.
Инициировать как глобальную переменную, присваивать значение один раз и до истечения интервала (можно поднять флаг) или производить присваивание после каждого изменения вверх и заново запускать счетчик.
После 28 строки следующее за ней условие никогда не выполнится, т.к. переменная всегда будет равна millis().
В 29 строке при сравнении температур, вместо сравнения производишь присваивание. Там же, вместо ==, лучше ставить <=.
 

А главное, с какой целью производишь такую проверку? Если термостат, то надо контролировать температуру и по ней принимать решения.