Время работы реле
- Войдите на сайт для отправки комментариев
Втр, 07/02/2017 - 02:23
Приветствую Вас, друзья! Сделал примитивный термостат на базе 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);
}
}
Если сделать digitalRead(7) то прочитается последнее записанное в D7 состояние, pulseIn() тут вообще не нужно. Это если учёт делается на той же самой ардуине. Если на отдельной то просто читать в цикле, как только поменялось - сохранять значение. Но судя по смыслу вы делаете на той же самой, так что просто digitalRead() оттуда же куда повешено реле, и будет состояние реле.
Мне не нужно знать само состояние пина. Мне нужно знать время, в течении которого пин принимал то или иное состояние и записывать это время в переменную.
Ну проще через millis. вы не уточнили в чем время измерять. микросекундах,милисекундах,секундах,минутах, часах, днях. А это же существенная информация.
Мне не важно в чем измерять. Пусть это будут миллисекунды. Если проще, мне нужно получить значение двух переменных -
пин 7 был HIGH "x" миллисекунд,
пин 7 был LOW "y" миллисекунд
По мере работы реле данные переменных должны соответственно обновляться
Спасибо, разобрался. Кому будет полезно - оставляю тут.
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")); ...