• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
[ATTINY85] pomiar poziomu naładowania akumulatora i problem z uśpieniem
#1
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 mASad

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ęSmile

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();
}
}
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości