progetto arduino nano

buongiorno ragazzi, avrei la necessità di fare un programmino:

ho un pulsante e 3 uscite:

premo il pulsante e deve partire un timer di 5 secondi…trascorsi i 5 secondi si attiva l’uscita in base al numero di volte che è stato premuto il pulsante:

esempio: premo una volta, passano 5 secondi …si attiva l’uscita 1:

i 5 secondi devono partire quando premo il pulsante e poi con un swhit case controlla lo stato del pulsante.

ho scritto qualcosa ma sbaglio…
grazie

const int  BUTTON = 2;    // pin di input a cui è collegato il pulsante  
const int LED = 13;       // LED collegato al pin digitale 13  
 const int rele1 = 3;
 const int rele2 = 4;
 const int rele3 = 5;
// Variabili globali (tutti interi)  
int statoButton     = 0;      // stato del pulsante (inizialmente non premuto)  
int readSensor = 0;      // ultimo stato del pulsante (per ora non premuto)  
int x     = 0;      // Conteggio del bottone  
 
// Avvio dell'applicazione  
void setup()  
{  
 pinMode(LED, OUTPUT); 
 pinMode(rele1, OUTPUT);
 pinMode(rele2, OUTPUT);
 pinMode(rele3, OUTPUT); 
 // imposta il pin digitale come output  
 pinMode(BUTTON, INPUT);     // imposta il pin digitale come input  
}  
 
// Avvio del loop  
void loop()  
{  

 
  
   // Aspetto 15ms per far alzare il dito all'utente  
if (digitalRead(BUTTON) == LOW)

statoButton= statoButton +1 ;
 do 
{  
  x= x + 1; // assegna il valore di readSensor() a 
  delay(50); // pausa di 50 millisecondi 

} while (x < 10); 
  
  

// In base allo stato del bottone scelgo l'azione del led  
switch (statoButton)  
 {  
    
 case 1:  
   digitalWrite(rele1, HIGH);  // accende il LED  
   delay(500);              // aspetta un secondo  
   digitalWrite(rele1, LOW);   // spegne il LED  
   delay(500);              // aspetta un secondo  
   break;  
 
    
 case 2:  
   digitalWrite(rele2, HIGH);  // accende il LED  
   delay(1000);              // aspetta un secondo  
   digitalWrite(rele2, LOW);   // spegne il LED  
   delay(1000);              // aspettaun secondo  
   break;  
 
    
 case 3:  
   digitalWrite(rele3, HIGH);  // accende il LED  
   delay(1500);              // aspetta un secondo  
   digitalWrite(rele3, LOW);   // spegne il LED  
   delay(1500);              // aspetta un secondo  
   break;  
 
   // Led si spegne  
 case 0:  
   delay(15);  
   digitalWrite(LED, LOW);  
   delay(5000);              // aspetta un secondo  
   break;  
 }  
}

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare.
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

grazie, scusate per lignoranza stavo preso per questo programma, faccio le mie scuse. volevo inserire il codice ma già ho visto che è stato fatto.
grazie

future1980:
ho scritto qualcosa ma sbaglio.....

Cosa non funziona?

ciao, praticamente io premo il pulsante e deve entrare dentro il do-while ( io ho messo 10 cicli ) quando finiscono i 10 cicli deve andare su swhit case:

poi se premo il pulsante mi incrementa all' infinito statobutton.....

Non sono sicuro di aver capito. Però questo pezzo di codice

if (digitalRead(BUTTON) == LOW)
statoButton= statoButton +1 ;
 do

equivale a questo:

if (digitalRead(BUTTON) == LOW)
{ statoButton= statoButton +1 ;
}
do

Ovvero solo 1 riga è nell'if, se non metti le graffe inizio e fine (fine dove deve terminare il blocco di n righe)

uhmmm nn capisco....

future1980:
i 5 secondi devono partire quando premo il pulsante e poi con un swhit case controlla lo stato del pulsante.

quindi anche il ciclo deve essere entro l'if, quindi devi usare le graffe.
Inoltre, perchè un ciclo di 10 volte con delay(50) ? metti un unico delay(500) (mezzo secondo)
5 secondi sono delay(5000). Il parametro sono millisecondi 1000=1 sec

ho messo 10 cicli per fare le prove

grazie ho risolto.

ragazzi rieccomi ancora qui, avevo detto che ho risolto ma sul mio simulatore funziona benissimo, ma ora in pratica no, ho caricato il programma su arduino nano, quando premo il pulsante mi si attiva subito il relè1 :open_mouth: :open_mouth:

il pulsante è collegato gnd -d5

dove sta l'errore?

:frowning:

#define rele1 12
#define rele2 11
#define rele3 10
#define TstNew 5
//#define led1 9
//#define led2 8
//#define led3 7
byte a=0;    
word Cnt;
byte Num;       
byte Flag;      
byte TstOld;
int x=0;
int timer=0;
void setup() {

         

pinMode(rele1, OUTPUT);
pinMode(rele2, OUTPUT);
pinMode(rele3, OUTPUT);
pinMode(TstNew, INPUT);
//pinMode(led1, OUTPUT);
//pinMode(led2, OUTPUT);
//pinMode(led3, OUTPUT);
//digitalWrite(TstNew, HIGH);
}
void loop() {
  timer:
  if(timer>=5000)
  {
    if (x==0)
    { timer=0;
    x=0;
    }
    if(x==1){
    digitalWrite(rele1,true);
    delay(2000);
    digitalWrite(rele1,false);
//    digitalWrite(led1,false);
//    digitalWrite(led2,false);
//    digitalWrite(led3,false);
    timer=0;
    x=0;
    }
    if(x==2){
    digitalWrite(rele2,true);
    delay(2000);
    digitalWrite(rele2,false);
//    digitalWrite(led1,false);
//    digitalWrite(led2,false);
//    digitalWrite(led3,false);
    timer=0;
    x=0; 
    }
    if(x==3||x>3){
    digitalWrite(rele3,true);
    delay(2000);
    digitalWrite(rele3,false);
//    digitalWrite(led1,false);
//    digitalWrite(led2,false);
//    digitalWrite(led3,false);
    timer=0;
    x=0;
    }
  }
//  rileggi:
//  //segnalazione led
//  if(x==1&&digitalRead(led1)==false){
//    digitalWrite(led1,true);
//    digitalWrite(led2,false);
//    digitalWrite(led3,false);
//  }
//  if(x==2&&digitalRead(led2)==false){
//    digitalWrite(led1,false);
//    digitalWrite(led2,true);
//    digitalWrite(led3,false);
//  }
//
//  if(x==3&&digitalRead(led3)==false){
//    digitalWrite(led1,false);
//    digitalWrite(led2,false);
//    digitalWrite(led3,true);
//  }
//  
  if (x>0)
  timer=timer+100;
  
  if (digitalRead(TstNew)==1){
    delay(500);
    inizio:
    //timer=timer+100; //se sei vuole incrementare  il timer sempre togliere il commento!!
    if(timer>=5000)
    goto timer;
    if (digitalRead(TstNew)==0){
      delay(500);
    x = x+1;
//    goto rileggi;
    }
    else
    goto inizio;
  }
}

e se nel setup mettessi il pinMode del relay LOW?

ragazzi non riesco a darmi una spiegazione :frowning: ho inserito Serial.begin(9600); Serial.println(timer); volevo monitorare il programma......e ha funzionato...!!!! cioè solo aggiungendo la seriale come si spiega????
vi prego datemi una spiegazione!

Per primo dimentica subito goto. Con C NON Ti serve.
L'effetto che inserndo un Serial.print() funziona spesso accade perché ha fatto un errore nel indice di un array o usando un puntatore in maniera errata. Visto che non hai usato ne uno ne l'altro questo caso non si puó verificare.

sostituisci il

inizio:
    if(timer>=5000)
    goto timer;
    if (digitalRead(TstNew)==0){
      delay(500);
    x = x+1;
    }
    else
    goto inizio;

con un cicle while()

sostituisci il

if(timer>=5000)
    goto timer;

con una condizione che il codice dopo non viene piú sesguito e la funzione loop viene richiamata in automatico.

Ciao Uwe

questo è il codice funzionante!!! se tolgo la seriale ( non funziona ) se la inserisco si!!!

io voglio capire qual’è il motivo…!!! devo capire non credo che il (GOTO) centri qualcosa.

le ho provate tutte, dal simulatore senza seriale va bene!!! e il programma è perfetto…ma dentro arduino no!!!

se provate anche voi vedrete che funziona!!

#define rele1 12
#define rele2 11
#define rele3 10
#define TstNew 5
#define led1 9
#define led2 8
#define led3 7

byte a=0;    
word Cnt;
byte Num;       
byte Flag;      
byte TstOld;
int x=0;
int timer=0;
void setup() {
Serial.begin(9600);
         

pinMode(rele1, OUTPUT);
pinMode(rele2, OUTPUT);
pinMode(rele3, OUTPUT);
//pinMode(TstNew, INPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(TstNew,HIGH);

}
void loop() {
  Serial.println(timer);
  time:
  if(timer>=5000)
  {
    if (x==0)
    { timer=0;
    x=0;
    }
    if(x==1){
    digitalWrite(rele1,true);
    delay(3000);
    digitalWrite(rele1,false);
    timer=0;
    x=0;
    }
    if(x==2){
    digitalWrite(rele2,true);
    delay(3000);
    digitalWrite(rele2,false);
    timer=0;
    x=0; 
    }
    if(x==3||x>3){
    digitalWrite(rele3,true);
    delay(3000);
    digitalWrite(rele3,false);
    timer=0;
    x=0;
    }
  }
  if (x>0)
  timer=timer+10;  
  if (digitalRead(TstNew)==HIGH){
    delay(100);
    inizio:
    if(timer>=5000)
    goto time;
    if (digitalRead(TstNew)==LOW){
    x = x+1;
    }
    else
    goto inizio;
  }
}
pinMode(TstNew,HIGH);

ti sei inventato una nuova funzione ?

Togli prima i goto e poi ne parliamo.
Ciao Uwe

Brunello:

pinMode(TstNew,HIGH);

ti sei inventato una nuova funzione ?

e perche in questo modo mi funziona??? ho solo un pulsante!!! ( tstnew )

Nei altri pinMode scrivi INPUT o OUTPUT.
Comunque togli i GOTO.
Ciao Uwe

future1980:
e perche in questo modo mi funziona??? ho solo un pulsante!!! ( tstnew )

è un puro caso il fatto che ti funzioni. quella funzione non esiste, quindi correggila. e per favore togli i goto come ti ha detto Uwe. In ogni caso non capisco la domanda, è ovvio che se vuoi stampare qualcosa nella console seriale devi usare begin, cosa intendi?