Fork of the espurna firmware for `mhsw` switches
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

80 lines
2.3 KiB

// -----------------------------------------------------------------------------
// SI1145 Sensor over I2C
// Copyright (C) 2020 by @HilverinkJ (https://github.com/HilverinkJ)
// Based on https://github.com/xoseperez/espurna/issues/2192#issuecomment-603430308
// -----------------------------------------------------------------------------
#if SENSOR_SUPPORT && SI1145_SUPPORT
#pragma once
#include <Arduino.h>
#include <Adafruit_SI1145.h>
#include "I2CSensor.h"
class SI1145Sensor : public I2CSensor<> {
public:
SI1145Sensor() {
_count = 1;
_sensor_id = SENSOR_SI1145_ID;
_si1145 = new Adafruit_SI1145();
}
void begin() {
static unsigned char addresses[1] = { SI1145_ADDRESS };
_address = _begin_i2c(_address, sizeof(addresses), addresses);
if (_address == 0) return;
if (!_si1145->begin()) {
_ready = false;
return;
}
// Adafruit library never sets any errors
_error = SENSOR_ERROR_OK;
_ready = true;
}
// ---------------------------------------------------------------------
// Sensor API
// ---------------------------------------------------------------------
// Descriptive name of the sensor
String description() {
char buffer[25];
snprintf(buffer, sizeof(buffer), "SI1145 @ I2C (0x%02X)", _address);
return String(buffer);
}
// Descriptive name of the slot # index
String description(unsigned char index) {
return description();
};
// Type for slot # index
unsigned char type(unsigned char index) {
if (index == 0) return MAGNITUDE_UVI;
return MAGNITUDE_NONE;
}
// Pre-read hook (usually to populate registers with up-to-date data)
void pre() {
_uvi = _si1145->readUV() / 100.0;
}
// Current value for slot # index
double value(unsigned char index) {
if (index == 0) return _uvi;
return 0.0;
}
protected:
Adafruit_SI1145 * _si1145 = nullptr;
double _uvi = 0.0;
};
#endif // SENSOR_SUPPORT && SI1145_SUPPORT