#pragma once #include #define ID(value) (value & 0x1F) #define STATE(value) ((value & 0x1) << 5) #define VCC(value) ((value & 0x1FFF) << 6) #define TEMP(value) (((unsigned long)value & 0x1FF) << 19) #define TYPE(value) (((unsigned long)value & 0xF) << 28) //#define ID(value, id) ((value & 0xFFFFFFE0) | id) //#define STATE(value, state) ((value & 0xFFFFFFDF) | state) //#define VCC(value, vcc) ((value & 0xFFF0003F) | vcc) //#define TEMP(value, temp) ((value & 0xF00FFFFF) | temp) //#define TYPE(value, type) ((value & 0x0FFFFFFF) | type) class TinySensor { protected: short id; short senderPin; RCSwitch mySwitch = RCSwitch(); long readVcc() { // Read 1.1V reference against AVcc // set the reference to Vcc and the measurement to the internal 1.1V reference #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 delay(2); // Wait for Vref to settle ADCSRA |= _BV(ADSC); // Start conversion while (bit_is_set(ADCSRA, ADSC)) ; // measuring uint8_t low = ADCL; // must read ADCL first - it then locks ADCH uint8_t high = ADCH; // unlocks both long result = (high << 8) | low; result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000 return result; // Vcc in millivolts } void sendInfo(unsigned long value) { mySwitch.send(value, 32); } public: TinySensor(short id, short senderPin) { this->id = id; this->senderPin = senderPin; } void setup() { mySwitch.enableTransmit(senderPin); mySwitch.setProtocol(2); } };