mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-10-03 18:09:02 -04:00
156 lines
2.4 KiB
C++
156 lines
2.4 KiB
C++
//
|
|
// FILE: rain.cpp
|
|
// AUTHOR: Rob Tillaart
|
|
// VERSION: 0.1.3
|
|
// DATE: 2021-12-03
|
|
// PURPOSE: Arduino library for a rain sensor
|
|
// URL: https://github.com/RobTillaart/RAIN
|
|
// https://www.tinytronics.nl/shop/nl/sensoren/vloeistof/regensensor
|
|
|
|
|
|
#include "rain.h"
|
|
|
|
|
|
RAIN::RAIN(uint8_t analogPort, uint8_t powerPin)
|
|
{
|
|
_analogPort = analogPort;
|
|
_powerPin = powerPin;
|
|
_maxVoltage = 5;
|
|
_maxSteps = 1023;
|
|
_dryRefVoltage = _maxVoltage;
|
|
}
|
|
|
|
|
|
bool RAIN::begin(float maxVoltage, uint16_t maxSteps)
|
|
{
|
|
_maxVoltage = maxVoltage;
|
|
_maxSteps = maxSteps;
|
|
_mVstep = _maxVoltage / _maxSteps;
|
|
_dryRefVoltage = _maxVoltage;
|
|
|
|
if (_powerPin != 255)
|
|
{
|
|
pinMode(_powerPin, OUTPUT);
|
|
powerOn();
|
|
}
|
|
read();
|
|
return true;
|
|
}
|
|
|
|
|
|
float RAIN::raw(uint8_t times)
|
|
{
|
|
if (times == 0) times = 1;
|
|
float sum = 0;
|
|
|
|
powerOn();
|
|
for (int i = 0; i < times; i++)
|
|
{
|
|
sum += analogRead(_analogPort);
|
|
}
|
|
powerOff();
|
|
|
|
if (times > 1) sum /= times;
|
|
return sum;
|
|
}
|
|
|
|
|
|
float RAIN::read(uint8_t times)
|
|
{
|
|
_previous = _voltage;
|
|
_voltage = raw(times) * _mVstep;
|
|
return _voltage;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
//
|
|
// ANALYSIS
|
|
//
|
|
void RAIN::setDryReference(float dryRef)
|
|
{
|
|
_dryRefVoltage = dryRef;
|
|
}
|
|
|
|
|
|
float RAIN::getDryReference()
|
|
{
|
|
return _dryRefVoltage;
|
|
}
|
|
|
|
|
|
float RAIN::percentage()
|
|
{
|
|
float perc = 100.0 - (_voltage * 100.0 / _dryRefVoltage);
|
|
if (perc < 0) perc = 0;
|
|
return perc;
|
|
}
|
|
|
|
|
|
float RAIN::delta()
|
|
{
|
|
return _voltage - _previous;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
//
|
|
// LEVEL
|
|
//
|
|
bool RAIN::setLevel(uint8_t nr, uint16_t milliVolts)
|
|
{
|
|
if (nr == 0) return false;
|
|
if (nr > 4) return false;
|
|
_level[nr] = milliVolts;
|
|
return true;
|
|
}
|
|
|
|
|
|
uint8_t RAIN::getLevel()
|
|
{
|
|
uint16_t value = _voltage * 1000;
|
|
for (int index = 4; index > 0; index--)
|
|
{
|
|
if (value >= _level[index]) return index;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
//
|
|
// POWER
|
|
//
|
|
void RAIN::powerOn()
|
|
{
|
|
if (_powerPin != 255)
|
|
{
|
|
digitalWrite(_powerPin, HIGH);
|
|
delayMicroseconds(_powerDelay); // time to stabilize, adjust if needed.
|
|
}
|
|
}
|
|
|
|
|
|
void RAIN::powerOff()
|
|
{
|
|
if (_powerPin != 255)
|
|
{
|
|
digitalWrite(_powerPin, LOW);
|
|
}
|
|
}
|
|
|
|
void RAIN::setPowerDelay(uint8_t powerDelay)
|
|
{
|
|
_powerDelay = powerDelay;
|
|
}
|
|
|
|
|
|
uint8_t RAIN::getPowerDelay()
|
|
{
|
|
return _powerDelay;
|
|
}
|
|
|
|
|
|
// -- END OF FILE --
|
|
|