Доброго времени суток. Написал, вернее переделал под себя один скетч. Задача: три кнопки включают и выключают, например, три светодиода. Алгоритм работы кнопок следующий: Нажал кнопку, включил светодиод, отпустил кнопку. Нажал кнопку-выключил светодиод. Программа работает, но не совсем корректно. При удержании кнопки светодиод начинает мигать. Причем частота мигания, зависит от длительности паузы при обработке дребезга контактов. Также кнопки иногда не срабатывают (как при дребезге, хотя антидребезг прописан и в исходном коде работает ) Исходный скетч (обработка одной кнопки с одним светодиодом) работает отлично, при удержании кнопки, светодиод не мигает. Код (C++): boolean butt_flag = 0; boolean butt; boolean led_flag = 0; unsigned long last_press; void setup() { pinMode(3, INPUT_PULLUP); Serial.begin(9600); pinMode(13, OUTPUT); } void loop() { butt = !digitalRead(3); if (butt == 1 && butt_flag == 0 && millis() - last_press > 50) //обработка нажатия { butt_flag = 1; Serial.println("Button was pressed"); led_flag = !led_flag; digitalWrite(13, led_flag); last_press = millis(); } if (butt == 0 && butt_flag == 1 && millis() - last_press > 50) //обработка отпускания { butt_flag = 0; Serial.println("Button was released"); last_press = millis(); } } Затем этот код был был переделан под три кнопки и три светодиода, по аналогии с этим скетчем:http://wiki.amperka.ru/конспект-arduino:мерзкое-пианино Вот что получилось: Код (C++): #define first_button 5 // первый пин с кнопкой #define button_count 3 // общее количество кнопок boolean butt; boolean butt_flag = 0; boolean led_state = LOW; unsigned long last_press = 0; void setup() { Serial.begin(9600); pinMode(5, INPUT_PULLUP); pinMode(6, INPUT_PULLUP); pinMode(7, INPUT_PULLUP); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); } void loop() { for (int i = 0; i < button_count; ++i) // в цикле бежим по всем номерам кнопок от 0-го по 2-й. i это номер кнопки { int button_pin = i + first_button; // на основе номера кнопки вычисляем номер её пина butt = !digitalRead(button_pin); // считываем значение с кнопки. Кнопка нажата-1!!! if (butt == 1 && butt_flag == 0 && millis() - last_press > 100) //проверяем значение { butt_flag = 1; int led_number = i + 8; //рассчитываем номер пина led, на который подаем сигнал led_state = !led_state; digitalWrite(led_number, led_state); last_press = millis(); } if (butt == 0 && butt_flag == 1 && millis() - last_press > 100) { butt_flag = 0; last_press = millis(); } } } Подскажите, что не так. Или посоветуйте программу для обработки двух и более кнопок, желательно простую.
Спойлер: код для одной кнопки и одного светодиода Код (C++): /**/ const byte btn1Pin = 2; bool btn1; unsigned long btn1past; const byte led1Pin = 13; bool led1; //--------------------------------- void setup() { pinMode(btn1Pin, INPUT_PULLUP); btn1 = false; btn1past = millis(); pinMode(led1Pin, OUTPUT); led1 = HIGH; digitalWrite (led1Pin, led1); } void loop() { if (millis() - btn1past >= 100) { switch (btn1) { case false: if (!digitalRead(btn1Pin)) { btn1 = true; btn1past = millis(); led1 = !led1; digitalWrite (led1Pin, led1); } break; case true: if (digitalRead(btn1Pin)) { btn1 = false; btn1past = millis(); break; } } } } /**/ Повтори еще 2 раза и будет для 3 кнопок и 3 светодиодов
Спойлер Код (C++): /**/ class Cl_unit { protected: const byte btn1Pin; bool btn1; unsigned long btn1past; const byte led1Pin; bool led1; public: Cl_unit(byte p1, byte p2): btn1Pin(p1), led1Pin(p2) {} void init() { pinMode(btn1Pin, INPUT_PULLUP); btn1 = false; btn1past = millis(); pinMode(led1Pin, OUTPUT); led1 = HIGH; digitalWrite (led1Pin, led1); } void run() { if (millis() - btn1past >= 100) { switch (btn1) { case false: if (!digitalRead(btn1Pin)) { btn1 = true; btn1past = millis(); led1 = !led1; digitalWrite (led1Pin, led1); } break; case true: if (digitalRead(btn1Pin)) { btn1 = false; btn1past = millis(); break; } } } } }; //-------------------------------- Cl_unit unit1(/*btn*/2,/*led*/13); Cl_unit unit2(/*btn*/3,/*led*/12); Cl_unit unit3(/*btn*/4,/*led*/11); //--------------------------------- void setup() { unit1.init(); unit2.init(); unit3.init(); } void loop() { unit1.run(); unit2.run(); unit3.run(); } /**/
Возьмите эту библиотеку и отрабатывайте любое количество кнопок. В ней реализовано всё и короткое и длинное нажатие и повторение... https://github.com/mathertel/OneButton