Oggi stavo preparando uno sketch per fare una centralina di luci per presepe, lo sketch non è completo ma ho già avuto dei problemi con i pulsanti che aumentano o diminuiscono il tempo di alba tramonto.
Questo è lo sketch, per il momento mostra i dati su un display lcd, a me pasta incrementare il valore delle 2 variabili che vengono stampater, x il pwm dopo mi arrangio XD.
int a = 0;
int b = 25;
int val = 0;
int val1 = 0;
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
pinMode(7, INPUT);
pinMode(8, INPUT);
lcd.begin(16, 2);
lcd.print("Luci presepe by");
lcd.setCursor(0, 1);
// print the number of seconds since reset:
lcd.print("Cesare Cacitti ");
}
void loop() {
delay(5000);
val = digitalRead(7);
if (val == HIGH) {
a=a+1;
}
val1 = digitalRead(8);
if (val1 == HIGH) {
a=a-1;
}
lcd.setCursor(0, 0);
lcd.clear();
lcd.print("Giorno:");
lcd.print(a);
lcd.setCursor(0, 1);
lcd.print("Notte:");
lcd.print(b);
}
praticamente se premo i bottoncini i numeri non cambiano in pratica non risponde ai miei comandi XD.
Menny, sai alla fine cos era? avevo inserito male il chip nella breadboard e faceva falso contatto (eppure l'ho inserito e disinserito una 10ina di volte -.-')
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.
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
}
}
}