Go Down

Topic: Problemino sketch (Read 4982 times) previous topic - next topic

cece99


Dovresti descrivere meglio il problema. "Non fa quello che deve fare" è troppo generico. Devi dire cosa ti aspetti e cosa succede invece.

mi aspetto che scriva su lcd "esecuzione" mentre non fa un tubo, inibisce solo la finzione dei pulsantini :(
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

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.

cece99


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
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

cece99



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 :
Code: [Select]
#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);
     
}
}
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

tuxduino

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

Code: [Select]
#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 :)

cece99


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

Code: [Select]
#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?
Code: [Select]
#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);         
     
}
}
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

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".

cece99


(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".
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

DevonMiles

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

leo72


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

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

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 ;)
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

BrainBooster

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?

leo72




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

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

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.
Code: [Select]

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

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

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

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.
Code: [Select]

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
Code: [Select]
#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);
}
}
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

cece99

#44
Oct 06, 2012, 09:57 am Last Edit: Oct 06, 2012, 10:16 am by cece99 Reason: 1
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:
Code: [Select]
#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);  
}
}

Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy