diff --git a/libraries/MySensors/core/MyHwATMega328.cpp b/libraries/MySensors/core/MyHwATMega328.cpp index 9600f7e..49205db 100644 --- a/libraries/MySensors/core/MyHwATMega328.cpp +++ b/libraries/MySensors/core/MyHwATMega328.cpp @@ -91,7 +91,7 @@ void hwInternalSleep(unsigned long ms) { if (!pinIntTrigger && ms >= 125) { hwPowerDown(SLEEP_120MS); ms -= 120; } if (!pinIntTrigger && ms >= 64) { hwPowerDown(SLEEP_60MS); ms -= 60; } if (!pinIntTrigger && ms >= 32) { hwPowerDown(SLEEP_30MS); ms -= 30; } - if (!pinIntTrigger && ms >= 16) { hwPowerDown(SLEEP_15Ms); ms -= 15; } + if (!pinIntTrigger && ms >= 16) { hwPowerDown(SLEEP_15MS); ms -= 15; } } int8_t hwSleep(unsigned long ms) { @@ -132,6 +132,54 @@ int8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mo return retVal; } +uint16_t hwCPUVoltage() { + // Measure Vcc against 1.1V Vref + #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + ADMUX = (_BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1)); + #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) + ADMUX = (_BV(MUX5) | _BV(MUX0)); + #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) + ADMUX = (_BV(MUX3) | _BV(MUX2)); + #else + ADMUX = (_BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1)); + #endif + // Vref settle + delay(70); + // Do conversion + ADCSRA |= _BV(ADSC); + while (bit_is_set(ADCSRA,ADSC)); + // return Vcc in mV + return (1125300UL) / ADC; +} + +uint8_t hwCPUFrequency() { + noInterrupts(); + // setup timer1 + TIFR1 = 0xFF; + TCNT1 = 0; + TCCR1A = 0; + TCCR1C = 0; + // save WDT settings + uint8_t WDTsave = WDTCSR; + wdt_enable(WDTO_500MS); + // enable WDT interrupt mode => first timeout WDIF, 2nd timeout reset + WDTCSR |= (1 << WDIE); + wdt_reset(); + // start timer1 with 1024 prescaling + TCCR1B = _BV(CS12) | _BV(CS10); + // wait until wdt interrupt + while (bit_is_clear(WDTCSR,WDIF)); + // stop timer + TCCR1B = 0; + // restore WDT settings + wdt_reset(); + WDTCSR |= (1 << WDCE) | (1 << WDE); + WDTCSR = WDTsave; + interrupts(); + // return frequency in 1/10MHz (accuracy +- 10%) + return TCNT1 * 2048UL / 100000UL; +} + #ifdef MY_DEBUG diff --git a/libraries/MySensors/core/MyHwATMega328.h b/libraries/MySensors/core/MyHwATMega328.h index c8eabd3..e8a41fa 100644 --- a/libraries/MySensors/core/MyHwATMega328.h +++ b/libraries/MySensors/core/MyHwATMega328.h @@ -79,7 +79,7 @@ do { \ enum period_t { - SLEEP_15Ms, + SLEEP_15MS, SLEEP_30MS, SLEEP_60MS, SLEEP_120MS, diff --git a/libraries/MySensors/core/MyHwESP8266.cpp b/libraries/MySensors/core/MyHwESP8266.cpp index da08eb0..33f615e 100644 --- a/libraries/MySensors/core/MyHwESP8266.cpp +++ b/libraries/MySensors/core/MyHwESP8266.cpp @@ -107,6 +107,18 @@ int8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mo return -2; } +ADC_MODE(ADC_VCC); + +uint16_t hwCPUVoltage() { + // in mV + return ESP.getVcc(); +} + +uint16_t hwCPUFrequency() { + // in 1/10Mhz + return ESP.getCpuFreqMHz()*10; +} + #ifdef MY_DEBUG void hwDebugPrint(const char *fmt, ... ) { char fmtBuffer[300];