Cronometro e Sketch

Ciao a tutti,

ho costruito un sistema Arduino che mi permette di gestire un presepe :

  1. Gestire l'illuminazione (sia la pubblica ad esempio strade, che case che sfondo)
  2. Gestire l'audio ( eseguire con df player mini) delle tracce audio che ho suddiviso in varie folder.

ora però devo fare una cosa che non riesco a fare e non so perchè, usando i delay devo giocare con le durate del giorno e della notte, in modo da far combaciare quelle che sono le "ore effettive" del ciclo, sono 8 fasi, ciascuna di un tempo variabile che va dagli 8 ai 12-13 minuti.
però per fare una misurazione corretta del tempo in essere, e di farlo combaciare con le fasi,
vorrei eseguire un cronometro da console, in modo da gestire il tempo in maniera perfetta tra una fase e un altra.

Avete qualche consiglio?

vi posto il mio sketch.

#include <DFRobotDFPlayerMini.h>
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#define ACTIVATED LOW
#define Start_Byte 0x7E
#define Version_Byte 0xFF
#define Command_Lenght 0xEF
#define Acknowledge 0x00
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

int volumedown = 3;
int volumeup = 4;
int i = 1;
int myvol = 0;
int analogValue = 0;
byte volumeLevel = 0;
const byte potPin = A0; 


 //01 - sun
 //02 - sunset
 //03 - night
 //04 - sunrise
 //05 - morning
 //06 - late morning
 //07 - midday
 //08 - road to sunset
 #define TIME_MSG_LEN  11   // time sync to PC is HEADER and unix time_t as ten ascii digits
#define TIME_HEADER  255   // Header tag for serial time sync message
 #include "LiquidCrystal_I2C.h" // Added library*
#include "Wire.h" // For I2C
#include "LCD.h" // For LCD
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7); // 0x27 is the default I2C bus address of the backpack-see article
//LiquidCrystal_I2C lcd(0x3F, 20,4);
int brightness = 0;   
int fadeAmount = 5;   
int rPin=3;
int gPin=5;
int bPin=6;
unsigned long currentTime;
unsigned long loopTime;
int redval;
int greenval;
int bval;
int greenval1;
int led1 = 4;
int led2 = 5;
int led3 = 6;
int led4 = 12;
int led5 = 13;
String string1;

void setup()  {
  mySoftwareSerial.begin(9600);
  // Serial.begin(115200);
  //setup Audio Device
   pinMode(volumedown, INPUT);
  pinMode(volumeup, INPUT);
  digitalWrite(volumedown, HIGH);
  digitalWrite(volumeup, HIGH);
  
  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true);
  }
  
  Serial.begin(9600);
  lcd.begin(20,4);
  lcd.setBacklightPin(3,POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.print("PRESEPE 2021....");
  lcd.setCursor(0,1);
  lcd.print("LOADING...");
  
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6,OUTPUT);
  currentTime = millis();
  loopTime = currentTime;
  myDFPlayer.volume(30);
  lcd.print("Day OK");
}




void loop()  {
 
//Audio Ptenziometer
  analogValue = analogRead(potPin); // get value from pot
  volumeLevel = map(analogValue, 0, 1023, 0, 30);
  
  myDFPlayer.volume(volumeLevel);
  Serial.println(volumeLevel);
  static unsigned long timer = millis();
  
   if (digitalRead(volumedown) == ACTIVATED) {
   
   Serial.println(myvol);
   myvol = myvol - 5;
   if (myvol == 0) {
    Serial.println("Min Reached");
    myvol = 0;
   }
    myDFPlayer.volume(myvol);
    
   
   
   }
   if (digitalRead(volumeup) == ACTIVATED) {
    
    Serial.println(myvol);
    myvol = myvol + 5;
    if (myvol >30) {
      Serial.println("Max Volume");
      myvol = 30;
    }else{
     myDFPlayer.volume(myvol); 
    }
    
   } 
//end process
  
int  rTot = 255;
int  gTot = 255;
int  bTot = 0;
Serial.println("START SUN");
 
myDFPlayer.loopFolder(1);
delay(7000);
lcd.clear();
lcd.print("START SUN..OK");
 
analogWrite( rPin, rTot);
analogWrite( gPin, gTot );
analogWrite( bPin, 0);
delay(1000);
for (int i = 0; i<=255; i++){
  greenval = gTot - i;
  analogWrite(gPin, greenval);
  Serial.print("SUN - ");
  Serial.print("Rosso: ");
  Serial.print(redval);
  Serial.print(" Green: ");
  Serial.print(greenval);
  Serial.print(" Blu: ");
  Serial.println(bval);
  lcd.setCursor(1,4);
  string1 = String("R") + redval + String("   G") + greenval + String("   B") + bval;
  lcd.print(string1);
  redval = rTot; 
  delay(100);
  brightness = brightness + fadeAmount;  
    if (brightness == 0 || brightness == 255) {
      fadeAmount = -fadeAmount ;
    }      
}
  Serial.print("SUNSET - ");
  lcd.clear();
  lcd.print("START SUNSET");
  myDFPlayer.loopFolder(2);
  delay(1000);
for (int z = 0; z<=255; z++){

    bval = bTot + z;
    analogWrite(bPin, z);
    brightness = brightness + fadeAmount;
    Serial.print("Rosso: ");
    Serial.print(redval);
    Serial.print(" Green: ");
    Serial.print(greenval);
    Serial.print(" Blu: ");
    Serial.println(bval);
    lcd.setCursor(0,3);
    delay(100);
    string1 = String("R") + redval + String("   G") + greenval + String("   B") + bval;
    lcd.print(string1);
    if (brightness == 0 || brightness == 255) {
      fadeAmount = -fadeAmount ;
    }  
        if (z == 190){
      digitalWrite(led3, HIGH);
      lcd.setCursor(0,2);
      lcd.print("LUCE:..");
      Serial.println("Gruppo Case 3 ON");
      lcd.setCursor(7,2);
      lcd.print("3");
    }
    if (z == 200) {
      digitalWrite(led4, HIGH);
      Serial.println("Illuminazione Pubblica 4 ON");
      lcd.setCursor(8,2);
      lcd.print("..4");
    }
    if (z == 210) {
      digitalWrite(led5, HIGH);
      Serial.println("Illuminazione Pubblica 5 ON");
      lcd.setCursor(11,2);
      lcd.print("..5-> NOW ON");
    }

}
  Serial.print("START NIGHT - ");
  myDFPlayer.loopFolder(3);
  delay(1000);
  lcd.clear();
  lcd.print("START NIGHT..");
for (int t= 0; t <=200; t++){
  redval = 200 - t; 
  if (redval == 1){
  delay(510);
  }
  analogWrite(rPin, redval);

    Serial.print("Rosso: ");
    Serial.print(redval);
    Serial.print(" Green: ");
    Serial.print(greenval);
    Serial.print(" Blu: ");
    Serial.println(bval);
    lcd.setCursor(0,3);
    string1 = String("R") + redval + String("   G") + greenval + String("   B") + bval;
    lcd.print(string1);
    if (t == 20) {
    lcd.setCursor(0,1);
    lcd.print("LUCE:..");
 
    digitalWrite(led1, HIGH);
    lcd.setCursor(7,1);
    Serial.println("Gruppo Case 1 ON");
    
    lcd.print("1");
    }
    if (t == 30){
      digitalWrite(led2, HIGH);
      lcd.setCursor(8,1);
      Serial.println("Gruppo Case 2 ON ");
      lcd.print("..2-> NOW ON");
    }
    
}
 
    Serial.print("SUNRISE - ");
    lcd.clear();
    lcd.print("START SUNRISE..");
    myDFPlayer.loopFolder(4);
    delay(1000);
for (int u= 0; u <= 255; u++) {

    greenval1 = greenval1 + u;
    analogWrite(gPin, u);
    Serial.print("Rosso: ");
    Serial.print(redval);
    Serial.print(" Green: ");
    Serial.print(u);
    Serial.print(" Blu: ");
    Serial.println(bval);
    lcd.setCursor(0,4);
    string1 = String("R") + redval + String("   G") + greenval + String("   B") + bval;
    lcd.print(string1);
    delay(300);
        if (u == 50) {
    digitalWrite(led1, LOW);
    Serial.println("Gruppo Case 1 OFF");
    lcd.setCursor(0,1);
    lcd.print("LUCE:..");
    lcd.setCursor(7,1);
    lcd.print("1");
    }
    if (u == 70){
      digitalWrite(led2, LOW);
      Serial.println("Gruppo Case 2 OFF ");
      lcd.setCursor(8,1);    
      lcd.print("..2");
    }
    if (u == 80){
      digitalWrite(led3, LOW);
      Serial.println("Gruppo Case 3 OFF");
      lcd.setCursor(11,1);    
      lcd.print("..3");
    }
    if (u == 120) {
      digitalWrite(led4, LOW);
      Serial.println("Illuminazione Pubblica 4 OFF");
      lcd.setCursor(14,1);    
      lcd.print("..4");
    }
    if (u == 150) {
      digitalWrite(led5, LOW);
      Serial.println("Illuminazione Pubblica 5 OFF");
      lcd.setCursor(17,1);    
      lcd.print("..5 OFF");
    }
}
  Serial.print("MORNING - ");
  lcd.clear();
  lcd.print("START MORNING..");
  myDFPlayer.loopFolder(5);
  delay(1000);
for (int  b = 0; b <= 55; b++){

    Serial.print("Rosso: ");
    Serial.print(redval);
    Serial.print(" Green: ");
    Serial.print(greenval);
    Serial.print(" Blu: ");
    Serial.println(bval);
    lcd.setCursor(1,4);
    string1 = String("R") + redval + String("   G") + greenval + String("   B") + bval;
    lcd.print(string1);
    delay(300);

}
    Serial.print("LATE MORNING - ");
    myDFPlayer.loopFolder(6);
  delay(1000);
    lcd.clear();
    lcd.print("MID MORNING");
for (int h = 0; h <=255; h++){
   redval = h;   
   analogWrite(rPin,redval);
   if (bval != 0) {
    bval = bval - 1;
   }
   analogWrite(bPin, bval);

    Serial.print("Rosso: ");
    Serial.print(redval);
    Serial.print(" Green: ");
    Serial.print(greenval);
    Serial.print(" Blu: ");
    Serial.println(bval);
    lcd.setCursor(1,4);
    string1 = String("R") + redval + String("   G") + greenval + String("   B") + bval;
    lcd.print(string1);
    delay(1000);
}
    Serial.print("Mid Day - ");
    myDFPlayer.loopFolder(7);
  delay(1000);
    lcd.clear();
    lcd.print("MID DAY");
for (int p = 0; p < 210; p++) {
    analogWrite(bPin, p);

    Serial.print("Rosso: ");
    Serial.print(255);
    Serial.print(" Green: ");
    Serial.print(255);
    Serial.print(" Blu: ");
    Serial.println(p);
    lcd.setCursor(1,4);
    string1 = String("R") + redval + String("   G") + greenval + String("   B") + bval;
    lcd.print(string1);
    delay(2000);
}
    Serial.print("Mid Day to Sunset - ");
    lcd.clear();
    lcd.print("MID DAY TO SUNSET");
    myDFPlayer.loopFolder(8);
  delay(1000);
for (int p = 0; p < 210; p++) {
    bval = 210 - p;
    analogWrite(bPin, bval);

    Serial.print("Rosso: ");
    Serial.print(255);
    Serial.print(" Green: ");
    Serial.print(255);
    Serial.print(" Blu: ");
    Serial.println(p);
    lcd.setCursor(1,4);
    string1 = String("R") + redval + String("   G") + greenval + String("   B") + bval;
    lcd.print(string1);
    delay(2000);
}

}

Non si capisce bene cosa vuoi fare.

Non ho esaminato a fondo il tuo programma (che ti suggerisco di indentare automaticamente con control+T sull'IDE e DI COMMENTARE PESANTEMENTE), ma se ho capito tu hai creato questa sequenza di fasi: SUN, SUNSET, NIGHT, SUNRISE, MORNING, LATE MORNING, MID DAY, MID DAY TO SUNSET.

Ciascuna fase è implementata con un ciclo for() e una serie di delay() per il fading. Le fasi si susseguono una dentro l'altra, senza sovrapposizioni.

Poi qualcuno ti ha suggerito di usare millis() e tu ce l'hai messo dentro. Ma non lo usi.

Adesso dicci cosa vuoi fare esattamente: Vuoi conoscere la durata di ciascuna fase? La vuoi poter modificare online? Vuoi modificare la successione delle fasi? Vuoi avere la possibilità di attivarne una mentre un'altra è ancora in corso?

E non rispondere: "TUTTE!", quella è una pubblicità della ELAH

Ciao,
P.

Ciao,

alla fine, nella nottata sono riuscito a risolvere da me, a ciascuna delle fasi,
ho usato millis così

ho dichiarato prima come long tempo_base e tempo_cronometrato e tempo sec

poi nel loop di ciascuna fase ho fatto questo. (sun, sunset, night, sunrise, morning etc)

tempo_base = millis();
tempo_cronometrato = millis() - tempo_base;
tempo_sec = tempo_cronometrato / 1000;
Serial.println(tempo_sec);
mi da il tempo da tempo base a tempo_sec perfettamente :)

ps, cosa intendi per questo ?

meglio così! Grazie ugualmente

Stai eseguendo il programma per provarlo e desideri cambiare la durata della fase.

Ciao,
P.