Неравномерное включение и выключение реле

Kota
Offline
Зарегистрирован: 17.10.2019

Доброго. Когда то я уже делал все это. НО прошло много времени, все мои скетчи уничтожены. И поиск не помогает.

Задача: сделать включение и выключение реле с помощью millis()

Включение на 2 секунды, выключение на заданный мной параметр intervaloff

int pin1 = 2;
int pin2 = 3;
int pin3 = 4;

int Rele1 = 8;
int Rele2 = 9;

int push1;
int push2;
int push3;
int mode = 1;
int intervaloff;


boolean buttonPush = false;
boolean relework = false;

unsigned long curentMillis;
unsigned long pushMillis;
unsigned long push3state;
unsigned long timetowork;
unsigned long timenotwork;

void setup() 
{
  // put your setup code here, to run once:

pinMode(pin1,INPUT_PULLUP);
pinMode(pin2,INPUT_PULLUP);
pinMode(pin3,INPUT_PULLUP);

pinMode(Rele1, OUTPUT);
pinMode(Rele2, OUTPUT);

digitalWrite(Rele1, HIGH);
digitalWrite(Rele2, HIGH);
Serial.begin(9600);
}

void loop() 
{
 push1=digitalRead(pin1);
 push2=digitalRead(pin2);
 curentMillis = millis();
 
if(push1 == LOW && push2 == LOW)
  {
    push3 = digitalRead(pin3);
    if(push3 == LOW)
      {
        push3state = millis();
        buttonPush = true;
      }
    if(push3 == HIGH && buttonPush == true && curentMillis - push3state >= 200)  //от дребезга
      {
        mode++;                     //параметр для выбора нужного intervaloff
        Serial.print("mode= ");
        Serial.println(mode);    //проверка что кнопка срабатывает
        buttonPush = false;
      }
    if(mode == 1)
      {
        intervaloff = 0;
      }
    if(mode == 2)
      {
        intervaloff = 1000;
      }
    if(mode == 3)
      {
        intervaloff = 2000;
      }
    if(mode == 4)
      {
        intervaloff = 3000;
      }
    if(mode == 5)
      {
        mode = 1;
      }
    if(curentMillis - timetowork >= intervaloff)  //вот дальше никак не могу сообразить 
      {                                                               //если бы время было одинаковым - было бы проще
    timetowork = curentMillis;
    relework = true;
    digitalWrite(Rele1, LOW);  //включение реле
    digitalWrite(Rele2, HIGH);
      
      }
    if(curentMillis - timetowork >= 2000 && relework == true) // ну тут явно бред
        {
    timetowork = curentMillis;
    digitalWrite(Rele1, HIGH);  //выключение реле
    digitalWrite(Rele2, HIGH);
    relework = false;
        }
    
    pushMillis = millis();
  }
  
if(push1 == LOW && push2 == HIGH)
  {
    digitalWrite(Rele1, HIGH);
    digitalWrite(Rele2, LOW);
    pushMillis = millis();
  }

if(push1 == HIGH && push2 == LOW)
  {
   if(curentMillis - pushMillis > 5000)
     {
        digitalWrite(Rele1, HIGH);
        digitalWrite(Rele2, HIGH);
     }
    
  }

}

 

b707
Offline
Зарегистрирован: 26.05.2017

вы для начала напишите включение и выключение реле на разное время, без этих кнопок и режимов. Когда заработает - начнете добавлять остальное

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

сто строк для блинка - многовато:
 

uint32_t timer;
bool flag = true;
#define work_time 100
#define period 100


void setup() {
  pinMode(1, OUTPUT);
  digitalWrite(1,flag);
}

void loop() {
  if (millis() - timer >= (flag ? work_time : period)) {
    timer = millis();
    flag = !flag;
    digitalWrite(1, flag);
  }
}