diff --git a/sensor433/sensor.fzz b/sensor433/sensor.fzz index 5bd38ca..0b83c4b 100644 Binary files a/sensor433/sensor.fzz and b/sensor433/sensor.fzz differ diff --git a/sensor433/sensor_Steckplatine.png b/sensor433/sensor_Steckplatine.png index cf0c6d6..f48513d 100644 Binary files a/sensor433/sensor_Steckplatine.png and b/sensor433/sensor_Steckplatine.png differ diff --git a/sensor433/src/main.cpp b/sensor433/src/main.cpp index 9591f17..ede8810 100644 --- a/sensor433/src/main.cpp +++ b/sensor433/src/main.cpp @@ -7,9 +7,8 @@ https://git.cryhost.de/crycode/attiny85-radiohead-dht22-weather-sensor/-/tree/master */ - -// pin with the LED connected -#define LED_PIN 4 +// pin with the transistor base (And LED) is connected +#define TRANSISTOR_BASE_PIN 4 // blink time for the LED #define LED_TIME 200 @@ -33,10 +32,12 @@ */ #define WATCHDOG_WAKEUP 9 +// Sleep this many again before waging up. Sleep time in s = WATCHDOG_WAKEUP s * WATCHDOG_SLEEP_FURTHER, e.g. 8*8s = 64s +#define WATCHDOG_SLEEP_FURTHER 8 // pins for the radio hardware -#define RH_RX_PIN 6 // not used, set to a non-existent pin -#define RH_TX_PIN 3 +#define RH_RX_PIN 6 // not used, set to a non-existent pin +#define RH_TX_PIN 3 // Transmit Pin #define RH_PTT_PIN 6 // not used, set to a non-existent pin #include @@ -53,14 +54,13 @@ #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) #endif - // DHT22 lib // not using the current adafruit dht library, because it's too memory intensive #include "dht22.h" dht22 dht; #define RH_BUF_LEN 5 -uint8_t rh_buf[RH_BUF_LEN] = { 0x00, 0x00, 0x00, 0x00, 0x00 }; +uint8_t rh_buf[RH_BUF_LEN] = {0x00, 0x00, 0x00, 0x00, 0x00}; // reduce the RadioHead max message length to save memory #define RH_ASK_MAX_MESSAGE_LEN RH_BUF_LEN @@ -68,7 +68,6 @@ uint8_t rh_buf[RH_BUF_LEN] = { 0x00, 0x00, 0x00, 0x00, 0x00 }; // RadioHead #include - // Message Headers: #define MSG_START 0x00 #define MSG_TEMP 0x01 @@ -77,7 +76,6 @@ uint8_t rh_buf[RH_BUF_LEN] = { 0x00, 0x00, 0x00, 0x00, 0x00 }; #define MSG_SOIL 0x04 #define MSG_ERR 0xee - RH_ASK rh_driver(RH_SPEED, RH_RX_PIN, RH_TX_PIN, RH_PTT_PIN); // watchdog flag @@ -86,7 +84,6 @@ volatile boolean f_wdt = 1; // temp / humid toggle volatile uint8_t counter = 0; - // prototypes: void gotoSleep(void); @@ -98,94 +95,120 @@ void setup_watchdog(int ii); void system_sleep(); -void setup() { +void blink(uint8_t num); + +void setup() +{ // setup the LED pin - pinMode(LED_PIN, OUTPUT); + pinMode(TRANSISTOR_BASE_PIN, OUTPUT); pinMode(SOIL_PIN, INPUT); // init the DHT22 dht_init(&dht, DHT_PIN); - uint8_t num_blink = 3; - if (!rh_driver.init()) { + if (!rh_driver.init()) + { num_blink = 5; } - // blink 3 times - for (uint8_t i = 0; i < num_blink; i++) { - digitalWrite(LED_PIN, HIGH); - _delay_ms(LED_TIME); - digitalWrite(LED_PIN, LOW); - _delay_ms(LED_TIME); - } + blink(num_blink); // send start message rh_buf[0] = MSG_START; rh_send(1); setup_watchdog(WATCHDOG_WAKEUP); - } // main loop -void loop() { +void loop() +{ - if (f_wdt) { + if (f_wdt) + { f_wdt = 0; - // turn on the LED - digitalWrite(LED_PIN, HIGH); + // turn on the LED and the transistor: + digitalWrite(TRANSISTOR_BASE_PIN, HIGH); // temperature and humidity - float t = 0;//float is 32bit = 4 byte + float t = 0; //float is 32bit = 4 byte float h = 0; int soil = 0; long battery = 0; - if (counter % 4 == 0) { - rh_buf[0] = MSG_BAT; - battery = getVcc(); - memcpy(&rh_buf[1], &battery, 4); - rh_send(RH_BUF_LEN); - }else if (dht_read_data(&dht, &t, &h) == 1) { - if (counter % 3 == 0) { + // wait for everything the transistor switched on: + delay(25); + + if (counter % 4 == 0) + { + rh_buf[0] = MSG_BAT; + battery = getVcc(); + memcpy(&rh_buf[1], &battery, 4); + rh_send(RH_BUF_LEN); + } + else if (dht_read_data(&dht, &t, &h) == 1) + { + if (counter % 3 == 0) + { rh_buf[0] = MSG_TEMP; memcpy(&rh_buf[1], &t, 4); - } else if (counter % 3 == 1) { + } + else if (counter % 3 == 1) + { rh_buf[0] = MSG_HUMID; memcpy(&rh_buf[1], &h, 4); - } else if (counter % 3 == 2) { + } + else if (counter % 3 == 2) + { rh_buf[0] = MSG_SOIL; soil = analogRead(SOIL_PIN); memcpy(&rh_buf[1], &soil, 2); } - rh_send(RH_BUF_LEN); - } else { + rh_send(RH_BUF_LEN); + } + else + { // error message + blink(4); + digitalWrite(TRANSISTOR_BASE_PIN, HIGH); + delay(5); rh_buf[0] = MSG_ERR; rh_send(1); - } counter++; - // turn off the LED - digitalWrite(LED_PIN, LOW); - system_sleep(); + // turn off the LED and transistor: + digitalWrite(TRANSISTOR_BASE_PIN, LOW); + // deep sleep + for (uint8_t i = 0; i < WATCHDOG_SLEEP_FURTHER; i++) + { + system_sleep(); + } } - } +void blink(uint8_t num) +{ + // blink n times + for (uint8_t i = 0; i < num; i++) + { + digitalWrite(TRANSISTOR_BASE_PIN, HIGH); + _delay_ms(LED_TIME); + digitalWrite(TRANSISTOR_BASE_PIN, LOW); + _delay_ms(LED_TIME); + } +} // function to send RadioHead messages from the buffer -void rh_send(uint8_t len) { +void rh_send(uint8_t len) +{ rh_driver.send((uint8_t *)rh_buf, len); rh_driver.waitPacketSent(); } - - ISR(WDT_vect) { f_wdt = 1; // set global flag @@ -194,28 +217,29 @@ ISR(WDT_vect) /* set system into the sleep state system wakes up when watchdog is timed out */ -void system_sleep() { - //cbi(ADCSRA, ADEN); // switch Analog to Digitalconverter OFF - +void system_sleep() +{ set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here sleep_enable(); - sleep_mode(); // System sleeps here + sleep_mode(); // System sleeps here - sleep_disable(); // System continues execution here when watchdog timed out - //sbi(ADCSRA, ADEN); // switch Analog to Digitalconverter ON + sleep_disable(); // System continues execution here when watchdog timed out } /* 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec */ -void setup_watchdog(int ii) { +void setup_watchdog(int ii) +{ byte bb; int ww; - if (ii > 9 ) ii = 9; + if (ii > 9) + ii = 9; bb = ii & 7; - if (ii > 7) bb |= (1 << 5); + if (ii > 7) + bb |= (1 << 5); bb |= (1 << WDCE); ww = bb; @@ -227,31 +251,33 @@ void setup_watchdog(int ii) { WDTCR |= _BV(WDIE); } - /** From https://github.com/cano64/ArduinoSystemStatus/blob/master/SystemStatus.cpp */ -int getVcc() { - //reads internal 1V1 reference against VCC - #if defined(__AVR_ATtiny84__) || defined(__AVR_ATtiny44__) - ADMUX = _BV(MUX5) | _BV(MUX0); // For ATtiny84 - #elif defined(__AVR_ATtiny85__) || defined(__AVR_ATtiny45__) - ADMUX = _BV(MUX3) | _BV(MUX2); // For ATtiny85/45 - #elif defined(__AVR_ATmega1284P__) - ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); // For ATmega1284 - #else - ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); // For ATmega328 - #endif - delay(2); // Wait for Vref to settle +int getVcc() +{ + //reads internal 1V1 reference against VCC +#if defined(__AVR_ATtiny84__) || defined(__AVR_ATtiny44__) + ADMUX = _BV(MUX5) | _BV(MUX0); // For ATtiny84 +#elif defined(__AVR_ATtiny85__) || defined(__AVR_ATtiny45__) + ADMUX = _BV(MUX3) | _BV(MUX2); // For ATtiny85/45 +#elif defined(__AVR_ATmega1284P__) + ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); // For ATmega1284 +#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)); + while (bit_is_set(ADCSRA, ADSC)) + ; uint8_t low = ADCL; unsigned int val = (ADCH << 8) | low; //discard previous result ADCSRA |= _BV(ADSC); // Convert - while (bit_is_set(ADCSRA, ADSC)); + while (bit_is_set(ADCSRA, ADSC)) + ; low = ADCL; val = (ADCH << 8) | low; - - return ((long)1024 * 1100) / val; + + return ((long)1024 * 1100) / val; }