Hola, mi duda es la siguiente. Quiero controlar la intensidad de un LED con ultrasonidos, de momento solo he conseguido que se encienda/apague el LED.
Lo que quiero hacer es controlarlo con la mano a una distancia de unos 25 cm ( mas o menos ) acercando la mano al LED se reduciria la intensidad y alejandola se aumentaria.
De hecho apartando la mano deberia recordar el ultimo estado.
Mi codigo es el siguiente:
#define trigPin 13
#define echoPin 12
#define led 3
void setup()
{ Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(led, OUTPUT);
}
void loop()
{ long duracion, distancia ;
digitalWrite(trigPin, LOW); // Nos aseguramos de que el trigger está desactivado
delayMicroseconds(2); // Para asegurarnos de que el trigger esta LOW
digitalWrite(trigPin, HIGH); // Activamos el pulso de salida
delayMicroseconds(10); // Esperamos 10µs. El pulso sigue active este tiempo
digitalWrite(trigPin, LOW); // Cortamos el pulso y a esperar el echo
duracion = pulseIn(echoPin, HIGH) ;
distancia = duracion / 2 / 29.1 ;
Serial.println(String(distancia) + " cm.") ;
int Limite = 25 ; // Medida en vacío del sensor
if ( distancia < Limite)
{
digitalWrite ( led , HIGH) ;
Serial.println("Esta dentro de rango");
}
else
{
digitalWrite( led , LOW) ;
Serial.println("Esta fuera del rango");
delay (500) ; // Para limitar el número de mediciones
}
}
Buena UserArduino94, veo que en tu montaje has colocado el led en pin2 que no es PWM (como por ej el pin 3,5,6....) entonces averigua las propiedades de dichos pines porque ahi puede que este el problema.
Bueno es que yo veo en el programa que al led le estas dando un HIGH o LOW esos son niveles altos o bajos no hay intermedios, ahora por curiosidad voy a ver (te sujiero que lo hagas tambien) como funcionan los pines PWM porque sospecho que asi no es.
Bienvenido al foro Arduino @UserArduino94. Te invito a que leas lasnormas del foroy edites tu post de acuerdo a ellas. Los códigos van con etiquetas </>. Aprovecha y cuando edites el código, cambia el título. Los títulos no deben llevar la palabra Ayuda que se considera inútil porque es juntamente lo que el foro te va a brindar así que para que ser redundante?
#define trigPin 53
#define echoPin 52
#define led 13
long duracion, distancia, distanciaAnterior;
int Limite = 25 ; // Medida en vacío del sensor
int intensidad;
bool unaVez = true, unaVez2 = true;
void setup()
{
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(led, OUTPUT);
}
void loop()
{
//CALCULAMOS LA DISTANCIA
digitalWrite(trigPin, LOW); // Nos aseguramos de que el trigger está desactivado
delayMicroseconds(2); // Para asegurarnos de que el trigger esta LOW
digitalWrite(trigPin, HIGH); // Activamos el pulso de salida
delayMicroseconds(10); // Esperamos 10µs. El pulso sigue active este tiempo
digitalWrite(trigPin, LOW); // Cortamos el pulso y a esperar el echo
duracion = pulseIn(echoPin, HIGH) ;
distancia = duracion / 2 / 29.1 ;
if ( distancia != distanciaAnterior )
{
Serial.println(String(distancia) + " cm.") ;
}
distanciaAnterior = distancia;
//DENTRO DEL LIMITE
if ( distancia <= Limite )
{
intensidad = 255 / Limite * distancia;
analogWrite ( led , intensidad) ;
if ( unaVez == true )
{
Serial.println("Esta dentro de rango");
unaVez = false;
}
unaVez2 = true;
}
//FUERA DEL LIMITE
else
{
if (unaVez2 == true )
{
Serial.println("Esta fuera del rango");
unaVez2 = false;
}
unaVez = true;
}
delay (50) ; // Para limitar el número de mediciones
}
Ajustá los pines a tu necesidad, compilá, subí y disfruta de los resultados.
NOTAS:
En el momento en el que un objeto sale del rango, se mantiene la intensidad del led en el ultimo estado valido detectado (como pediste).
Solo envía una vez los mensajes "Esta en el rango" y "Esta fuera del rango" cada vez que se cumpla una u otra condición.
Se envía al monitor serial la distancia a la que está un objeto cada vez que esta cambie (sea distinta a la lectura anterior). Así que si se pareciera que se tilda el monitor serial, es normal.