Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Controllare presepe con Arduino

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteMassimoB, Foto UtenteWALTERmwp, Foto Utentexyz

0
voti

[61] Re: Controllare presepe con Arduino

Messaggioda Foto Utentepaofanello » 5 dic 2015, 2:08

Come ha detto Russel conviene che ti concentri su un blocco alla volta, potresti provare a far funzionare intanto ogni parte del giorno una per volta, senza che su susseguano. Praticamente carichi uno sketch per l'alba e vedi se le luci vanno bene, poi il giorno ecc... Poi puoi vedere se funziona l'alternarsi e il discorso del tempo!
Piuttosto che chiedere qualcosa a me, chiedila a Mara Maionchi. E' più competente.
Avatar utente
Foto Utentepaofanello
2.275 8 13
Expert
Expert
 
Messaggi: 532
Iscritto il: 7 lug 2015, 21:01

0
voti

[62] Re: Controllare presepe con Arduino

Messaggioda Foto Utentedadothebest » 5 dic 2015, 2:52

Non potrei creare uno sketch che funzioni in cascata? Ad esempio inizia con il primo led in fade, dopo un tot secondi ne accende un altro in fade, poi dopo un tempo spegne il led di prima in fade e contemporaneamente ne accende un altro e così via?
Avatar utente
Foto Utentedadothebest
24 2 7
Frequentatore
Frequentatore
 
Messaggi: 229
Iscritto il: 25 nov 2013, 17:13
Località: Ascoli Piceno

0
voti

[63] Re: Controllare presepe con Arduino

Messaggioda Foto UtenteTardoFreak » 5 dic 2015, 3:41

Cosa intendi per "creare uno sketch che funzioni in cascata"
il cosiddetto sketch è, a tutti gli effetti, un programma. O meglio sono funzioni che vengono chiamate da un main.
Cosa è questa "cascata"?
Stai parlando con cognizione di causa o stai cercando di dire un qualcosa ma ... non sai bene come dirlo e quindi ti inventi termini astrusi?
Avatar utente
Foto UtenteTardoFreak
73,4k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15764
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[64] Re: Controllare presepe con Arduino

Messaggioda Foto Utentedadothebest » 6 dic 2015, 0:55

Ci sono riuscito!! Ho adattato uno sketch preso on-line e studiandolo pezzo per pezzo sono riuscito a farlo funzionare come dovrebbe (per ora).
Vi ringrazio ancora una volta per il vostro aiuto siete incredibili!! :D =D>
Avatar utente
Foto Utentedadothebest
24 2 7
Frequentatore
Frequentatore
 
Messaggi: 229
Iscritto il: 25 nov 2013, 17:13
Località: Ascoli Piceno

0
voti

[65] Re: Controllare presepe con Arduino

Messaggioda Foto Utentedadothebest » 6 dic 2015, 10:59

Come non detto... non riesco a risolvere 2 ultime cose:
1) Nello sketch per cambiare la durata di ogni fase basta cambiare i valori in millisicondi della seguente stringa:
Codice: Seleziona tutto
int oneminrome[4] = { 5000,20000,5000,6000 };

il problema è che se provo a mettere un valore abbastanza grande, tipo 100000ms, il programma mi restituisce l'errore "Programma_presepe.ino:10:45: warning: overflow in implicit constant conversion [-Woverflow]" e il ciclo si blocca su quesl valore che ha dato errore.
2)Vorrei modificare la durata del fade poiché anch se aumento i valori nella stringa precedente, la durata è sempre la stessa.
Vi scrivo lo sketch funzionante:
Codice: Seleziona tutto
#define pin_down   10
#define pin_sun    11
#define pin_sunset 9
#define pin_moon   6
#define pin_starsA 5
#define pin_starsB 3
#define pin_luciint 2
#define pin_luciest 4

int oneminrome[4] = { 5000,200000,5000,6000 };
int oneminbtlm[4] = { 2972,9788,2976,9257 };
int timeStepOld = 0;
int timeStep = 0;

long timeCurr = 0;

byte fade[]  = {255,250,245,240,235,230,225,220,215,210,205,200,195,190,185,180,175,170,165,160,155,150,145,140,135,130,125,120,115,110,105,100,95,90,85,80,75,70,65,60,55,50,45,40,35,30,25,20,15,10,5,0}; // 52 step
byte curr   = 0;

void setup() {
  Serial.begin( 9600 );
   
  pinMode( pin_down  ,OUTPUT );
  pinMode( pin_sun   ,OUTPUT );
  pinMode( pin_sunset,OUTPUT );
  pinMode( pin_moon  ,OUTPUT );
  pinMode( pin_starsA,OUTPUT );
  pinMode( pin_starsB,OUTPUT );
  pinMode( pin_luciint,OUTPUT );
  pinMode( pin_luciest,OUTPUT );

  analogWrite( pin_down  ,LOW );
  analogWrite( pin_sun   ,LOW );
  analogWrite( pin_sunset,LOW );
  analogWrite( pin_moon  ,LOW );
  analogWrite( pin_starsA,LOW );
  analogWrite( pin_starsB,LOW );
  digitalWrite( pin_luciint,LOW );
  digitalWrite( pin_luciest,LOW );
   
  Serial.println("-- START --");
}

void loop() {
  timeCurr = oneminrome[curr];
  timeStep = (timeCurr/52);

  Serial.print("Current: "); Serial.println(curr);
  Serial.print("Time current: "); Serial.println(timeCurr);
  Serial.print("Time single step: "); Serial.println(timeStep);

  // down
  if ( curr == 0 ) {
     Serial.print("Fase: "); Serial.println("DOWN");
     for ( int i=0; i<52; i++) {
       analogWrite(pin_down,   fade[(51-i)]);
       if ( fade[i] < 25) digitalWrite(pin_luciest,    0 );
       analogWrite(pin_sun,    0 );
       analogWrite(pin_sunset, 0 );
       analogWrite(pin_moon,   fade[i] );
       analogWrite(pin_starsA, fade[i] );
       analogWrite(pin_starsB, fade[i] );
       digitalWrite(pin_luciint, 1 );
       delay( timeStep );
     }
     timeStepOld = timeStep;
  }

  // sun
  if ( curr == 1 ) {
     Serial.print("Fase: "); Serial.println("SUN");
     for ( int i=0; i<52; i++) {
       analogWrite(pin_down,   fade[i]);
       if ( fade[i] < 125) analogWrite(pin_sun,    fade[(51-i)]*2 );
       if ( fade[i] < 10) digitalWrite(pin_luciint,    0 );
       analogWrite(pin_sunset, 0 );
       analogWrite(pin_moon,   0 );
       analogWrite(pin_starsA, 0 );
       analogWrite(pin_starsB, 0 );
       digitalWrite(pin_luciest, 0 );
       delay( timeStepOld );
     }
     timeStepOld = (timeStepOld*52); // elapsed time
     timeCurr = (timeCurr - timeStepOld);
     delay( timeCurr );
  }

  // sunset
  if ( curr == 2 ) {
     Serial.print("Fase: "); Serial.println("SUNSET");
     for ( int i=0; i<52; i++) {
       analogWrite(pin_down,   0);
       analogWrite(pin_sun,    fade[i] );
       analogWrite(pin_sunset, fade[(51-i)] );
        if ( fade[i] < 150) digitalWrite(pin_luciint,    1 );
       analogWrite(pin_moon,   0 );
       analogWrite(pin_starsA, 0 );
       analogWrite(pin_starsB, 0 );
       digitalWrite(pin_luciest, 0 );
       delay( timeStep );
     }
     timeStepOld = timeStep;
  }
   
  // moon
  if ( curr == 3 ) {
     Serial.print("Fase: "); Serial.println("MOON");
     for ( int i=0; i<52; i++) {
       analogWrite(pin_down,   0);
       analogWrite(pin_sun,    0 );
       analogWrite(pin_sunset, fade[i] );
       if ( fade[i] < 20) analogWrite(pin_moon,   fade[(51-i)]*2 );
       if ( fade[i] < 125) analogWrite(pin_starsA, fade[(51-i)]*2 );
       if ( fade[i] < 250) analogWrite(pin_starsB, fade[(51-i)]*2 );
       if ( fade[i] < 100) digitalWrite(pin_luciest,    1 );
       digitalWrite(pin_luciint, 1 );
       delay( timeStepOld );     
   }     
   timeStepOld = (timeStepOld*52); // elapsed time     
   timeCurr = (timeCurr - timeStepOld);     
   delay( timeCurr );
  }   
  curr++;
  if ( curr >= 4 ) { curr = 0; }
}

Posso risolvere in qualche modo questi problemi?
Avatar utente
Foto Utentedadothebest
24 2 7
Frequentatore
Frequentatore
 
Messaggi: 229
Iscritto il: 25 nov 2013, 17:13
Località: Ascoli Piceno

0
voti

[66] Re: Controllare presepe con Arduino

Messaggioda Foto Utentepaofanello » 6 dic 2015, 11:47

Ripeto: Non sono esperto, ma il programma mi sembra scritto abbastanza male, cosa che unita alla totale mancanza di commenti non ci rende facile il lavoro :D
Per il problema di 100mila é che una costante (o variabile) di tipo int in Arduino puó contenere numeri da -32mila fino a +32mila. Dichiarando invece di "int" "unsigned int" potrai usare numeri da 0 a 65mila. Basterebbe usare dei fattori nel calcolo dei millisecondi... Dimmi tu se 65mila te li fai bastare.
Per il secondo discorso non capisco che intendi per aumentare il fade. Qualsiasi transizione di qualsiasi parte del giorno deve avere il fade aumentato?
A me sembra che la durata del fade (data da time step) sia proporzionale alla durata delle parti del giorno (date da time curr), scusa se mi sbaglio, ma per ora non posso aiutarti di piú!
Piuttosto che chiedere qualcosa a me, chiedila a Mara Maionchi. E' più competente.
Avatar utente
Foto Utentepaofanello
2.275 8 13
Expert
Expert
 
Messaggi: 532
Iscritto il: 7 lug 2015, 21:01

0
voti

[67] Re: Controllare presepe con Arduino

Messaggioda Foto UtenteRussell » 6 dic 2015, 12:01

confemo l'overflow, il numero è troppo grande
ti conviene eventualmente ragionare in secondi per le transizioni di stato... dovrebbe bastarti tranquillamente anche 32000 a quel punto

per il discorso durate del fade, vedi, hai il tuo array dei valori di uscita analogici
Codice: Seleziona tutto
byte fade[]  = ...

è realizzato con 52 elementi
quindi durerà sempre 52 'momenti', indipendentemente da quanto dura una fase temporale

il mio suggerimento potrebbe essere quello di evitare di realizzare un array del genere, e prepararti una funzione che ti calcoli il valore di ampiezza del fade istantaneo, tenendo conto del momento in cui lo vuoi far partire, e il momento nel qualo lo vorrai interrompere (portanto l'effetto a destinazione)
ti basta qualcosa del tipo

Codice: Seleziona tutto
int CalcolaFadeIn(int tempostart, int tempostop, int tempocurr){
  float num = float (tempocurr)-tempostart;
  float den= float (tempostop)-tempostart;
  float fade=num /dem *255;
  if(fade<0) fade=0;
  if(fade>255) fade=255;
  return fade;
}


Codice: Seleziona tutto
int CalcolaFadeOut(int tempostart, int tempostop, int tempocurr){
  float num = float (tempocurr)-tempostart;
  float den= float (tempostop)-tempostart;
  float fade=(1.0-num /dem) *255;
  if(fade<0) fade=0;
  if(fade>255) fade=255;
  return fade;
}


[non è codice debuggato, ma dovrebbe andare]
Avatar utente
Foto UtenteRussell
3.373 3 5 9
Master
Master
 
Messaggi: 2194
Iscritto il: 4 ott 2009, 10:25

0
voti

[68] Re: Controllare presepe con Arduino

Messaggioda Foto Utentedadothebest » 6 dic 2015, 13:16

paofanello ha scritto:Ripeto: Non sono esperto, ma il programma mi sembra scritto abbastanza male, cosa che unita alla totale mancanza di commenti non ci rende facile il lavoro :D
Per il problema di 100mila é che una costante (o variabile) di tipo int in Arduino puó contenere numeri da -32mila fino a +32mila. Dichiarando invece di "int" "unsigned int" potrai usare numeri da 0 a 65mila. Basterebbe usare dei fattori nel calcolo dei millisecondi... Dimmi tu se 65mila te li fai bastare.
Per il secondo discorso non capisco che intendi per aumentare il fade. Qualsiasi transizione di qualsiasi parte del giorno deve avere il fade aumentato?
A me sembra che la durata del fade (data da time step) sia proporzionale alla durata delle parti del giorno (date da time curr), scusa se mi sbaglio, ma per ora non posso aiutarti di piú!

Purtroppo capisco moolto poco di programmazione, per fare il mio progetto ho solo adattato un codice preso on-line. Il sito dove l'ho preso conteneva anche i commenti per ogni singola stringa di codice, allego la pagina web con sketch e commento originali: http://www.mauroalfieri.it/elettronica/centralina-alba-tramonto-arduino-sketch.html
Per quanto riguarda il tempo di ogni fase devo mettere valori dipo 320000ms.
Russell ha scritto:confemo l'overflow, il numero è troppo grande
ti conviene eventualmente ragionare in secondi per le transizioni di stato... dovrebbe bastarti tranquillamente anche 32000 a quel punto

Ti chiedo scusa se sono insistente e ignorante, cosa dovrei scrivere per cambiare i valori di ogni ciclo da millisecondi in secondi?
Russell ha scritto:per il discorso durate del fade, vedi, hai il tuo array dei valori di uscita analogici
Codice: Seleziona tutto
byte fade[]  = ...

è realizzato con 52 elementi
quindi durerà sempre 52 'momenti', indipendentemente da quanto dura una fase temporale

il mio suggerimento potrebbe essere quello di evitare di realizzare un array del genere, e prepararti una funzione che ti calcoli il valore di ampiezza del fade istantaneo, tenendo conto del momento in cui lo vuoi far partire, e il momento nel qualo lo vorrai interrompere (portanto l'effetto a destinazione)
ti basta qualcosa del tipo

Codice: Seleziona tutto
int CalcolaFadeIn(int tempostart, int tempostop, int tempocurr){
  float num = float (tempocurr)-tempostart;
  float den= float (tempostop)-tempostart;
  float fade=num /dem *255;
  if(fade<0) fade=0;
  if(fade>255) fade=255;
  return fade;
}


Codice: Seleziona tutto
int CalcolaFadeOut(int tempostart, int tempostop, int tempocurr){
  float num = float (tempocurr)-tempostart;
  float den= float (tempostop)-tempostart;
  float fade=(1.0-num /dem) *255;
  if(fade<0) fade=0;
  if(fade>255) fade=255;
  return fade;
}


[non è codice debuggato, ma dovrebbe andare]

Ho provato a riscrivere il codice sul programma ma mi restituisce diversi errori, come funziona? Dove lo devo mettere all'inizio sostituendo
Codice: Seleziona tutto
byte fade[]  =(......);
oppure ogni volta che devo fare un fade al led?
Avatar utente
Foto Utentedadothebest
24 2 7
Frequentatore
Frequentatore
 
Messaggi: 229
Iscritto il: 25 nov 2013, 17:13
Località: Ascoli Piceno

0
voti

[69] Re: Controllare presepe con Arduino

Messaggioda Foto UtenteRussell » 6 dic 2015, 13:44

dadothebest ha scritto:Ho provato a riscrivere il codice sul programma ma mi restituisce diversi errori

eh si, possibile ci sia di metterci le mani su quelle funzioni.
come ti ho scritto era solo un'idea per l'approccio al problema, e non avevo affatto debuggato quel nuovo pezzetto di codice.

dadothebest ha scritto:Dove lo devo mettere all'inizio sostituendo...

ni, o meglio si, piu' o meno:
in pratica alla riga 26-27 definisci l'array "fade" che stabilisce i valori da 0 a 255 relativi alla luminosità dei LED, linearmente.
Questo è un modo di procedere, ma piuttosto rozzo, si puo' fare di meglio...
la mia funzione ti calcolerebbe il valore di "fade" in tempo reale, senza necessità di scrivere tutta la lista, e il tutto diventa anche piu' dinamico in modo da poter perfezionare quello che intendi fare.

in pratica poi, dato che l'array "fade" non esisterà piu', devi cambiare il codice altrove.
ad esempio a riga 78 hai:
Codice: Seleziona tutto
analogWrite(pin_down,   fade[i]);

diventerebbe
Codice: Seleziona tutto
analogWrite(pin_down,   CalcolaFadeIn(..., ..., ...));

e a riga 63 hai:
Codice: Seleziona tutto
analogWrite(pin_down,   fade[(51-i)]);

che diventerebbe
Codice: Seleziona tutto
analogWrite(pin_down,   CalcolaFadeOut(..., ..., ...));

dove ho messo i puntini devi valutare il tempo da scriverci, secondo le tue necessità
ripeto che il mio approccio è solo un'idea, va perfezionata un minimo.
ma chiaramente se non ti studi un po' in dettaglio quello che stai facendo, ovvero un po' di C, dubito che tu possa comprendere le mie parole :?
hai la spiegazione passo passo del codice, gia' è qualcosa, cerca di capire realmente cosa accade, e vedrai che con un po' di lavoro ti riuscirà far funzionare tutto :ok:
Avatar utente
Foto UtenteRussell
3.373 3 5 9
Master
Master
 
Messaggi: 2194
Iscritto il: 4 ott 2009, 10:25

0
voti

[70] Re: Controllare presepe con Arduino

Messaggioda Foto Utentedadothebest » 7 dic 2015, 0:57

Russell ha scritto:ni, o meglio si, piu' o meno:
in pratica alla riga 26-27 definisci l'array "fade" che stabilisce i valori da 0 a 255 relativi alla luminosità dei LED, linearmente.
Questo è un modo di procedere, ma piuttosto rozzo, si puo' fare di meglio...
la mia funzione ti calcolerebbe il valore di "fade" in tempo reale, senza necessità di scrivere tutta la lista, e il tutto diventa anche piu' dinamico in modo da poter perfezionare quello che intendi fare.

in pratica poi, dato che l'array "fade" non esisterà piu', devi cambiare il codice altrove.
ad esempio a riga 78 hai:
Codice: Seleziona tutto
analogWrite(pin_down,   fade[i]);

diventerebbe
Codice: Seleziona tutto
analogWrite(pin_down,   CalcolaFadeIn(..., ..., ...));

e a riga 63 hai:
Codice: Seleziona tutto
analogWrite(pin_down,   fade[(51-i)]);

che diventerebbe
Codice: Seleziona tutto
analogWrite(pin_down,   CalcolaFadeOut(..., ..., ...));

sa, cerca di capire realmente cosa accade, e vedrai che con un po' di lavoro ti riuscirà far funzionare tutto :ok:

Fino a qui ci ero errivato, il problema è che non riesco a capire che valori devo mettere su "tempocurr", facendo delle prove con diversi valori mi restituisce sempre errore.
Sto cercando su internet qualche informazione in più per capire come funzionano alcune cose (specialmente la funzione fade, ho girato 15 pagine su google e ancora non ho trovato quello che cerco) ma essendo alle prime a volte non so neanche come cercare :oops:
Avatar utente
Foto Utentedadothebest
24 2 7
Frequentatore
Frequentatore
 
Messaggi: 229
Iscritto il: 25 nov 2013, 17:13
Località: Ascoli Piceno

PrecedenteProssimo

Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite