Problema con presepe

Buon giorno alla comitiva, doto tempo mi rifaccio sentire, o ripreso in mano il progetto del presepe che è rimasto sempre con il problema della striscia RGB mi spiego meglio.
Sto costruendo un presepe meccanico e sto usando di base il progetto che o trovato su "Zmaker" 624 presepe-completo, funziona quasi tutto tranne il fatto che la striscia RGB non fa il ciclo alba e tramonto ma solo giorno, notte, sembra come se non fosse su un pin pwm già provato con schede diverse e strisce diverse, uso alimentazioni separate sia per il lettore mp3 che per le luci (rgb sia 5V che 12V)
ora sto usando come scheda un arduino mega 2560 Usa i tags code per formattare il codice per il forum



/**
 * Gestisce un LED in PWM per simulare alba e tramonto
 * accende le luci delle case
 * simula un fuoco
 * 
 * sole: pwm pin 
 * case: pin 4
 * fuoco: pwm pin 5
 * 
 * con mp3 player (dfminiplayer)
 * collegato sui pin:
 * 10 rx <- tx player 
 * 11 tx -> rx player
 * 
 *  neopixel su pin 7
 */
#include <FastLED.h>
#define NUM_LEDS 300
CRGB leds[NUM_LEDS];
int h = 0;
int s = 255;

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
SoftwareSerial sSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
int trid = 0;
#define MAXTRACKS 4
int tracks[] = {1,3,5,7};

void setup() {
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);

  FastLED.addLeds<WS2811, 6, GRB>(leds, NUM_LEDS);
  fill_solid(leds, NUM_LEDS, CRGB::Black);
  FastLED.show();
    
  randomSeed(analogRead(A0));
  Serial.begin(9600);
  
  sSerial.begin(9600);
  while (!sSerial) delay(1);
  Serial.println(F("Presepe V2.0"));

  if (!myDFPlayer.begin(sSerial)) {
    Serial.println(F("Error"));
    while(true);
  }
  Serial.println(F("ready!"));
  myDFPlayer.volume(30);

  delay(1000);
  myDFPlayer.play(tracks[0]);
  trid++;
}

unsigned long tc, t1, t2;

void loop() {
  tc = millis();
  if ((tc - t1) > 60000) {    
    //Serial.print("t1: ");
    //Serial.println(t1);
    t1 = millis();
  }
  
  if ((tc - t2) > 100) {   
     
    //alba
    taskPwm(6, tc-t1, 0, 6000, 0, 255);  
    //giorno
    taskPin(6, tc-t1, 6000, 24000, HIGH);  
    //tramonto
    taskPwm(6, tc-t1, 24000, 34000, 255, 0);   
    //notte
    taskPin(6, tc-t1, 34000, 60000, LOW);  

    //neopixel
    //alba
    taskNPAlba1(tc-t1, 0, 3000);
    taskNPAlba2(tc-t1, 3000, 6000);
    //giorno
    taskNPGiorno(tc-t1, 6000, 24000);
    //tramonto
    taskNPTramonto1(tc-t1, 24000, 26000);
    taskNPTramonto2(tc-t1, 26000, 29000);
    taskNPTramonto3(tc-t1, 29000, 34000);
    //notte
    taskNPNotte(tc-t1, 34000, 60000);

    //accende e spegne le case
    taskPin(4, tc-t1, 0, 3000, HIGH);
    taskPin(4, tc-t1, 3000, 28000, LOW);  
    taskPin(4, tc-t1, 28000, 60000, HIGH);

    //il fuoco
    fuoco(5);

    //musica
    music();

    //Serial.println(tc-t1);
    t2 = millis();
  } 
}

void taskPwm(int pin, unsigned long t, unsigned long t1, unsigned long t2, int l1, int l2){
  if (t >= t1 && t < t2) {
    int pwm = map(t-t1, 0, t2-t1, l1, l2);
    analogWrite(pin, pwm);
  }
}

void taskPin(int pin, unsigned long t, unsigned long t1, unsigned long t2, int stato){
  if (t >= t1 && t < t2) {
    digitalWrite(pin, stato);    
  }
}

void fuoco(int pin){
  analogWrite(pin, random(256)); 
}

void music() {
  //suona una dopo l'altra le tracce presenti sulla sdcard  
  int st = myDFPlayer.readState();
  //Serial.println(st);
  //513 è in play
  //512 ha finito
  if ( (st == 512)) {
    //ha terminato
    myDFPlayer.play(tracks[trid]);
    Serial.print("track: ");
    Serial.println(tracks[trid]);
    trid++;
    if (trid >= MAXTRACKS) trid = 0;  
  } else if (st == 513) {
    //playing...
  }
}

void taskNPAlba1(unsigned long t, unsigned long t1, unsigned long t2){
  if (t >= t1 && t < t2) {
    h = map(t-t1, 0, t2-t1, 160, 200);
    fill_solid(leds, NUM_LEDS, CHSV(h, s, 255));
    FastLED.show();
  }
}
void taskNPAlba2(unsigned long t, unsigned long t1, unsigned long t2){
  if (t >= t1 && t < t2) {
    s = map(t-t1, 0, t2-t1, 255, 0);
    fill_solid(leds, NUM_LEDS, CHSV(h, s, 255));
    FastLED.show();
  }
}
void taskNPGiorno(unsigned long t, unsigned long t1, unsigned long t2){
  if (t >= t1 && t < t2) {
    h = 64; //giallo
    s = 0;
    fill_solid(leds, NUM_LEDS, CRGB::White);
    FastLED.show();
  }
}
void taskNPNotte(unsigned long t, unsigned long t1, unsigned long t2){ 
  if (t >= t1 && t < t2) {
    h = 160; //giallo
    fill_solid(leds, NUM_LEDS, CRGB::Black);
    FastLED.show();
  }
}
void taskNPTramonto1(unsigned long t, unsigned long t1, unsigned long t2){
  if (t >= t1 && t < t2) {
    s = map(t-t1, 0, t2-t1, 0, 255);
    fill_solid(leds, NUM_LEDS, CHSV(h, s, 255));
    FastLED.show();
  }
}
void taskNPTramonto2(unsigned long t, unsigned long t1, unsigned long t2){
  if (t >= t1 && t < t2) {
    h = map(t-t1, 0, t2-t1, 64, 0);
    fill_solid(leds, NUM_LEDS, CHSV(h, s, 255));
    FastLED.show();
  }
}
void taskNPTramonto3(unsigned long t, unsigned long t1, unsigned long t2){
  if (t >= t1 && t < t2) {
    h = map(t-t1, 0, t2-t1, 255, 60);
    fill_solid(leds, NUM_LEDS, CHSV(h, s, 255));
    FastLED.show();
  }

}

Questo è su cosa mi sto scervellando, se ci sono consigli sono i benvenuti grazie
P.S. spero di non avere fatto pasticci e infranto regole come mio solito grazie

:warning:
Ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato.
Grazie.

Ok grazie ma non riesco piu a ritrovare cosa o pubblicato

... basta che vai nel tuo profilo, e selezioni il TAB "activity" ed hai tutti i tuoi post.

Guglielmo

Si grazie trovato, ora vediamo se si trova anche la soluzione del progetto

I'm confused. I thought I was in the English-speaking forum (International?) when I started composing this. Even though sketch comments were in Italian. But on refreshing I was clearly in the Italian forum. Anyway I'll be brief in case I'm now breaking rules!

Google translation:
Non ho capito bene. Quando ho iniziato a scrivere questo, pensavo di essere nel forum di lingua inglese (internazionale?). Anche se i commenti agli schizzi erano in inglese. Ma aggiornando ero chiaramente nel forum italiano. Comunque sarò breve nel caso in cui stessi infrangendo le regole!

@piero56:
I suspect the issue lies in the way you're checking the status or availability of the DFR player. In most of my sketches I used the module's BUSY pin (16), but another alternative could be something like this:

Immagino che il problema risieda nel modo in cui controlli lo stato o la disponibilità del lettore DFR. Nella maggior parte dei miei schizzi ho utilizzato il pin BUSY del modulo (16), ma un'altra alternativa potrebbe essere qualcosa del genere:

if (mp3Player.available())
    if (mp3Player.available())
    {
      int status = mp3Player.readType();
      if (status == DFPlayerPlayFinished)
      {
        mp3Player.next(); 
      }
    }

======================

Ti ringrazio per l'idea ma non funziona, vado per la soluzione drastica, piloto la RGB con un nano, tanto ne gia altri 8 in giro per gestire le statue uno in più non cambia nulla, grazie comunque

Non avendo i tuoi stessi device (le strisce led) non so dirti esattamente, ma la prima cosa che mi è balzata all'occhio è che mi sfugge il perché tu abbia necessità di usare "taskPin" oltre a "taskPwm". Io in genere per i PWM non uso digitalWrite() e analogWrite() sullo stesso pin (non so esattamente perché, lo faccio per mia "pulizia", e non vorrei che qualcosa possa "confondersi" ed usare il pin sempre come digitale non PWM), ma comunque se fai "analogWrite(pin, 0)" è come fare "digitalWrite(pin, LOW)", e "analogWrite(pin, 255)" è come fare "digitalWrite(pin, HIGH)", per cui a me sembra che non ti serva.
Una prova al posto tuo la farei evitando la "taskPin" mettendo così:

    //alba
    taskPwm(6, tc-t1, 0, 6000, 0, 255);  
    //giorno
    taskPwm(6, tc-t1, 6000, 24000, 255, 255);  
    //tramonto
    taskPwm(6, tc-t1, 24000, 34000, 255, 0);   
    //notte
    taskPwm(6, tc-t1, 34000, 60000, 0, 0);  

Poi dato che usi il pin 6, nel reference di analogWrite() leggo anche:

Gli output PWM generati sui pin 5 e 6 avranno un duty cyle più alto di quello atteso. Questo a causa dell’interazione con le funzioni millis() e delay() , che condividono lo stesso timer interno usato per generare questi output PWM.

Nel caso prova a spostare il pin Pwm dal 6 al 9 ad esempio.

Buon giorno, fatto un po di tentativi ma scarso risultato, usando tutto "taskPwm" non accende nulla e spostando il pin neanche, vado per la soluzione del controllo esterno con NANO basta che sincronizzo bene i tempi e non mi complico la vita. Grazie comunque a tutti

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.