Автоматика для посева саженцев

Здравствуйте. Начал изучать программирование, с ребятами в колледже собираем первое устройство автоматики посадки саженцев, схему отрабатываем на симуляторе в протэусе, помогите “плиз” разобраться с кодом.

Тело “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;
  }
}
ите или вставьте сюда код

это в смысле такая сеялка для маленьких елок, которая их в землю втыкает? а фотки или видео есть?

Мы студенты, это проект на летнюю выставку “Старт в науку”, пока разработали алгоритм посадки, если с мозгами всё выйдет, то будем рисовать и печатать на 3 дешке механику. Сначала думали на сервоприводах сделать, но решили пойти сложным путём с сделать на электромагнитах. У нас были сервоприводы MG 90 но они сдохли при экспериментах, качество плохое, или замучили их.

то есть, вы сейчас изобретаете управляющую часть под несуществующий исполнительный механизм?

ты че, студентом не был)))

1 лайк

был)))))) интересно как щас с этим))

Черт, нечайно удалил сообщение. Да, макета у нас пока нет, ибо есть риск создав механику и потратив 3D пластик, не сможем реализовать управление. Мы два года назад собирали рентген, начинали с ZVS драйвера, потом поиска ТВС, потом собрали умножители, далее купили лампу. Фото могу показать.

ну вот видишь, ниче не меняется, сначала бассейн, научитесь плавать, нальем воды)

2 лайка

покажи, интересно.

Я уверенно рисую в солид ворксе, по программист с меня пока не ахти. Вся механика в голове, чтоб её опробовать нужно управление. Если нужно мы заплатим, если не дорого будет.

приятно видеть, что у молодых пацанов такие свойства есть. Не просри эту способность, держать в голове сложные вещи.

1 лайк

Мы синхронизировали фотик с запуском схемы, на фотике выдержку выставили и готово. Только потом наставник по кружку забрал у нас его, чтоб не облучались.

какой симулятор?

Протеус. Я в нем рисую схему и проверяю код.

ну осталось скинуть проект протеуса с полным кодом, чтоб желающие могли полноценно помочь.
у меня протеус на другом компе только, будет время и желание тоже гляну, но это не точно))

Знать бы ещё как с кодом скидывать, рисовать и как сохранять схему как я знаю, а вот как с кодом (((

Я правлю код в ардуине иде, компилирую, рисую схему в протеусе и там подкидую хекс с иде и проверяю.

Опиши просто словами, как ты представляешь работу своей сажалки