Hola, estoy usando un sensor SR04, y necesito que al detectarse un objeto en cierto rango (10-20cm) se encienda un led, pero que cuando salga de ese rango se apague. Con el codigo que hice ya puedo hacer la parte de que se prenda el led despues de 3 segundos en rango, pero despues el led se queda para siempre encendido, y no se por que no se reinicia el loop para que ahora se apague, si me pueden ayudar lo agradecería, este es el codigo:
Tu quieres que el LED se encienda luego de estar 3 segundos en rango y que lo apaga? Eso no lo has dicho o yo no te he entendido.
Algo esta entre 10 y 20 x 3 segundos.... entonces enciendes el LED y???? que lo apaga.
EDITO:
Acabo de ver que la respuesta está en el título. Yo suelo buscar respuestas en el cuerpo del mensaje no en el titulo. Tenlo presente para la próxima vez.
Bueno cuando sale del rango se apaga, o sea..
Algo entra en rango y esta prendido si permanece 3 segundos y sigue prendido porque esta en rango y luego lo apago cuando sale de rango.
Creo que no entendí muy bien que es lo que tengo que hacer con la variable que añadiste de "flag", trate de implementarlo, añadí boolean flag = false; antes del setup pero al cargarlo al arduino no logro que se encienda el led estando en rango.
No se si me puedas explicar para que es esa parte de flag, o si notas que es lo que hice mal en el codigo, aqui te lo comparto:
#include <NewPing.h>
#include <Wire.h>
#define ECHO_PIN 11
#define TRIGGER_PIN 12
#define MAX_DISTANCE 200
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
unsigned long t_start;
int ledr = 8;
boolean flag = false;
void setup() {
pinMode (ledr, OUTPUT);
}
void loop() {
int dValue = sonar.ping_cm();
if (dValue >= 10 && dValue <= 20 && !flag) {
flag = true;
t_start = millis();
}
flag = false;
if (flag)
if (millis() - t_start >= 3000) {
digitalWrite(ledr, HIGH);
// lo preparo para otro disparo.
}
else
digitalWrite(ledr, LOW);
}
Acá esta el código corregido, porque el que pensé no funcionaba bien, no hacía lo que querías, ahora lo entendí y hace esto.
cuando estas en rango, x mas de 3 seg arranca el led y lo deja encendido hasta que sales del rango
#include <NewPing.h>
#include <Wire.h>
//#include <LiquidCrystal_I2C.h>
//LiquidCrystal_I2C lcd(0x27,16,2);
#define ECHO_PIN 11
#define TRIGGER_PIN 12
#define MAX_DISTANCE 200
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
bool flag = false,
inicializado = false;
int dValue;
unsigned long t_start;
int ledr = 8;
void setup() {
pinMode (ledr, OUTPUT);
Serial.begin(9600);
}
void loop() {
dValue = sonar.ping_cm();
Serial.print("Mido = " + String(dValue)+ " ");
if (dValue >= 10 && dValue <= 20) {
flag = true;
if (!inicializado) {
t_start = millis();
inicializado = true;
}
}
else {
flag = false;
inicializado = false;
}
if (flag) {
Serial.print("Estoy en rango = " + String(millis()-t_start));
Serial.println(flag?" ON":" OFF");
if (millis() - t_start > 3000UL) {
Serial.println("Superados los 3 seg");
digitalWrite(ledr, HIGH);
//flag = false; // lo preparo para otro disparo.
}
}
else {
digitalWrite(ledr, LOW);
}
}
El flag o bandera es una variable SI o NO o dicho de otro modo True o False Verdadero o Falso que luego hará lo que se pretende.
En tu caso decide si estamos en la condición de prender o no el led.
Pero tu LED o RELE debe encenderse luego de 3 segundos de estar con el flag en on y acá me fallaba mi código inicial.
Agregué otro flag que llamo inicializado y que lo uso de este modo.
Si esta negado o sea si
if (!inicializado) {
que es lo mismo que
if (inicializado == LOW) {
o
if (inicializado == 0) {
! es un negador entonces como inicializado toma dos valores 0 o 1 si lo niego será lo opuesto
Cuando esta negado es porque no esta inicializado entonces solo en ese caso le cargo el valor a t_start con millis()
Luego como estamos en rango solo falta cumplir los 3 segundos. Cuando los cumplimos entonces encendemos el led.
Si no estamos en rango reseteamos todo.
Edito: te dejo un link para probar el código simulado.