// // FILE: AnalogUVSensor.h // AUTHOR: Rob Tillaart // VERSION: 0.1.5 // DATE: 2021-09-25 // PURPOSE: Arduino library for an analogue UV sensor. // URL: https://github.com/RobTillaart/AnalogUVSensor #include "AnalogUVSensor.h" AnalogUVSensor::AnalogUVSensor() { // defaults from UNO. _analogPin = 14; // A0 for UNO _volts = 5; _maxADC = 1023; _powerPin = -1; _invert = false; } void AnalogUVSensor::begin(uint8_t analogPin, float volts, uint16_t maxADC) { _analogPin = analogPin; _volts = volts; _maxADC = maxADC; } float AnalogUVSensor::read(uint8_t times) { uint32_t sum = 0; if (times == 0) times = 1; for (int i = 0; i < times; i++) { sum += analogRead(_analogPin); } uint16_t milliVolt = sum * (_volts * 1000.0) / (times * _maxADC); return mV2index(milliVolt); } float AnalogUVSensor::mV2index(uint16_t milliVolt) { if (milliVolt < 50) { return 0.0; } // linear interpolation between 0..1 if (milliVolt < 227) { return 0.0 + (1.0 * milliVolt - 50.0) / (227.0 - 50.0); } // linear interpolation between 1..11 // formula derived with spreadsheet. if (milliVolt < 1200) { return 0.0104865310 * milliVolt - 1.289154988; } return 12; } char AnalogUVSensor::index2color(float index) { if (index <= 2) return 'G'; if (index <= 5) return 'Y'; if (index <= 7) return 'O'; if (index <= 10) return 'R'; return 'P'; } void AnalogUVSensor::setPowerPin(uint8_t powerPin, bool invert) { _invert = invert; _powerPin = powerPin; pinMode(_powerPin, OUTPUT); switchOn(); } void AnalogUVSensor::switchOff() { digitalWrite(_powerPin, _invert ? HIGH : LOW); } void AnalogUVSensor::switchOn() { digitalWrite(_powerPin, _invert ? LOW : HIGH); } // -- END OF FILE --