Время работы реле

Alexsis f
Offline
Зарегистрирован: 22.11.2016

Приветствую Вас, друзья! Сделал примитивный термостат на базе arduino + ML35 + Реле.

Реле включает нагрузку электрокотла. В зависимости от того, сколько времени реле включено и сколько времени оно отключено я узнаю примерные затраты электроэнергии. Сейчас я это делаю вручную, таймером измеряя время работы котла и время простоя и по формуле узнаю киловатты. Хочу это сделать программно.

Мне необходимо при каждом включении и выключении реле записывать в переменную время, в течении которого Pin 7 принимал значение LOW и HIGH. pulseIn() не подходит ввиду ограничения в 3 минуты.

void relay (int tmin, int tmax){  //Управление нагрузкой в зависимости от текущей температуры
  
  if  ( temp  <=  tmin ) {
  
digitalWrite(7,HIGH);

  }
  
if ( temp >= tmax ) {
    
digitalWrite(7,LOW);

  }

}

 

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Если сделать digitalRead(7) то прочитается последнее записанное в D7 состояние, pulseIn() тут вообще не нужно. Это если учёт делается на той же самой ардуине. Если на отдельной то просто читать в цикле, как только поменялось - сохранять значение. Но судя по смыслу вы делаете на той же самой, так что просто digitalRead() оттуда же куда повешено реле, и будет состояние реле.

Alexsis f
Offline
Зарегистрирован: 22.11.2016

Мне не нужно знать само состояние пина. Мне нужно знать время, в течении которого пин принимал то или иное состояние и записывать это время в переменную.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну проще через millis. вы не уточнили в чем время измерять. микросекундах,милисекундах,секундах,минутах, часах, днях. А это же существенная информация.

Alexsis f
Offline
Зарегистрирован: 22.11.2016

Мне не важно в чем измерять. Пусть это будут миллисекунды. Если проще, мне нужно получить значение двух переменных -

пин 7 был HIGH "x" миллисекунд,

пин 7 был LOW "y" миллисекунд

По мере работы реле данные переменных должны соответственно обновляться

Alexsis f
Offline
Зарегистрирован: 22.11.2016

Спасибо, разобрался. Кому будет полезно - оставляю тут.

unsigned long htime = 0; // время работы реле, миллисекунды
unsigned long ltime = 0; // реле выключено, миллисекунды
unsigned long relaytime = 0;

void setup() {
relaytime = millis();
...
}

void relay (int tmin, int tmax){  //Управление нагрузкой в зависимости от текущей температуры

if  ( temp  <= tmin && digitalRead(7) == LOW ) { //Включаем нагрузку
 
digitalWrite(7,HIGH);

    ltime = millis() - relaytime - htime;
    relaytime+=htime;
    }
  
if ( temp >= tmax && digitalRead(7) == HIGH ) { //Выключаем нагрузку
  
  digitalWrite(7,LOW);
    
    htime = millis() - relaytime - ltime;
    relaytime+=ltime;
  }
}

void loop() {
...
relay();
}

//Расчет текущей мощности 3-х киловаттного электрокотла :
...
 Serial.println(String("Boiler:  ")+float (htime) / float (int (htime)+ int (ltime)) * 3.00 + String(" kWh"));
Serial.println(String("Boiler:  ")+float (htime) / float (int (htime)+ int (ltime)) * 3.00 * 24.00 + String(" kWd"));
Serial.println(String("Boiler:  ")+float (htime) / float (int (htime)+ int (ltime)) * 3.00 * 744.00 + String(" kWm"));
...