Problemino sketch

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);

  
}

Grazie

E che problemi hai? Se non lo dici... :stuck_out_tongue:

è da ieri che sta dando i numeri, povero cecé, così giovane, già preda di sostanze dannose....

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.

non mi è stato detto, ora continuo le prove.....

Non ho che scritto che sia stato detto a te, ma che è viene sempre detto, sottintendendo il forum. :stuck_out_tongue:

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?

Perché delay(5000) dopo il setup ?

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.

PS: CTRL+T prima di postare il codice, grazie!

tuxduino:
Perché delay(5000) dopo il setup ?

Per la schermata iniziale col suo nome :stuck_out_tongue:

Ah, già! Una volta l'ho fatto anch'io... ma solo per mostrare il nome del programma (e poi erano solo 3 secondi :stuck_out_tongue: )

E cosa farebbe sto control T prima di postare il cosice, su mac os x mi apre una nuova scheda :cold_sweat:.
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
  }  

  

    } 


  }

E cosa farebbe sto control T prima di postare il cosice, su mac os x mi apre una nuova scheda.

Autoformattazione del codice. La voce di menu è Strumenti => Formattazione automatica. Su Linux indica l'hotkey CTRL+T, su Mac non so.

tuxduino:

E cosa farebbe sto control T prima di postare il cosice, su mac os x mi apre una nuova scheda.

Autoformattazione del codice. La voce di menu è Strumenti => Formattazione automatica. Su Linux indica l'hotkey CTRL+T, su Mac non so.

ok, ma nessuno sa aiutarmi?

ok, ma nessuno sa aiutarmi?

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 :stuck_out_tongue:

tuxduino:
Scusa, ma secondo me prima di chiedere altro aiuto dovresti mostrare più impegno :stuck_out_tongue:

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.

leo72:

tuxduino:
Scusa, ma secondo me prima di chiedere altro aiuto dovresti mostrare più impegno :stuck_out_tongue:

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.

Si, ok, ma non ho capito bene cosa devo fare -.-'

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,

Si, ok, ma non ho capito bene cosa devo fare -.-'

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 :slight_smile:

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 :frowning:
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
  }  
  }  
  }