Problema con millis

Ciao a tutti,
sto riscontrando un problema con il millis che non riesco a risolvere.
Praticamente io devo fare partire un conteggio pezzi con fronte salita e discesa (fino a 20 nell'esempio), raggiunto il 20 accendere un led per tot secondi (5 nell'esempio) e poi spegnerlo e resettare il contapezzi. Devo usare la funzione millis perché non voglio che durante i 5 secondi la scheda si "blocchi".
Non capisco però perché nel codice che ho scritto il led rimane accesso per un tempo ogni ciclo sempre più corto.
Mi illuminate?
grazie

/*
 * TM1637.cpp
 */
#include "TM1637.h"
#define CLK 5
#define DIO 4
TM1637 tm1637(CLK,DIO);
#define BATTUTA 20          
#define TEMPOBATTUTA 5000             
int count = 0;    // contatore display    		
unsigned long t0, dt;			
	

bool pezzo, prev_pezzo;

void setup() {
  Serial.begin(9600);

  t0 = millis();
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  pinMode(9, OUTPUT);
  
  tm1637.init();
  tm1637.set(BRIGHT_TYPICAL); //BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
}

void loop() {  
   
  bool pezzo = !digitalRead(2);  // NEGO perchè il sensore è a logica "inversa"

  if (pezzo && !prev_pezzo) {
    //Fronte salita: pezzo che entra  
  }

  if (pezzo && prev_pezzo) {
    //pezzo che scorre
  }

  if (!pezzo && prev_pezzo) {
    //Fronte discesa: pezzo uscito
    count++;   
  }

  if (digitalRead(3)) {
    count = 0;     
  }
  shownumber(count);

  //salvo lo stato per la prossima iterazione
  prev_pezzo = pezzo;
     
  if (count == BATTUTA) {
   	digitalWrite(9, HIGH);
      count = 0;
       
  }
 dt = millis() - t0; 
  if (dt >= TEMPOBATTUTA ){
    t0 = millis();
      digitalWrite(9, LOW);
          
  }

}

void shownumber(int n){  
  int d1 = n % 10;
  int d2 = (n/10) % 10;
  int d3 = (n/100) % 10;
  int d4 = (n/1000) % 10;
  tm1637.display(0,d4);
  tm1637.display(1,d3);
  tm1637.display(2,d2);
  tm1637.display(3,d1);
}

Così?

if (count == BATTUTA) {
  digitalWrite(9, HIGH);
  count = 0;
  t0=millis();
  }

if (millis()-t0>TEMPOBATTUTA) {
  digitalWrite(9, LOW);
  }

grazie mille funziona!
se posso ti chiedo un altro aiuto.
Se volessi che il contatore invece che incrementare da 0 a 20 fosse da 20 a 0 come dovrei fare?
Perché se metto count--; sotto il fronte di discesa arriva a 0 ma poi va in negativo invece che ripartire da 20

ok ci sono arrivato grazie

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