battery sensor

This commit is contained in:
Stefan Ostermann 2021-04-04 18:42:39 +02:00
parent 34d33d05f0
commit c685867d51
2 changed files with 50 additions and 17 deletions

View File

@ -14,12 +14,12 @@ RH_ASK driver(RH_SPEED, RH_RX_PIN);
float t = 0; float t = 0;
float h = 0; float h = 0;
uint8_t bat_percent = 0; long bat = 0;
uint8_t bat_raw = 0;
#define MSG_START 0x00 #define MSG_START 0x00
#define MSG_TEMP 0x01 #define MSG_TEMP 0x01
#define MSG_HUMID 0x02 #define MSG_HUMID 0x02
#define MSG_BAT 0x03
#define MSG_ERR 0xee #define MSG_ERR 0xee
void setup() { void setup() {
@ -55,6 +55,13 @@ void loop() {
Serial.print(t); Serial.print(t);
Serial.print("%"); Serial.print("%");
break; break;
case MSG_BAT:
// battery data
Serial.println("0x03 Battery");
memcpy(&bat, &rh_buf[1], 4);
Serial.print(bat);
Serial.print("mV");
break;
case MSG_ERR: case MSG_ERR:
// error // error
Serial.println("0xEE error"); Serial.println("0xEE error");

View File

@ -2,7 +2,7 @@
RadioHead attiny85 DHT22 Weather Station RadioHead attiny85 DHT22 Weather Station
2021 Stefan Ostermann based on several source from the internetz. 2021 Stefan Ostermann based on several source from the internetz.
Sources: Sources:
https://git.cryhost.de/crycode/attiny85-radiohead-dht22-weather-sensor/-/tree/master https://git.cryhost.de/crycode/attiny85-radiohead-dht22-weather-sensor/-/tree/master
*/ */
@ -63,6 +63,7 @@ uint8_t rh_buf[RH_BUF_LEN] = { 0x00, 0x00, 0x00, 0x00, 0x00 };
#define MSG_START 0x00 #define MSG_START 0x00
#define MSG_TEMP 0x01 #define MSG_TEMP 0x01
#define MSG_HUMID 0x02 #define MSG_HUMID 0x02
#define MSG_BAT 0x03
#define MSG_ERR 0xee #define MSG_ERR 0xee
@ -72,11 +73,13 @@ RH_ASK rh_driver(RH_SPEED, RH_RX_PIN, RH_TX_PIN, RH_PTT_PIN);
volatile boolean f_wdt = 1; volatile boolean f_wdt = 1;
// temp / humid toggle // temp / humid toggle
volatile boolean toggle = 0; volatile uint8_t counter = 0;
void gotoSleep(void); void gotoSleep(void);
int getVcc();
void setup() { void setup() {
// setup the LED pin // setup the LED pin
pinMode(LED_PIN, OUTPUT); pinMode(LED_PIN, OUTPUT);
@ -118,28 +121,29 @@ void loop() {
// temperature and humidity // temperature and humidity
float t = 0;//float is 32bit = 1byte float t = 0;//float is 32bit = 1byte
float h = 0; float h = 0;
long battery = 0;
// read from the sensor and check if it was successfull if (counter % 4 == 0) {
if (dht_read_data(&dht, &t, &h) == 1) { rh_buf[0] = MSG_BAT;
// normal message battery = getVcc();
memcpy(&rh_buf[1], &battery, 4);
if (toggle) { rh_send(RH_BUF_LEN);
}else if (dht_read_data(&dht, &t, &h) == 1) {
if (counter % 2 == 0) {
rh_buf[0] = MSG_TEMP; rh_buf[0] = MSG_TEMP;
memcpy(&rh_buf[1], &t, 4); memcpy(&rh_buf[1], &t, 4);
} else { } else if (counter % 2 == 1) {
rh_buf[0] = MSG_HUMID; rh_buf[0] = MSG_HUMID;
memcpy(&rh_buf[1],&h,4); memcpy(&rh_buf[1], &h, 4);
} }
toggle = !toggle; rh_send(RH_BUF_LEN);
rh_send(RH_BUF_LEN);
} else { } else {
// error message // error message
rh_buf[0] = MSG_ERR; rh_buf[0] = MSG_ERR;
rh_send(1); rh_send(1);
} }
counter++;
// turn off the LED // turn off the LED
digitalWrite(LED_PIN, LOW); digitalWrite(LED_PIN, LOW);
@ -167,7 +171,7 @@ ISR(WDT_vect)
system wakes up when watchdog is timed out system wakes up when watchdog is timed out
*/ */
void system_sleep() { void system_sleep() {
cbi(ADCSRA, ADEN); // switch Analog to Digitalconverter OFF //cbi(ADCSRA, ADEN); // switch Analog to Digitalconverter OFF
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here
sleep_enable(); sleep_enable();
@ -175,7 +179,7 @@ void system_sleep() {
sleep_mode(); // System sleeps here sleep_mode(); // System sleeps here
sleep_disable(); // System continues execution here when watchdog timed out sleep_disable(); // System continues execution here when watchdog timed out
sbi(ADCSRA, ADEN); // switch Analog to Digitalconverter ON //sbi(ADCSRA, ADEN); // switch Analog to Digitalconverter ON
} }
/* 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms /* 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms
@ -198,3 +202,25 @@ void setup_watchdog(int ii) {
WDTCR = bb; WDTCR = bb;
WDTCR |= _BV(WDIE); WDTCR |= _BV(WDIE);
} }
/**
From https://github.com/cano64/ArduinoSystemStatus/blob/master/SystemStatus.cpp
*/
int getVcc() {
//reads internal 1V1 reference against VCC
ADMUX = _BV(MUX3) | _BV(MUX2); // For ATtiny85/45
_delay_ms(5);; // Wait for Vref to settle
ADCSRA |= _BV(ADSC); // Convert
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));
low = ADCL;
val = (ADCH << 8) | low;
return ((long)1024 * 1100) / val;
}