Hace poco recogí un arduino nano kit y jugué un poco con todos los proyectos simples. No tengo mucha experiencia en EE además de esas, así que tengo una pregunta que podría ser bastante básica.
Estoy intentando hacer una linterna de viaje simple con una batería recargable de ion de litio. Está funcionando, pero el voltaje en el LED está por debajo de lo que calculé, 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 protección / carga TP4056. La salida TP4056 está conectada a un convertidor elevador de aumento MT3608 para aumentar 3.7v hasta 7v, lo que alimenta al Nano a través del pin 30. Sé que no es una forma eficiente de hacerlo, pero lo cambiaré en el futuro.
Quiero usar PWM para controlar el brillo mediante un codificador rotatorio y el botón para encenderlo / apagarlo. El LED se salvó de una linterna que tenía alrededor y después de algunas investigaciones parece que es un cree xp-c que muestra un voltaje directo de 3.6v @ 350mA. Para reducir la salida máxima de 5 V de los pines de arduino, hice un divisor de voltaje con R1 como resistencia de 100 ohmios y R2 con 330 ohmios. Esto debería hacer que la salida entre las resistencias sea ~ 3.8v, pero como el arduino emite un poco menos de 5v, esperaba una salida de ~ 3.6v.
El problema es que estoy obteniendo 2.6v al LED en lugar de 3.6v como debería ser. Medí 4.5v desde el pin D6 a GND pero solo 2.6v después del divisor. ¿Qué podría hacer 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);
}
}