Hallo meigrafd,
danke für die Links. In Sachen Sketches bin ich noch recht neu.
Ich habe den Timer nun wie folgt implementiert, leider bisher ohne Erfolg.
Ich vermute, dass sich der Attiny im Schlafmodus befindet und daher der Timer nicht "aktiv" ausgeführt wird.
Kannst du mir mit dem Code für den Sketch helfen?
C
//----------------------------------------------------------------------------------------------------------------------
// TinyTX or Tiny328 and RFM12B Wireless Module with PIR module
// By Nathan Chantrell. For hardware design see http://nathan.chantrell.net/
//
// Licenced under the Creative Commons Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) licence:
// http://creativecommons.org/licenses/by-sa/3.0/
//
// For TinyTX the arduino-tiny core is required: http://code.google.com/p/arduino-tiny/
//----------------------------------------------------------------------------------------------------------------------
#include <JeeLib.h> // https://github.com/jcw/jeelib
#include <avr/sleep.h>
#include <TimerOne.h>
#if defined(__AVR_ATtiny84__) // If we are running on a TinyTX
#include <PinChangeInterrupt.h> // http://code.google.com/p/arduino-tiny/downloads/list
#endif
ISR(WDT_vect) { Sleepy::watchdogEvent(); } // interrupt handler for JeeLabs Sleepy power saving
#define myNodeID 7 // RF12 node ID in the range 1-30
#define network 210 // RF12 Network group
#define freq RF12_433MHZ // Frequency of RFM12B module
#define USE_ACK // Enable ACKs, comment out to disable
#define RETRY_PERIOD 5 // How soon to retry (in seconds) if ACK didn't come in
#define RETRY_LIMIT 5 // Maximum number of times to retry
#define ACK_TIME 10 // Number of milliseconds to wait for an ack
#define PIR_PIN 3 // PIR Output pin connected to Pin 3
#define PIR_IRQ 1 // PIR Output pin connected to INT1 (only used for Tiny328)
//########################################################################################################################
//Data Structure to be sent
//########################################################################################################################
typedef struct {
int pirState; // PIR state
int aliveState; // Alive message
int supplyV; // Supply voltage
} Payload;
Payload tinytx;
//########################################################################################################################
void setup() {
rf12_initialize(myNodeID,freq,network); // Initialize RFM12 with settings defined above
rf12_sleep(0); // Put the RFM12 to sleep
pinMode(PIR_PIN, INPUT); //set the pin to input
Timer1.initialize(60*1000000);
Timer1.attachInterrupt(keppAlive);
#if defined(__AVR_ATtiny84__)
attachPcInterrupt(PIR_PIN,wakeUp,CHANGE); // attach a PinChange Interrupt for TinyTX boards
#else
attachInterrupt(PIR_IRQ,wakeUp,CHANGE); // attach an Interrupt for Tiny328 boards
#endif
PRR = bit(PRTIM1); // only keep timer 0 going
ADCSRA &= ~ bit(ADEN); bitSet(PRR, PRADC); // Disable the ADC to save power
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Set sleep mode
sleep_mode(); // Sleep now
}
void wakeUp(){}
void loop() {
int pirState = digitalRead(PIR_PIN); // Read the state of the pin
if (pirState == HIGH) { // Movement detected
tinytx.pirState = 1;
tinytx.supplyV = readVcc(); // Get supply voltage
rfwrite(); // Send data via RF
}
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Set sleep mode
sleep_mode(); // Sleep now
}
void keppAlive() {
tinytx.pirState = 99;
tinytx.aliveState = 99;
tinytx.supplyV = readVcc(); // Get supply voltage
rfwrite(); // Send data via RF
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Set sleep mode
sleep_mode(); // Sleep now
}
//--------------------------------------------------------------------------------------------------
// Send payload data via RF
//-------------------------------------------------------------------------------------------------
static void rfwrite(){
#ifdef USE_ACK
for (byte i = 0; i <= RETRY_LIMIT; ++i) { // tx and wait for ack up to RETRY_LIMIT times
rf12_sleep(-1); // Wake up RF module
while (!rf12_canSend())
rf12_recvDone();
rf12_sendStart(RF12_HDR_ACK, &tinytx, sizeof tinytx);
rf12_sendWait(2); // Wait for RF to finish sending while in standby mode
byte acked = waitForAck(); // Wait for ACK
rf12_sleep(0); // Put RF module to sleep
if (acked) { return; } // Return if ACK received
Sleepy::loseSomeTime(RETRY_PERIOD * 1000); // If no ack received wait and try again
}
#else
rf12_sleep(-1); // Wake up RF module
while (!rf12_canSend())
rf12_recvDone();
rf12_sendStart(0, &tinytx, sizeof tinytx);
rf12_sendWait(2); // Wait for RF to finish sending while in standby mode
rf12_sleep(0); // Put RF module to sleep
return;
#endif
}
// Wait a few milliseconds for proper ACK
#ifdef USE_ACK
static byte waitForAck() {
MilliTimer ackTimer;
while (!ackTimer.poll(ACK_TIME)) {
if (rf12_recvDone() && rf12_crc == 0 &&
rf12_hdr == (RF12_HDR_DST | RF12_HDR_CTL | myNodeID))
return 1;
}
return 0;
}
#endif
//--------------------------------------------------------------------------------------------------
// Read current supply voltage
//--------------------------------------------------------------------------------------------------
long readVcc() {
bitClear(PRR, PRADC); ADCSRA |= bit(ADEN); // Enable the ADC
long result;
// Read 1.1V reference against Vcc
#if defined(__AVR_ATtiny84__)
ADMUX = _BV(MUX5) | _BV(MUX0); // For ATtiny84
#else
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); // For ATmega328
#endif
delay(2); // Wait for Vref to settle
ADCSRA |= _BV(ADSC); // Convert
while (bit_is_set(ADCSRA,ADSC));
result = ADCL;
result |= ADCH<<8;
result = 1126400L / result; // Back-calculate Vcc in mV
ADCSRA &= ~ bit(ADEN); bitSet(PRR, PRADC); // Disable the ADC to save power
return result;
}
Alles anzeigen