• 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
Wybudzanie
#1
Witam. Postanowiłem swego czasu skonstruować urządzenie które będzie sobie stało w łazience, mierzyło wilgotność, miało zegarek i i sterowało wentylatorem.
Dodatkowo najważniejsza sprawa to żeby urządzenie było energooszczędne (czyli musi się usypiać).
Wybudzanie miało być za pomocą pilota i/lub klawisza w obudowie. 
Jestem na początku no i .... problem Big Grin

Chodzi o to, że raz mogę wybudzić układ a następnie już d..a Sad
Może ktoś z Was rzucić okiem i wytknąć mi błędy ?

Generalnie poniższy kod ma działać tak:
- jeżeli układ jest nie uśpiony to odbiera kody z pilota i steruje a w zasadzie będzie pozwalał sterować całością
- każde naciśnięcie klawisza pilota gdy układ nie śpi, zeruje naliczanie Timera
- jeżeli minie określony czas (w tym przykładzie 10) to arduino ma przejść w stan uśpienia.
- jeżeli następuje budzenie to wyłączamy przerwanie aby można było normalnie czytać kody wysyłane z pilota za pomocą biblioteki
- jeżeli wchodzimy w stan uśpienia to włączamy przerwanie aby można było obudzić procka

Wdaje mi się, że założenia są prawidłowe, ale jakoś to nie działa Sad
Kod:
#define TSOP_PIN 2

#include <Timers.h>
#include <RC5.h>

Timer licznik;
RC5 rc5(TSOP_PIN);

//Dane odczytywane z pilota
byte address;
byte command;
byte toggle;

//Czas po jakim ma się uśpić układ
const byte czasDoUspienia = 10;

void setup() {
 
 DDRB |= (1 << 5);
 PORTB |= (1 << 5);

 attachInterrupt(digitalPinToInterrupt(TSOP_PIN), Budzenie, CHANGE);
 licznik.begin(SECS(czasDoUspienia));
 Serial.begin(9600);
}

void loop() {

 if (licznik.available())
 {
   attachInterrupt(digitalPinToInterrupt(TSOP_PIN), Budzenie, CHANGE);

   SMCR |= (1 << SM2);
   SMCR |= (1 << SM1);
   SMCR &= ~(1 << SM0);
   SMCR |= (1 << SE);
   asm( "SLEEP \n");
 }

 if (rc5.read(&toggle, &address, &command))
 {
   licznik.restart();
   Serial.print("A:");
   Serial.print(address);
   Serial.print(" K:");
   Serial.print(command);
   Serial.print(" T:");
   Serial.println(toggle);
 }
 
}

void Budzenie()
{
 detachInterrupt(digitalPinToInterrupt(TSOP_PIN));
 SMCR &= ~(1 << SE);  
 licznik.restart();
}
 
Odpowiedź
#2
Sporo mieszasz. Widać, że coś już wiesz, może to pomoże:
http://www.gammon.com.au/forum/?id=11497
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
OK. Dzięki. Wieczorem postaram się przysiąść i zobaczyć co tam w artykule piszczy Wink

Podejrzałem co nieco i wydaje się, że działa.
Niestety na tą chwilę nie do końca jeszcze ogarniam dlaczego, ale popracuję nad tym.

Generalnie dzięki za wskazania gdzie szukać.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości