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
}
>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.
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?
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:
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
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.