Contare 60 minuti

riscrivo per togliermi un dubbio (enorme)... davvero non capisco il perché...

allora intanto il codice scritto è questo:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Bridge.h>
#define intervalLcd 100
unsigned long previousLcd = 0;
// Dichiaro i pin del display
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
void setup() {
  //Definisco la porta seriale per leggere dati dal monitor seriale.
  Serial.begin(9600);
  //Inizializzo il display
  lcd.begin(20, 4);
  //Inizializzo l'interfaccia Bridge per la comunicazione con Linux
  Bridge.begin();
}
void loop()  {
  Process uptime;
  uptime.runShellCommand("cat /proc/uptime | cut -d. -f1");
  unsigned long uptimeSec = 0;
  while (uptime.available() > 0) {
    char c = uptime.read();
    if (c != '\n') {
      uptimeSec *= 10;
      uptimeSec += c - '0';
    }
  }
  //Serial.flush();
  //Serial.print(uptimeSec);
  if (millis() - previousLcd > intervalLcd) {
    previousLcd = millis();
    lcd.setCursor(0, 0);
    lcd.print(uptimeSec);
    unsigned long uptimeDay = uptimeSec / 86400;
    uptimeSec -= uptimeDay * 86400;
    unsigned long uptimeHour = uptimeSec / 3600;
    uptimeSec -= uptimeHour * 3600;
    unsigned long uptimeMin = uptimeSec / 60;
    uptimeSec -= uptimeMin * 60;
    lcd.setCursor(0, 1);
    lcd.print("Uptime:");
    lcd.setCursor(0, 2);
    lcd.print(uptimeDay);
    lcd.print("d ");
    if (uptimeHour < 10) lcd.print("0");
    lcd.print(uptimeHour);
    lcd.print("h ");
    if (uptimeMin < 10) lcd.print("0");
    lcd.print(uptimeMin);
    lcd.print("m ");
    if (uptimeSec < 10) lcd.print("0");
    lcd.print(uptimeSec);
    lcd.print("s");
  }
}

inizialmente però, visto che le variabili uptimeDay, uptimeHour e uptimeMin dovrebbero contenere rispettivamente, meno di 32000 quella dei giorni (sicuramente morirebbe prima l'hardware :slight_smile: ), solo da 0 a 23 quella delle ore e da 0 a 59 quella dei minuti, avevo impostato queste variabili come int al posto di unsigned long...

Per buona parte della giornata funziona tutto regolarmente, la sera intorno alle 20:30 tornando davanti all'arduino mi trovo davanti a un output sull lcd di questo genere:

218845
2d 12h 1139m 65577s !!!! (che continua ad incrementare in modo anomalo il num. dei secondi e dei minuti)

Mi chiedo come sia possibile !? Ho rifatto i calcoli mille volte ma non capisco xkè proprio intorno a quell'ora la stampa dei minuti e dei secondi viene fuori errata...se al volo senza riavviare yun, trasformo in UNSIGNED LONG le var, si aggiusta tutto...
Perchè?