27-05-2019, 12:06
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
Chodzi o to, że raz mogę wybudzić układ a następnie już d..a
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
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
Chodzi o to, że raz mogę wybudzić układ a następnie już d..a
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
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();
}