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