Warning: overflow se supero i 60000 millis

Buongiorno a tutti.Ho copiato qua e la e ho messo insieme un piccolo sketch per accendere vari led di un presepe.
Provando varie soluzioni quella che è la più funzionale per il mio progetto ha un unico intoppo che non riesco a risolvere.Questo è il codice:

void setup() {
 pinMode(3, OUTPUT);
 randomSeed(analogRead(A0));
 Serial.begin(9600);
}
unsigned long tc, t1, t2;

void loop() {
  tc = millis();
  if ((tc - t1) > 70000) {    
    Serial.print("t1: ");
    Serial.println(t1);
    t1 = millis();
  }
  
  if ((tc - t2) > 100) {   
     
    //alba
    taskPwm(3, tc-t1, 0, 10000, 0, 255);  
    //giorno
    taskPin(3, tc-t1, 10000, 15000, HIGH);  
    //tramonto
    taskPwm(3, tc-t1, 15000, 25000, 255, 0);   
    //notte
    taskPin(3, tc-t1, 25000, 70000, LOW);  

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

void taskPwm(int pin, unsigned long t, int t1, int 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, int t1, int t2, int stato){
  if (t >= t1 && t < t2) {
    digitalWrite(pin, stato);    
  }
}

se imposto come in questo caso
if ((tc - t1) > 70000)
mi restituisce un

25:40:warning: overflow in implicit constant conversion [-Woverflow]
     taskPin(3, tc-t1, 25000, 70000,LOW);

fino a 60000 millis funziona tutto benissimo.
usato sia su nano che su mega2560.
non riesco a capire e non trovo nulla di utile in rete.
Abbiate infinita pazienza vi prego
questo e il mio primissimo progetto con arduino.
P.S.(probabilmente troverete altri difetti nel codice).
Fatemi sapere tutto quello che notate
Vi ringrazio tanto.
Ciao
Gabriele

UL = Unsigned Long

if ((tc - t1) > 70000UL) { 
taskPin(3, tc-t1, 25000, 70000UL, LOW);
void taskPwm(int pin, unsigned long t, int t1, int t2, unsigned long l1, int l2){

Arduino Mega 2560 int : -32768 ... 32767
https://www.arduino.cc/reference/en/language/variables/data-types/int/

Hai dichiarato taskPwm() con degli int come parametri (t1, t2) e poi cerchi di passargli degli unsigned long.

Si ma non è solo taskPwm(), anche taskPin(): i due parametri t1 e t2 li usa per confrontare il parametro t che è un millis() quindi anche questi devono essere unsigned long:

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);    
  }
}

Attenzione anche alla map() che ha parametri long e non unsigned long...

Buongiorno e benvenuto, :slight_smile:
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il succitato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nel rispetto del suddetto regolamento nessuno ti risponderà (eventuali risposte verrebbero cancellate), quindi ti consiglio di farla al più presto. :wink:

70000 è più del valore massimo del tipo di variabile a cui lo stai assegnando. ('int') Dovrai cambiare il tipo in long o unsigned long, inoltre dovrai specificare il letterale che assegni (tutti i letterali sono del tipo 'int' per impostazione predefinita)

taskPin(3, tc-t1, 25000, 70000UL, LOW);  
// (....)

void taskPin(int pin, unsigned long t, unsigned long t1, unsigned long t2, int stato){

Ops.Pardon.
Ero convinto di averlo fatto ma solo nell 'arduino profile'!
Provvedo.
Mi spiace di non aver potuto ringraziare koepel per l immediato aiuto.
Spero di farlo in seguito.
Grazie

Fai la presentazione e poi potrai ringraziare tutti quelli che hanno partecipato/parteciperanno alla discussione :wink:

Guglielmo

Ora hai le varie risposte disponibili :wink:

Guglielmo

Ciao.Perdonami.
Colpa mia!
La risposta è stata tolta perché avevo sbagliato a fare la mia presentazione.
Spero che ora la rimettano.
Grazie mille comunque!
Soluzione e spiegazione in tempo record!
Cosa vuoi di più!?
Avevo guardato qualche video che trattava di unsigned long e overflow ma evidentemente non ci avevo capito una mazza!
Grazie di nuovo.
A presto

C'è l ho fatta!
Perdonatemi.nella presentazione mi sono scordato di dire che sono alle prime armi anche con i forum!
A presto
Gabriele

Scusate l assenza ma per una trasferta di lavoro non sono più riuscito a provare le soluzioni consigliate!
Finalmente ho risolto il problema e capito il funzionamento di queste variabili.
Grazie mille ancora a tutti!
A presto

1 Like

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