Hej,
mam problem z częścią dotyczącą uśpienia Attiny w programie mierzącym poziom naładowania akumulatora.
Mianowicie, sam program podający poziom naładowania akumulatora działa bez problemu, problem natomiast pojawia się gdy próbuję dodać uśpienie Attiny po osiągnięciu określonego czasu działania.
Całość będzie ostatecznie "Siedzieć" w pakiecie ogniw Li-Ion, owszem można by to zrobić na zwykłym włączniku bez funkcji sleep, ale chcę żeby po zresetowaniu Attiny program działał założoną ilość czasu po czym przechodził w funkcję uśpienia i tak do czasu ponownego resetu układu.
Niestety po dodaniu tych funkcji nie działa to prawidłowo, tzn. otrzymuję odczyt napięcia na diodzie RGB przez ok sekundę i przestaje działać, niestety nie przechodzi też w tryb uśpienia gdyż dalej pobór prądu wynosi kilka mA
Siedzę już nad tym i niestety nie mam pomysłu co jest nie tak, dodam tylko że w mikrokontrolerach siedzę od bardzo niedawna i ciągle się uczę...
Za pomoc serdecznie dziękuję
mam problem z częścią dotyczącą uśpienia Attiny w programie mierzącym poziom naładowania akumulatora.
Mianowicie, sam program podający poziom naładowania akumulatora działa bez problemu, problem natomiast pojawia się gdy próbuję dodać uśpienie Attiny po osiągnięciu określonego czasu działania.
Całość będzie ostatecznie "Siedzieć" w pakiecie ogniw Li-Ion, owszem można by to zrobić na zwykłym włączniku bez funkcji sleep, ale chcę żeby po zresetowaniu Attiny program działał założoną ilość czasu po czym przechodził w funkcję uśpienia i tak do czasu ponownego resetu układu.
Niestety po dodaniu tych funkcji nie działa to prawidłowo, tzn. otrzymuję odczyt napięcia na diodzie RGB przez ok sekundę i przestaje działać, niestety nie przechodzi też w tryb uśpienia gdyż dalej pobór prądu wynosi kilka mA
Siedzę już nad tym i niestety nie mam pomysłu co jest nie tak, dodam tylko że w mikrokontrolerach siedzę od bardzo niedawna i ciągle się uczę...
Za pomoc serdecznie dziękuję
Kod:
#include <avr/sleep.h>
#define adc_disable() (ADCSRA &= ~(1<<ADEN))
#define adc_enable() (ADCSRA |= (1<<ADEN))
const int redPin = PB2;
const int greenPin = PB1;
const int bluePin = PB0;
const unsigned long Sleep = 3000;
unsigned long StartTime = 0;
int del = 200; // delay
void setup()
{
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
digitalWrite(redPin, HIGH);
digitalWrite(bluePin, HIGH);
digitalWrite(greenPin, HIGH);
delay(200);
}
void enterSleep(void)
{
adc_disable();
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_cpu();
}
void loop() {
int sensorValue = analogRead(PB3);
float voltage = sensorValue * (4.9 / 1023.0);
delay(100);
int value=sensorValue;
if (value<=651 ) {
digitalWrite(redPin, LOW);
delay(del);
digitalWrite(redPin, HIGH);
delay(del/2);
digitalWrite(bluePin, HIGH);
digitalWrite(greenPin, HIGH);
}
else
if (value>651 && value<=681) {
digitalWrite(redPin, LOW);
delay(del);
digitalWrite(bluePin,HIGH);
digitalWrite(greenPin,HIGH);
}
else
if (value>681 && value<=716) {
digitalWrite(redPin, LOW);
digitalWrite(greenPin, LOW);
delay(del);
digitalWrite(bluePin,HIGH);
}
else
if (value>716 && value<=751) {
digitalWrite(greenPin, LOW);
delay(del);
digitalWrite(redPin, HIGH);
digitalWrite(bluePin, HIGH);
}
else
if (value>751 && value<=796) {
digitalWrite(bluePin, LOW);
delay(del);
digitalWrite(redPin, HIGH);
digitalWrite(greenPin, HIGH);
}
else
if (value>796) {
digitalWrite(bluePin, LOW);
delay(del);
digitalWrite(bluePin, HIGH);
delay(del/2);
digitalWrite(redPin, HIGH);
digitalWrite(greenPin, HIGH);
}
delay(100);
while (millis() - StartTime < Sleep){
enterSleep();
}
}