Recientemente he cogido un kit de arduino nano y he jugado con todos los proyectos sencillos. No tengo mucha experiencia EE además de los que tengo una pregunta que podría ser bastante básico.
Estoy tratando de hacer una linterna de viaje simple con un paquete de baterías recargables de iones de litio. Está funcionando, pero el voltaje en el LED está por debajo de lo que calculé que debía ser y por lo tanto el LED es más tenue de lo esperado.
Estoy usando una batería 18650 3.7v Li-ion para la alimentación que está conectada a una placa de carga/protección TP4056. La salida del TP4056 está conectada a un convertidor elevador MT3608 para elevar los 3,7v a 7v que alimenta al Nano a través del pin 30. Sé que no es una forma eficiente de alimentarlo pero lo cambiaré en el futuro.
Quiero usar PWM para controlar el brillo usando un codificador rotatorio y el botón para encenderlo/apagarlo. El LED fue rescatado de una linterna que tenía por ahí y después de algunas investigaciones parece que es un cree xp-c que tiene un voltaje de 3.6v @ 350mA. Para reducir la salida máxima de 5v de los pines del arduino hice un divisor de voltaje con R1 siendo una resistencia de 100 ohmios y R2 de 330 ohmios. Esto debería hacer que la salida entre las resistencias sea de ~3.8v, pero como el arduino pone un poco menos de 5v yo esperaba una salida de ~3.6v.
El problema es que estoy recibiendo 2,6v al LED en lugar de los 3,6v que debería ser. He medido 4,5v desde el pin D6 a GND pero sólo 2,6v después del divisor. ¿Qué puede causar que el voltaje sea 1v más bajo de lo esperado?
Aquí está el código que tengo en el nano:
int tempPin = 0;
volatile boolean TurnDetected; // need volatile for Interrupts
volatile boolean rotationdirection; // CW or CCW rotation
volatile boolean isOn;
volatile boolean buttonPress;
const int PinCLK=2; // White
const int PinDT=4; // Orange
const int PinSW=3; // Brown
const int PinLED=5;
int counter = 100;
// Interrupt routine runs if CLK goes from HIGH to LOW
void isr () {
delay(4); // delay for Debouncing
if (digitalRead(PinCLK))
rotationdirection= digitalRead(PinDT);
else
rotationdirection= !digitalRead(PinDT);
TurnDetected = true;
}
void isr1 () {
delay(4); // delay for Debouncing
if(!digitalRead(PinSW)){
isOn = !isOn;
}
buttonPress = true;
}
void setup() {
isOn=false;
Serial.begin(9600);
pinMode(PinCLK,INPUT);
pinMode(PinDT,INPUT);
pinMode(PinSW,INPUT);
pinMode(PinLED,OUTPUT);
digitalWrite(PinSW, HIGH); // Pull-Up resistor for switch
attachInterrupt (0,isr,FALLING);
attachInterrupt (digitalPinToInterrupt(PinSW),isr1,FALLING);
}
void loop() {
if(buttonPress){
if(isOn){
int val = map(counter, 0, 100, 0, 255);
analogWrite(PinLED, val);
} else {
digitalWrite(PinLED, LOW);
}
buttonPress=false;
}
if (TurnDetected) {
if (rotationdirection) {
counter+=2;
}
else {
counter-=2;
}
if(counter > 100){
counter=100;
}else if (counter < 30){
counter = 30;
}
int val = map(counter, 0, 100, 0, 255);
analogWrite(PinLED, val);
TurnDetected = false; // do NOT repeat IF loop until new rotation
detected
Serial.println(counter);
}
}