Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define CE_PIN 3
- #define CSN_PIN 3 //Since we are using 3 pin configuration we will use same pin for both CE and CSN
- #define DHTPIN 4
- #define DHTTYPE DHT22 // DHT 22 (AM2302)
- #define F_CPU 8000000 // This is used by delay.h library (needed for sleep)
- #include "RF24.h"
- #include <DHT.h>
- #include <avr/sleep.h> // Needed for sleep mode (max length 8s for attiny)
- #include <avr/wdt.h> // Watch Dog Timer for sleep mode
- //for sleep/watchdog
- #ifndef cbi
- #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
- #endif
- #ifndef sbi
- #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
- #endif
- volatile boolean f_wdt = 1;
- RF24 radio(CE_PIN, CSN_PIN);
- DHT dht(DHTPIN, DHTTYPE);
- byte address[8] = "nodeDHT"; // Name of this node
- struct message_t {
- float temperature;
- float humidity;
- float hic;
- };
- message_t message;
- void setup() {
- setup_watchdog(7); // sleep length: // 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms, 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec
- radio.begin(); // Start up the radio
- radio.setAutoAck(1); // Ensure autoACK is enabled
- radio.setRetries(15,15); // Max delay between retries & number of retries
- radio.openWritingPipe(address); // Write to device address 'SimpleNode'
- radio.setDataRate(RF24_250KBPS);
- radio.setCRCLength(RF24_CRC_8);
- }
- void loop(void){
- if (f_wdt==1) { // wait for timed out watchdog / flag is set when a watchdog timeout occurs
- f_wdt=0; // reset flag
- for (int i = 0; i < 2; i++) { // Needed to sleep longer than the max of 8s
- system_sleep();
- }
- radio.powerUp(); // Power radio back up
- float t = dht.readTemperature(); // Read temperature as Celsius
- float h = dht.readHumidity(); // Read humidity (percent)
- delay(2000); // DHT22 needs minimum 1s before reliable data can be retrieved after power up, poll again after 2s to ensure we get values
- t = dht.readTemperature(); // Read temperature as Celsius
- h = dht.readHumidity(); // Read humidity (percent)
- float hic = dht.computeHeatIndex(t, h, false); // Compute heat index in Celsius (isFahreheit = false)
- // Transmit readings
- message = (message_t){ t, h, hic }; // Construct message
- radio.write( &message, sizeof(message) ); // Send message to 'Receiver'
- radio.powerDown(); // Power down radio to save battery (DHT22 automatically enters low-power mode when done with reading)
- system_sleep(); // enter sleep mode
- }
- }
- // set system into the sleep state
- // system wakes up when wtchdog is timed out
- void system_sleep() {
- cbi(ADCSRA,ADEN); // switch Analog to Digitalconverter OFF
- set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here
- sleep_enable();
- sleep_mode(); // System sleeps here
- sleep_disable(); // System continues execution here when watchdog timed out
- sbi(ADCSRA,ADEN); // switch Analog to Digitalconverter ON
- }
- void setup_watchdog(int ii) {
- byte bb;
- int ww;
- if (ii > 9 ) ii=9;
- bb=ii & 7;
- if (ii > 7) bb|= (1<<5);
- bb|= (1<<WDCE);
- ww=bb;
- MCUSR &= ~(1<<WDRF); // Clear the reset flag
- WDTCR |= (1<<WDCE) | (1<<WDE); // Start timed sequence
- // set new watchdog timeout value
- WDTCR = bb;
- WDTCR |= _BV(WDIE);
- }
- // Watchdog Interrupt Service / is executed when watchdog timed out
- ISR(WDT_vect) {
- f_wdt=1; // set global flag
- }
Advertisement
Add Comment
Please, Sign In to add comment