Hola a todos. A ver , tengo una luz PWM para una mini lámpara.
La idea es luz variable en intensidad mediante dos botones,
-uno para subir y
-otro para bajar la intensidad,
-además de un tercer boton que este lo que hace es apagar la luz directamente esté la intensidad donde esté.
El problema está en que si la luz la pongo a cualquier intensidad que no sea la máxima va todo correcto, o si la pongo al máximo y la bajo con el segundo boton (bajar intensidad), pero si la pongo a maxima intensidad (que ya parpadea el led rojo) y apago desde el boton de apagado (tercer boton) si le doy a encender progresivamente nuevamente la luz, está lo primero que hace es que da un pico de intensidad y seguido comienza a subir poco a poco, pero lo primero siempre es un pico que es molesto.
A continuacion dejo el sketch (aunque terminaría montando con un attiny 85 por cuestion de tamaño)
#include <elapsedMillis.h>
elapsedMillis timeElapsed;
//Patillas
const int ledPinOUT = 9; //PIN6 --> Patilla 5 del Attiny, es el que tendrá asignada la salida de luz regulable y es un pin PWM
const int ledPinROJO = 5; //PIN7 --> Patilla 6 del Attiny,
const int botonOFF = 2; // PIN0 the number of the pushbutton pin
const int botonSumaPin = 3 ; //PIN1 --> Patilla 2 del Attiny , es el boton que sumara (1 en este caso) al ciclo de trabajo subir luz
const int botonRestaPin = 4; //PIN2 --> Patilla 3 del Atinny , es el boton que restara (1 en este caso) al ciclo de trabajo bajar luz
// Variables
int botonSumaValue; //Variable para el boton de suma
int botonRestaValue; //Variable para el boton de resta
byte cicloTrabajo=0; //Variable para el ciclo de trabajo del led
// retraso en milisegundos entre parpadeos del LED
unsigned int interval = 50;
// estado del LED = LOW está apagado, HIGH está encendido
boolean ledState = LOW;
volatile int i = 0; // inicializando un entero para incrementar y disminuir la relación de trabajo.
//inicialización
void setup(){
pinMode(ledPinOUT, OUTPUT);
pinMode(ledPinROJO, OUTPUT);
pinMode(botonSumaPin, INPUT);
pinMode(botonRestaPin, INPUT);
pinMode(botonOFF, INPUT);
// Serial.begin(9600);
}
void loop (){
botonSumaValue= digitalRead(botonSumaPin);
botonRestaValue= digitalRead(botonRestaPin);
cicloTrabajo = constrain(cicloTrabajo, 0, 200);
//Serial.println(cicloTrabajo);
if ( cicloTrabajo <150 && botonSumaValue == HIGH ){
cicloTrabajo++;
}
if ( cicloTrabajo >=1 && botonRestaValue == HIGH){
cicloTrabajo--; //Disminuye el brillo si se presiona el pulsador
}
analogWrite(ledPinOUT, cicloTrabajo); //Modifica el brillo del LED por medio de una señal PWM
delay(15);
if (cicloTrabajo ==0)
analogWrite(ledPinROJO, 200);
else
analogWrite(ledPinROJO, 0);
if (botonSumaValue == HIGH && cicloTrabajo >=149)
{
ledState = !ledState; // cambiar el estado de ALTO a BAJO a ALTO a BAJO ...
digitalWrite(ledPinOUT, ledState);
timeElapsed = 0; // restablecer el contador a 0 para que el conteo comience de nuevo ...
}
delay(10);
if (digitalRead(botonOFF) == HIGH)
{
cicloTrabajo =0;
analogWrite(ledPinOUT, cicloTrabajo);
delay (10);
}
}
}