Go Down

Topic: Problemino sketch (Read 4000 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