Otto17
New member
Такая проблема, вроде и не сложная, но не могу понять как решить. Переделал функцию button1() на кнопке №1, что бы при обычных (коротких) нажатиях переключался regim1 на значения 0 или 1, а при удержании этой кнопки 2 или более секунд включался режим auto с функции pir() (датчика движения). Так вот, кнопка отлично переключается во всех трёх режимах, но почему то при выборе auto режима функция pir() не срабатывает. Возможно где то перепутал с условиями проверок в функции button1()....
На всякий случай прикладываю код программы, для понимания в архиве...
Код:
***
boolean Status1 = true; // объявляем Status1 реле в 0, инверсия...
boolean btnPress1 = false; // объявляем что кнопка №1 не нажата "0"
boolean lastbtnStat1 = false; // временная переменная для хранения статуса1
int regim1 = 0; // Режимы по умолчанию при включении
bool button_long_state = false; // Булево значение для выбора режима button1()
uint32_t ms_button = 0; // Беззнаковый тип конкретного размера для выбора режима button1()
***
void button1() { // Функция для кнопки №1
btnPress1 = digitalRead(BUTTON_1); // Считываем значение кнопки в btnPress1
Status1 = digitalRead(RELAY_1); // Считываем значение реле в Status1
if (btnPress1 && !lastbtnStat1) { // Если btnPress1 нажата и lastbtnStat1 ИСТИНА...
delay(30); // защита от дребезга
btnPress1 = digitalRead(BUTTON_1); // ... записываем результат в btnPress1
}
uint32_t ms = millis(); //Задаём переменную для хранения времени
// Фиксируем нажатие кнопки (более 10 мкр./сек.)
if (btnPress1 == false && !lastbtnStat1 && (ms - ms_button) > 10) {
lastbtnStat1 = true;
button_long_state = false;
ms_button = ms;
}
// Фиксируем длинное нажатие кнопки (больше или равно 2-м секундам)
if (btnPress1 == false && !button_long_state && ( ms - ms_button ) >= 2000 ) {
button_long_state = true;
regim1 = 2;
pir();
}
// Фиксируем отпускание кнопки (более 10 мкр./сек.)
if (btnPress1 == true && !lastbtnStat1 && ( ms - ms_button ) > 10) {
lastbtnStat1 = false;
ms_button = ms;
// Цикл проверки/переключения 0 и 1 режима
if (btnPress1) { // Если кнопка нажата, то...
regim1++; // переключаем на слежующий режим
if (regim1 > 1) { // если действующий режим > второго, то...
regim1 = 0; // возвращаемся на нулевой режим
}
}
if (regim1 == 0) { // Если режим 1=0, то...
Status1 = true; // Status1 ИСТИНА (инверсия для Реле)
digitalWrite(RELAY_1, Status1); // Выключаем Реле №1
}
if (regim1 == 1) { // Если режим 1=1, то...
Status1 = false; // Status1 ЛОЖЬ (инверсия для Реле)
digitalWrite(RELAY_1, Status1); // Включаем реле №1
}
}
lastbtnStat1 = btnPress1; // Копируем значение из кнопки в lastbtnStat1
}
Вложения
-
12.4 KB Просмотры: 16