Problemino sketch

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

Devi creare 2 funzioni, una per programmare ed una per eseguire ciò che deve fare. Quando è in programmazione, gestisci il + ed il -.

ecco cosa non avevate capito!!!

vabbe' se le cose non le dici... :stuck_out_tongue:

(e insisti con il codice non indentato...)

leo72:
Devi creare 2 funzioni, una per programmare ed una per eseguire ciò che deve fare. Quando è in programmazione, gestisci il + ed il -.

ma non lo sto già facendo?

Ecco un esempio di quello che secondo me è un codice molto più leggibile, quindi comprensibile.

#include <LiquidCrystal.h>

byte cntGiorno = 0;
byte cntNotte = 25;
int brightness = 0;    

// pin dell'interruttore di programmazione
const int modeSwitchPin = 6;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
    pinMode(modeSwitchPin, INPUT);
    pinMode(7, INPUT);     
    pinMode(8, 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(cntGiorno);
    lcd.setCursor(0, 1);
    lcd.print("Notte:");
    lcd.print(cntNotte);
    delay(100);

    // determino se siamo in modalità programmazione
    // o normale funzionamento
    programModeActive = (digtalRead(modeSwitchPin) == HIGH));
    

    if (programModeActive) {
        decBtnState = digitalRead(decBtnPin);
        incBtnState = digitalRead(incBtnPin);
        
        if (decBtnState == HIGH) {
            cntGiorno--;
        }
        else if (incBtnState == HIGH) {
            cntGiorno++;
        }
        
        // come si seleziona il contatore notte ?
    }  
    else {
        // codice fade
    }
}

Ora vo' a cena, buona fortuna! :slight_smile:

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