// сделать #define для состояния входов (кнопок) 1- по земле или по питанию
// Объявляем необходимые библиотеки
//#include <Arduino.h>
using pvfCallbackShort = void (*)(void); // это тип. указатель на функцию без параметров возвр-ую void
using pvfCallbackLong = void (*)(void); // это тип. указатель на функцию без параметров возвр-ую void
// pvf - необязательная мнемоника типа. pointer to void func
// Определяем пины для кнопки и светодиода
#define BUTTON_PIN 2
#define BUTTON_PIN2 4
#define BUTTON_PIN3 5
#define LED_PIN 13
#define LED_PIN2 12
#define Mirr_LED_PIN 3
//
//bool buttonPressed =false;
// Объявляем переменную для хранения текущей яркости светодиода
int currentBrightness = 0;
// Объявляем
int Direction=1;
void myFunction();
void myFunction2();
void myFunction3();
void myFunction4();
void ChkPressButton(int ButtonPin,pvfCallbackShort MyCallbackShort ,unsigned long ShortButtonPressTime, pvfCallbackLong MyCallbackLong, unsigned long CallbackInterval);
// Функция инициализации
void setup() {
pinMode(BUTTON_PIN, INPUT );
pinMode(BUTTON_PIN2, INPUT );
pinMode(BUTTON_PIN3, INPUT );
pinMode(LED_PIN, OUTPUT);
pinMode(LED_PIN2, OUTPUT);
Serial.begin(9600);
// Direction=5;
}
// Функция основного цикла
void loop() {
ChkPressButton(BUTTON_PIN,myFunction3,200, myFunction,300); // вызываем ChkPressButton, пин кнопки, вызываемая функция при коротком нажатии, длительность короткого нажатия в мсек, вызываемая функция при длительном нажатии, период вызова функции длительного нажатия.
ChkPressButton(BUTTON_PIN2,myFunction3,200, myFunction2,300); // вызываем ChkPressButton, пин кнопки, вызываемая функция при коротком нажатии, длительность короткого нажатия в мсек, вызываемая функция при длительном нажатии, период вызова функции длительного нажатия.
ChkPressButton(BUTTON_PIN3,myFunction3,200, myFunction4,1000); // вызываем ChkPressButton, пин кнопки, вызываемая функция при коротком нажатии, длительность короткого нажатия в мсек, вызываемая функция при длительном нажатии, период вызова функции длительного нажатия.
digitalWrite(Mirr_LED_PIN,digitalRead(BUTTON_PIN));
}
void myFunction()
{
// PWM LED
static int brightness=0 ; // уставливаем начально значение яркости
static int fadeAmount=5 ; // шаг приращения/убывания яркости
// Ваш код для функции, которую нужно вызывать каждые CallbackInterval миллисекунд при длительном нажатии
// устанавливаем значение широты импульса на выходе 9
// задавая яркость светодиода
//analogWrite(PIN, brightness);
// измением значение в переменной для яркости
brightness = brightness + fadeAmount*Direction;
Serial.println(" brightness=");
Serial.println(brightness);
Serial.println(" Direction=");
Serial.println(Direction);
// при достижение крайних значений для яркости
// меняем знак переменной шага приращения/убывания яркости
if ( brightness >= 255) {brightness=255;}
if (brightness <= 0 ) {brightness=0;}
}
void myFunction2() {
// Ваш код для функции, которую нужно вызывать каждые CallbackInterval миллисекунд при длительном нажатии
Serial.println(" код для функции2");
digitalRead(LED_PIN) ? digitalWrite(LED_PIN, LOW): digitalWrite(LED_PIN, HIGH) ;
}
void myFunction3() {
// Ваш код для функции, которую нужно вызывать при коротком нажатии
Serial.println("Короткое нажатие");
digitalRead(LED_PIN) ? digitalWrite(LED_PIN, LOW): digitalWrite(LED_PIN, HIGH) ;
}
void myFunction4() {
// Ваш код для функции, которую нужно вызывать каждые CallbackInterval миллисекунд при длительном нажатии
Serial.println(" код для функции2");
digitalRead(LED_PIN2) ? digitalWrite(LED_PIN2, LOW): digitalWrite(LED_PIN2, HIGH) ;
}
void ChkPressButton(int ButtonPin,pvfCallbackShort MyCallbackShort ,unsigned long ShortButtonPressTime, pvfCallbackLong MyCallbackLong, unsigned long CallbackInterval)
{
unsigned long RattlingCycle = 10; // значение количества прошедших циклов (счетчик) после отжатия кнопки при котором считается что кнопка гарантированно отжата (для антидребезга )
unsigned long RattlingTime = 10; // время (в мсек.) после нажаваия кнопки при котором считается что кнопка гарантированно нажата (для антидребезга )
// Объявляем переменные для отслеживания длительности удержания кнопки
static unsigned long buttonPressStartTime ; // момент время при котором кнопка была нажата (для определения длительности нажатия)
static unsigned long buttonPressEndTime ; // время прошедшее после нажатия и удержания кнопки в мсек. (для определения длительности нажатия. =(текущее время)-(время при котором кнопка была нажата))
static unsigned long buttonUnPressedCount ; // счетчик циклов контроллера после отжатия кнопки (для определения длительности отжатой кнопки.Если кнопка отжата считаем сколько циклов выполнения программы контроллера прошло)
static byte buttonPressedCount ; // признак длительности нажатия(короткое =1 , длинное=2. обрабатывается при отпускании кнопки)
//
// Объявляем переменные для хранения времени при вызове пользовательской функции
static unsigned long previousMillis ; // хранит значение предыдущего момента времени для переодического вызова функции длинного нажатия с периодом CallbackInterval
//
int buttonState = digitalRead(ButtonPin); // Проверяем состояние кнопки
if (buttonState == HIGH) // Если кнопка нажата
{ //Serial.println("Короткое нажатие");
//Serial.println("Короткое нажатие");
// Запоминаем время начала нажатия
if (buttonPressStartTime ==0) // Если до этого кнопка была отжата
{
buttonPressStartTime = millis();
}
// Проверяем длительность удержания кнопки
buttonPressEndTime = millis() - buttonPressStartTime;
//Serial.print("buttonPressEndTime = ");
//Serial.println(buttonPressEndTime);
if (buttonPressEndTime >= RattlingTime ) {buttonUnPressedCount=0;} //если кнопка гарантировано нажата то сбрасываем счетчик отпущенной кнопки
if (buttonPressEndTime >= RattlingTime && buttonPressEndTime <= ShortButtonPressTime) //если кнопка гарантировано нажата в течении короткого периода (короткое нажатие)
{
buttonPressedCount=1; // формируем признак нажатия кнопки 1= короткое.(обрабатывается при отпускании кнопки)
//Serial.println(" период короткого нажатия ");
}
if (buttonPressEndTime > ShortButtonPressTime) // если нажатие длинное
{
buttonPressedCount=2; // перезаписываем признак нажатия кнопки 2= длинное. (обрабатывается при отпускании кнопки)
// Получаем текущее время с помощью функции millis()
unsigned long currentMillis = millis();
// Если прошло достаточно времени с момента последнего вызова функции
if (currentMillis - previousMillis >= CallbackInterval)
{
//Serial.println(" !период длинного нажатия! ");
// Serial.print(" currentMillis - previousMillis ");
// Serial.println(currentMillis - previousMillis);
// Запоминаем текущее время как новый момент времени для вызова функции
previousMillis = currentMillis;
// Вызываем нашу функцию
// функция, принимающая параметром указатель на другую функцию
if (MyCallbackLong != NULL) MyCallbackLong(); //!!! вызов функции по событию длинное нажатие с периодом CallbackInterval
}
//*****************************111111111111
//Serial.println("период нажатия 2");
}
} else
{ //buttonPressStartTime=0;
buttonUnPressedCount=buttonUnPressedCount+1; // кнопка отпущена то увеличиваем счетчик отжатия кнопки каждый цикл
if (buttonUnPressedCount>=10000000) {buttonUnPressedCount=RattlingCycle;}// если количество циклов прошедших после отжатия кнопки превысило заданное значение ,то сбрасывае счетчик до значения RattlingCycle (чтоб не было переполнения)
//if (buttonPressed && buttonUnPressedCount >=10)
if (buttonPressedCount>0 && buttonUnPressedCount >=RattlingCycle)
{
if (buttonPressedCount ==1)
{
if (MyCallbackShort != NULL) MyCallbackShort(); //!!! вызов функции по событию короткое нажатие
//myFunction3();
Serial.println("короткое 0");
Serial.print("buttonPressedCount =");
Serial.println(buttonPressedCount );
}
if (buttonPressedCount ==2)
{
Direction = -Direction ; // направление приращения
Serial.println("Длинное нажатие 2");
Serial.print("buttonPressedCount2 =");
Serial.println(buttonPressedCount );
//Serial.print("Direction =");
//Serial.println(Direction );
//digitalRead(LED_PIN) ? digitalWrite(LED_PIN, LOW): digitalWrite(LED_PIN, HIGH) ;
}
//currentBrightness = 0;
//digitalWrite(LED_PIN, HIGH);
//currentBrightness = 0;
//digitalWrite(LED_PIN, LOW);
buttonPressStartTime = 0;
buttonPressEndTime = 0;
buttonPressedCount=0;
}
}
}
//