Неравномерное включение и выключение реле
- Войдите на сайт для отправки комментариев
Вс, 23/01/2022 - 18:14
Доброго. Когда то я уже делал все это. НО прошло много времени, все мои скетчи уничтожены. И поиск не помогает.
Задача: сделать включение и выключение реле с помощью 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);
}
}
}
вы для начала напишите включение и выключение реле на разное время, без этих кнопок и режимов. Когда заработает - начнете добавлять остальное
сто строк для блинка - многовато:
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); } }