Hola a todos, bueno decidí avanzar un poco más en el aprendizaje con arduino y me he encontrado un obstáculo que quizás sea sencillo, pero me tiene -………Necesito retrasar la ejecución de una función a unos 10s y claro esta delay no es una opción.
Tengo una función llamada alarma, pero quiero que pasen 10s antes de que se ejecute después de ser llamada en el código.
Probé con MillisTimer y funciona bien cuando está ella sola, pero al introducir en el código donde se requiere no funciona, simplemente se ejecuta al instante.
Así funciona bien:
int pLedO = 4;
int pLedF = 5;
int buz = 6;
int sActA = 3;
int sActL = 2;
int pir = 7;
int valorLuz0 = 0;
int valorLuz1 = 0;
int estadoLuz = 0;
int valor0 = 0;
int valor1 = 0;
int estado = 0;
int asistenteP = 0;
void setup() {
Serial.begin(9600);
pinMode(pLedF, OUTPUT);
pinMode(pLedO, OUTPUT);
pinMode(buz, OUTPUT);
pinMode(sActA, INPUT);
pinMode(sActL, INPUT);
pinMode(pir, INPUT);
}
void loop() {
long retardo_alarma;
swAlarma();
swLuz();
controlPir();
if (digitalRead(pLedF) == HIGH) {
if (asistenteP == 1) {
if (digitalRead(pLedO) == LOW) {
estadoLuz = 1;
retardo_alarma = millis();
///coloque un Serial.print(retardo_alarma) y todo ok
if (millis() > (retardo_alarma + 10000)) {
///coloque un Serial.print(retardo_alarma) y nada muestra
alarma();
}
}
}
} else {
if (asistenteP == 1) {
if (digitalRead(pLedO) == LOW) {
estadoLuz = 1;
}
}
}
}
//////////////////bocinita
void alarma() {
digitalWrite(buz, HIGH);
}
//////////////////sensor PIR
void controlPir() {
if (digitalRead(pir) == HIGH) {
asistenteP = 1;
} else {
asistenteP = 0;
}
}
///////////////////switch activa/desactiva alarma
void swAlarma() {
valor0 = digitalRead(sActA);
delay(10);
if ((valor0 == HIGH) && (valor1 == LOW)) {
estado = 1 - estado;
}
valor1 = valor0;
if (estado == 1) {
digitalWrite(pLedF, HIGH);
delay(10);
}
else {
digitalWrite(pLedF, LOW);
digitalWrite(buz, LOW);
delay(10);
}
}
///////////////////switch activa/desactiva luz
void swLuz() {
valorLuz0 = digitalRead(sActL);
delay(10);
if ((valorLuz0 == HIGH) && (valorLuz1 == LOW)) {
estadoLuz = 1 - estadoLuz;
}
valorLuz1 = valorLuz0;
if (estadoLuz == 1) {
digitalWrite(pLedO, HIGH);
delay(10);
}
else {
digitalWrite(pLedO, LOW);
delay(10);
}
}
Hola venenodcuba, por cierto, podrias haber elegido mejor nick!!
Este código esta mal
if (asistenteP == 1) {
if (digitalRead(pLedO) == LOW) {
estadoLuz = 1;
retardo_alarma = millis();
///coloque un Serial.print(retardo_alarma) y todo ok
if (millis() > (retardo_alarma + 10000)) {
///coloque un Serial.print(retardo_alarma) y nada muestra
alarma();
}
}
}
Cuando se cumplen las condiciones retardo_alarma = millis() pero luego preguntas si es mayor que ese valor mas 10 seg.
estaría bien si retardo_alarma no se actualizara mas pero en cada ciclo vuelve a hacerlo lo que indica que tienes que encontrar el modo que esto
retardo_alarma = millis();
se ejecute una vez y luego si hacer cumplir la codición de si es mayor a 10 seg.
Se comprende?
Una solución sería que lo haga en la transición 1 a 0 o HIGH a LOW de digitalRead(pLedO) == LOW
Acá te dejo la versión modificada
int pLedO = 4;
int pLedF = 5;
int buz = 6;
int sActA = 3;
int sActL = 2;
int pir = 7;
int valorLuz0 = 0;
int valorLuz1 = 0;
int estadoLuz = 0;
int valor0 = 0;
int valor1 = 0;
int estado = 0;
int asistenteP = 0;
bool estadopLed0, estadopLed0Ant = LOW;
void setup() {
Serial.begin(9600);
pinMode(pLedF, OUTPUT);
pinMode(pLedO, OUTPUT);
pinMode(buz, OUTPUT);
pinMode(sActA, INPUT);
pinMode(sActL, INPUT);
pinMode(pir, INPUT);
}
void loop() {
long retardo_alarma;
swAlarma();
swLuz();
controlPir();
estadopLed0 = digitalRead(pLedO);
if (digitalRead(pLedF) == HIGH) {
if (asistenteP == 1) {
if (!estadopLed0 && estadopLed0Ant) {
retardo_alarma = millis(); // solo se ejecuta en la transición 1 a 0
if (!estadopLed0) {
estadoLuz = 1;
///coloque un Serial.print(retardo_alarma) y todo ok
if (millis() > (retardo_alarma + 10000)) {
///coloque un Serial.print(retardo_alarma) y nada muestra
alarma();
}
}
}
} else {
if (asistenteP == 1) {
if (!estadopLed0) {
estadoLuz = 1;
}
}
}
estadopLed0Ant = estadopLed0;
}
//////////////////bocinita
void alarma() {
digitalWrite(buz, HIGH);
}
//////////////////sensor PIR
void controlPir() {
if (digitalRead(pir) == HIGH) {
asistenteP = 1;
} else {
asistenteP = 0;
}
}
///////////////////switch activa/desactiva alarma
void swAlarma() {
valor0 = digitalRead(sActA);
delay(10);
if ((valor0 == HIGH) && (valor1 == LOW)) {
estado = 1 - estado;
}
valor1 = valor0;
if (estado == 1) {
digitalWrite(pLedF, HIGH);
delay(10);
}
else {
digitalWrite(pLedF, LOW);
digitalWrite(buz, LOW);
delay(10);
}
}
///////////////////switch activa/desactiva luz
void swLuz() {
valorLuz0 = digitalRead(sActL);
delay(10);
if ((valorLuz0 == HIGH) && (valorLuz1 == LOW)) {
estadoLuz = 1 - estadoLuz;
}
valorLuz1 = valorLuz0;
if (estadoLuz == 1) {
digitalWrite(pLedO, HIGH);
delay(10);
}
else {
digitalWrite(pLedO, LOW);
delay(10);
}
}
ook surbyte entendí todo y me funciona perfecto tu opción, gracias, trasteando y mirando un poco también logre al final de otra forma usando la librería MillisTimer
...
MillisTimer retardo_alarma (10000);
...
boolean alarma_tmp;
...
if (digitalRead(pLedF) == HIGH) {
if (asistenteP == 1) {
if (digitalRead(pLedO) == LOW) {
alarma_tmp = true;
retardo_alarma.setTimer();
}
}
}
if (alarma_tmp) {
if (retardo_alarma.checkTimer()) {
alarma();
}
}
...