Estoy haciendo un codigo en el cual tengo un final de carrera FC_S el cual se supone que debo mantenerlo presionado por al menos unos cuantos segundos antes de que se realice la funcion atras(); la cual hace girar un motor CD, sin embargo con el codigo que tengo, cuando presiono FC_S hace falso y avanza mm hasta despues de mas tiempo avanza hacia atras, estos falsos no deben ocurrir, intente utilizar un for y tampoco funciono.
Les comparto el codigo:
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int PB_ON = 1;
const int PB_OFF = 2;
int sistema;
int led = 3;
const int PB_D = 4;
const int PB_T = 5;
int ledD = 6;
int ledT = 7;
int MAD = 8;
int MAT = 9;
const int FC_D = 10;
const int FC_T = 11;
const int FC_S = 12;
void Apagado();
void Encendido();
void in_atras();
void atras();
void adelante();
void stop();
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(3, 0);
if (sistema == 0) {
lcd.print("BIENVENIDO");
}
pinMode(PB_ON, INPUT_PULLUP);
pinMode(PB_OFF, INPUT_PULLUP);
pinMode(led, OUTPUT);
pinMode(PB_D, INPUT_PULLUP);
pinMode(PB_T, INPUT_PULLUP);
pinMode(ledD, OUTPUT);
pinMode(ledT, OUTPUT);
pinMode(MAT, OUTPUT);
pinMode(MAD, OUTPUT);
pinMode(FC_D, INPUT_PULLUP);
pinMode(FC_T, INPUT_PULLUP);
pinMode(FC_S, INPUT_PULLUP);
}
void loop() {
static unsigned long t = 0;
if (digitalRead(PB_ON) == LOW) t = (t == 0) ? millis() : t;
if (digitalRead(PB_ON) == LOW && millis() - t >= 1500) {
sistema = 1;
lcd.clear();
in_atras();
t = 0;
}
if (digitalRead(PB_ON) == HIGH) t = 0;
if (digitalRead(PB_OFF) == HIGH) {
sistema = 2;
}
if (sistema == 1) {
Encendido();
if (digitalRead(FC_S) == LOW) {
bool mantenerPresionado = true;
for (int i = 0; i < 2000; i++) { // 2000 ms total
delay(1);
if (digitalRead(FC_S) == HIGH) {
mantenerPresionado = false;
break; // Se soltó antes de tiempo, salir
}
}
if (mantenerPresionado) {
atras(); // Solo si se mantuvo LOW por 2s completos
}
}
}
if (sistema == 2) {
Apagado();
}
}
void Encendido() {
digitalWrite(led, HIGH);
lcd.setCursor(3, 0);
lcd.print("SISTEMA ON ");
if (digitalRead(PB_D) == LOW) {
adelante();
} else if (digitalRead(FC_D) == LOW) {
stop();
}
if (digitalRead(PB_T) == LOW) {
atras();
} else if (digitalRead(FC_T) == LOW) {
stop();
}
}
void Apagado() {
digitalWrite(led, LOW);
stop();
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(3, 0);
lcd.print("SISTEMA OFF");
}
void atras() {
digitalWrite(MAT, LOW);
digitalWrite(MAD, HIGH);
digitalWrite(ledT, HIGH);
digitalWrite(ledD, LOW);
}
void adelante() {
digitalWrite(MAT, HIGH);
digitalWrite(MAD, LOW);
digitalWrite(ledT, LOW);
digitalWrite(ledD, HIGH);
}
void stop() {
digitalWrite(MAD, HIGH);
digitalWrite(MAT, HIGH);
digitalWrite(ledT, LOW);
digitalWrite(ledD, LOW);
}
void in_atras() {
unsigned long t_inicio = millis();
atras(); // Empieza a girar hacia atrás
// Girar máximo 1 segundo o hasta que PB_D sea LOW (presionado)
while (millis() - t_inicio < 1000 && digitalRead(PB_D) == HIGH) {
// Esperar
}
stop();
}