funzioni non comprese

#include <Adafruit_NeoPixel.h>

#define PIN 6
#define PIN 7
const int left =2;
const int right= 3;
boolean toggle ;
boolean toggle1;
bool leftNew ;
int rightNew;
bool leftLast = 1;    
int rightLast = 1;
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() {
  rightNew = digitalRead(right);
  if (rightLast == 0 && rightNew == 1) {

    if (toggle1 == false) {

      ArrowRight2(strip2.Color(255, 40, 0), 100);


      toggle1 = true;

    }
  }
  else {

    // ArrowRight2(strip2.Color(255, 40, 0), 100,!toggle1);
    //  strip2.fill(0, 0,4);
    // strip2.show();
    // ArrowRight( strip2.Color(0, 0, 0),0);
    toggle1 = false;

  }




  rightLast = rightNew;
  delay(dt);
  //Serial.print(toggle1,DEC);
  //Serial.print("  ");
  //Serial.println(rightLast,DEC);
}
void ArrowRight2(uint32_t c, uint8_t wait) {
      strip2.fill(c, 0,4);
      strip2.show();
      delay(300);
    
    for (uint16_t i = strip2.numPixels(); i<=4; i -- ) {
           strip2.setPixelColor(i, 0);
           strip2.show();
           delay(70);
    }
   
}

Buongiorno a tutti.
Vorrei capire perchè se chiamo la funzione, dopo la prima pressione, la esegue solo una volta…cosa non capisco? perchè non continua a ripetersi fino alla seconda pressione del pulsante?
Ho fatto il debug sulla serial, e infatti " toggle1" va a uno alla prima pressione e a zero alla seconda.

Grazie per il vostro aiuto.

Hai fatto due domande dentro una sola e non capisco cosa dovrebbe succedere e cosa no.

Da quello che vedo 'toggle1' non ha alcuna funzionalità, diventa 1 (true) per un solo ciclo di loop alla pressione del pulsante.

Quello che avviene è che alla pressione del pulsante parte la funzione 'ArrowRight2'.

La funzione riparte (viene eseguita una volta) ad ogni pressione.

infatti, sto cercando di seguire i vari esempi che ho trovato per trasformare un pulsante in uno a 2 stati.
quando premo e rilascio una volta parte la funzione finchè non ripremo e non rilascio, e allora esce dalla funzione.
vorrei capire cosa sto sbagliando grazie

L'istante di pressione già lo rilevi:

if (rightLast == 0  &&  rightNew == 1)

Quando lo rilevi basta invertire la variabile 'toggle1', così ad ogni pressione cambia di stato.

rightNew = digitalRead(right);
if (rightLast == 0 && rightNew == 1) { toggle1 = !toggle1; }
rightLast = rightNew;

E il pulsante a due stati è fatto.

Dopo di che (seconda domanda) basta chiamare la funzione se la variabile 'toggle1' è 'true', altrimenti non chiamarla.

if (toggle1) { ArrowRight2(strip2.Color(255, 40, 0), 100); }

Poi, siccome la funzione dura un certo tempo, il pulsante verrà controllato di nuovo solo al termine di quel tempo, quando l'esecuzione della funzione finisce e si riprende l'esecuzione del loop principale.

#include <Adafruit_NeoPixel.h>

#define PIN 6
#define PIN 7
unsigned long stop_time;
unsigned long start_time;
const int left =2;
const int right= 3;
boolean toggle = false ;
boolean toggle1= false;
boolean toggle2 = false;
bool leftNew ;
int rightNew;
bool leftLast = 1;    
int rightLast = 1;

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);
 if (leftLast== 0 && leftNew==1 ) {toggle = !toggle;}
     delay(dt);
     leftLast=leftNew;
     
  if (toggle == true){
      ArrowLeft(strip1.Color(255, 40, 0),300,50);  //orange
      
   }
    else{
          ArrowLeft(strip1.Color(0, 0, 0),0,0);
        
        }
  

     rightNew = digitalRead(right);
 if (rightLast ==0 && rightNew==1 ) {toggle1 = !toggle1;}
     delay(dt);
     rightLast = rightNew;
     
  if( toggle1 == true){
    ArrowRight(strip2.Color(255, 40, 0),300,80); //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);
    }
   
}

Questo dovrebbe andare bene, lo sto provando e funziona.
Domanda: scrivere if( toggle) o if toggle==1) è la stessa cosa?
adesso provero’ ad implementare la negazione di uno stato se l’altro è attivo, in modo che se premo il sinistro e per sbaglio premo anche il destro, il secondo non funzioni finchè il primo ritorna off.
poi provero’ la contemporaneità, ovvero quando li premo contemporaneamente si deve attibavare la funzione blinker, ma non il lampeggio singolo.
Domanda: è giusto secondo te chiamare la funzione con dati a 0 per spegnerla?

ti ringrazio

#include <Adafruit_NeoPixel.h>

#define PIN 6
#define PIN 7
unsigned long stop_time;
unsigned long start_time;
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 longPressTime = 500;
bool longPressActive = false;
bool LED1State=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);
 if (digitalRead(left) == HIGH) {
  if (!toggle1 && !toggle ) {
      toggle = true;
      buttonTimer = millis();
  }
  if ((millis() - buttonTimer > longPressTime) && (longPressActive == false)) {

      longPressActive = true;
      LED2State = !LED2State;
  }
 } else {
      if (toggle == true ) {
        if (longPressActive == true) {
            longPressActive = false;
        } else {
                LED1State = !LED1State;
                
               }
           toggle = false;
           }
       }

 

               
 /*    leftNew = digitalRead(left);
  if (  leftLast== 0 && leftNew==1 && !toggle1 ) {toggle = !toggle;}
     delay(dt);
    leftLast=leftNew;
    
  if (toggle ){
      
      ArrowLeft(strip1.Color(255, 40, 0),300,50);  //orange
       
   }
    else{
          ArrowLeft(strip1.Color(0, 0, 0),0,0);
        }*/
  

     rightNew = digitalRead(right);
  if ( !toggle && rightLast ==0 && rightNew==1  ) {toggle1 = !toggle1;}
     delay(dt);
     rightLast = rightNew;
     
     
  if( toggle1 ){
    
    ArrowRight(strip2.Color(255, 40, 0),300,80); //orange
    
   }
    else{
         ArrowRight(strip2.Color(0, 0, 0),0,0); //orange
         
         }
  
 
 if (LED1State){   
  ArrowLeft(strip1.Color(255, 40, 0),300,50);  //orange
 }
   else{
        ArrowLeft(strip1.Color(0, 0, 0),0,0);
        }


  
  if (LED2State){    
  Blinker (strip2.Color(255, 40, 0),80);
  }
   else{
    Blinker (strip2.Color(0, 0, 0),0);
   }
} 


 
  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);
    }
   
}

dopo svariate prove sono arrivato a questo, che non mi soddisfa, ma funziona.
Ovvero, premendo il destro parte la funzione del destro finchè non lo ripremo, idem per il sinistro, solo che se il sinistro lo tengo premuto piu a lungo parte la funzione blinker.
Quello che avrei voluto fare, è che invece che premere solo il sinistro per la funzione blinker, mi sarebbe piaciuto premere entrambi i pulsanti contemporaneamente, ma se si sbaglia la pressione parte a anche la sinistra o la destra.
Altra cosa, non riesco a fare in modo, nonostante ci siano gli stati negati, che se premo esempio il sinistro,premendo il destro, questo non si attivi, e anche il contrario.

Qualche suggerimento? grazie