Здравствуйте. Начал изучать программирование, с ребятами в колледже собираем первое устройство автоматики посадки саженцев, схему отрабатываем на симуляторе в протэусе, помогите “плиз” разобраться с кодом.
Тело “Arduino NANO” при включении сканирует два входа; D2 - это “zamok” (если на него подается 1 (флаг поднят)). Второй вход A0 “фото” (отслеживает падение напряжения с 5 до 4 и ниже (флаг поднят)). В зависимости от команд на входы, ардуино управляет четырьмя нагрузками; “podacha”, “podgotovka”, “otkritie” “alarm”.
По замыслу.
1.) Во время включения сканируется D2 (zamok), если на D2 нет флага, запуск на 1 секунду D5 (podacha) - HIGH. Если на D2 флаг поднят, то на D3 (podgotovka) - HIGH и D6 (alarm) - HIGH и ждём падение флага, если упал то D3 и D6 -LOW, далее запуск на 1 секунду D5 (podacha) - HIGH . Опрос D2 идёт пока на A0 не поднимется флаг.
2). Если на A0 флаг поднят, запускается; D3 (podgotovka) - HIGH на 10 сек, так же параллельно но с задержкой в 2 сек пин D4 (otkritie) - HIGH с длительностью на 3 секунды, после отработки 10 секундного таймера D3, запуск на 3 сек D4, далее через 2 сек идёт опрос D2 (возврат к первому 1). пункту).
Нам товарищ помог написать код, но сейчас помочь не может, обстоятельства, когда стали проверять в симуляторе у нас проблемка появилась, часть мы доработали, но дальше тяму не хватает, а с верху наседают, ещё механику делать.
Частично работает пункт 1)., а именно, нет постоянного опроса D2 перед и после отработки кода по входу с A0, он есть только после включения, а в процессе ожидания нет. Так же после поднятия флага на A0 отрабатывает пин D3 (podgotovka) - HIGH на 10 сек, но нет параллельной работы с задержкой в 2 сек пина D4 (otkritie) - HIGH с длительностью на 1 секунду, она есть только после отработки 10 секундного таймера, а нам нужно так, D3-HIGH, через 2 секунды D4 - HIGH на 1 секунду, через 6 секунд D4-HIGH на 1 секунду, D3-LOW, опрос D2. Вод код, если не трудно покажите куда копать. Спасибо.
введ// Определение пинов
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);
currentState = STATE_ALARM;
} else {
// Если флаг опущен, включаем "подача" и ждем 3 секунды
digitalWrite(alarmPin, 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;
}
}
ите или вставьте сюда код