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