Нужно что бы при нажатии включался зеленый круг и горел до следующего нажатия ( выключался ) Перепробовал кучу всего толку ноль, delay да задерживаю выключение ( Спасибо за помощь Вот Код: Код (C++): #include <RGBmatrixPanel.h> #define CLK 8 #define OE 9 #define LAT 10 #define A A0 #define B A1 #define C A2 //#define D A3 RGBmatrixPanel matrix(A, B, C, CLK, LAT, OE, false); boolean butt_flag = 0; boolean butt; boolean led_flag = 1; unsigned long last_press; void setup() { pinMode(12, INPUT); matrix.begin(); int width = matrix.width(); int height = matrix.height(); Serial.begin(9600); } void loop() { //matrix.begin(); int width = matrix.width(); int height = matrix.height(); // выводим текст из буфера на матрицу butt = digitalRead (12); if (butt== 0 && butt_flag == 1&& millis()- last_press +1 ) { butt_flag = 0; Serial.println ("butt_ON"); led_flag = !led_flag; digitalWrite(12, led_flag); matrix.fillCircle(width / 4, height / 2, 7, matrix.Color333(0, 7, 0)); delay(5000); } if (butt== 1 && butt_flag == 0) { butt_flag = 1; Serial.println ("butt_Off"); matrix.fillCircle(width / 4, height / 2, 7, matrix.Color333(0, 0, 0)); } }
с таким кодом - без дребезга - купил сенсорную кнопку - там тригированное состояние выхода - то что надо
Нужен триггер. Попробуйте так, со своими доработками: Код (C++): #include <RGBmatrixPanel.h> RGBmatrixPanel matrix(A, B, C, CLK, LAT, OE, false); bool state = false, on = false; void setup() { pinMode(12, INPUT); } void loop() { bool butt = digitalRead (12); // trigger if (butt == 1 && !on) { state = !state; on = true; } if (butt == 0) on = false; // your code if (state) { matrix.fillCircle(width / 4, height / 2, 7, matrix.Color333(0, 7, 0)); } else { matrix.fillCircle(width / 4, height / 2, 7, matrix.Color333(0, 0, 0)); } }
у меня в детстве была магнитола RIGA 110. В ней были кнопки с фиксацией. Нажал кнопку - радиво включилось. Ещё раз нажал - радиво выключилось. Если уж так хочется дурину, то можно примотать сбоку синей изолентой.
Так работать не будет. У вас не обрабатывается дребезг контактов. Как минимум нужна пауза после "state =!state;" А с вашим кодом при нажатии кнопки лампочка очень быстро незаметно для глаза моргнет много раз, а после отпускания кнопки её состояние будет случайным.
Да, я думал про это. Тогда лучше добавить задержку после триггера, потому что при отпускании тоже может дребезжать. Код (C++): // trigger if (butt == 1 && !on) { state = !state; on = true; } if (butt == 0) on = false; delay(50);
Не будет там никаких морганий и случайных состояний. Все там будет нормально. Разве что кнопка раздолбанная в хлам или трясущимися руками два провода замыкать. Всегда так делаю без всяких делеев, дебоунсов() и т.п. И даже на макетке при замыкании проводками все нормально переключается. Но я еще во второе условие тоже добавляю проверку флага Код (C++): if (butt == 1 && !on) { state = !state; on = true; } if (butt == 0&& on) on = false;
кнопку достаточно опрашивать раз в 100 мс. За это время все дребезги гарантированно закончатся. Между опросами тупо спать.
Desert-Eagle, кстати, не забудьте подключить ко входу с кнопкой внешний подтягивающий резистор 10кОм на землю. Иначе на входе будет скакать то ноль, то единица. Или подключайте внутренний резистор pinMode(12, INPUT_PULLUP). Но он подтягивает к плюсу. Придётся кнопку замыкать на землю и код поправить соответственно. Код (C++): #include <RGBmatrixPanel.h> RGBmatrixPanel matrix(A, B, C, CLK, LAT, OE, false); bool state = false, on = false; void setup() { pinMode(12, INPUT_PULLUP); } void loop() { bool butt = digitalRead (12); // trigger if (butt == 0 && !on) { state = !state; on = true; } if (butt == 1 && on) on = false; delay(50); // your code if (state) { matrix.fillCircle(width / 4, height / 2, 7, matrix.Color333(0, 7, 0)); } else { matrix.fillCircle(width / 4, height / 2, 7, matrix.Color333(0, 0, 0)); } }
а почему "придется"? - звучит так, как будто замыкать на GND - это что-то неправильное? Вообще-то это как раз более правильно, в проф оборудовании кнопки замыкают именно на GND