AgnosticAndroid

Attiny85TemperatureNode

Feb 5th, 2016
230
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.05 KB | None | 0 0
  1. #define CE_PIN 3
  2. #define CSN_PIN 3                             //Since we are using 3 pin configuration we will use same pin for both CE and CSN
  3. #define DHTPIN 4
  4. #define DHTTYPE DHT22                         // DHT 22  (AM2302)
  5. #define F_CPU 8000000                         // This is used by delay.h library (needed for sleep)
  6.  
  7. #include "RF24.h"
  8. #include <DHT.h>
  9. #include <avr/sleep.h>                        // Needed for sleep mode (max length 8s for attiny)
  10. #include <avr/wdt.h>                          // Watch Dog Timer for sleep mode
  11.  
  12. //for sleep/watchdog
  13. #ifndef cbi
  14. #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
  15. #endif
  16. #ifndef sbi
  17. #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
  18. #endif
  19.  
  20. volatile boolean f_wdt = 1;                  
  21.  
  22. RF24 radio(CE_PIN, CSN_PIN);
  23. DHT dht(DHTPIN, DHTTYPE);
  24.  
  25. byte address[8] = "nodeDHT";                  // Name of this node
  26.  
  27. struct message_t {
  28.   float temperature;
  29.   float humidity;
  30.   float hic;
  31. };
  32. message_t message;
  33.  
  34.  
  35. void setup() {
  36.   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
  37.   radio.begin();                                // Start up the radio
  38.   radio.setAutoAck(1);                          // Ensure autoACK is enabled
  39.   radio.setRetries(15,15);                      // Max delay between retries & number of retries
  40.   radio.openWritingPipe(address);               // Write to device address 'SimpleNode'
  41.   radio.setDataRate(RF24_250KBPS);
  42.   radio.setCRCLength(RF24_CRC_8);
  43. }
  44.  
  45. void loop(void){
  46.   if (f_wdt==1) {                                   // wait for timed out watchdog / flag is set when a watchdog timeout occurs
  47.       f_wdt=0;                                      // reset flag
  48.     for (int i = 0; i < 2; i++) {                   // Needed to sleep longer than the max of 8s
  49.       system_sleep();
  50.     }
  51.     radio.powerUp();                                // Power radio back up
  52.     float t = dht.readTemperature();                // Read temperature as Celsius
  53.     float h = dht.readHumidity();                   // Read humidity (percent)
  54.     delay(2000);                                    // DHT22 needs minimum 1s before reliable data can be retrieved after power up, poll again after 2s to ensure we get values
  55.     t = dht.readTemperature();                      // Read temperature as Celsius
  56.     h = dht.readHumidity();                         // Read humidity (percent)
  57.     float hic = dht.computeHeatIndex(t, h, false);  // Compute heat index in Celsius (isFahreheit = false)
  58.  
  59. // Transmit readings
  60.     message = (message_t){ t, h, hic };             // Construct message
  61.     radio.write( &message, sizeof(message) );       // Send message to 'Receiver'
  62.  
  63.     radio.powerDown();                              // Power down radio to save battery (DHT22 automatically enters low-power mode when done with reading)
  64.     system_sleep();                                 // enter sleep mode
  65.   }
  66. }
  67.  
  68. // set system into the sleep state
  69. // system wakes up when wtchdog is timed out
  70. void system_sleep() {
  71.   cbi(ADCSRA,ADEN);                                 // switch Analog to Digitalconverter OFF
  72.    
  73.   set_sleep_mode(SLEEP_MODE_PWR_DOWN);              // sleep mode is set here
  74.   sleep_enable();
  75.    
  76.   sleep_mode();                                     // System sleeps here
  77.    
  78.   sleep_disable();                                  // System continues execution here when watchdog timed out
  79.   sbi(ADCSRA,ADEN);                                 // switch Analog to Digitalconverter ON
  80. }
  81.  
  82. void setup_watchdog(int ii) {
  83.  
  84.   byte bb;
  85.   int ww;
  86.   if (ii > 9 ) ii=9;
  87.   bb=ii & 7;
  88.   if (ii > 7) bb|= (1<<5);
  89.   bb|= (1<<WDCE);
  90.   ww=bb;
  91.    
  92.   MCUSR &= ~(1<<WDRF);                              // Clear the reset flag
  93.   WDTCR |= (1<<WDCE) | (1<<WDE);                    // Start timed sequence
  94.   // set new watchdog timeout value
  95.   WDTCR = bb;
  96.   WDTCR |= _BV(WDIE);
  97.   }
  98.    
  99.   // Watchdog Interrupt Service / is executed when watchdog timed out
  100.   ISR(WDT_vect) {
  101.   f_wdt=1;  // set global flag
  102. }
Advertisement
Add Comment
Please, Sign In to add comment