Problemino sketch

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:

leo72:

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:
Arduino - Home
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:

Quello lo o, l'avevo studiato mooolto tempo fa, ma non capisco che funzione mi fa sto "famigerato" 253+5

Chiedo scusa, non avevo notato che valoreLed ecc. erano dichiarati byte e non int :cold_sweat:

tuxduino:
Chiedo scusa, non avevo notato che valoreLed ecc. erano dichiarati byte e non int :cold_sweat:

Gli devo dichiarare INT?

Non so, il fatto è che un byte può rappresentare i valori 0-255, quindi chiedersi se un byte è > 255 non ha senso.

tuxduino:
Non so, il fatto è che un byte può rappresentare i valori 0-255, quindi chiedersi se un byte è > 255 non ha senso.

quello lo so, ma non riesco a capire cosa centri sto 253+5

Questo è quello che sto creando, ma non funziona =( (è la parte x solo il fading)

  analogWrite(9, valoreLed);
  analogWrite(10, valoreLed1);
    
   
 if ((valoreLed1 >= 255) || (valoreLed1 <= 0)) {
  g:
  analogWrite(10, 0);
      
      a=a+valoreLed;
 }
      else {
        goto h;
      }
  if ((valoreLed >= 255) || (valoreLed <= 0)) {
   h:
   analogWrite(9, 0);
   b=b-valoreLed1;
  }
    else{
      goto g;
  }
  }
  }

Tu hai scritto una porzione di codice che incrementa il valore della luminosità del led con una variabile che contiene un numero anche maggiore di 1.
Ammettiamo che questo valore sia appunto 5 ed ammettiamo che la luminosità attuale del led sia 253. Facendo 253+5 ottieni 2, ed il test che fai tu:

if ((valoreLed >= 255) || (valoreLed <= 0))

viene saltato, quindi il ciclo viene ripetuto un'altra volta, senza che il fade torni a 0.

Mi scuso anche per averti fatto ingrullire perché ho fatto un errore nel precedente codice, dove ho messo incremento di tipo byte mentre serve di tipo char, dato che poteva andare anche negativo.
Questo codice funziona con qualunque incremento di fading (basta che sia max di 127).

char incremento=5;
byte valoreLed=0;
byte LED = 3;

void setup() {
}

void loop() {
  analogWrite(LED, valoreLed);
  if (incremento > 0) {
    if (valoreLed > (255-incremento)) {
      incremento *= -1;
    }
  } else {
    if (valoreLed < abs(incremento)) {
      incremento *= -1;
    }
  }
  valoreLed += incremento;
  delay(25);
}