#1 2016-12-04 21:08:03

pavlov1984
Учасник
Зареєстрований: 2016-12-04
Повідомлень: 4

Помогите доработать цикл

Нужен цикл для включения реле например: 8:00 включать на 7 секунд и и повторить включение через 5 минут опять на 7 секунд и повторять это до 19:00.
Я сделал чтоб 8:00 включать на 7 секунд (время только для примера), а дальше цикл не получается.
if(hour == h1on[0] && minute == min1on[0] && second == sec1on[0]) // совпадение времини
{
digitalWrite(Relay1, LOW);   // включение релле
    lcd.setCursor(0, 1);
    lcd.print("relle 1 ON");
TimerINTERVAL = millis();
}
{
     if(millis() - TimerINTERVAL > per1on[0]*1000) // если прошел период времени.
    {
     digitalWrite(Relay1, HIGH); // выключаем релле
     lcd.clear();
     TimerINTERVAL = 0;     
    }   
}
if(hour == h1off && minute == min1off && second == sec1off)
{
digitalWrite(Relay1, HIGH);
}

Неактивний

#2 2016-12-05 01:26:24

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 876

Re: Помогите доработать цикл

в 8 часов запустил цикл
включаешь счётчик
а потом его каждые 300 сек опять повторяешь пока время меньше 19
не забываем счётчик обнулять

Неактивний

#3 2016-12-05 18:46:48

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: Помогите доработать цикл

Разберешься и сможешь применить, то все Ок.

/* генератор вспышек
светодиод -> 13 (Led_pin) 1 горит/ 0 нет
       GND ->  GND
*/
const int Led_pin = 13 ; // нога светодиода
uint8_t Led  ;
void setup() {
  pinMode(Led_pin, OUTPUT);
  digitalWrite(Led_pin, Led = 0);
}
void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ;
  //#1 1000 миллисекунд вычислит. поток 1
  static uint32_t past_1 = 0 ;
  static uint32_t past1_1 = 0 ;
  if (Led && MILLIS - past1_1 >= 2000 ) {// 2000 миллесекунд=2сек длительность вспышеки
    digitalWrite(Led_pin, Led = 0);
  }
  if (MILLIS - past_1 >= 10000) { // 10000 миллесекунд=10сек период вспышек
    past_1 = MILLIS ;
    digitalWrite(Led_pin, Led = 1);
    past1_1 = MILLIS ;
  }
}

Остання редакція qwone (2016-12-05 18:47:53)

Неактивний

#4 2016-12-06 02:29:12

pavlov1984
Учасник
Зареєстрований: 2016-12-04
Повідомлень: 4

Re: Помогите доработать цикл

Идеи хорошие. С циклом возникли проблемы, когда заходит в цикл не мого сделать чтобы он с этого цикла вышел когда нужно.
level1: 
if(hour == h1on && minute == min1on && second == sec1on)
{
level:
TimerINTERVAL = millis();
for (a=0; a<5000; a=millis()-TimerINTERVAL)
         {digitalWrite(Relay1, LOW);
          Serial.print(a);
          Serial.print("a=");
          TimerINTERVAL1 = millis();
          if(hour == h1off && minute == min1off && second == sec1off)
          {
          digitalWrite(Relay1, HIGH);
          goto level1;
          }
          }
for (b=0; b<2000; b=millis()-TimerINTERVAL1)
         {digitalWrite(Relay1, HIGH);
          Serial.print(b);
          Serial.print("b=");
          TimerINTERVAL = 0;
          if(hour == h1off && minute == min1off && second == sec1off)
          {
          digitalWrite(Relay1, HIGH);
          goto level1;
          }
          }
goto level;         
}

Неактивний

#5 2016-12-06 02:34:50

pavlov1984
Учасник
Зареєстрований: 2016-12-04
Повідомлень: 4

Re: Помогите доработать цикл

Этот цикл работает тоже отлично. Не могу вставить его во временные рамки. Подскажите пожалуйста как это можна сделать.
if(hour == h1on && minute == min1on && second == sec1on)
{
TimerINTERVAL = millis() ;
  //#1 1000 миллисекунд вычислит. поток 1
  static uint32_t past_1 = 0 ;
  static uint32_t past1_1 = 0 ;
 
  if (Led && TimerINTERVAL - past1_1 >= 2000 ) {// 2000 миллесекунд=2сек длительность вспышеки
    digitalWrite(Relay1, HIGH);
    }
  if (TimerINTERVAL - past_1 >= 5000) { // 10000 миллесекунд=10сек период вспышек
    past_1 = TimerINTERVAL ;
    digitalWrite(Relay1, LOW);
    past1_1 = TimerINTERVAL ;
    Led = 1;
  }
}
if(hour == h1off && minute == min1off && second == sec1off)
{
digitalWrite(Relay1, HIGH);
}

Неактивний

#6 2016-12-06 21:36:11

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: Помогите доработать цикл

Блин. Что там вставлять. Да и код все же оформите вставкой , если приводите его на форуме.

/* генератор вспышек
#1 часы
#2 поддержка реле
реле -> 13 (Relay_pin) 1 вкл/ 0 выкл
       GND ->  GND
       вкл с 8:00:00 до 19:00:00 каждые 5 минут на 7 секунд
*/
//#1
uint8_t HOUR;// время
uint8_t MINUTE;
uint8_t SECOND;
//#2
const uint32_t Time_0N = (8 * 60 + 0) * 60 + 0; // время вкл в сек 8:00:00
const uint32_t Time_OFF = (19 * 60 + 0) * 60 + 0; // время выкл в сек 19:00:00
uint32_t Time;// текущее время в секундах
const int Relay_pin = 13 ; // нога светодиода
uint8_t Relay  ;
void setup() {
  pinMode(Relay_pin, OUTPUT);
  digitalWrite(Relay_pin, Relay = 0);
}
void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ;
  //#1 непрерывно вычислит. поток 1
  // получить точное время
  // uint8_t HOUR= ...
  // uint8_t MINUTE= ...
  // uint8_t SECOND= ...;
  //#2  вычислит. поток 2
  static uint32_t past_2 = 0 ;
  Time=(HOUR * 60 + MINUTE) * 60 + SECOND;// получить время в секундах
  if (Relay && MILLIS - past_2 >= 7000 ) {// 7сек длительность вспышеки
    digitalWrite(Relay_pin, Relay = 0);
  }
  if ( Time >=Time_0N && Time<Time_OFF && MILLIS - past_2 >= 5*60*1000) { // каждые 5 минут период вспышек
    digitalWrite(Relay_pin, Relay = 1);
    past_2 = MILLIS ;
  }
}

Остання редакція qwone (2016-12-06 21:39:05)

Неактивний

#7 2016-12-06 22:56:18

pavlov1984
Учасник
Зареєстрований: 2016-12-04
Повідомлень: 4

Re: Помогите доработать цикл

Большое спасибо за уделенное вами время моей проблеме. В 3:00 пришла мысля и я решил проблему.
if(hour == h1on && minute == min1on && second == sec1on)
{
   b=h1off*3600+min1off*60+sec1off;
}
if (b-(hour*3600+minute*60+second)>0)
{
  TimerINTERVAL = millis() ;
  //#1 1000 миллисекунд вычислит. поток 1
  static uint32_t past_1 = 0 ;
  static uint32_t past1_1 = 0 ;
  if (Led && TimerINTERVAL - past1_1 >= 2000 ) {// 2000 миллесекунд=2сек длительность вспышеки
    digitalWrite(Relay1, HIGH);
    Led = 0;
    }
  if (TimerINTERVAL - past_1 >= 10000) { // 10000 миллесекунд=10сек период вспышек
    past_1 = TimerINTERVAL ;
    digitalWrite(Relay1, LOW);
    past1_1 = TimerINTERVAL ;
    Led = 1;
  }
}
if(b-(hour*3600+minute*60+second)==0)
{
  digitalWrite(Relay1, HIGH);
  b=0;
}
Спасибо.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму