Собственно код `
#include <Arduino.h>
const int D2_PIN = 2;
const int D3_PIN = 3;
const int D4_PIN = 4;
const int D5_PIN = 5;
const int D6_PIN = 6;
const int A0_PIN = A0;
enum State
{
STATE_D2_HIGH,
STATE_INIT_D5,
STATE_WAIT_A0,
STATE_PROCESS_A0_HIGH,
STATE_D4_POST_D3,
STATE_WAIT_AFTER_D4,
STATE_D2_LOW,
STATE_INIT_D5_2
};
State currentState;
unsigned long timer;
unsigned long d4Timer;
bool d4Active;
void resetOutputs()
{
digitalWrite(D3_PIN, LOW);
digitalWrite(D4_PIN, LOW);
digitalWrite(D5_PIN, LOW);
digitalWrite(D6_PIN, LOW);
}
void setup()
{
pinMode(D2_PIN, INPUT);
pinMode(D3_PIN, OUTPUT);
pinMode(D4_PIN, OUTPUT);
pinMode(D5_PIN, OUTPUT);
pinMode(D6_PIN, OUTPUT);
pinMode(A0_PIN, INPUT);
resetOutputs();
if (digitalRead(D2_PIN) == HIGH)
{
currentState = STATE_D2_HIGH;
digitalWrite(D3_PIN, HIGH);
digitalWrite(D6_PIN, HIGH);
}
else
{
currentState = STATE_INIT_D5;
timer = millis();
digitalWrite(D5_PIN, HIGH);
}
}
void loop()
{
unsigned long currentMillis = millis();
// Проверка приоритета D2
if (currentState != STATE_D2_HIGH && digitalRead(D2_PIN) == HIGH)
{
resetOutputs();
digitalWrite(D3_PIN, HIGH);
digitalWrite(D6_PIN, HIGH);
currentState = STATE_D2_HIGH;
}
switch (currentState)
{
case STATE_D2_HIGH:
if (digitalRead(D2_PIN) == LOW)
{
resetOutputs();
currentState = STATE_INIT_D5;
timer = currentMillis;
digitalWrite(D5_PIN, HIGH);
}
break;
case STATE_INIT_D5:
if (currentMillis - timer >= 500)
{
digitalWrite(D5_PIN, LOW);
currentState = STATE_WAIT_A0;
}
break;
case STATE_WAIT_A0:
if (analogRead(A0_PIN) <= 800)
{
currentState = STATE_PROCESS_A0_HIGH;
timer = currentMillis;
digitalWrite(D3_PIN, HIGH);
d4Active = false;
}
break;
case STATE_PROCESS_A0_HIGH:
if (!d4Active && currentMillis - timer >= 500)
{
digitalWrite(D4_PIN, HIGH);
d4Timer = currentMillis;
d4Active = true;
}
if (d4Active && currentMillis - d4Timer >= 500)
{
digitalWrite(D4_PIN, LOW);
d4Active = true;
}
if (currentMillis - timer >= 5000)
{
digitalWrite(D4_PIN, HIGH);
timer = currentMillis;
currentState = STATE_D4_POST_D3;
}
break;
case STATE_D4_POST_D3:
if (currentMillis - timer >= 500)
{
digitalWrite(D4_PIN, LOW);
digitalWrite(D3_PIN, LOW);
timer = currentMillis;
currentState = STATE_WAIT_AFTER_D4;
}
break;
case STATE_WAIT_AFTER_D4:
if (currentMillis - timer >= 500)
{
currentState = STATE_D2_LOW;
}
break;
case STATE_D2_LOW:
if (digitalRead(D2_PIN) == LOW)
{
resetOutputs();
currentState = STATE_INIT_D5_2;
timer = currentMillis;
digitalWrite(D5_PIN, HIGH);
}
break;
case STATE_INIT_D5_2:
if (currentMillis - timer >= 500)
{
digitalWrite(D5_PIN, LOW);
currentState = STATE_WAIT_A0;
}
break;
}
}`