Pages: 1 2 3 [4] 5   Go Down
Author Topic: Problemino sketch  (Read 3478 times)
0 Members and 1 Guest are viewing this topic.
Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 332
Posts: 22813
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusa ho sbagliato il codice  smiley-sweat

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


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

Scusa ho sbagliato il codice  smiley-sweat

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

 
 

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

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

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

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

}
}
Logged

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

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

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


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

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.  smiley-razz
che èsta storia del 258 e del 3?
Logged

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

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

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


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

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  smiley-wink
Quello lo o, l'avevo studiato mooolto tempo fa, ma non capisco che funzione mi fa sto "famigerato" 253+5
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

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

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

Chiedo scusa, non avevo notato che valoreLed ecc. erano dichiarati byte e non int  smiley-roll-sweat
Gli devo dichiarare INT?
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

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

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

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
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: 1749
http://cesarecacitti.wordpress.com/
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Questo è quello che sto creando, ma non funziona smiley-cry (è la parte x solo il fading)
Code:
  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;
  }
  }
  }
Logged

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

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

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


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

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:
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:
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:
#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]
« Last Edit: October 07, 2012, 04:43:55 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: