Hola estoy tratando de dejar de usar delay, pero no puedo hacer que me funcione bien una alarma con tiempo para un cuartel de bomberos voluntarios. en un arduino UNO R3
Lo que necesito es que al apretar el botón se dispare la sirena y quede activa durante 27 segundos y luego quede en espera por si se aprieta nuevamente el botón.
pongo ejemplo de lo que hice:
</
unsigned long startMillis;
unsigned long currentMillis;
const unsigned long period = 7000; // tiempo de espera con la sirena encendida
const byte sirena = 13; // salida siena
int boton=2;
void setup()
{
pinMode(ledPin, OUTPUT);
startMillis = millis();
pinMode(boton, INPUT);
}
void loop()
{
currentMillis = millis();
if (currentMillis - startMillis >= period)
{
digitalWrite(sirena, digitalRead(boton));
startMillis = currentMillis;
}
}
>
-Lo que sucede es que tarda los 7 segundos para leer el boton y luego si mantiene la sirena encendida por 7 segundos.-
Una vez resuelto esto tengo que hacerlo con repeticiones, ejemplo: alarma1 : 27 segundos encendida 20 segundos apagara y que se repita 2 veces.
Desde ya muchas gracias por tomarse el tiempo de leer mi consulta, y sera agradecida cualquier ayuda.
Bienvenido Lu9bmg y hoy es un día memorable, dos recién llegados (eres el segundo) posteando como corresponde. Felicitaciones!!
Bueno esto resuelve parte de lo que pides.
El resto me gustaría que lo trabajes para que aprendas por tu cuenta.
Ahora resolví el problema de que se dispare cuando quieres y active los 27 segundos.
unsigned long startMillis;
const unsigned long period = 27000; // tiempo de espera con la sirena encendida
const byte sirena = 13; // salida siena
const byte boton = 2;
bool status, statusAnt = false;
bool ActivarSirena = false;
void setup() {
pinMode(sirena, OUTPUT);
startMillis = millis();
pinMode(boton, INPUT);
}
void loop() {
status = digitalRead(boton);
if (status && !statusAnt) {
ActivarSirena = true;
digitalWrite(sirena, LOW);
}
statusAnt = status;
if (ActivarSirena) {
if (millis() - startMillis >= period) {
digitalWrite(sirena, HIGH);
ActivarSirena = false;
}
}
}
Dirás: Es muy parecido al mío!! Si, claro, pero en el orden debido.
Ahora la repetición requiere una máquina de estados asi que ve a
Ve a Documentación => Indice de temas tutoriales => millis() y también lee máquina de estados.
Y cuando lo leas nos comentas y a ver que idea se te ocurre.
NOTA: He editado 2 o 3 veces porque descubrí mas errores en tu código como por ejemplo, defines ledpin como salida o lo usas y no estaba definido. Acabo de corregirlo.
Esta versión compila.