Тема: 3 таймера
Добрый день!
на другом форуме человек обратился с просьбой помочь со схемой управления какого то процесса, которая должна обеспечить следующий алгоритм работы
- нажимается кнопка "пуск"
- зажигается светодиод оптопары, дает разрешение на работу процесса и ждет сигнала от датчика
- по истечении 500мс, если ничего не происходит, светодиод(разрешение процесса) должен выключится и включиться регулируемая потенциометром пауза длительностью 0.5 - 4 сек, после чего все повторяется (если кнопка "пуск" остается нажатой)
- пока есть разрешение(горит светодиод), если пришел сигнал с датчика, должно включиться реле на регулируемое вторым потенциометром время от 10мс до 500мс и затем также включается пауза 0.5-4сек
- режим "паза" наступает в любом из следующих случаев, который произойдет раньше:
1. отпускание кнопки "пуск"
2. истечение времени 500мс, после нажатия и длительного удержания кнопки "пуск"(если ничего не происходит)
3. истечение времени 10мс - 500мс после прихода сигнала с датчика
после окончания паузы 0.5-4 сек если кнопка "пуск" не нажата ничего не происходит, если нажата, то цикл повторяется
согласно алгоритму я "родил" скетч программы и нарисовал схему
// !!!ВНИМАНИЕ!!!
//пины ввода/вывода можно заменить на любые удобные
//только в строках #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); //конец паузы
}
}
все работает! человек остался доволен
То что Вы сотворили просто конструктор и очень легко настраиваемый и понимаемый. Такого в интернете я нигде не находил когда искал.
но... недоволен я
я в программировании профаном себя уже не считаю, но и до программиста мне еще далеко, скажем так я себя оцениваю в программировании как Дилетант(с большой буквы )
объясните мне пожалуйста, если не трудно, почему в строках программы
if (millis() - tmr < 500)
и
if (millis() - tmr1 > t1
которые выполняют в общем то одинаковые действия, для правильной отработки выдержки в первом случае мне пришлось ставить "<"(воспользовавшись методом "научного тыка"), а во втором "> " ???
у меня уже мозги "кипят" - не понимаю
и еще, как можно было бы обойтись в данном алгоритме без "goto"?
мне без них не удалось реализовать поставленную задачу