conosco tutto quello da te descritto, e di prove con switch case e millis per i debouce e millis per i ritardi alla pressione ne ho già provati, solo che non riuscendo a trovare una soluzione volevo ripartire da capo magari con suggerimenti diversi per vedere dove sbagliavo.
tutti e due i pulsanti hanno resistenze di pullup esterne.
#include <Adafruit_NeoPixel.h>
#define PIN 6
#define PIN 7
const int left =2;
const int right= 3;
boolean toggle = false ;
boolean toggle1= false;
boolean toggle2 = false;
bool leftNew ;
bool rightNew;
bool leftLast = 1;
bool rightLast = 1;
bool left_state ;
bool right_state;
long buttonTimer = 0;
long rightTimer =0;
long leftTimer =0;
long longLeftTime = 500;
long longRightTime = 500;
long longPressTime = 200;
bool longPressActive = false;
bool longLeftActive = false;
bool longRightActive =false;
bool LEDLeftState=false;
bool LEDRightState = false;
bool LED2State= false;
int dt(50);
Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(6, 6, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strip2 = Adafruit_NeoPixel(4, 7, NEO_GRB + NEO_KHZ800);
void setup() {
pinMode ( left, INPUT);
pinMode (right, INPUT);
strip1.begin();
strip2.begin();
strip1.show();
strip2.show();
Serial.begin(9600);
}
void loop() {
//Serial.println(right,DEC);
leftNew = digitalRead(left);
delay(dt);
rightNew = digitalRead(right);
delay(dt);
/* if (leftNew && rightNew) {
if (!toggle1 && !toggle && !toggle2) {
toggle2 = true;
buttonTimer = millis();
}
if ((millis() - buttonTimer > longPressTime) && (longPressActive == false)) {
longPressActive = true;
LED2State = !LED2State;
}
} else {
if (toggle2 == true ) {
if (longPressActive == true) {
longPressActive = false;
}
}
toggle2 = false;
}*/
// ritardo destro
if ( toggle1== false && rightNew == true && leftNew == false ) {
//if ( !toggle2 && !toggle1) {
if (toggle == false ){
toggle = true;
rightTimer = millis();
}
//}
if ((millis() - rightTimer > longRightTime) && (longRightActive == false)) {
longRightActive = true;
LEDRightState = !LEDRightState;
}
} else {
if (toggle == true ) {
if (longRightActive == true) {
longRightActive = false;
}
toggle = false;
}
}
// ritardo sinistro
if ( toggle == false && leftNew == true && rightNew == false ) {
// if ( !toggle2 && !toggle) {
if (toggle1 == false ){
toggle1 = true;
leftTimer = millis();
}
// }
if ((millis() - leftTimer > longLeftTime) && (longLeftActive == false)) {
longLeftActive = true;
LEDLeftState = !LEDLeftState;
}
} else {
if (toggle1 == true ) {
if (longLeftActive == true) {
longLeftActive = false;
}
toggle1 = false;
}
}
if (LED2State){
Blinker (strip2.Color(255, 40, 0),200);
}
else{
Blinker (strip2.Color(0, 0, 0),0);
}
if (LEDLeftState){
ArrowLeft(strip1.Color(255, 40, 0),500,90); //orange
}
else{
ArrowLeft(strip1.Color(0, 0, 0),0,0);
}
if (LEDRightState){
ArrowRight(strip2.Color(255, 40, 0),500,150); //orange
}
else{
ArrowRight(strip2.Color(0, 0, 0),0,0); //orange
}
}
void Blinker(uint32_t c, uint8_t wait) {
strip1.fill(c, 0,6);
strip2.fill(c, 0,4);
strip1.show();
strip2.show();
delay(wait);
strip1.fill(0, 0,6);
strip2.fill(0, 0,4);
strip1.show();
strip2.show();
delay(wait);
}
void ArrowLeft(uint32_t c,uint8_t wait,uint8_t wait1 ) {
strip1.fill(c, 0,6);
strip1.show();
delay(wait);
for (uint16_t i =strip1.numPixels(); i<=6; i --) {
strip1.setPixelColor(i, 0);
strip1.show();
delay(wait1);
}
}
void ArrowRight(uint32_t c,uint8_t wait,uint8_t wait1) {
strip2.fill(c, 0,4);
strip2.show();
delay(wait);
for (uint16_t i = strip2.numPixels(); i<=4; i -- ) {
strip2.setPixelColor(i, 0);
strip2.show();
delay(wait1);
}
}
questa è una delle ultime soluzioni che ho provato, in pratica mettendo un ritardo alla pressione singola.
e un ritardo piu corto alla pressione contemporanea, ma nonostante la negazione degli stati singoli, quando premo il contemporaneo e poi premo uno dei singoli, la funzione del singolo si attiva lo stesso.
dagli un’occhiata
grazie