Ну, во первых я не вижу где выставляются значения на ногах при включении питания. Вижу только установку направления ног.
Далее, ACC и BAT надо получать не digitalRead, а analogRead с проверкой на нужный уровень. Для этого можно воспользоваться макросом:
Код:
#define Rinput 47.0 // Последовательное сопротивление
#define Rground 10.0 // Сопротивление на массу
#define VRef 5.0 // Опорное для ADC
#define Kmnog ((Rground + Rinput) / Rground)
#define V2ADC(v) ((u16)(((v) * 1024.0) / (VRef * Kmnog)))
и сравнивать со значением, например V2ADC(10.0)
p.s.
Далее, чтобы не запутаться в своих-же if() else.... лучше void loop() написать с использование switch, т.е.
Код:
#define POWER_ST_OFF 0
#define POWER_ST_ACC_ON 1
#define ACC_MIN_TRIP_POINT V2ADC(10.0)
int POWER_ST;
int POWER_CNT;
в setup()
POWER_ST = POWER_ST_OFF
POWER_CNT = 0;
в loop()
{
// Вызывать с интервалом например 1 мСек по таймеру
PowerCheck();
}
void PowerCheck()
{
switch(POWER_ST)
{
case POWER_ST_OFF:
if(analogRead(ACC) >= ACC_MIN_TRIP_POINT)
{
// напряжение на АСС больше минимального
if(++POWER_CNT >= 1000)
{
// АСС больше минимального более 1 сек
POWER_CNT = 0;
POWER_ST = POWER_ST_ACC_ON;
}
}
else
{
POWER_CNT = 0;
}
break;
case POWER_ST_ACC_ON:
..................
break;
}
}
Ну и так далее, меньше условий тут запутаться.