leo72:
Perché hai messo quel delay(5000) all'inizio del loop? In questo modo la lettura dei pulsanti viene eseguita solo 1 volta ogni 5 secondi e se non cogli l'attimo esatto potresti non leggere la pressione. Se il motivo è evitare lo sfarfallio del display, metti la stampa sul display solo ogni 500/1000 ms, con un if basato su millis, ad esempio. Inoltre come è sempre stato detto, metti 2 letture del pin separate da un piccolo delay per evitare rimbalzi del pulsantino e letture doppie/triple.
oggi mi sono arrivati i pulsantini e ho cominciato a provare, questo è lo sketch che è uscito XD
byte a = 0;
byte b = 25;
int val = 0;
int val1 = 0;
int val2 = 0;
int brightness = 0;
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
pinMode(7, INPUT);
pinMode(8, INPUT);
pinMode(6, INPUT);
lcd.begin(16, 2);
lcd.print("Luci presepe by");
lcd.setCursor(0, 1);
lcd.print("Cesare Cacitti ");
delay(5000);
}
void loop() {
lcd.setCursor(0, 0);
lcd.clear();
lcd.print("Giorno:");
lcd.print(a);
lcd.setCursor(0, 1);
lcd.print("Notte:");
lcd.print(b);
delay(100);
val = digitalRead(7);
if (val == HIGH) {
a=a-1;
}
val1 = digitalRead(8);
if (val1 == HIGH) {
a=a+1;
}
}
quello che vorrei fare è riuscire a mettere un interruttore che quando è chiuso mi permette di cambiare i tempi, e quando lo apro, mi fa partire una funzione basata sul fade, che mi fa fare il fade sul led con velocità della variabile a che ho già impostato con quella variabile.
Qualcuno potrebbe integrarmi nello sketch, un if (che funziona) nel quale dopo inserisco il fade?
Studiati bene blink without delay. Leggi ogni pulsante ogni 20-50ms (prova per vedere qual è il valore che dà la "responsività" migliore), e quando rilevi un cambio di stato (da premuto a rilasciato o viceversa) modifica il contatore.
Per quanto riguarda il fade, anche quello va inserito con la tecnica di blink without delay, altrimenti ti trovi a leggere i pulsanti solo all'inizio o alla fine del ciclo di fade, col risultato che l'oggetto diventa inutilizzabile.
E cosa farebbe sto control T prima di postare il cosice, su mac os x mi apre una nuova scheda .
Comunque non ci capisco nulla!
Ho creato uno sketch (non funzionante) per farvi capire cosa dovrei fare:
byte a = 0;
byte b = 25;
int val = 0;
int val1 = 0;
int val2 = 0;
int brightness = 0;
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
pinMode(7, INPUT);
pinMode(8, INPUT);
pinMode(6, INPUT);
lcd.begin(16, 2);
lcd.print("Luci presepe by");
lcd.setCursor(0, 1);
lcd.print("Cesare Cacitti ");
delay(5000);
}
void loop() {
lcd.setCursor(0, 0);
lcd.clear();
lcd.print("Giorno:");
lcd.print(a);
lcd.setCursor(0, 1);
lcd.print("Notte:");
lcd.print(b);
delay(100);
val1 = digitalRead(8);
if (val1 == HIGH) {
val = digitalRead(7);
if (val == HIGH) {
a=a-1;
}
val1 = digitalRead(8);
if (val1 == HIGH) {
a=a+1;
}
else {
//codice fade
}
}
}
Allora siamo a questo punto: hai due pulsanti. Premendo uno di questi una variabile va incrementata. Premendo l'altro, la stessa variabile va decrementata.
Ti è stato fornito materiale in abbondanza per approfondire. Ti sono stati dati suggerimenti (vedi il debounce con doppia lettura), ma il tuo codice è ancora lì senza nemmeno una indentazione decente.
Scusa, ma secondo me prima di chiedere altro aiuto dovresti mostrare più impegno
tuxduino:
Scusa, ma secondo me prima di chiedere altro aiuto dovresti mostrare più impegno
Quoto.
Il forum non è il CED, Centro Elaborazione Dati, dove chiami e ti fai preparare il software di cui hai bisogno. Come ripeto tante volte, se qualcuno ti scrive il codice: 1) risolvi il tuo problema; 2) non impari nulla ed alla prox difficoltà sei nuovamente a chiedere.
tuxduino:
Scusa, ma secondo me prima di chiedere altro aiuto dovresti mostrare più impegno
Quoto.
Il forum non è il CED, Centro Elaborazione Dati, dove chiami e ti fai preparare il software di cui hai bisogno. Come ripeto tante volte, se qualcuno ti scrive il codice: 1) risolvi il tuo problema; 2) non impari nulla ed alla prox difficoltà sei nuovamente a chiedere.
Ma parliamo di pulsanti o di interruttori?
Un pulsante è un contatto che si chiude o apre temporaneamente, un interruttore è un contatto permanente.
Se usi un interruttore, basta alternare con un if: if chiuso {xxx} else {yyy}.
cece99:
quello che vorrei fare è riuscire a mettere un interruttore che quando è chiuso mi permette di cambiare i tempi, e quando lo apro, mi fa partire una funzione basata sul fade,
Secondo me dovresti fare domande più specifiche. E per fare questo dovresti provare a scrivere più codice, fare prove, sbattere la testa sul tavolo, insomma fare un po' quello che si fa tutti quanti per divertirsi con le varie arduinate più o meno semplici che vengono in mente
leo72:
Ma parliamo di pulsanti o di interruttori?
Un pulsante è un contatto che si chiude o apre temporaneamente, un interruttore è un contatto permanente.
Se usi un interruttore, basta alternare con un if: if chiuso {xxx} else {yyy}.
cece99:
quello che vorrei fare è riuscire a mettere un interruttore che quando è chiuso mi permette di cambiare i tempi, e quando lo apro, mi fa partire una funzione basata sul fade,
ecco cosa non avevate capito!!! per passare dalla modalità "programmazione" a quella di "esecuzione" utilizzo un interruttore, mentre per fare la "programmazione" dei tempi utilizzo due pulsantini ;).
Sto provando in tutti i modi ma non riesco a far funzionare nulla
Questo è lo sketch (compila ma non funziona: quando muovo l'interruttore nel display non si vede più nulla :()
byte a = 0;
byte b = 25;
int val = 0;
int val1 = 0;
int val2 = 0;
int brightness = 0;
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
pinMode(7, INPUT);
pinMode(8, INPUT);
pinMode(6, INPUT);
lcd.begin(16, 2);
lcd.print("Luci presepe by");
lcd.setCursor(0, 1);
lcd.print("Cesare Cacitti ");
delay(5000);
//scrivo nome e cognome :-)
}
void loop() {
//stampo i tempi
lcd.setCursor(0, 0);
lcd.clear();
lcd.print("Giorno:");
lcd.print(a);
lcd.setCursor(0, 1);
lcd.print("Notte:");
lcd.print(b);
delay(100);
val2 = digitalRead(6); // se ho l'interruttore chiuso, vado in modalità programmazione
if (val2 == HIGH) {
val = digitalRead(7);
if (val == HIGH) {
a=a-1;
}
val1 = digitalRead(8);
if (val1 == HIGH) {
a=a+1;
}
else {// se è aperto vado in modalità esecuzione
//codice fade
}
}
}
Ti ho modificato leggermente il codice.
Non l'ho provato, ma dovrebbe funzionare.
Se premi il pulsante sul pin 8 incrementa a fino al valore 255, se premi il pulsante sul pin 7 decrementa a fino al volore 0.
Ho aggiunto un controllo per l'overflow.
Ho tolto il codice per il fade perché sinceramente non ho capito con quale sequenza di pulsanti lo volessi attivare.
#include <LiquidCrystal.h>
byte a = 0;
byte b = 25;
int up = LOW;
int down = LOW;
int check = LOW;
int brightness = 0;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
pinMode(7, INPUT);
pinMode(8, INPUT);
pinMode(6, INPUT);
lcd.begin(16, 2);
lcd.print("Luci presepe by");
lcd.setCursor(0, 1);
lcd.print("Cesare Cacitti ");
delay(5000);
}
void loop() {
lcd.setCursor(0, 0);
lcd.clear();
lcd.print("Giorno:");
lcd.print(a);
lcd.setCursor(0, 1);
lcd.print("Notte:");
lcd.print(b);
delay(50);
up = digitalRead(8);
down = digitalRead(7);
check = digitalRead(6);
if (check == HIGH) {
if (up == HIGH) {
if (a<255) a++;
}
if (down == HIGH) {
if (a>0) a--;
}
}
}
Qualcuno sul forum ha scritto del codice per attivare le funzioni a seconda di quanto si tiene premuto il pulsante: pressione breve fai una cosa, pressione lunga fanne un'altra.
Non ricordo chi, ma se fai una ricerca forse esce qualcosa.
Invece di scrivere come in basic a=a+1; in C si può usare la sintassi a++; per incrementare o a--; per decrementare.
Esistono anche ++a; e --a;, ma è un'altro discorso.