Всем привет, слинял с пар, что отписаться.
Попробую ещё раз описать задание. Есть два входа, первый цифровой D2 принимает логическую (1- флаг поднят) или логическую (0 - флаг опущен), второй аналоговый A0 принимает (5 вольт = 1023, флаг опущен) или (4 вольта ±= 800, флаг поднят).
Есть четыре выхода для нагрузки D3, D4, D5, D6, умолчанию на LOW.
Должно работать так.
1). Если подачи питания, на входе D2 логическая (1- флаг поднят), то на D3 и D6 - HIGH.
2). Если при подачи питания на входе D2 логическая (0 - флаг опущен) то длительностью 1 секунда на D5 - HIGH, далее ждём команду на вход A0.
3). Если если в процессе ожидания на D2 опять появится логическая (1- флаг поднят), а на A0 (5 вольт = 1023, флаг опущен), то на D3 и D6 - HIGH, A0 при этом игнорируется, пока на D2 не появится логическая (0 - флаг опущен).
4). Если на D2 логическая (0 - флаг опущен), а на A0 (4 вольта ±= 800, флаг поднят), то на с разницей в 2 секунды на D3-HIGH длительностью 10 секунд, а на D4-HIGH длительностью 1 секунда.
После отработки 10 секундного таймера D3, на D4-HIGH длительностью 1 секунда.
Ждём 2 секунды.
5). Если на D2 логическая (1- флаг поднят) то на D3 и D6 - HIGH, ждем появления логической (0 - флаг опущен).
6). Если на D2 логическая (0 - флаг опущен) то на D5 - HIGH длительностью 1 секунда.
Переходим к пункту 3.
Сейчас у меня работает так.
1). Если подачи питания, на входе D2 логическая (1- флаг поднят), то на D3 и D6 - HIGH.
2). Если при подачи питания на входе D2 логическая (0 - флаг опущен) то длительностью 1 секунда на D5 - HIGH, далее ждём команду на вход A0.
3). Если если в процессе ожидания на D2 опять появится логическая (1- флаг поднят), а на A0 (5 вольт = 1023, флаг опущен), то на D3 и D6 - HIGH, A0 при этом игнорируется, пока на D2 не появится логическая (0 - флаг опущен).
4). Если на D2 логическая (0 - флаг опущен), а на A0 (4 вольта ±= 800, флаг поднят), то на с разницей в 2 секунды на D3-HIGH длительностью 10 секунд, а на D4-HIGH длительностью 1 секунда.
После отработки 10 секундного таймера D3, на D4-HIGH длительностью 1 секунда.
Ждём 2 секунды.
5). Если на D2 логическая (1- флаг поднят) то на D3 и D6 - HIGH, ждем появления логической (0 - флаг опущен).
6). Если на D2 логическая (0 - флаг опущен) то на D5 - HIGH длительностью 1 секунда.
Переходим к пункту 3.
Жирным текстом я выделил, что у меня не работает, а нужно.
Это мой доработанный код, он отличный от первого поста. Но в нём не хватает того, что выделил жирным текстом. Как мне дополнить в него эти функции ???
const int zamokPin = 2; // Цифровой пин "замок"
const int fotoPin = A0; // Аналоговый пин "фото"
const int podgotovkaPin = 3; // Пин "подготовка"
const int otkritiePin = 4; // Пин "открытие"
const int podachaPin = 5; // Пин "подача"
const int alarmPin = 6; // Пин "аларм"
// Переменные для хранения времени
unsigned long previousMillis = 0; // Время последнего изменения состояния
unsigned long interval = 0; // Интервал для таймеров
// Состояния системы
enum SystemState {
STATE_IDLE, // Ожидание
STATE_CHECK_ZAMOK, // Проверка входа "замок"
STATE_CHECK_FOTO, // Проверка входа "фото"
STATE_ALARM, // Состояние "аларм"
STATE_PODACHA, // Состояние "подача"
STATE_PODGOTOVKA, // Состояние "подготовка"
STATE_OTKRITIE, // Состояние "открытие"
};
SystemState currentState = STATE_IDLE; // Текущее состояние системы
void setup() {
// Настройка пинов
pinMode(zamokPin, INPUT);
pinMode(fotoPin, INPUT);
pinMode(podgotovkaPin, OUTPUT);
pinMode(podachaPin, OUTPUT);
pinMode(otkritiePin, OUTPUT);
pinMode(alarmPin, OUTPUT);
// Инициализация выходов
digitalWrite(podachaPin, LOW);
digitalWrite(podgotovkaPin, LOW);
digitalWrite(podachaPin, LOW);
digitalWrite(otkritiePin, LOW);
digitalWrite(alarmPin, LOW);
}
void loop() {
unsigned long currentMillis = millis(); // Текущее время
// Обработка состояний
switch (currentState) {
case STATE_IDLE:
// Начальное состояние, переход к проверке "замок"
currentState = STATE_CHECK_ZAMOK;
break;
case STATE_CHECK_ZAMOK:
if (digitalRead(zamokPin)) {
// Если флаг поднят, переходим в состояние "аларм"
digitalWrite(alarmPin, HIGH);
digitalWrite(podgotovkaPin, HIGH);
currentState = STATE_ALARM;
} else {
// Если флаг опущен, включаем "подача" и ждем 3 секунды
digitalWrite(alarmPin, LOW);
digitalWrite(podgotovkaPin, LOW);
digitalWrite(podachaPin, HIGH);
previousMillis = currentMillis;
interval = 1000; // 1 секунды
currentState = STATE_PODACHA;
}
break;
case STATE_PODACHA:
if (currentMillis - previousMillis >= interval) {
// По истечении 1 секунды переходим к проверке "фото"
digitalWrite(podachaPin, LOW);
currentState = STATE_CHECK_FOTO;
}
break;
case STATE_CHECK_FOTO:
if (analogRead(fotoPin) <= 800) { // 4 В +-= 800 (при 5 В = 1023)
// Если флаг поднят, включаем "подготовку" и ждем 10 секунд
digitalWrite(podgotovkaPin, HIGH);
previousMillis = currentMillis;
interval = 10000; // 10 секунд
currentState = STATE_PODGOTOVKA;
}
break;
case STATE_PODGOTOVKA:
if (currentMillis - previousMillis >= interval) {
// По истечении 10 секунд проверяем "замок"
if (digitalRead(zamokPin)) {
digitalWrite(alarmPin, HIGH);
}
// Включаем "открытие" и ждем 3 секунды
digitalWrite(otkritiePin, HIGH);
previousMillis = currentMillis;
interval = 1000; // 1 секунды
currentState = STATE_OTKRITIE;
}
break;
case STATE_OTKRITIE:
if (currentMillis - previousMillis >= interval) {
// По истечении 3 секунд выключаем "открытие" и ждем 2 секунды
digitalWrite(otkritiePin, LOW);
previousMillis = currentMillis;
interval = 2000; // 2 секунды
currentState = STATE_CHECK_ZAMOK; // Возврат к проверке "zamok"
}
break;
case STATE_ALARM:
// Ожидание опускания флага на "замок"
if (!digitalRead(zamokPin)) {
digitalWrite(alarmPin, LOW);
currentState = STATE_CHECK_ZAMOK; // Возврат к проверке "замок"
}
break;
}
}