Problemino sketch

tuxduino:
Stai facendo continuamente lcd.clear(), scrivi qualcosa, poi di nuovo lcd.clear(), poi scrivi qualcosa, poi lcd.clear(), ecc., ad una velocità supersonica. Il risultato è che il display sembra non scrivere nulla perché i cristalli hanno una certa lentezza nella risposta.

La funzione loop() viene chiamata continuamente appena termina.

Fino a che ti ostini a non affrontare blinkwithoutdelay, siamo fritti.

a me basta che dopo il codice ci stia in un atmega8, non voglio appesantirlo per niente

cece99:

tuxduino:
Stai facendo continuamente lcd.clear(), scrivi qualcosa, poi di nuovo lcd.clear(), poi scrivi qualcosa, poi lcd.clear(), ecc., ad una velocità supersonica. Il risultato è che il display sembra non scrivere nulla perché i cristalli hanno una certa lentezza nella risposta.

La funzione loop() viene chiamata continuamente appena termina.

Fino a che ti ostini a non affrontare blinkwithoutdelay, siamo fritti.

a me basta che dopo il codice ci stia in un atmega8, non voglio appesantirlo per niente

ok, così funziona decentemente per quello che devo fare io, domani continuo le prove :

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

  }
  else {
    lcd.clear();
    lcd.print("Esecuzione");
    delay(1000);
      
}
}

Madonna santa! Quel delay(1000) proprio non si può vedere ]:smiley:

#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() {
    // lettura di switch e pulsanti
    up = digitalRead(8);
    down = digitalRead(7);
    check = digitalRead(6);

    if (check == HIGH) {  
        // modalità programmazione: mostro i valori attuali dei parametri
        lcd.setCursor(0, 0);
        lcd.clear();
        lcd.print("Giorno:");
        lcd.print(a);
        lcd.setCursor(0, 1);
        lcd.print("Notte:");
        lcd.print(b);

        // tasto su: aumento il parametro
        if (up == HIGH) {  
            if (a<255) a++;
        }  

        // tasto giù: diminuisco il parametro
        if (down == HIGH) {  
            if (a>0) a--;
        }
        
        // nessun tasto premuto: non faccio nulla
    }
    else {
        // modalità esecuzione: emetto solo un messaggio
        lcd.clear();
        lcd.print("Esecuzione");
    }
    
    // ritardo di debounce(e vabbe')
    delay(50);
}

Si dovrebbe chiamare lcd.clear() e "ridisegnare" sull'LCD solo quando necessario, cioè al cambio di modalità oppure quando varia uno dei parametri da visualizzare, ma fa niente. Questo nella versione 3.0 magari :slight_smile:

tuxduino:
Madonna santa! Quel delay(1000) proprio non si può vedere ]:smiley:

#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() {
    // lettura di switch e pulsanti
    up = digitalRead(8);
    down = digitalRead(7);
    check = digitalRead(6);

if (check == HIGH) { 
        // modalità programmazione: mostro i valori attuali dei parametri
        lcd.setCursor(0, 0);
        lcd.clear();
        lcd.print("Giorno:");
        lcd.print(a);
        lcd.setCursor(0, 1);
        lcd.print("Notte:");
        lcd.print(b);

// tasto su: aumento il parametro
        if (up == HIGH) { 
            if (a<255) a++;
        }

// tasto giù: diminuisco il parametro
        if (down == HIGH) { 
            if (a>0) a--;
        }
       
        // nessun tasto premuto: non faccio nulla
    }
    else {
        // modalità esecuzione: emetto solo un messaggio
        lcd.clear();
        lcd.print("Esecuzione");
    }
   
    // ritardo di debounce(e vabbe')
    delay(50);
}




Si dovrebbe chiamare lcd.clear() e "ridisegnare" sull'LCD solo quando necessario, cioè al cambio di modalità oppure quando varia uno dei parametri da visualizzare, ma fa niente. Questo nella versione 3.0 magari :)

In queste ore ho cominciato a riprendere il progetto, ho inserito il fade, ma l'effetto PWM è molto "granuloso" e poi riesco a far fare solo dalla massima intensità alla minima, non viceversa, qualcuno mi darebbe un occhiata allo sketch?

#include <LiquidCrystal.h>

byte fadeAmount = 0;    // how many points to fade the LED by
byte b = 0;

int up = LOW;
int down = LOW;
int up1 = LOW;
int down1 = LOW;
int check = LOW;
int led = 9;           
int brightness = 0;  

   

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

void setup() {
  pinMode(7, INPUT);     
  pinMode(8, INPUT);   
  pinMode(6, INPUT);
  pinMode(14, INPUT);
  pinMode(15, INPUT);
  pinMode(led, OUTPUT);
  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(fadeAmount);
  lcd.setCursor(0, 1);
  lcd.print("Notte:");
  lcd.print(b);

  delay(50);
  up = digitalRead(8);
  down = digitalRead(7);
  up1 = digitalRead(14);
  down1 = digitalRead(15);
  check = digitalRead(6);

  if (check == HIGH) {  

    if (up == HIGH) {  
      if (fadeAmount<255) fadeAmount++;
    }  

    if (down == HIGH) {  
      if (fadeAmount>0) fadeAmount--;
    }  
        if (down1 == HIGH) {  
      if (b>0) b--;
    }  
        if (up1 == HIGH) {  
      if (b<255) b++;
    }  

  }
  else {
    

  analogWrite(led, brightness);    


  brightness = brightness + fadeAmount;

 
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ; 
  }     
  
  delay(30);         
      
}
}

(ripeti con me: CTRL+T! CTRL+T! CTRL+T!)

Ho dato un'occhiata veloce. Hai due delay in fila: delay(50) e delay(30). Forse è per questo che il fade è un po' "scattoso".

tuxduino:
(ripeti con me: CTRL+T! CTRL+T! CTRL+T!)

Ho dato un'occhiata veloce. Hai due delay in fila: delay(50) e delay(30). Forse è per questo che il fade è un po' "scattoso".

CTRL+T non funzionaaaaaaaaaa
Ok x i delay, ma non capisco come mai il fade vada solo in un "verso".

Ciao,
provo a dire la mia, io userei delle variabili int al posto del byte su fadeAmount e b.

cece99:
Ok x i delay, ma non capisco come mai il fade vada solo in un "verso".

Il fade lo puoi fare in entrambi i versi, casomai io semplificherei un po' il tuo codice. Lo vedo un po' "contorto" :wink:

leo72:

cece99:
Ok x i delay, ma non capisco come mai il fade vada solo in un "verso".

Il fade lo puoi fare in entrambi i versi, casomai io semplificherei un po' il tuo codice. Lo vedo un po' "contorto" :wink:

Io ho messo il codice per fare il face in tutti e due i versi, ma il tutto viene "granuloso" (mi ricorda un problema con un quarzo che avevo nell'atmega8) e va solo da 255 a 0, non da 0 a 255.
Se mi dici come semplificare il codice mi metto al lavoro :wink:

A prima vista potresti iniziare a concatenare con un AND alcune if che adesso sono nidificate, e poi la variabile "b" per cosa la usi? e brightness quando la inizializzi?

cece99:

leo72:

cece99:
Ok x i delay, ma non capisco come mai il fade vada solo in un "verso".

Il fade lo puoi fare in entrambi i versi, casomai io semplificherei un po' il tuo codice. Lo vedo un po' "contorto" :wink:

Io ho messo il codice per fare il face in tutti e due i versi, ma il tutto viene "granuloso" (mi ricorda un problema con un quarzo che avevo nell'atmega8) e va solo da 255 a 0, non da 0 a 255.
Se mi dici come semplificare il codice mi metto al lavoro :wink:

Bastano un paio di variabili. Una per tenere il valore della luminosità del led ed una per l'incremento/decremento che usi anche come direzione dello stesso.

byte incremento = 1;
byte valoreLed = 0;

void loop() {
  analogWrite(LED, valoreLED);
  valoreLed += incremento;
  if ((incremento == 255) || (incremento == 0)) {
    incremento *= -1; //con questo inverti la direzione
  }
  delay(qualcosa);
}

leo72:

cece99:

leo72:

cece99:
Ok x i delay, ma non capisco come mai il fade vada solo in un "verso".

Il fade lo puoi fare in entrambi i versi, casomai io semplificherei un po' il tuo codice. Lo vedo un po' "contorto" :wink:

Io ho messo il codice per fare il face in tutti e due i versi, ma il tutto viene "granuloso" (mi ricorda un problema con un quarzo che avevo nell'atmega8) e va solo da 255 a 0, non da 0 a 255.
Se mi dici come semplificare il codice mi metto al lavoro :wink:

Bastano un paio di variabili. Una per tenere il valore della luminosità del led ed una per l'incremento/decremento che usi anche come direzione dello stesso.

byte incremento = 1;

byte valoreLed = 0;

void loop() {
  analogWrite(LED, valoreLED);
  valoreLed += incremento;
  if ((incremento == 255) || (incremento == 0)) {
    incremento *= -1; //con questo inverti la direzione
  }
  delay(qualcosa);
}

sto usando questo sketch, ma mi da sempre lo stesso problema: il PWM va da 25 a 0 ma non da 0 a 255

#include <LiquidCrystal.h>


byte b = 0;
byte incremento = 1;
int up = LOW;
int down = LOW;
int up1 = LOW;
int down1 = LOW;
int check = LOW;
int led = 9;           
int a = 0;  

   

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

void setup() {
  pinMode(7, INPUT);     
  pinMode(8, INPUT);   
  pinMode(6, INPUT);
  pinMode(14, INPUT);
  pinMode(15, INPUT);
  pinMode(led, OUTPUT);
  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);
  up1 = digitalRead(14);
  down1 = digitalRead(15);
  check = digitalRead(6);

  if (check == HIGH) {  

    if (up == HIGH) {  
      if (a<255) a++;
    }  

    if (down == HIGH) {  
      if (a>0) a--;
    }  
        if (down1 == HIGH) {  
      if (b>0) b--;
    }  
        if (up1 == HIGH) {  
      if (b<255) b++;
    }  

  }
  else {
    
  analogWrite(led, incremento );
  incremento += a;
  if ((a == 255) || (a == 0)) {
    a *= -1; //con questo inverti la direzione
  }
  delay(15);
}
}

Bene,bene, ho appena aggiunto il led rgb (mi stancava il led normale ]:D) e dopo varie prove sono riuscito ad ottenere un effetto bruttissimo, io dovrei fare: primo led da 0 a 255, poi da 255 a 0, dopo entra il secondo che fa 0-255 e 255-0 e dopo riparte il loop, ma non riesco a combinare nulla
Ecco lo sketch:

#include <LiquidCrystal.h>


byte b = 0;
byte incremento = 1;
byte incremento1 = 1;
int up = LOW;
int down = LOW;
int up1 = LOW;
int down1 = LOW;
int check = LOW;
int led = 9;           
byte a = 0;  

   

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

void setup() {
  pinMode(7, INPUT);     
  pinMode(8, INPUT);   
  pinMode(6, INPUT);
  pinMode(14, INPUT);
  pinMode(15, INPUT);
  pinMode(led, OUTPUT);
  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);
  up1 = digitalRead(14);
  down1 = digitalRead(15);
  check = digitalRead(6);

  if (check == HIGH) {  

    if (up == HIGH) {  
      if (a<255) a++;
    }  

    if (down == HIGH) {  
      if (a>0) a--;
    }  
        if (down1 == HIGH) {  
      if (b>0) b--;
    }  
        if (up1 == HIGH) {  
      if (b<255) b++;
    }  

  }
  else {
    
  analogWrite(led, incremento);
  incremento += a;
  if ((a == 255) || (a == 0)) {
    a *= -1; 
  }
  delay(15);
  
  
  analogWrite(led, incremento);  
  incremento = incremento + a;
  if (incremento == 0 || incremento == 255) {
    a = -a ; 
  }     
 
  delay(30); 
 
  analogWrite(10, incremento1);
  incremento1 = incremento1 + b;
  if (incremento1 == 255 || incremento1 == 0) {
    b = -b ; 
  }     
  delay(30);   
}
}

Scusa ho sbagliato il codice :sweat_smile:

byte incremento = 1;
byte valoreLed = 0;

void loop() {
  analogWrite(LED, valoreLED);
  valoreLed += incremento;
  if ((valoreLed == 255) || (valoreLed == 0)) {
    incremento *= -1; //con questo inverti la direzione
  }
  delay(qualcosa);
}

leo72:
Scusa ho sbagliato il codice :sweat_smile:

byte incremento = 1;

byte valoreLed = 0;

void loop() {
  analogWrite(LED, valoreLED);
  valoreLed += incremento;
  if ((valoreLed == 255) || (valoreLed == 0)) {
    incremento *= -1; //con questo inverti la direzione
  }
  delay(qualcosa);
}

Adesso ho modificato il codice, ma, se aumento la velocità del fading, mi da i soliti problemi =(

#include <LiquidCrystal.h>


byte b = 0;
byte valoreLed = 1;
byte valoreLed1 = 1;
int up = LOW;
int down = LOW;
int up1 = LOW;
int down1 = LOW;
int check = LOW;
int led = 9;           
byte a = 0;  

   

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

void setup() {
  pinMode(7, INPUT);     
  pinMode(8, INPUT);   
  pinMode(6, INPUT);
  pinMode(14, INPUT);
  pinMode(15, INPUT);
  pinMode(led, OUTPUT);
  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);
  up1 = digitalRead(14);
  down1 = digitalRead(15);
  check = digitalRead(6);

  if (check == HIGH) {  

    if (up == HIGH) {  
      if (a<255) a++;
    }  

    if (down == HIGH) {  
      if (a>0) a--;
    }  
        if (down1 == HIGH) {  
      if (b>0) b--;
    }  
        if (up1 == HIGH) {  
      if (b<255) b++;
    }  

  }
  else {
    
  analogWrite(9, valoreLed);
  valoreLed += a;
  if ((valoreLed == 255) || (valoreLed == 0)) {
    a *= -1; //con questo inverti la direzione
  }
  delay(30);
  

  
  

}
}

Poiché a può essere > 1, devi sostituire i test == 255 e == 0 con >= 255 e <= 0.

tuxduino:
Poiché a può essere > 1, devi sostituire i test == 255 e == 0 con >= 255 e <= 0.

Ho provato ma gli effetti fanno schifo, come mai? io voglio semplicemente fare così: led 1 0-255;255-0 led2 0-255;255-0, ma il codice non fa quello che voglio io =(

#include <LiquidCrystal.h>


byte b = 0;
byte valoreLed = 1;
byte valoreLed1 = 1;
int up = LOW;
int down = LOW;
int up1 = LOW;
int down1 = LOW;
int check = LOW;
int led = 9;           
byte a = 0;  

   

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

void setup() {
  pinMode(7, INPUT);     
  pinMode(8, INPUT);   
  pinMode(6, INPUT);
  pinMode(14, INPUT);
  pinMode(15, INPUT);
  pinMode(led, OUTPUT);
  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);
  up1 = digitalRead(14);
  down1 = digitalRead(15);
  check = digitalRead(6);

  if (check == HIGH) {  

    if (up == HIGH) {  
      if (a<255) a++;
    }  

    if (down == HIGH) {  
      if (a>0) a--;
    }  
        if (down1 == HIGH) {  
      if (b>0) b--;
    }  
        if (up1 == HIGH) {  
      if (b<255) b++;
    }  

  }
  else {
    
  analogWrite(9, valoreLed);
  valoreLed += a;
  if ((valoreLed >= 255) || (valoreLed <= 0)) {
    a *= -1; //con questo inverti la direzione
  }
  delay(30);
  
  analogWrite(10, valoreLed1);
  valoreLed1 += b;
  if ((valoreLed1 >= 255) || (valoreLed1 <= 0)) {
    b *= -1; //con questo inverti la direzione
  }
  delay(30);
  
  

}
}

tuxduino:
Poiché a può essere > 1, devi sostituire i test == 255 e == 0 con >= 255 e <= 0.

Esatto.

cece99:
Ho provato ma gli effetti fanno schifo, come mai?

Senza sapere cosa intendi per "schifo" è difficile aiutarti di più. Comunque se tu fai 253+5 non ottieni 258 ma 3 (stai usando un byte, ricordi?) quindi gli effetti sembreranno impazziti. Devi rivedere tutto il codice, non solo prendere parte di quello che già avevi scritto ed incollarci pari pari quello che ti ho scritto io. :stuck_out_tongue:

leo72:

tuxduino:
Poiché a può essere > 1, devi sostituire i test == 255 e == 0 con >= 255 e <= 0.

Esatto.

cece99:
Ho provato ma gli effetti fanno schifo, come mai?

Senza sapere cosa intendi per "schifo" è difficile aiutarti di più. Comunque se tu fai 253+5 non ottieni 258 ma 3 (stai usando un byte, ricordi?) quindi gli effetti sembreranno impazziti. Devi rivedere tutto il codice, non solo prendere parte di quello che già avevi scritto ed incollarci pari pari quello che ti ho scritto io. :stuck_out_tongue:

che èsta storia del 258 e del 3?

cece99:
che èsta storia del 258 e del 3?

Hai ragione, 253+5 = 2, ho sbagliato :stuck_out_tongue_closed_eyes:

Sstudia un po' il Reference del linguaggio:

Ed i tipi di dati, nello specifico il tipo "byte":
http://arduino.cc/en/Reference/Byte

Poi dopo TU mi spieghi perché 253+5=2 :wink: