This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Dimmer para tira de leds, problema
#1
Buenos días!

Os cuento, estoy empezando con esto del arduino y su programación, hace años había visto algo de C++ y hay cosas de las que me acuerdo (pocas, ya lo digo) y otras en las que estoy totalmente perdido.

Aprovechando que tengo por aquí unas placas Arduino, me puse estos días a ver si era capaz de hacer un dimmer para unas tiras de led.

A ver si no meto la pata explicando lo que he podido entender hasta ahora, de ser así, disculpad.

La idea es usar esto para la entrada de casa, un sensor magnético me dirá cuando la puerta está abierta o cerrada, generando un HIGH o un LOW en una entrada digital y la salida se hará controlada por PWM y de ahí a un circuito con Mosfet (esta parte aún no me he puesto con ella).

Al abrir la puerta quiero que las tiras vayan subiendo la luminosidad hasta que lleguen al máximo y se mantengan ahí mientras la puerta esté abierta y una vez la puerta esté cerrada (HIGH en el pin digital), al cabo de unos segundos deberían empezar a bajar la luminosidad hasta apagarse completamente.

Todo esto he intentado hacerlo, pero no me va bien, al menos revisándolo con el "Monitor Serie" del GUI de Arduino, cuando detecta un nivel LOW en la entrada digital, ejecuta un bucle While el cual dentro va incrementando el valor de una variable "brillo" de 0 a 255 (¿Esto es así o debería usar valores más específicos como 64, 128, 192, 255?), después de llegar a ese "255", me salta a otro bucle en el que se se queda mientras el valor de la entrada digital siga siendo LOW, el problema es que no lo hace, se va directamente a la otra parte y empieza a descontar del 255 al 0 y al final es todo un bucle haciendo lo mismo, sube y baja. Cambiando diferentes cosas en el programa a veces sólo llega la cuenta hasta 20 o así.

Espero no haberme liado con la explicación!!

Luego os pongo el código de lo que he hecho para ver en que meto la pata, ya que a priori me parece sencillo, pero no consigo que funcione.
  Responder
#2
Vas bien. Por lo que dices, se te sale del bucle que debe mantenerse a máxima potencia un tiempo X. Quedamos a la espera de código.
  Responder
#3
Buenas, gracias por la respuesta, llevo un rato peleándome de nuevo a ver si conseguía algo, pero nada.
Me da la sensación como si se pasara por el forro el "while(digitalRead(sensor) ". Fijo que he metido la pata en varias cosas  Facepalm Confundido

Este es el código que tengo, a ver en donde la he liado...

Cita:int sensor = 2;  //Declaramos el sensor en el pin 2
int Mosfet = 6;  //Declaramos la salida al mosfet en el pin 6
int brillo;  //Declaramos la variable para el brillo de los leds

void setup() {
  // put your setup code here, to run once:
  
  Serial.begin(9600);  //Iniciamos el puerto Serie
  pinMode(sensor, INPUT); //Definimos el pin del sensor como entrada
  pinMode(Mosfet, OUTPUT);  //Definimos el pin del Mosfet como salida

}

void loop() {
  // put your main code here, to run repeatedly:
  
  while (digitalRead(sensor) == HIGH)   //Mientras la puerta esté cerrada, ejecutamos
  {
    brillo = 0;
    analogWrite(Mosfet, brillo); //Salida 6 a 0, Leds apagados

    Serial.println("Puerta Cerrada");
    Serial.println(brillo);
  }

  if(digitalRead(sensor) == LOW)  //Si la puerta está abierta
  {
    while(brillo < 255)       //Mientras brillo sea menor de 255
    {
      analogWrite(Mosfet, brillo);
      brillo ++;
      Serial.println(brillo);  
    }
  }  
   if(brillo == 255)    //Si brillo = 255
    {
      while (digitalRead(sensor) == LOW)    //Mientras la puerta esté abierta, mantenemos ese valor de 255
      {
        brillo = 255;
        analogWrite(Mosfet, brillo);
        Serial.println("Maximo Brillo");
        Serial.println(brillo);
      }
    }
    else
    {
      if(digitalRead(sensor) == HIGH) //Si cerramos la puerta, esperamos 5 seg y mientras el brillo sea mayor de 0, vamos bajando.
      delay(5000);
      while (brillo > 0)
      {
        analogWrite(Mosfet, brillo);
        brillo --;
        Serial.println(brillo);  
      
      }  
  } 
}    
  
  Responder
#4
No te llega nunca al valor de 255. Se queda en 254. Pon un <= en "while(brillo < 255)". Te quedaria "while(brillo <= 255)"
  Responder
#5
Gracias por la respuesta, voy a probar eso y aparte acabo de darme cuenta de una cosa, si dejo como entrada el pin 2, este fluctúa entre 0 y 1¿puede ser por ser un pin PWM?
He probado a cambiarlo por el pin 22 que es digital y parece que va mejor.

Voy a probar ambas cosas y os digo algo.

Nada, he probado eso que me dices, pero se me va a 256, pues cuenta que cuenta que cuando es igual a 255, suma 1.
Para solucionarlo, he modificado el while por un Do... While, de forma que primero hace la suma y luego comprueba, pero sigue haciendo el ciclo de subir y bajar.

Mmm... no me contestes aún, voy a pelearme con el, que usando los Do...while la cosa cambia.
Luego comento.

Bien, tras algunas pruebas, creo que he encontrado parte del problema y es que si pongo el pin que uso para el sensor directamente a GND, funciona bien.

¿No se puede dejar "al aire" un pin que se esté usando?
  Responder
#6
Un pin al aire puede tomar cualquier valor, no lo controlas. Si es un pin digital, se les suele poner una resistencia de pull-up o pull-down.
  Responder
#7
Mmm... ok, voy a investigar el tema.

Muchas gracias por todo
  Responder
#8
yo lo plantearia de otra manera para que el sketch no haga cosas redundantes ,es decir ,tienes dos estados posibles ,puerta abierta o cerrada ,pero solo deberias actuar en las luces cuando el estado ha cambiado,creando una variable booleana (0 o 1 /true o false) que te indique el estado.en la siguiente ejecucion del loop comparas el estado actual con el anterior ,si nada ha cambiado ,no hago nada.si la puerta esta ahora cerrada y anteriormente estaba abierta ,activo temporizador ,apago luces y indico la situacion en la variable.si la puerta esta ahora abierta y anteriormente estaba cerrada ,hago el encendido gradual e indico situacion en la variable.esto lo puedes hacer con un if (los bucles while son peligrosos...) y el encendido gradual con un bucle for.
  Responder


Posibles temas similares…
Tema Autor Respuestas Vistas Último mensaje
  [TUTO] Pantalla 150 Leds WS2812 cansi22 27 29,791 06-10-2019, 08:14 PM
Último mensaje: yomaker
  CONSULTA Controlar 3000 leds, ¿cual es la mejor opcion? the_feti 2 1,434 13-08-2018, 10:00 PM
Último mensaje: the_feti
  Controlar 8 leds 100 mA con Arduino y ULN2803 amjlopez 1 1,412 30-07-2018, 12:04 PM
Último mensaje: Bayaz
  Leds ws2801 y alimentar arduino uno joseab 1 4,252 27-07-2015, 08:53 AM
Último mensaje: biketrial981
  Leds ws2801 y alimentar arduino uno joseab 0 1,371 26-07-2015, 10:48 PM
Último mensaje: joseab