В настоящее время я пытаюсь сделать простой индикатор состояния зарядки для моей 12В свинцовой батареи.Поэтому я использую два резистора (11 кОм и 6,8 кОм) в качестве делителя напряжения и аналоговый вход Arduino UNO для измерения значения.Напряжение преобразуется в значение percantage, а затем выводится и отображается на 5 светодиодах (таким образом, 5 светодиодов означают заряд 100-90%, 4 светодиода - 90-80% и т. Д.).Также есть кнопка и реле для включения и устройства, подключенного к аккумулятору.
Однако, когда я подключаю arduino к аккумулятору, количество активируемых светодиодов продолжает увеличиваться.При активации он начинается с 3-х светодиодов и продолжает расти до 5-ти активированных светодиодов и остается там до деактивации.При измерении напряжения на делителе напряжения оно остается неизменным и не увеличивается.
Я не могу понять, почему эта проблема продолжает возникать.
Основная программа:
#include "AnalogConversionLib.c"
#include "VoltageCapacityFkt.c"
#include "DisplayLib.c"
#define Analog1 0
Spannung Volt;
Ladung Ldg;
disp dsp;
bool led1;
bool led2;
bool led3;
bool led4;
bool led5;
bool ledEin;
bool Schutz=0;
bool Taster=0;
static bool TasterOld=0;
static bool State=0;
void setup()
{
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, INPUT_PULLUP);
}
void loop()
{
Taster=digitalRead(8);
Volt.AnalogIn=analogRead(Analog1);
VoltageRead(&Volt);
Ldg.Spg=Volt.ActVolt;
CapFkt(&Ldg);
dsp.Charge=Ldg.Charge;
ChargeState(&dsp);
if(Taster && !TasterOld && !State){
Schutz=HIGH;
}
else if(Taster && !TasterOld == State){
Schutz=LOW;
led1=LOW;
led2=LOW;
led3=LOW;
led4=LOW;
led5=LOW;
}
else if(State){
switch(dsp.Leds) {
case 5:
led1=HIGH;
led2=HIGH;
led3=HIGH;
led4=HIGH;
led5=HIGH;
Schutz=HIGH;
break;
case 4:
led1=HIGH;
led2=HIGH;
led3=HIGH;
led4=HIGH;
led5=LOW;
Schutz=HIGH;
break;
case 3:
led1=HIGH;
led2=HIGH;
led3=HIGH;
led4=LOW;
led5=LOW;
Schutz=HIGH;
break;
case 2:
led1=HIGH;
led2=HIGH;
led3=LOW;
led4=LOW;
led5=LOW;
Schutz=HIGH;
break;
case 1:
led1=HIGH;
led2=LOW;
led3=LOW;
led4=LOW;
led5=LOW;
Schutz=HIGH;
break;
case 0:
led1=LOW;
led2=LOW;
led3=LOW;
led4=LOW;
led5=LOW;
Schutz=HIGH;
break;
case 6:
led1=LOW;
led2=LOW;
led3=LOW;
led4=LOW;
led5=LOW;
Schutz=LOW;
}
}
else{
led1=LOW;
led2=LOW;
led3=LOW;
led4=LOW;
led5=LOW;
Schutz=LOW;
}
digitalWrite(1, led1);
digitalWrite(2, led2);
digitalWrite(3, led3);
digitalWrite(4, led4);
digitalWrite(5, led5);
digitalWrite(6, Schutz);
digitalWrite(7, State);
State=Schutz;
TasterOld=Taster;
}
AnalogConversionLib:
/***********************************************************************
*
* Analogwert in Batteriespannung umwandeln
*
*
************************************************************************/
typedef struct {
//Input
int AnalogIn;
//Output
float ActVolt;
}Spannung;
void VoltageRead(Spannung *ptr)
{
ptr->ActVolt=(((ptr->AnalogIn*5.0)/1023)*(12.4/4.7));
}
VoltageCapacityFkt:
/***********************************************************************
*
* Spannung in Kapazit�t umwandeln
*
*
************************************************************************/
typedef struct {
//Input
float Spg;
//Output
float Charge;
} Ladung;
void CapFkt(Ladung *ptr){
if(ptr->Spg>=10.8){
ptr->Charge=30.299*(ptr->Spg*ptr->Spg) - 655.35*ptr->Spg + 3546.5;
}
else{
ptr->Charge=0;
}
}
DisplayLib:
/***********************************************************************
*
* Spannung in Kapazit�t umwandeln
*
*
************************************************************************/
typedef struct {
//Input
float Charge;
//Output
int Leds;
}disp;
void ChargeState (disp *ptr){
if(ptr->Charge>=90.0){
ptr->Leds=5;}
else if(ptr->Charge>=80.0){
ptr->Leds=4;}
else if(ptr->Charge>=70.0){
ptr->Leds=3;}
else if(ptr->Charge>=60.0){
ptr->Leds=2;}
else if(ptr->Charge>=50.0){
ptr->Leds=1;}
else if(ptr->Charge>=40.0 && millis()%500>250){
ptr->Leds=5;}
else if(ptr->Charge<40.0){
ptr->Leds=6;}
else{ptr->Leds=0;}
}