1 (2024-03-09 21:14:10 отредактировано v1ct0r)

Тема: 3 таймера

Добрый день!

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

- нажимается кнопка "пуск"
- зажигается светодиод оптопары, дает разрешение на работу процесса и ждет сигнала от датчика
- по истечении 500мс, если ничего не происходит, светодиод(разрешение процесса) должен выключится и включиться регулируемая потенциометром пауза длительностью 0.5 - 4 сек, после чего все повторяется (если кнопка "пуск" остается нажатой)
- пока есть разрешение(горит светодиод), если пришел сигнал с датчика, должно включиться реле на регулируемое вторым потенциометром время от 10мс до 500мс и затем также включается пауза 0.5-4сек
- режим "паза" наступает в любом из следующих случаев, который произойдет раньше:
1. отпускание кнопки "пуск"
2. истечение времени 500мс, после нажатия и длительного удержания кнопки "пуск"(если ничего не происходит)
3. истечение времени 10мс - 500мс после прихода сигнала с датчика

после окончания паузы 0.5-4 сек если кнопка "пуск" не нажата ничего не происходит, если нажата, то цикл повторяется

согласно алгоритму я "родил" скетч программы и нарисовал схему


http://forum.rcl-radio.ru/uploads/images/2024/03/0f0f208b3ca3dacd382d4767c712069b.jpg

//       !!!ВНИМАНИЕ!!!
//пины ввода/вывода можно заменить на любые удобные
//только в строках #define !!!
//кроме А0 и А1 - их можно менять на любые аналоговые

#define PUSK_PIN 8      // номер вывода кнопки "пуск"
#define DATCHIK_PIN 9   // номер вывода сигнала датчика 
#define LedPUSK_PIN 10  // номер вывода светодиода "пуск"
#define LedPAUSA_PIN 11 // номер вывода светодиода "пауза"
#define RELE_PIN 12     // номер вывода светодиодa c реле

unsigned long tmr ;     // переменная таймера
unsigned long tmr1 ;    // переменная таймера1

void setup() {
  pinMode(PUSK_PIN, INPUT_PULLUP);    // кнопка пуск
  pinMode(DATCHIK_PIN, INPUT_PULLUP); // !!!сигнал с датчика-"0"!!!
  pinMode(LedPUSK_PIN, OUTPUT);       // индикация пуска
  pinMode(LedPAUSA_PIN, OUTPUT);      // индикация паузы
  pinMode(RELE_PIN, OUTPUT);          // реле и светодиод
}
void loop() {
  if ( digitalRead(PUSK_PIN) == LOW ) //если кнопка пуск нажата
  { delay(20);                  //задержка на дребезг контактов
    digitalWrite(LedPUSK_PIN, HIGH);  // вкл. светодиода "пуск"

    tmr = millis();
tmr:
    if (millis() - tmr < 500) //время включенного светодиода "пуск"
    {
      if ( digitalRead(PUSK_PIN) == HIGH) //пауза если отжата "пуск"
      {
        goto pauza;
      }
      if ( digitalRead(DATCHIK_PIN) == LOW) //если есть сигнал датчика
      {
        digitalWrite(RELE_PIN, HIGH);      // вкл.реле и светодиода

 //время на отключение реле регулировка(мс) переменным резистором
        int t1 =  analogRead(A1) / 2 ;
        tmr1 = millis();
tmr1:
        if (millis() - tmr1 > t1 or
            digitalRead(PUSK_PIN) == HIGH)
        {
          goto pauza;
        }
        goto tmr1;
      }
      goto tmr;
    }
pauza:
    digitalWrite(LedPUSK_PIN, LOW);  // выкл. светодиода "пуск"
    digitalWrite(RELE_PIN, LOW);      //выключение реле
    digitalWrite(LedPAUSA_PIN, HIGH); //индикация паузы
    //регулировка паузы(мс) переменным резистором
    int t0 = 4 * analogRead(A0);
    delay(t0);                         //время паузы
    digitalWrite(LedPAUSA_PIN, LOW);  //конец паузы
  }
}

все работает! человек остался доволен

То что Вы сотворили просто конструктор и очень легко настраиваемый и понимаемый. Такого в интернете я нигде не находил когда искал.


но... недоволен я


я  в программировании профаном себя уже не считаю, но и до программиста мне еще далеко, скажем так я себя оцениваю в программировании как Дилетант(с большой буквы smile )

объясните мне пожалуйста, если не трудно, почему в строках программы

if (millis() - tmr < 500)

и

if (millis() - tmr1 > t1

которые выполняют в общем то одинаковые действия, для правильной отработки выдержки в первом случае мне пришлось ставить "<"(воспользовавшись методом "научного тыка"),  а во втором "> " ???

у меня уже мозги "кипят" - не понимаю sad


и еще, как можно было бы обойтись в данном алгоритме  без  "goto"?
мне без них не удалось реализовать поставленную задачу sad