lthomasaMarcel Idaewor
Published

Group 18 Fall 2023

Intelligent automatic sprinkler system monitors rainfall and ground moisture levels to prevent over watering or watering when it is raining.

AdvancedShowcase (no instructions)82
Group 18 Fall 2023

Things used in this project

Hardware components

Photon 2
Particle Photon 2
×2
Ceramic Capacitive Rain Sensor
Telecontrolli Ceramic Capacitive Rain Sensor
×1
Gravity: Analog Soil Moisture Sensor For Arduino
DFRobot Gravity: Analog Soil Moisture Sensor For Arduino
×1
Jumper wires (generic)
Jumper wires (generic)
×1
Grove - Relay
Seeed Studio Grove - Relay
×1
Voltage Regulator Module
Digilent Voltage Regulator Module
×1
60W PCIe 12V 5A Power Supply
Digilent 60W PCIe 12V 5A Power Supply
×1
Li-Ion Battery 1000mAh
Li-Ion Battery 1000mAh
×1
5v Solar Panel
×1
Micro USB cable
TinyCircuits Micro USB cable
×1
Motorized 1 Inch 12v Ball Vavle
×1

Software apps and online services

Particle Build Web IDE
Particle Build Web IDE

Hand tools and fabrication machines

Soldering iron (generic)
Soldering iron (generic)
Solder Wire, Lead Free
Solder Wire, Lead Free
Wire Stripper & Cutter, 18-10 AWG / 0.75-4mm² Capacity Wires
Wire Stripper & Cutter, 18-10 AWG / 0.75-4mm² Capacity Wires

Story

Read more

Schematics

Sensor Package Schematics

Wiring diagram from the Photon 2 to the Sensors and LEDs

Valve Control Schematics

Wiring diagram for the Photon 2 controlling the watering valve.

Code

Sensor Package Code

Arduino
Code to run the soil moisture sensor and the rainfall sensor. Control for LED indication of what the sensors are reading. Publish and subscribe to output sensor readings to the valve control package to determine if the regular watering schedule should be postponed due to wet soil or rainfall.
// Constants
//Rain
int rainSensor = A2;
int blueRainLED = D2;
int redRainLED = D3;
//Soil
int soilSensor = A1;
int greenSoilLED = D4;
int yellowSoilLED = D5;
int redSoilLED = D6;
// rainSensor adjust the threshold value
int rainThresholdValue = 4000;

// Sensor 
int defaultSensorWait = 1000 * 5;

// status
bool isWaterValveOpened = false;

void setup(){
  Serial.begin(9600); // Set the serial monitor baudrate to 9600
  pinMode(rainSensor, INPUT);
  pinMode(blueRainLED, OUTPUT);
  pinMode(redRainLED, OUTPUT);
  pinMode(greenSoilLED, OUTPUT);
  pinMode(yellowSoilLED, OUTPUT);
  pinMode(redSoilLED, OUTPUT);
  digitalWrite(blueRainLED, 0);
  digitalWrite(redRainLED, 0);
  digitalWrite(greenSoilLED, 0);
  digitalWrite(yellowSoilLED, 0);
  digitalWrite(redSoilLED, 0);
  
  Particle.subscribe("WaterValveStatus", valveEventHandler);
}

void loop() {
    if (isWaterValveOpened == true) {
        delay(defaultSensorWait);
    }
    // Subscription coding
    
  //  if(read subscribe) says its raining;
  //      digitalWrite(blueRainLED, 0);
  //      digitalWrite(redRainLED, 0);
  //      digitalWrite(greenSoilLED, 0);
  //      digitalWrite(yellowSoilLED, 0);
  //      digitalWrite(redSoilLED, 0);
        
  //      ***3V3Pin OFF
  //      delay(how ever long a watering cycle is + 12 hours)
 //   else{
    
    
  // Read the input on analog pin A0:
    // Read the input on analog pin A1:
  int rainSensorValue = analogRead(rainSensor);
  int soilSensorValue = analogRead(soilSensor);
  Serial.print(rainSensorValue);
  if(rainSensorValue < rainThresholdValue){
    // If sensorValue < rainThresholdValue then it is raining
    // Send a publish to the cloud and turn the blueLED on
    // Send a publish to your devices
    Particle.publish("RainStatus","RainDetected");
        Particle.publish("WateringStatus","WateringStopped");
    Serial.println("Rain Sensor Value:");
    Serial.println(rainSensorValue);
    digitalWrite(blueRainLED, 1);
    digitalWrite(redRainLED, 0);
  }
  
  else {
    // Send a publish to the cloud and turn the redLED on
    // Send a publish to your devices
    //Particle.publish("RainStatus","NoRainDetected");
    Serial.println("Rain Sensor Value:");
        Particle.publish("WateringStatus","WateringNormal");

    Serial.println(rainSensorValue);
    digitalWrite(blueRainLED, 0);
    digitalWrite(redRainLED, 1);
  }
  
    //SOILSTARTSOILSTARTSOILSTART
    
    Serial.print(soilSensorValue);
    if(soilSensorValue >= 1000) {
 //   Serial.println("Sensor is DISCONNECTED");
//            Particle.publish("WateringStatus","WateringNormal");

    //Particle.publish("SoilStatus","SensorDisconnected");
        digitalWrite(greenSoilLED, 1);
        digitalWrite(yellowSoilLED, 1);
        digitalWrite(redSoilLED, 1);
        delay(1000);
        digitalWrite(greenSoilLED, 0);
        digitalWrite(yellowSoilLED, 0);
        digitalWrite(redSoilLED, 0);
        delay(1000);
        digitalWrite(greenSoilLED, 1);
        digitalWrite(yellowSoilLED, 1);
        digitalWrite(redSoilLED, 1);
        delay(1000);
        digitalWrite(greenSoilLED, 0);
        digitalWrite(yellowSoilLED, 0);
        digitalWrite(redSoilLED, 0);
        delay(1000);
        digitalWrite(greenSoilLED, 1);
        digitalWrite(yellowSoilLED, 1);
        digitalWrite(redSoilLED, 1);
    }
    
    if(soilSensorValue < 1000 && soilSensorValue >= 600) { 
    Serial.println("Soil is DRY");
   // Particle.publish("SoilStatus","SoilDry");
  //  Particle.publish("WateringStatus","WateringNormal");

    digitalWrite(greenSoilLED, 0);
    digitalWrite(yellowSoilLED, 0);
    digitalWrite(redSoilLED, 1);
    }
    
    if(soilSensorValue < 850 && soilSensorValue >= 370) {
    Serial.println("Soil is HUMID"); 
    //Particle.publish("SoilStatus","SoilHumid");
    digitalWrite(greenSoilLED, 0);
    digitalWrite(yellowSoilLED, 1);
    digitalWrite(redSoilLED, 0);
    }
    
    if(soilSensorValue < 800) {
    Serial.println("Soil is WET");
    Particle.publish("SoilStatus","SoilWet");
    Particle.publish("WateringStatus","WateringStopped");
    digitalWrite(greenSoilLED, 1);
    digitalWrite(yellowSoilLED, 0);
    digitalWrite(redSoilLED, 0);
  }                                          
  
  delay(2000);
}
//}

void valveEventHandler(const char *event, const char *data) {
    //char* c;
    if (strcmp(data, "ValveOpened") == 0)   {
        // Event msg equals to ValveOpened
        isWaterValveOpened = true;
        //c = "0";
    } else {
        // Event msg is not equals to ValveOpen
        isWaterValveOpened = false;
        //c = "1";
    }
    
    // For troubleshooting
    // Particle.publish("Sensor::ValveEventHandler", c);
    Particle.publish("Sensor::ValveEventHandler - isWaterValveOpened", isWaterValveOpened ? "true" : "false");
}

//ENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDEND

Valve Control Code

Arduino
Code for the control of the watering valve. The base logic is a regular watering cycle adjustable by modifying the delay values. The code also reads the outputs from the sensor package and will delay given a positive input of either wet soil or rainfall being detected.
//Rain
int powerSupplyOpen = D1;
int powerSupplyClosed = D2;


// WaterSensor
bool isWatering = true;

void setup(){
  Serial.begin(9600); // Set the serial monitor baudrate to 9600
  pinMode(powerSupplyOpen, OUTPUT);
    pinMode(powerSupplyClosed, OUTPUT);

  digitalWrite(powerSupplyOpen, 0);
    digitalWrite(powerSupplyClosed, 1);

  Particle.subscribe("WateringStatus", waterSensorEventHandler);
}

void loop() {
    if (isWatering == true) {
        // Open valve
        digitalWrite(powerSupplyOpen, 1);
            digitalWrite(powerSupplyClosed, 0);

        Particle.publish("WaterValveStatus","ValveOpened");
        
        delay(15000);
        
        // Close Valve
        digitalWrite(powerSupplyOpen, 0);
            digitalWrite(powerSupplyClosed, 1);
            
        delay(10000);

        Particle.publish("WaterValveStatus","ValveClosed");
        
        // Daily cycle
        //     Delay for 24 hours minus the previous watering time
        //delay((1000 * 60 * 60 * 24) - (1000 * 60 * 30));
        delay(15000);
    } else {
        //Delay one day due to rain or soil moisture
        delay(15000);
        //delay(1000 * 60 * 60 * 24);
    }
}
    
void waterSensorEventHandler(const char *event, const char *data) {
    //char* c;
    if (strcmp(data, "WateringStopped") == 0)   {
        // Event msg equals to WateringStopped
        isWatering = false;
        //c = "0";
    } else {
        // Event msg is not equals to WateringStopped
        isWatering = true;
        //c = "1";
    }
    
    // For troubleshooting
    // Particle.publish("Sensor::waterSensorEventHandler", c);
    Particle.publish("Sensor::waterSensorEventHandler - isWatering", isWatering ? "true" : "false");
}

Credits

lthomasa

lthomasa

1 project • 0 followers
Marcel Idaewor

Marcel Idaewor

1 project • 0 followers
Thanks to Logan ThomasArrigo and Marcel Idaewor.

Comments