Делаю контроллер управления нагрузками.
#define BUTTON_PIN_2 19
#define BUTTON_PIN_1 18
short bounceTime = 100; // задержка для подавления дребезга
short doubleTime = 2000; // время, в течение которого нажатия можно считать двойным
short i_1 = 0;
short i_2 = 0; // Счетчик для подсчета количества двойных нажатий кнопки
boolean lastReading_1 = false; // флаг предыдущего состояния кнопки
boolean lastReading_2 = false;
boolean buttonSingle_1 = false; // флаг состояния "краткое нажатие"
boolean buttonMulti_1 = false; // флаг состояния "двойное нажатие"
boolean buttonSingle_2 = false; // флаг состояния "краткое нажатие"
boolean buttonMulti_2 = false;
boolean read_1 = 0;
boolean read_2 = 0;
boolean read_3 = 0;
boolean read_4 = 0;
long onTime = 0; // переменная обработки временного интервала
long lastSwitchTime = 0; // переменная времени предыдущего переключения состояния
void setup(){
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
Serial.begin(9600); // Настройка последовательного порта для вывода данных
}
void loop(){
// Считывание состояния кнопки
boolean reading_1 = digitalRead(BUTTON_PIN_1);
boolean reading_2 = digitalRead(BUTTON_PIN_2);
// проверка первичного нажатия
if (reading_1 && !lastReading_1){
// Если кнопка только что была нажата (текущее состояние кнопки "reading" равно true, а предыдущее состояние "lastReading" равно false),
// то сохраняем текущее время в переменную "onTime"
onTime = millis();
}
if (reading_2 && !lastReading_2){
// Если кнопка только что была нажата (текущее состояние кнопки "reading" равно true, а предыдущее состояние "lastReading" равно false),
// то сохраняем текущее время в переменную "onTime"
onTime = millis();
}
// Проверка отпускания кнопки
if (!reading_1 && lastReading_1){
// Если кнопка только что была отпущена (текущее состояние кнопки "reading" равно false, а предыдущее состояние "lastReading" равно true),
// то проверяем, прошла ли задержка для подавления дребезга
if (((millis() - onTime) > bounceTime)){
// Если прошла задержка для подавления дребезга, то проверяем, прошло ли достаточно времени с момента последнего переключения для определения двойного нажатия
if ((millis() - lastSwitchTime) >= doubleTime){
// Если прошло достаточно времени с момента последнего переключения, то устанавливаем флаг "buttonSingle" в true,
// сбрасываем счетчик "i" в 1 и обновляем время последнего переключения "lastSwitchTime"
lastSwitchTime = millis();
buttonSingle_1 = true;
i_1=1;
} else {
// Если не прошло достаточно времени, то увеличиваем счетчик "i" и обновляем время последнего переключения "lastSwitchTime",
// а также устанавливаем флаг "buttonSingle" в false и флаг "buttonMulti" в true
i_1++;
lastSwitchTime = millis();
buttonSingle_1 = false;
buttonMulti_1 = true;
}
}
}
if (!reading_2 && lastReading_2){
// Если кнопка только что была отпущена (текущее состояние кнопки "reading" равно false, а предыдущее состояние "lastReading" равно true),
// то проверяем, прошла ли задержка для подавления дребезга
if (((millis() - onTime) > bounceTime)){
// Если прошла задержка для подавления дребезга, то проверяем, прошло ли достаточно времени с момента последнего переключения для определения двойного нажатия
if ((millis() - lastSwitchTime) >= doubleTime){
// Если прошло достаточно времени с момента последнего переключения, то устанавливаем флаг "buttonSingle" в true,
// сбрасываем счетчик "i" в 1 и обновляем время последнего переключения "lastSwitchTime"
lastSwitchTime = millis();
buttonSingle_2 = true;
i_2=1;
} else {
// Если не прошло достаточно времени, то увеличиваем счетчик "i" и обновляем время последнего переключения "lastSwitchTime",
// а также устанавливаем флаг "buttonSingle" в false и флаг "buttonMulti" в true
i_2++;
lastSwitchTime = millis();
buttonSingle_2 = false;
buttonMulti_2 = true;
}
}
}
// Сохранение текущего состояния кнопки
lastReading_1 = reading_1;
// Проверка состояния "краткое нажатие" и времени с момента последнего переключения
if (buttonSingle_1 && (millis() - lastSwitchTime) > doubleTime){
// Если флаг "buttonSingle" установлен в true и прошло достаточно времени с момента последнего переключения,
// вызываем функцию для обработки состояния "краткое нажатие"
isButtonSingle_1();
}
// Проверка состояния "двойное нажатие" и времени с момента последнего переключения
if (buttonMulti_1 && (millis() - lastSwitchTime) > doubleTime){
// Если флаг "buttonMulti" установлен в true и прошло достаточно времени с момента последнего переключения,
// вызываем функцию для обработки состояния "двойное нажатие" и передаем ей значение счетчика "i"
isButtonMulti_1(i_1);
}
lastReading_2 = reading_2;
// Проверка состояния "краткое нажатие" и времени с момента последнего переключения
if (buttonSingle_2 && (millis() - lastSwitchTime) > doubleTime){
// Если флаг "buttonSingle" установлен в true и прошло достаточно времени с момента последнего переключения,
// вызываем функцию для обработки состояния "краткое нажатие"
isButtonSingle_2();
}
// Проверка состояния "двойное нажатие" и времени с момента последнего переключения
if (buttonMulti_2 && (millis() - lastSwitchTime) > doubleTime){
// Если флаг "buttonMulti" установлен в true и прошло достаточно времени с момента последнего переключения,
// вызываем функцию для обработки состояния "двойное нажатие" и передаем ей значение счетчика "i"
isButtonMulti_2(i_2);
}
}
// Функция для обработки состояния "краткое нажатие"
void isButtonSingle_1(){
// Сбрасываем флаги состояний "краткое нажатие" и "двойное нажатие"
buttonMulti_1 = false;
buttonSingle_1 = false;
// Выводим значение 1 в последовательный порт
Serial.println("a1");
read_1 = !read_1;
digitalWrite(2, read_1);
}
// Функция для обработки состояния "двойное нажатие"
void isButtonMulti_1( short count ){
// Сбрасываем флаги состояний "краткое нажатие" и "двойное нажатие"
buttonSingle_1 = false;
buttonMulti_1 = false;
// Выводим значение count (количество нажатий) в последовательный порт
Serial.println("a" + count);
read_2 = !read_2;
digitalWrite(3, read_2);
}
// Функция для обработки состояния "краткое нажатие"
void isButtonSingle_2(){
// Сбрасываем флаги состояний "краткое нажатие" и "двойное нажатие"
buttonMulti_2 = false;
buttonSingle_2 = false;
// Выводим значение 1 в последовательный порт
Serial.println("b1");
read_3 = !read_3;
digitalWrite(4, read_3);
}
// Функция для обработки состояния "двойное нажатие"
void isButtonMulti_2( short count ){
// Сбрасываем флаги состояний "краткое нажатие" и "двойное нажатие"
buttonSingle_2 = false;
buttonMulti_2 = false;
// Выводим значение count (количество нажатий) в последовательный порт
Serial.println("b" + count);
read_4 = !read_4;
digitalWrite(5, read_4);
}
Схема подключения:
Нагрузка 1 + (d2) - (GND)
Нагрузка 2 + (d3) - (GND)
Нагрузка 3 + (d4) - (GND)
Нагрузка 4 + (d5) - (GND)
Кнопка 1 a4 к GND (через резистор к 5В)
Кнопка 2 a5 к GND (через резистор к 5В)
Переключение происходит хаотично
и на мониторе порта вообще чушь происходит
4
2
1
1
a1
b1
b1
a1
a1
a1
a1
Я так понимаю проблема аппаратного плана, но не знаю как решить.