Lampeggiare led con pulsante per nr volte

Buon giorno
Sto cercando di modifcare questo file di esempio (Allego sotto)
E vorrei che al premere del pulsante il led iniziassi a lampeggiare per un nr di volte che ho impostato
COme posso fare??
Grazie

#define LED 13        // LED collegato al pin digitale 13  
#define BOTTONE 7     // pin di input collegato al pulsante  
int val = 0;        // val conserva lo stato attuale del pin di input (7) 
int prec_val;         // Variabile per valutare lo stato del precedente Loop
bool accendi;         // Accendi = true  => devo accendere il LED 
 
void setup() 
{  
 pinMode(LED, OUTPUT);       // imposta il pin digitale (13) come output  
 pinMode(BOTTONE, INPUT);    // imposta il pin digitale (7) come input  
 digitalWrite(LED, LOW);     // spegne inizialmente il led
 accendi = false;
}  
 
void loop() 
{  
 val = digitalRead(BOTTONE);  // leggo il valore dell'input e lo conservo in val  
 if (val==prec_val) return;   // Se lo stato del bottone è invariato (esempio continuo a 
                              // premere il pulsante) non faccio nulla ed esco dal loop
 prec_val=val;                // salvo lo stato come precedente per la prossima esecuzione di loop()
 
 // controllo se lo stato del pulsante sia diventato "premuto" (lo stato cambia anche quando
 // rilascio il bottone!)
 if (val == HIGH)       // se premuto ...
    accendi = !accendi; // cambio lo stato  
 
 if (accendi)  
   digitalWrite(LED, HIGH);   // accende il led  
 else
   digitalWrite(LED, LOW);    // spegne il led  
}

Hai 52 post all'attivo, e ancora non sai che il codice si mette tra i tag "code"?? :o

Dai, su, sistema il tuo post e poi possiamo proseguire...

come faccio a modificarlo ora..mi esce solo quick edit mode
Grazie

>spiddy1: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo.

Guglielmo

ok fatto l'ho un po modificato ed ho risolto il conteggio...volevo fare un'altra cosa la variabile led mi fa il conteggio e volevo che quando il conteggio si andato a fine si accendesse il led2 per dire fine ciclo..pero non lo fa sembra quasi non esegui l'else che sia?

#define LED 13        // LED collegato al pin digitale 13 
#define LED2 12
#define BOTTONE 7     // pin di input collegato al pulsante 
int val = 0;        // val conserva lo stato attuale del pin di input (7)
int prec_val;         // Variabile per valutare lo stato del precedente Loop
bool accendi;       // Accendi = true  => devo accendere il LED
int conta=1;
 
void setup()
{ 
  pinMode(LED, OUTPUT);       // imposta il pin digitale (13) come output 
  pinMode(LED2, OUTPUT);
  pinMode(BOTTONE, INPUT);    // imposta il pin digitale (7) come input 
  digitalWrite(LED, LOW);     // spegne inizialmente il led
  digitalWrite(LED2, HIGH);
  accendi = false;
} 
 
void loop()
{ 
  
  val = digitalRead(BOTTONE);  // leggo il valore dell'input e lo conservo in val 
  if (val==prec_val) return;   // Se lo stato del bottone è invariato (esempio continuo a
                               // premere il pulsante) non faccio nulla ed esco dal loop
  prec_val=val;                // salvo lo stato come precedente per la prossima esecuzione di loop()
 
  // controllo se lo stato del pulsante sia diventato "premuto" (lo stato cambia anche quando
  // rilascio il bottone!)
  if (val == HIGH)      // se premuto ...
     accendi = !accendi; // cambio lo stato 
 
  if (accendi) 
  ripeti: 
  {
    conta++;
    digitalWrite(LED2, LOW);
    delay(250);
    digitalWrite(LED, HIGH);// accende il led 
    delay(1000);
    digitalWrite(LED, LOW);
    delay(1000);
  if (conta <5) { goto ripeti;  } 
    
    }
  else
    { 
     digitalWrite(LED2, HIGH);
     conta=1;
     delay (2000);
   
  }
    
}

A parte il tuo codice, il tutto si risolve più semplicemente e senza usare il goto.

1)Devi fare qualcosa alla pressione del pulsante

    if(digitalRead(pulsante)==HIGH){

         //Devi ripetere 5 volte ciclo for
         for(int i=0;i<5;i++){
                  //sequenza accensione led


         }

         //finito il tutto accendi il led2
         digitalWrite(led2,HIGH);
    }

Grazie mille va da dio.....
Se ora il valore 5(valore di quante volte ripetere l'operazione) dovese essere una variabile che devoo cambiare...ad esempio tramite un lcd e 2 bottoni per aumentare e diminuire il valore esiste qlc spunto?
lcd sara il classico lcd 1602 con i2c i/o expander

Quas quasi userei questo display(attacco foto) coai cavi in meno tasti incorporati e via....ci sono esempi con questo display per impostare una variabile con 2 tasti up down e asssociarla al mio programmino?

Credo che sia analogo a QUESTO di DFRobot.
In quella pagina c'è anche un programmino di esempio.
Praticamente lo inizializzi con

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

poi leggi da A0 il valore che corrisponde al pulsante premuto:

void loop() {
  int x;
  x = analogRead (0);
  lcd.setCursor(10,1);
  if (x < 50) {
    lcd.print ("Right ");
  }
  else if (x < 200) {
    lcd.print ("Up    ");
  }
  else if (x < 400){
    lcd.print ("Down  ");
  }
  else if (x < 600){
    lcd.print ("Left  ");
  }
  else if (x < 800){
    lcd.print ("Select");
  }
}

Alla fine per delle prove ho optato per un semplice display e 3 tasti,con molta fatica e soddisfazione ho circa raggiunto quello che volevo...nel mio codice ho creato 2 pulsnati Button2 e 3 che mi incrementa una variabile che poi uso per fare il conteggio per il problema e che non si incrementa o decremanta di 1 ma di un valore a caso..come posso fare che al premere di button2 e button3 incrementi o decrementi la variabile di 1 solamente
Grazie in anticipo

#include <LiquidCrystal.h>
#define LED 13        // LED collegato al pin digitale 13 
#define LED2 10
#define BOTTONE 9   // pin di input collegato al pulsante 
#define BOTTONE2 8
#define BOTTONE3 7
int Costante=0;
int Costante2=Costante;

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("hello, world!");
  pinMode(LED, OUTPUT);       // imposta il pin digitale (13) come output 
  pinMode(LED2, OUTPUT);
  pinMode(BOTTONE, INPUT);    // imposta il pin digitale (7) come input
  pinMode(BOTTONE2, INPUT);
  pinMode(BOTTONE3, INPUT);
  digitalWrite(LED, LOW);     // spegne inizialmente il led
  digitalWrite(LED2, LOW);
  Serial.begin(9600);
 
}

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  lcd.print(Costante);
  lcd.setCursor(3, 6);
  // print the number of seconds since reset:
  lcd.print(Costante2);
      
  if (digitalRead(BOTTONE2)==HIGH)
  {
    Costante++;
     }
  if (digitalRead(BOTTONE3)==HIGH)
  {
    Costante--;
     }
  int Costante2=Costante;
  if(digitalRead(BOTTONE)==HIGH)
  {

         //Devi ripetere 5 volte ciclo for
         for(int i=0;i<Costante;i++){
                  //sequenza accensione led
           Costante2--;
           digitalWrite(LED2,LOW);
           delay(250);
           digitalWrite(LED,HIGH);
           delay(700);
           digitalWrite(LED,LOW);
           delay(700);{
             
             
             Serial.println(Costante2, DEC);
           
            }
         }

         //finito il tutto accendi il led2
         digitalWrite(LED2,HIGH);
    }

}

Ho dato un rapido sguardo. Da quello che ho visto non è che viene incrementato a caso... Manca un debounce sulla lettura dei pulsanti, e dipenda anche da quanto tempo lo tieni schiacciato, ad ogni ciclo se lo legge alto lui incrementa. Devi memorizzare lo stato del pulsante.
Ti posto uno dei tanti esempi che si trovano in rete:

Arduino

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/* Debounce a push button
 
  This sketch will demonstrate debouncing a pushbutton with software.
  Every time the button is pressed the LED will toggle
 
  The circuit:
   LED attached from pin 13 to ground
   pushbutton attached from pin 2 to +5V
   10K resistor attached from pin 2 to ground
 
   Note: On most Arduino boards, there is already an LED on the board
  connected to pin 13, so you don't need any extra components for this example.
  created 21 November 2006
  by David A. Mellis
  modified 30 Aug 2011
  by Limor Fried
  modifies again sometime in Sept 2012
  by Michael J
  This example code is in the public domain.
  http://www.arduino.cc/en/Tutorial/Debounce
  http://www.opensourcehardwarejunkies.com
*/
 
//initialize and declare variables
const int ledPin = 13; //led attached to this pin
const int buttonPin = 2; //push button attached to this pin
 
int buttonState = LOW; //this variable tracks the state of the button, low if not pressed, high if pressed
int ledState = -1; //this variable tracks the state of the LED, negative if off, positive if on
 
long lastDebounceTime = 0;  // the last time the output pin was toggled
long debounceDelay = 50;    // the debounce time; increase if the output flickers
 
 
void setup() {
 
  //set the mode of the pins...
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
 
}//close void setup
 
 
void loop() {
 
  //sample the state of the button - is it pressed or not?
  buttonState = digitalRead(buttonPin);
 
  //filter out any noise by setting a time buffer
  if ( (millis() - lastDebounceTime) > debounceDelay) {
 
    //if the button has been pressed, lets toggle the LED from "off to on" or "on to off"
    if ( (buttonState == HIGH) && (ledState < 0) ) {
 
      digitalWrite(ledPin, HIGH); //turn LED on
      ledState = -ledState; //now the LED is on, we need to change the state
      lastDebounceTime = millis(); //set the current time
    }
    else if ( (buttonState == HIGH) && (ledState > 0) ) {
 
      digitalWrite(ledPin, LOW); //turn LED off
      ledState = -ledState; //now the LED is off, we need to change the state
      lastDebounceTime = millis(); //set the current time
    }//close if/else
 
  }//close if(time buffer)
 
}//close void loop

Mentre qui hai il link al reference di arduino con un altro esempio.

Lollo82:
Ho dato un rapido sguardo. Da quello che ho visto non è che viene incrementato a caso... Manca un debounce sulla lettura dei pulsanti, e dipenda anche da quanto tempo lo tieni schiacciato, ad ogni ciclo se lo legge alto lui incrementa.

Infatti i problemi in contemporanea possono essere due: mancanza di debounce (forse, non sappiamo come è l'hardware), e test sul livello in ingresso invece che sulla sua variazione (sicuro).

Ti posto uno dei tanti esempi che si trovano in rete:

Quell'esempio mi sembra totalmente sbagliato. Intanto usa variabili long per millis invece di unsigned long. Poi spara ON/OFF a raffica ogni 50ms finché si tiene premuto il pulsante. E non fa il debounce sull'istante di pressione.

Una logica che effettua il debounce sia alla pressione che al rilascio, e che fa qualcosa una sola volta al momento della pressione è la seguente:

byte lettura = digitalRead(...pin pulsante...);

if(lettura == letturaPrecedente)
    t = millis();
else if(millis() - t >= ...tempo debounce...) 
{
    letturaPrecedente = lettura;
    if(lettura == ...livello premuto...) 
    {
        ....fa qualcosa all'istante della pressione...
    }
}

Si, ho preso il primo esempio trovato. Ma dopo averlo trovato gli ho anche postato quello presente sul reference di arduino.
Il fatto di un incremento continuo alla pressione continua del pulsante dovrebbe essere una cosa corretta (chiaro non ogni 50 ms), ogni 500 mi sembra un tempo corretto.
Scusa mi son accorto ora di averti detto ecco qui il link al reference e non averti messo nulla.

Grazie mille hardware ok i 3 tasti hanno resistenza di 10k verso gnd il codice domani lo provo a me serve si incrementi o decremento di 1 la variabile
A quanto bisogna impostare il tempo denunce che e scritto sull'esempio
else if(millis() - t >= ...tempo debounce...) ?
Grazie ancora

spiddy1:
A quanto bisogna impostare il tempo denunce che e scritto sull'esempio
else if(millis() - t >= ...tempo debounce...) ?

Un 50..60ms di solito va bene.

Grazie stasera faro le modifiche del debounce,altra info per cortesia ho inserito uno switch nel mio programma che quando e a stato high faccio la conta etc etc e quando e low mi mette sempre il led a high pero non funziona cosa ho sbagliato?
in qualsiasi momento pero devo passare con il conteggio una specie di ""automatico" "manuale"
Grazie Ancora

// include the library code:
#include <LiquidCrystal.h>
#define LED 13        // LED collegato al pin digitale 13 
#define LED2 10
#define BOTTONE 9   // pin di input collegato al pulsante 
#define BOTTONE2 8
#define BOTTONE3 7
#define SWITCH 6
int Costante=0;
int Costante2=Costante;

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.setCursor(4, 0);
  lcd.print("STAZIONE");
  delay(1000);
  lcd.setCursor(5, 1);
  lcd.print("GRASSO");
  delay(1000);
  lcd.clear();
  lcd.setCursor(2, 1);
  lcd.print("EUROSALD SRL");
  delay(1000);
  lcd.clear();
  lcd.setCursor(5, 1);
  lcd.print("VERS 1");
  delay(1000);
  lcd.clear();
  pinMode(LED, OUTPUT);       // imposta il pin digitale (13) come output 
  pinMode(LED2, OUTPUT);
  pinMode(BOTTONE, INPUT);    // imposta il pin digitale (7) come input
  pinMode(BOTTONE2, INPUT);
  pinMode(BOTTONE3, INPUT);
  pinMode(SWITCH, INPUT);
  digitalWrite(LED, LOW);     // spegne inizialmente il led
  digitalWrite(LED2, LOW);
  Serial.begin(9600);
 
}

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(1, 0);
  lcd.print("NR VOLTE:");
  lcd.setCursor(1, 1);
  lcd.print("CONTEGGIO:");
  lcd.setCursor(14, 0);
  // print the number of seconds since reset:
  lcd.print(Costante);
  lcd.setCursor(14, 1);
  // print the number of seconds since reset:
  lcd.print(Costante2);
   
  
  if (digitalRead(SWITCH)==HIGH)
     {
    
      
  if (digitalRead(BOTTONE2)==HIGH)
  {
    Costante++;
     }
  if (digitalRead(BOTTONE3)==HIGH)
  {
    Costante--;
     }
  int Costante2=Costante;
  if(digitalRead(BOTTONE)==HIGH)
  {

         //Devi ripetere 5 volte ciclo for
         for(int i=0;i<Costante;i++)
         {
                  //sequenza accensione led
           Costante2--;
           digitalWrite(LED2,LOW);
           delay(250);
           digitalWrite(LED,HIGH);
           delay(500);
           digitalWrite(LED,LOW);
           delay(1500);{
             
             
             Serial.println(Costante2, DEC);
           
            }
         }

         //finito il tutto accendi il led2
         digitalWrite(LED2,HIGH);
        
    }
   }
  else
     {
     digitalWrite(LED,HIGH);
    }
 

}

spiddy1:
in qualsiasi momento pero devo passare con il conteggio una specie di ""automatico" "manuale"

  • Il codice va indentato.
  • Chiamare con il nome 'costante' e 'costante2' delle variabili che variano non è molto coerente.
  • La scrittura su LCD è un'operazione relativamente lenta, sarebbe da evitare di riscrivere ad ogni giro sempre le stesse cose che non variano.
  • Non puoi gestire più cose "in qualsiasi momento" con una logica bloccante a singolo processo piena di delay. Una volta che il for inizia tutti gli ingressi non vengono più letti e non si può fare altro che attendere il suo termine. Il modo più semplice è la logica a stati.

Si potrebbero fare mille esempi, ma nessuno adatto al caso specifico.
Per cui bisogna partire da quali ingressi servono, come vanno letti (livello, impulso, solo pressione, pressione e rilascio, autorepeat ecc), e quali funzioni devono comandare.

Buona Sera finalmente sono riuscito a fare cio che volevo ma ho ancor aun problemino,quando incremento la variabile "Costante" e mi visualizza la 3 cifra e faccio il decrementa esempio sono a 100 e faccio -1 nwl display visualizzo 990 la stessa cosa per La variabile Costante 2 che copia la Costante e fa -- ogni volta toglie l'ultima cifra resta in memoria esempio fa 101 100 990
Come posso fare a toglierla?
Grazie

//Sample using LiquidCrystal I2C library
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

/*******************************************************

This program will test the LCD panel and the buttons

********************************************************/

// setup either PCF8574 and 8574A IO expander to drive LCD
LiquidCrystal_I2C lcd_8574(0x20,16,2);  // set the LCD address to 0x20 (8574) for a 16 chars and 2 line display


// define some values used by the panel and buttons
int lcd_key     = 0;
int adc_key_in  = 0;
int POT = 0;
//int servopos = 0;
int brightness = 0;
int statoButton     = 0;      // stato del pulsante (inizialmente non premuto)
int lastStatoButton = 0;      // ultimo stato del pulsante (per ora non premuto)
int countButton     = 0;   // Conteggio del bottone
int Costante=0;
int Costante2=0;

#define LED 11     
#define LED2 12
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

// read the buttons
int read_LCD_buttons()
{
 adc_key_in = analogRead(0);      // read the value from the sensor 
 if (adc_key_in > 1000) return btnNONE; // this is the 1st option for speed reasons: it will be the most likely result
 // For V1.1 us this threshold
 if (adc_key_in < 50)   return btnRIGHT;  
 if (adc_key_in < 250)  return btnUP; 
 if (adc_key_in < 450)  return btnDOWN; 
 if (adc_key_in < 650)  return btnLEFT; 
 if (adc_key_in < 850)  return btnSELECT;  

 return btnNONE;  // when all others fail, return this...
}

void setup()
{


 
 //init LCD on 8574
 lcd_8574.begin();
 lcd_8574.backlight();
  
  
  pinMode(LED, OUTPUT);       // imposta il pin digitale (13) come output
  pinMode(LED2, OUTPUT);
  

  digitalWrite(LED, LOW);     // spegne inizialmente il led
  digitalWrite(LED2, LOW);
  Serial.begin(9600);
 
  lcd_8574.setCursor(4, 0);
  lcd_8574.print("STAZIONE");
  delay(1000);
  lcd_8574.setCursor(5, 1);
  lcd_8574.print("GRASSO");
  delay(1000);
  lcd_8574.clear();
  lcd_8574.setCursor(2, 1);
  lcd_8574.print("EUROSALD SRL");
  delay(1000);
  lcd_8574.clear();
  lcd_8574.setCursor(5, 1);
  lcd_8574.print("VERS 1");
  delay(1000);
  lcd_8574.clear();
  lcd_8574.setCursor(1, 0);
  lcd_8574.print("NR VOLTE:");
  delay(500);
  lcd_8574.setCursor(1, 1);
  lcd_8574.print("CONTEGGIO:");
 
  
  
  int state = 0; //declare and init state machine


 
 
 }


void loop()
{
lcd_8574.setCursor(12, 0);
lcd_8574.print(Costante);
lcd_8574.setCursor(12, 1);
lcd_8574.print(Costante2); 
delay(250);
Serial.print(adc_key_in,DEC);

{
 
 lcd_key = read_LCD_buttons();  // read the buttons
 switch (lcd_key)               // depending on which button was pushed, we perform an action
 {   
  case btnRIGHT:
 { 
  int Costante2=Costante;
  for(int i=0;i<Costante;i++){
                  //sequenza accensione led
           lcd_8574.setCursor(12, 1);
           lcd_8574.print(Costante2);
           Costante2--;
           digitalWrite(LED2,LOW);
           delay(250);
           digitalWrite(LED,HIGH);
           delay(700);
           digitalWrite(LED,LOW);
           delay(700);

         }
           digitalWrite(LED2,HIGH);
           
           
   
     break;
     }
   case btnLEFT:
     {
     
   
     Costante=Costante+10;
     break;
     }
   case btnUP:
     {
   
     
     Costante=Costante+1;
  
     break;
     }
   case btnDOWN:
     {
     
  
     Costante=Costante-1;
  
     break;
     }
   case btnSELECT:
     {
     
  
      Costante=Costante-10;
     break;
     }
     case btnNONE:
     {
     
 
     digitalWrite(11,LOW);
     digitalWrite(12,LOW);
     break;
       }
   }
 }
}

Nel caso di passaggio da tre a due cifre devi sostituire lo 0 con un carattere vuoto.
Succede la stessa cosa se fai un lcd.print con spiddy1 e poi con il cursore nella stessa posizione scrivi ciao. Ti ritroverai con scritto sul display ciaody1.
Puoi anche prevedere sempre un numero a tre cifre in posizione definita, prima di scriverla posizioni il cursore sempre in quella posizione e prima di printarla con un if verifichi se è minore di cento printi uno 0 e successivamente la tua variabile, se è maggiore printi direttamente la variabile, così avrai 099, 100, 101... 100, 099.

Grazie
mi fa cortesemente un'esempio al volo