Reviviendo antiguo proyecto de cronometro

Buenas
Hace tiempo estuve haciendo un proyecto con surbyte de un cronometro controlado por varios esp8266,el proyecto lo dejamos finalizado hace un tiempo pero por diversos problemas personales no puede probarlo con las barreras finales,nosotros lo probamos con botones, mi problema es que pusimos un debounce ya que son 3 sensores de barrera y esto podria hacer que iniciara y parara al momento,según he comprobado el debounce no sirve ya que tarda también en iniciar a contar haciendo que este no comience,sin debounce las barreras funcionan bien pero inician y paran de seguido.
Adjunto el codigo por si alguien puede ayudarme para que una vez se envie el primer start automáticamente no pueda enviarse stop de forma seguida a no ser que pase por ejemplo 3s
Si Surbyte recuerda el proyecto y pudiera ayudarme estaría agradecido
Gracias de antemano

#include <ESP8266WiFi.h>
#include <espnow.h>
#include <Bounce2.h>

// INSTANTIATE A Bounce OBJECT.
Bounce bounce = Bounce();

#define BOTONPIN D1
#define JUMPER   D2         // Jumper Open o Abierto 1 solo nodemcu 
                            // Jumper Cerrado        2 nodemcu : 1 actúa como Start y otro como Stop
#define STOP

// REPLACE WITH THE MAC Address of your receiver 
#ifdef START 
  // este le envia el arranque a STOP
  uint8_t stopAddress[] = {0x50, 0x02, 0x91, 0xFE, 0x2C, 0x19};
#else   
  // Stop le envia el dato final a Panel
  //uint8_t broadcastAddress[] = {0x5C, 0xCF, 0x7F, 0x13, 0xDE, 0x00};
  uint8_t panelAddress[] = {0xD8, 0xBF, 0xC0, 0x14, 0xBC, 0xA7};
#endif

unsigned long startTime;
int status, estado;
int statusBoton, statusBotonAnt = false;

// Define variables to store incoming readings
unsigned long incomingTime;
int incomingStatus;
bool flagStart        = false;
bool flagStop         = false;
bool jumper2Nodemcus;

//Must match the receiver structure
typedef struct struct_message {
    unsigned long time;
    int status;
} struct_message;

// Create a struct_message called StatusReadings to hold sensor readings
struct_message StatusReadings;

// Create a struct_message to hold incoming sensor readings
struct_message incomingReadings;
unsigned long endTime, starTime;

// Callback when data is sent
void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) {
  // Serial.print("Last Packet Send Status: ");
  // if (sendStatus == 0){
  //   Serial.println("Delivery success");
  // }
  // else{
  //   Serial.println("Delivery fail");
  // }
}

// Callback when data is received
void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) {
  if (!flagStart) {
    memcpy(&incomingReadings, incomingData, sizeof(incomingReadings));
    Serial.print("Bytes received: ");
    Serial.println(len);
    incomingTime    = incomingReadings.time;
    incomingStatus  = incomingReadings.status;
    starTime = millis();
    Serial.println("Contador mseg iniciado.");
    flagStart = true;
    flagStop = false;
  }
}  

void setup() {
  
  // pinMode(BOTONPIN, INPUT_PULLUP);
  pinMode(JUMPER, INPUT_PULLUP);

  // Jumper Open o Abierto 1 solo nodemcu 
  // Jumper Cerrado        2 nodemcu : 1 actúa como Start y otro como Stop
  if (digitalRead(JUMPER))  //
      jumper2Nodemcus = false;          // HIGH  = 1 nodemcu hace de Start/Stop
  else
      jumper2Nodemcus = true;           // LOW   = 2 nodemcus

  // SELECT ONE OF THE FOLLOWING :
  // 1) IF YOUR INPUT HAS AN INTERNAL PULL-UP
  bounce.attach( BOTONPIN ,  INPUT_PULLUP ); // USE INTERNAL PULL-UP
  // 2) IF YOUR INPUT USES AN EXTERNAL PULL-UP
  //bounce.attach( BOUNCE_PIN, INPUT ); // USE EXTERNAL PULL-UP

  // DEBOUNCE INTERVAL IN MILLISECONDS
  bounce.interval(150); // interval in ms      

  // Init Serial Monitor
  Serial.begin(115200);
  Serial.println("\nInicializado");

  // Set device as a Wi-Fi Station
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();

  // Init ESP-NOW
  if (esp_now_init() != 0) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }

  // Set ESP-NOW Role
  esp_now_set_self_role(ESP_NOW_ROLE_COMBO);

  // Once ESPNow is successfully Init, we will register for Send CB to
  // get the status of Trasnmitted packet
  esp_now_register_send_cb(OnDataSent);
  
  // Register peer
  #ifdef START 
  // este le envia el arranque a STOP
  esp_now_add_peer(stopAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
#else   
  // Stop le envia el dato final a Panel
  esp_now_add_peer(panelAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
  // Register for a callback function that will be called when data is received
  esp_now_register_recv_cb(OnDataRecv);
#endif
}
 
void loop() {
  bounce.update();
  statusBoton = digitalRead(BOTONPIN);
  if ( bounce.changed() ) {
    // THE STATE OF THE INPUT CHANGED GET THE STATE
    int deboucedInput = bounce.read();
    if (deboucedInput) {   
        if (jumper2Nodemcus) {    // estoy con solo 2 nodemcus
            #ifdef START
              //  Send message via ESP-NOW  
              StatusReadings.status = 1;
            #else
              // le comunico esto a Panel
              StatusReadings.status = 3;
            #endif
        }
        else {  // estoy con solo 1 nodemcu
            estado = !estado; 
            if (estado) 
                StatusReadings.status = 1;    // estado = 1 => start
            else 
                StatusReadings.status = 1;    // estado = 0 => stop //cambiadooooooooooooooooooooooooooooooooooooooooooooooo
        }
        StatusReadings.time = millis();       
        esp_now_send(panelAddress, (uint8_t *) &StatusReadings, sizeof(StatusReadings));
        Serial.println("status = " + String(StatusReadings.status));
    }
  }
}

Adjunta el link al tema en cuestión así vemos de que va la cosa. :wink:

Fue un favor que me hizo Surbyte,ayudandome de forma remota los ratos que el podia, por eso no se publicó por aqui
El codigo es del esp8266 que esta en la barrera y envia el start o stop al cronometro

Ah. Ok.

De todas formas seria anular el debounce y que cuando se envia la primera señal no se pueda enviar nada en los siguientes 3s,por eso creo que seria en este codigo

Este es el link mencionado

Ya no lo recordaba ahi empezamos preguntando por esa libreria.
He estado pensando puede haber alguna funcion millis que anule el boton 3segundos ¿cada vez que se pulse?
Es decir que el boton permanezca en low despues de los 3 primero segundos despues de pulsar o algo asi
Gracias por responder

millis() solo cuenta los milisegundos desde que se energiza el arduino o lo reseteas, punto aparte a otro renglón.
Todo lo que quieras hacer, debes programarlo.

Usa bounce2.h

He hecho este código y parece que interactua bien con el esp8266 y funciona,podríais mirar por si encontráis algún fallo?
gracias

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <espnow.h>
#define BOTONPIN D1

#define START   
              
           
#define JUAN


#ifdef RICARDO   
  uint8_t panelAddress[] = {0xA0, 0x20, 0xA6, 0x17, 0x43, 0x6A};
#else   // JUAN
  uint8_t panelAddress[] = {0xD8, 0xBF, 0xC0, 0x14, 0xBC, 0xA7};
#endif

unsigned long startTime;
int status;
int statusBoton;
int statusBotonAnt = false;

// Define variables to store incoming readings
unsigned long incomingTime;
int incomingStatus;
bool flagStart = false;
bool flagStop = false;


// Variable to store if sending data was successful
String success;

// Structure example to send data
// Must match the receiver structure
typedef struct struct_message {
    unsigned long time;
    int status;
} struct_message;

// Create a struct_message called StatusReadings to hold sensor readings
struct_message StatusReadings;

// Create a struct_message to hold incoming sensor readings
struct_message incomingReadings;
unsigned long endTime, starTime, muestroEnPanel;

// Variable para controlar el tiempo de inhabilitación del botón
unsigned long lastButtonPressTime = 0;  // Tiempo de la última pulsación del botón
const unsigned long debounceDelay = 3000;  // Retardo de 3 segundos

// Callback when data is sent
void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) {
//  Serial.print("Last Packet Send Status: ");
//  if (sendStatus == 0){
//    Serial.println("Delivery success");
//  }
//  else{
//    Serial.println("Delivery fail");
//  }
}

// Callback when data is received
void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) {
    memcpy(&incomingReadings, incomingData, sizeof(incomingReadings));
    Serial.print("Bytes received: ");
    Serial.println(len);
    StatusReadings.time    = incomingReadings.time;
    StatusReadings.status  = incomingReadings.status;
}  

void setup() {
  
  pinMode(D1, INPUT_PULLUP);
  // Init Serial Monitor
  delay(2000);
  Serial.begin(115200);
  #ifdef START
      Serial.print("\nInicializado START ");
  #else
      Serial.print("\nInicializado STOP");
  #endif

  #ifdef RICARDO
      Serial.println(" con MACs de RICARDO\n");
  #else
      Serial.println(" con MACs de JUAN\n");
  #endif

  // Set device as a Wi-Fi Station
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();

  // Init ESP-NOW
  if (esp_now_init() != 0) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }

  // Set ESP-NOW Role
  esp_now_set_self_role(ESP_NOW_ROLE_COMBO);

  // Once ESPNow is successfully Init, we will register for Send CB to
  // get the status of Trasnmitted packet
  esp_now_register_send_cb(OnDataSent);
  
  // Register peer
  #ifdef START 
  // este le envia el arranque a STOP
  esp_now_add_peer(panelAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
  #else   
  // Stop le envia el dato final a Panel
  esp_now_add_peer(panelAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
  // Register for a callback function that will be called when data is received
  //esp_now_register_recv_cb(OnDataRecv);
  #endif

}
 
void loop() {
  statusBoton = digitalRead(BOTONPIN);
  unsigned long currentTime = millis();

  if (currentTime - lastButtonPressTime > debounceDelay) {
    if (!statusBoton && statusBotonAnt) {   
      #ifdef START
        //  Send message via ESP-NOW
        StatusReadings.time = millis();       
        StatusReadings.status = 1;
        esp_now_send(panelAddress, (uint8_t *) &StatusReadings, sizeof(StatusReadings));
      #else
        // le comunico esto a Panel
        StatusReadings.time = millis();
        StatusReadings.status = 3;
        esp_now_send(panelAddress, (uint8_t *) &StatusReadings, sizeof(StatusReadings));
      #endif
      Serial.println("status = " + String(StatusReadings.status));
      lastButtonPressTime = currentTime;  // Actualizar el tiempo de la última pulsación
    }
  }
  statusBotonAnt = statusBoton;
}