Go Down

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

leo72

Scusa ho sbagliato il codice  :smiley-sweat:

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

cece99


Scusa ho sbagliato il codice  :smiley-sweat:

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

 
 

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

tuxduino

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

cece99


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

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

leo72


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

Esatto.


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.  :P

cece99



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

Esatto.


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.  :P

che èsta storia del 258 e del 3?
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

leo72


che èsta storia del 258 e del 3?

Hai ragione, 253+5 = 2, ho sbagliato  :smiley-yell:

Sstudia un po' il Reference del linguaggio:
http://arduino.cc/en/Reference/HomePage
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  ;)

cece99



che èsta storia del 258 e del 3?

Hai ragione, 253+5 = 2, ho sbagliato  :smiley-yell:

Sstudia un po' il Reference del linguaggio:
http://arduino.cc/en/Reference/HomePage
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  ;)

Quello lo o, l'avevo studiato mooolto tempo fa, ma non capisco che funzione mi fa sto "famigerato" 253+5
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

tuxduino

Chiedo scusa, non avevo notato che valoreLed ecc. erano dichiarati byte e non int  :smiley-roll-sweat:

cece99


Chiedo scusa, non avevo notato che valoreLed ecc. erano dichiarati byte e non int  :smiley-roll-sweat:

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

tuxduino

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

cece99


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

cece99

Questo è quello che sto creando, ma non funziona =( (è la parte x solo il fading)
Code: [Select]
  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;
  }
  }
  }
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

leo72

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

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

cece99

#59
Oct 07, 2012, 11:33 am Last Edit: Oct 07, 2012, 11:43 am by cece99 Reason: 1

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

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


ti ringrazio, ora stoprovando con questo sketch, ma nel display, al posto di visualizzare le variabili char, mi mostra caratteri "cinesini"
Code: [Select]
#include <LiquidCrystal.h>



char b = 0;
byte valoreLed = 0;
byte valoreLed1 = 0;
int up = LOW;
int down = LOW;
int up1 = LOW;
int down1 = LOW;
int check = LOW;
int led = 9;           
char 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, valoreLed);
  if (a > 0) {
    if (valoreLed > (255-a)) {
      a *= -1;
    }
  } else {
    if (valoreLed < abs(a)) {
      a *= -1;
    }
  }
  valoreLed += a;
  delay(25);

    analogWrite(10, valoreLed1);
  if (b > 0) {
    if (valoreLed1 > (255-b)) {
      b *= -1;
    }
  } else {
    if (valoreLed1 < abs(b)) {
      b *= -1;
    }
  }
  valoreLed1 += b;
  delay(25);
}
}

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

Go Up