Ci risiamo

L'anno scorso grazie all'aiuto di gpb01 (Guglielmo) ho programmato un arduino nano per far brillare il cielo stellato del mio presepe.
Purtroppo per problemi al pc ho perso lo schetch che adesso sto cercando di ricostruire. Premetto che per problemi di salute e di lavoro sono rimasto lontano dal mondo arduino. Ho quindi ripreso la discussione precedente e mi sono rimesso all'opera. Purtroppo ho modificato lo schetch ma non sembra funzionare e cioè i led fissi si accendono mentre il fade ed il ramdom non ne vogliono sapere.
Allego lo schetch.
Qualcuno potrebbe farmi capire dov'è l'errore ?

//Marrone 2 = Fissa
//Rosso 3 = Fissa
//Arancio 5 = Fade
//Giallo 6 = Random
//Verde 7 = Fissa
//Blu 8 = Fissa
//Viola 9 = Fissa
//Grigio 10 = Fissa
//Nero N = Negativo    

//******* dichiarazioni ********
const int Marrone = 2; //pin del Fissa
const int Rossa = 3; //pin del Fissa
const int Arancio = 5; //pin del Fade
const int Giallo = 6; //pin del Random
const int Verde = 7; //pin del Fissa
const int Blu = 8; //pin del Fissa
const int Viola = 9; //pin del Fissa
const int Grigio = 10; //pin del Fissa

int valoreX   = 0;       //imposta la variabile numerica
int fadeValue = 0;     //valore iniziale fade
int fadeUpDn  = 1;     //0 = Down, 1 = Up

unsigned long fadeTime;     //tempo ultimo fade
unsigned long rndTime;     //tempo ultima random


//********** setup **********
void setup() {
  pinMode(Marrone, OUTPUT); //imposta il pin del Led come uscita
  pinMode(Rossa, OUTPUT); //imposta il pin del Led come uscita
  pinMode(Arancio, OUTPUT); //imposta il pin del Led come uscita
  pinMode(Giallo, OUTPUT); //imposta il pin del Led come uscita
  pinMode(Verde, OUTPUT); //imposta il pin del Led come uscita
  pinMode(Blu, OUTPUT); //imposta il pin del Led come uscita
  pinMode(Viola, OUTPUT); //imposta il pin del Led come uscita
  pinMode(Grigio, OUTPUT); //imposta il pin del Led come uscita

  fadeTime = millis();
  rndTime  = millis();
}

void loop() {
  // accendo i led fissi
  digitalWrite(Marrone, HIGH);
  digitalWrite(Rossa, HIGH);
  digitalWrite(Verde, HIGH);
  digitalWrite(Blu, HIGH);
  digitalWrite(Viola, HIGH);
  digitalWrite(Grigio, HIGH);


  
  // questo si ripete ogni 50 millisecondi circa
  //
  if (millis() - rndTime >= 50) {
    valoreX = random(50, 250);
    analogWrite(Giallo, valoreX);
    //
    rndTime = millis(); // aggiorna il tempo per il prossimo evento random
  }
  //
  // questo si ripete ogni 30 millisecondi circa
  //
  if (millis() - fadeTime >= 30) {
    if (fadeUpDn == 1) {
      fadeValue += 5;
      analogWrite(Arancio, fadeValue);
      if (fadeValue == 255) fadeUpDn = 0; // arrivato al massimo, devi decrescere
    }
    else {
      fadeValue -= 5;
      analogWrite(Arancio, fadeValue);
      if (fadeValue == 0) fadeUpDn = 1; // arrivato al minimo, devi crescere
    }
    //
    fadeTime = millis(); // aggiorna il tempo per il prossimo evento fade
  }
}

Grazie

Hai guardato quel tuo vecchio thread ?

Se guardi il tuo profilo, show posts li rivedi tutti.

--- spostato nella sezione Software - gpb01

Ho guardato il vecchio post, ma non riesco a capire dov'è l'errore nel mio scheth e quindi mi sono impantanato

Nessuno che mi dà uno spunto, un aiuto?

Sai che sto guardando il codice, ma non mi salta agli occhi nulla ... ::slight_smile:

... i pin 5 e 6 sono correttamente pin PWM
... le variabili fadeTime e rndTime le hai dichiarate correttamente unsigned long
... all'interno del loop() fai tutti i controlli su millis()

... mi sfugge qualche cosa :confused: ... sei SICURO dei collegamenti dei LED ?

Guglielmo

P.S.: Mi raccomando, per i pin ti basta *const byte" invece di "const int" dato che tanto 255 pin NON li hai :smiley: :smiley: :smiley:

Lo sto provando sul simulatore per arduino della virtronic. Mentre per gli altri led li vedo accesi random e fade no

Allora, il programma gira tranquillamente ed entra in tutte le routines, però intanto … mi dici CHI spegne i LED fissi ?

Poi vediamo il resto (… a me si accendono anche i LED sul 5 e 6).

Guglielmo

Questo il codice che sto facendo girare … stampa sulla seriale dove passa :

#define _DEBUG_

//Marrone 2 = Fissa
//Rosso 3 = Fissa
//Arancio 5 = Fade
//Giallo 6 = Random
//Verde 7 = Fissa
//Blu 8 = Fissa
//Viola 9 = Fissa
//Grigio 10 = Fissa
//Nero N = Negativo

//******* dichiarazioni ********
const int Marrone = 2; //pin del Fissa
const int Rossa = 3; //pin del Fissa
const int Arancio = 5; //pin del Fade
const int Giallo = 6; //pin del Random
const int Verde = 7; //pin del Fissa
const int Blu = 8; //pin del Fissa
const int Viola = 9; //pin del Fissa
const int Grigio = 10; //pin del Fissa

int valoreX   = 0;       //imposta la variabile numerica
int fadeValue = 0;     //valore iniziale fade
int fadeUpDn  = 1;     //0 = Down, 1 = Up

unsigned long fadeTime;     //tempo ultimo fade
unsigned long rndTime;     //tempo ultima random


//********** setup **********
void setup() {
  #ifdef _DEBUG_
    delay(1000);
    Serial.begin(9600);
  #endif
  pinMode(Marrone, OUTPUT); //imposta il pin del Led come uscita
  pinMode(Rossa, OUTPUT); //imposta il pin del Led come uscita
  pinMode(Arancio, OUTPUT); //imposta il pin del Led come uscita
  pinMode(Giallo, OUTPUT); //imposta il pin del Led come uscita
  pinMode(Verde, OUTPUT); //imposta il pin del Led come uscita
  pinMode(Blu, OUTPUT); //imposta il pin del Led come uscita
  pinMode(Viola, OUTPUT); //imposta il pin del Led come uscita
  pinMode(Grigio, OUTPUT); //imposta il pin del Led come uscita

  fadeTime = millis();
  rndTime  = millis();
}

void loop() {
  // accendo i led fissi
  digitalWrite(Marrone, HIGH);
  digitalWrite(Rossa, HIGH);
  digitalWrite(Verde, HIGH);
  digitalWrite(Blu, HIGH);
  digitalWrite(Viola, HIGH);
  digitalWrite(Grigio, HIGH);
  #ifdef _DEBUG_
    Serial.println("LED fissi accesi");
  #endif
  //
  // questo si ripete ogni 50 millisecondi circa
  //
  if (millis() - rndTime >= 50) {
    valoreX = random(50, 250);
    analogWrite(Giallo, valoreX);
    //
    rndTime = millis(); // aggiorna il tempo per il prossimo evento random
    #ifdef _DEBUG_
      Serial.println("Sono nella routine random");
  #endif
  }
  //
  // questo si ripete ogni 30 millisecondi circa
  //
  if (millis() - fadeTime >= 30) {
    if (fadeUpDn == 1) {
      fadeValue += 5;
      analogWrite(Arancio, fadeValue);
      if (fadeValue == 255) fadeUpDn = 0; // arrivato al massimo, devi decrescere
    }
    else {
      fadeValue -= 5;
      analogWrite(Arancio, fadeValue);
      if (fadeValue == 0) fadeUpDn = 1; // arrivato al minimo, devi crescere
    }
    //
    fadeTime = millis(); // aggiorna il tempo per il prossimo evento fade
    #ifdef _DEBUG_
      Serial.println("Sono nella routine fade");
  #endif
  }
}

In testa ho messo una #define DEBUG … basta che la commenti e tutto quello che riguarda la seriale è come se NON esistesse :wink:

Guglielmo

Io "seguo" con interesse, volevo cimentarmi pure io nel "mescolare" random e millis.

>speedyant: basta che copi/incolli il codice qua sopra ... :wink: però manca qun pezzo, quello che, NON so per quali condizioni (Jkwxp non lo dice e non lo fa), spegne i LED fissi ... ::slight_smile:

Guglielmo

gpb01:
>speedyant: basta che copi/incolli il codice qua sopra ... :wink: però manca qun pezzo, quello che, NON so per quali condizioni (Jkwxp non lo dice e non lo fa), spegne i LED fissi ... ::slight_smile:

Guglielmo

I led fissi vanno spenti quando si spegne tutto.

Ho provato il tuo programma sul simulatore e ancora i led sul 5 e 6 non si accendono mai

Quindi gli rimangono tutti accesi. Potrebbe essere un motivo del "problema" generale?
Comunque per il copia/incolla, non posso "smitragliare" punti karma come vorrei...

:smiley:

Jkwxp:
Ho provato il tuo programma sul simulatore e ancora i led sul 5 e 6 non si accendono mai

Buco del simulatore ... visto che io l'ho provato ... SU ARDUINO con due LED :smiling_imp:

E poi basta che prendi quello che ho messo sopra, apri il monitor seriale e vedi il programma girare ...

Guglielmo

Jkwxp:
I led fissi vanno spenti quando si spegne tutto.

... ma NON lo fai e poi ... chi ti garantisce che sia il random che il fade siano entrambi spenti ? Anzi ... credo che sia una condizione impossibile per come è scritto il programma ... ::slight_smile:

Guglielmo

gpb01:
... ma NON lo fai e poi ... chi ti garantisce che sia il random che il fade siano entrambi spenti ? Anzi ... credo che sia una condizione impossibile per come è scritto il programma ... ::slight_smile:

Guglielmo

Allora ti spiego la situazione. Non ho arduino nano sotto mano e quindi stavo preparando il software. Per provarlo come ti ho detto prima uso il simulatore. Questo simulatore mi indica l'accensione del pin e quindi del led in rosso di intensità variabile in base al valore. Mentre i pin fissi sono di colore rosso sia il fade che il random sono sempre bianchi. Ho caricato sempre sul simulatore il tuo programma e anche sul seriale mi indica solo l'accensione dei led fissi senza mai indicarmi che entra nel fade o nel ramdom. In questi giorni proverò con un arduino collegato o esiste qualche altro metodo per la verifica senza arduino?

P:S: I led fissi vengono spenti togliendo l'alimentazione quando spengo il presepe. E' sbagliato?

Ma sei sicuro che il simulatore gestisca la millis() ? ? ? ... perché secondo me è quello il problema :wink:

Guglielmo

Non lo so questo, errori non ne dà. Esiste un altro metodo per provarlo senza arduino?

Allora, si, la millis() funziona, basta che guardi sulla barra dove sta il bottone di RUN e c'è un campo che te la fa vedere ed il programma gira pure, solo che ... evidentemente NON hai letto le note che accompagnato il simulatore e che per la millis() dicono :

Please note that the Simulator is not a real-time Simulator and runs around 1000 to 10000 times slower than a real Arduino.

quindi ... gli eveti si scatenano una volta ogni morte di papa :smiley: :smiley: :smiley:

Io, lasciandolo girare svariati minuti, sono riuscoito a vedere sulla seriale UNA volta il passaggio ... :smiley: :smiley: :smiley:

Guglielmo

P.S.: Le prove si fanno con un vero Arduino .. i simulatori sono buoni SOLO per imparare le varie istruzioni ...

Quindi già il mio programma molto probabilmente funzionava ? Inoltre i led fissi conviene farli spegnere prima di togliere l'alimentazione? Se sì come faccio?

In questi giorni farò una prova con un arduino clone.

P.S. Per Guglielmo ti ringrazio moltissimo per il tuo tempo che mi hai dedicato

Jkwxp:
Quindi già il mio programma molto probabilmente funzionava ?

SI, funzionav, era con il simulatore che, data la lentezza, non vedevi l'effetto :wink:

Jkwxp:
Inoltre i led fissi conviene farli spegnere prima di togliere l'alimentazione? Se sì come faccio?

Per quanto riguarda lo spegnerli prima di togliere alimentazione ... NON c'è alcun motivo.

Se invece li vuoi spegnere per fare degli effetti di luce ... come sempre ti devi inventare una regola per cui li spegni e una per cui li accendi :wink:

Guglielmo