Vyberte stránku

S Arduinem je skutečně hodně zábavy. Pokud ho použijete pro nějaký projekt a budete jej napájet baterií či dokonce dobíjecím článkem, je dobré zjistit jeho stav a signalizovat jeho případné vybití.

NanofrontNapájení se na Arduino nano (viz. obrázek) přivádí na VIN pin, tam tedy připojíte kladnou část baterie a na ground pin (GND) zápornou část. Dovoleno je 6V až 12V. Pokud zároveň připojíte i USB kabel, přes který se Arduino také napají, přepne se automaticky Arduino na ten zdroj, který má větší napětí. Tedy pokud máte 9V baterii (USB má 5V) tak se automaticky napájí z baterie.

Uveřejním zde opravdu dobrý kód, který jsem objevil. Zjistí stav baterie, která Arduino napájí. Vrací napětí v milivoltech, které jsem ještě dodatečně převedl na volty a zaokrouhlil pomocí “ceil(Vcc/1000)”, můžete ovšem klidně použít výchozí milivolty.

Pomocí kódu tedy zjistíte, že Vám například z akumulátoru o napětí 7,4V zbývá už pouze 5,6V nebo méně. To lze využít a jednoduše vytvořit podmínku typu:

if(Vcc<3000){ //Pokud je napětí menší než 3V

//zde je možné umístit kód, který se v tom případě provede

}

Můžete třeba rozblikat nějakou LED diodu, abyste poznali nízký stav baterie. Můžete to také využít pro případné dobíjení baterie (s upravenou podmínkou, kdy se nabíjení uskuteční pokud bude napětí například >= 0 ale zároveň < maximu). Tedy pokud dosáhne maxima, nabíjení se ukončí. Možností je celá řada a je jen na vás, jak je využijete. Já jsem třeba viděl repliku Phaseru, který přehrával počítačový hlas od “Majel Roddenberry” ve znění “Warning energy reserves reaching critical stage”. Bohužel pouze jako efekt nezávisle na stavu akumulátoru. Stejný efekt tedy hodlám použít u stavby mého Nemesis Phaseru s tím rozdílem, že se přehraje při opravdu reálném nízkém stavu napětí akumulátoru.

Zde je tedy slíbený kód:

 

void setup() {

Serial.begin(9600);
}

void loop() {
float Vcc=readVcc(); //hodnota v mV
Vcc=ceil(Vcc/1000);//hodnota ve V
delay(500);
}

long readVcc() {

#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
#elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
ADMUX = _BV(MUX5) | _BV(MUX0);
#elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
ADMUX = _BV(MUX3) | _BV(MUX2);
#else
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
#endif

delay(2);
ADCSRA |= _BV(ADSC);
while (bit_is_set(ADCSRA,ADSC));

uint8_t low = ADCL;
uint8_t high = ADCH;

long result = (high<<8) | low;

result = 1125300L / result; // Výpočet Vcc (mV); 1125300 = 1.1*1023*1000
return result;
}