Pages: 1 2 [3] 4 5   Go Down
Author Topic: Problemino sketch  (Read 3454 times)
0 Members and 1 Guest are viewing this topic.
Dueville (VI)
Offline Offline
Edison Member
*
Karma: 28
Posts: 1748
http://cesarecacitti.wordpress.com/
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-sad
Logged

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

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Dueville (VI)
Offline Offline
Edison Member
*
Karma: 28
Posts: 1748
http://cesarecacitti.wordpress.com/
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

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

Dueville (VI)
Offline Offline
Edison Member
*
Karma: 28
Posts: 1748
http://cesarecacitti.wordpress.com/
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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);
     
}
}
Logged

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

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Madonna santa! Quel delay(1000) proprio non si può vedere   smiley-twist

Code:
#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 smiley
Logged

Dueville (VI)
Offline Offline
Edison Member
*
Karma: 28
Posts: 1748
http://cesarecacitti.wordpress.com/
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Madonna santa! Quel delay(1000) proprio non si può vedere   smiley-twist

Code:
#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 smiley
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:
#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);         
     
}
}
Logged

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

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Dueville (VI)
Offline Offline
Edison Member
*
Karma: 28
Posts: 1748
http://cesarecacitti.wordpress.com/
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

ITALY
Offline Offline
Full Member
***
Karma: 1
Posts: 188
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 332
Posts: 22798
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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"  smiley-wink
Logged


Dueville (VI)
Offline Offline
Edison Member
*
Karma: 28
Posts: 1748
http://cesarecacitti.wordpress.com/
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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"  smiley-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 smiley-wink
Logged

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

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 332
Posts: 22798
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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"  smiley-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 smiley-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.
Code:
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);
}
Logged


Dueville (VI)
Offline Offline
Edison Member
*
Karma: 28
Posts: 1748
http://cesarecacitti.wordpress.com/
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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"  smiley-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 smiley-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.
Code:
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:
#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);
}
}
Logged

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

Dueville (VI)
Offline Offline
Edison Member
*
Karma: 28
Posts: 1748
http://cesarecacitti.wordpress.com/
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bene,bene, ho appena aggiunto il led rgb (mi stancava il led normale smiley-twist) 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:
#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);  
}
}
« Last Edit: October 06, 2012, 03:16:30 am by cece99 » Logged

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

Pages: 1 2 [3] 4 5   Go Up
Jump to: