Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Wire.h>
- #include <LiquidCrystal_I2C.h>
- #include <virtuabotixRTC.h>
- #define BUTTON_PIN A1
- #define delayBetweenMessages 1000 // millis
- #define PONETIOMETER_PIN A0
- #define _3_HOURS 3600000 // millis
- #define DIVIER_FROM_ANALOG_TO_PERCENT 10.23
- #define WINTER_DECREASE_COEFF 1.5
- #define FEBRUARY 1
- #define JANUARY 0
- #define DECEMBER 11
- virtuabotixRTC RTC(/*CLK*/ 8,
- /*DAT*/ 9,
- /*RESET*/ 10);
- LiquidCrystal_I2C lcd(0x27,
- /*columns*/ 16,
- /*rows*/ 2);
- bool ItsMorningNow(){
- return 5 <= RTC.hours && RTC.hours <= 13;
- };
- bool ItsWinterNow(){
- return RTC.month == FEBRUARY || RTC.month == JANUARY || RTC.month == DECEMBER;
- };
- class SoilMoistureSensor{
- private:
- byte port;
- public:
- SoilMoistureSensor(const byte port):port(port){};
- byte getMoisture()const { return analogRead(port) / DIVIER_FROM_ANALOG_TO_PERCENT;}
- };
- class Pump{
- private:
- byte pin;
- public:
- Pump(const byte pin):pin(pin){pinMode(pin,OUTPUT);};
- void pumpLiquid(const word delayMillis){
- digitalWrite(pin,HIGH);
- delay(delayMillis);
- digitalWrite(pin,LOW);
- };
- };
- class Pot{
- private:
- SoilMoistureSensor itsSoilMoistureSensor;
- Pump itsPump;
- byte currMoisture;
- byte requiredMoisture;
- static constexpr float deviationFromRequredMoistureCoeff = 0.2;
- byte calcMinSatisfactoryMoisture()const {
- float currDeviationFromRequredMoistureCoeff = deviationFromRequredMoistureCoeff;
- RTC.updateTime();
- if(ItsWinterNow()){
- currDeviationFromRequredMoistureCoeff = deviationFromRequredMoistureCoeff * WINTER_DECREASE_COEFF;
- }
- return requiredMoisture*(1 - currDeviationFromRequredMoistureCoeff);};
- public:
- Pot(const byte requiredMoisture,
- const byte soilMoistureSensorPin,
- const byte pumpPin)
- : requiredMoisture(requiredMoisture),
- itsSoilMoistureSensor(soilMoistureSensorPin),
- itsPump(pumpPin){};
- void setRequiredMoisture(const byte moisture){requiredMoisture = moisture;};
- bool needsWatering()const{ return currMoisture < calcMinSatisfactoryMoisture();};
- byte determineMoisture(){
- currMoisture = itsSoilMoistureSensor.getMoisture();
- return currMoisture;
- };
- void raiseMoistureToRequiredLevel(){
- byte currRequiredMoisture = calcMinSatisfactoryMoisture();
- while(currMoisture < currRequiredMoisture){
- itsPump.pumpLiquid(5000);
- delay(1000);
- Serial.print(determineMoisture());
- }
- };
- };
- Pot pot(/* required moisture level (in %) */50,
- /*soil moisture sensor pin*/ 0xA0,
- /*pump pin*/ 7);
- void printMessagesOnLCD(const char* str1, const char* str2, const word theirTimeOnScreen){
- lcd.clear();
- lcd.setCursor(0,0);
- lcd.print(str1);
- lcd.setCursor(0,1);
- lcd.print(str2);
- delay(theirTimeOnScreen);
- lcd.clear();
- }
- void setup()
- {
- Serial.begin(9600);
- lcd.init();
- lcd.backlight();
- RTC.setDS1302Time(00, 52, 14, 5, 18, 4, 2019);
- pinMode(BUTTON_PIN,INPUT);
- while(!digitalRead(BUTTON_PIN)){
- printMessagesOnLCD("What level of", "moisture should", delayBetweenMessages);
- printMessagesOnLCD("be maintained", "in the pot?", delayBetweenMessages);
- printMessagesOnLCD("Press button", "to continue", delayBetweenMessages);
- }
- byte moistureLevel;
- pinMode(PONETIOMETER_PIN, INPUT);
- delay(2000);
- while (!digitalRead(BUTTON_PIN)){
- moistureLevel = analogRead(PONETIOMETER_PIN) / DIVIER_FROM_ANALOG_TO_PERCENT;
- lcd.setCursor(0,0);
- lcd.print(moistureLevel);
- lcd.print(" %");
- delay(1000);
- printMessagesOnLCD("Press button", "to continue", delayBetweenMessages);
- }
- pot.setRequiredMoisture(moistureLevel);
- }
- void loop()
- {
- RTC.updateTime();
- // if(ItsMorningNow()){
- Serial.println(pot.determineMoisture());
- if(pot.needsWatering()){
- pot.raiseMoistureToRequiredLevel();
- }
- //}
- //delay(_3_HOURS);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement