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