Robin2:
When the program code is here (in this Forum) I will look at it.
...R
Cheers for the offer.
The whole sketch wouldn't fit in the tags so I have trimmed it to fit leaving in as much as possible. Full sketch can still be viewed on github.
Cheers
Iain
#include <DS3232RTC.h>
#include <Streaming.h>
#include <Wire.h>
#include <avr/sleep.h>
#include <avr/power.h>
#include <RTClib.h>
#include <Time.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
const char *string_table[] =
{
" Sleeping",
" Watering",
" Testing",
" Zone 1 For 30s ",
" Zone 2 For 30s ",
" Zone 3 For 30s ",
" Zone 4 For 30s ",
" Priming pump ",
" Test Mode ",
" Manual Run Mode",
"System Starting",
"YES",
"NO",
"Interrupt",
};
/*Start of User Defined Settings
*/
// Time1-5 are the hours for program to run (Sensors and watering)
int Time1 = 8;
int Time2 = 14;
int Time3 = 0;
int Time4 = 88;
int Time5 = 88;
// TimeMin is the minute on the hour for program to run.
int TimeMin = 30;
// Water levels are soil moisture settings in percent. So if the moisture in the soil reads less than WaterLevel
// then the program wil run.
int WaterLevel_1 = 60;
int WaterLevel_2 = 60;
int WaterLevel_3 = 60;
int WaterLevel_4 = 60;
int WaterLevel_5 = 60;
// Watering run time's in milliseconds so 1000 is 1sec and 30000 is 30sec.
int Delay1 = 10000; // 10seconds
int Delay2 = 20000; // 20seconds
int Delay3 = 30000; // 30seconds
int Delay4 = 60000; // 60seconds
int Delay5 = 3000000; // 5mins - Used For Refilling Resevoir
// ZoneSettings------
/* Only user serviceable settings are
-Zone*Delay = Watering time, Link to Delays above - can be added together using ( brackets) like (Delay2 + Delay3) would give a run
-- time of 50seconds.
-Zone*WaterLevel = Moisture Level you want the zone set to, link to WaterLevels above
*/
int Zone1Solenoid = 50;
int Zone1Sensors[] = {A12, A8};
int Zone1Delay = Delay3;
int Zone1SensorValue;
String Zone1Water;
int Zone1WaterLevel= WaterLevel_1;
int Zone2Solenoid = 48;
int Zone2Sensors[] = {A13, A9};
int Zone2Delay = Delay3;
int Zone2SensorValue;
String Zone2Water;
int Zone2WaterLevel = WaterLevel_1;
int Zone3Solenoid = 44;
int Zone3Sensors[] = {A14, A10};
int Zone3Delay = Delay3;
int Zone3SensorValue;
String Zone3Water;
int Zone3WaterLevel = WaterLevel_1;
int Zone4Solenoid = 46;
int Zone4Sensors[] = {A15, A11};
int Zone4Delay = Delay3;
int Zone4SensorValue;
String Zone4Water;
int Zone4WaterLevel = WaterLevel_1;
// End Of User Settings
int programDelay = 100;
int n = 1;
int solenoid;
String water_info;
int delay_time;
int soil1;
int soil2;
int SensorCount = 2;
int CirculationPump = 5;
int ResevoirPump = 4;
//volatile int buttonstate = HIGH;
#define I2C_ADDR 0x27
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
//int TEST_BUTTON = 19;
//int WATER_BUTTON = 18;
#define DS3231_I2C_ADDRESS 0x68
LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
RTC_DS3231 rtc;
int INTERRUPT_PIN = 22;
volatile int state = LOW;
byte decToBcd(byte val)
{
return( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
return( (val/16*10) + (val%16) );
}
void setup () {
// Set Time (sec,min,hour,day,date,mon,yr)
//setDS3231time(00,22,18,5,21,04,16); // Set time
pinMode(INTERRUPT_PIN, INPUT_PULLUP);
pinMode(CirculationPump, OUTPUT);
pinMode(ResevoirPump, OUTPUT);
pinMode(Zone1Solenoid, OUTPUT);
pinMode(Zone2Solenoid, OUTPUT);
pinMode(Zone3Solenoid, OUTPUT);
pinMode(Zone4Solenoid, OUTPUT);
// pinMode(TEST_BUTTON, INPUT);
// pinMode(WATER_BUTTON, INPUT);
digitalWrite(Zone1Solenoid, HIGH);
digitalWrite(Zone2Solenoid, HIGH);
digitalWrite(Zone3Solenoid, HIGH);
digitalWrite(Zone4Solenoid, HIGH);
attachInterrupt(19, pin_READ, CHANGE);
attachInterrupt(18, pin_WATER, CHANGE);
Wire.begin();
rtc.begin();
lcd.begin (16,2);
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
lcd.setBacklight(HIGH);
lcd.home ();
lcd.print(string_table[10]);
Serial.begin(57600);
};
void pin_READ() {
// buttonstate = digitalRead(TEST_BUTTON);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(string_table[8]);
delay(Delay3);
read_sensors();
};
void pin_WATER() {
// buttonstate = digitalRead(WATER_BUTTON);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(string_table[9]);
delay(Delay3);
water_run();
};
void program() {
DateTime tt = rtc.now();
int tthour = tt.hour();
int ttmin = tt.minute();
Serial.print(tt.hour(), DEC);
Serial.print(':');
Serial.print(tt.minute(), DEC);
Serial.print(':');
Serial.println(tt.second(), DEC);
if ((tthour == Time1 || Time2 || Time3 || Time4 || Time5 ) and ttmin == TimeMin ){
water_run();
}
else {
lcd_time(),
lcd.print(string_table[0]),
Serial.flush();
}
};
void water_run(){
read_sensors();
lcd.clear();
lcd.setCursor(0,0);
lcd.print(string_table[7]);
if (Zone1SensorValue <= Zone1WaterLevel ) {
Zone1Water = String(string_table[11]);
Serial.println(Zone1Water);
};
if (Zone2SensorValue <= Zone2WaterLevel ) {
Zone2Water = String(string_table[11]);
Serial.println(Zone2Water);
};
if (Zone3SensorValue <= Zone3WaterLevel ) {
Zone3Water = String(string_table[11]);
Serial.println(Zone3Water);
};
if (Zone4SensorValue <= Zone4WaterLevel ) {
Zone4Water = String(string_table[11]);
Serial.println(Zone4Water);
};
if (Zone1Water || Zone2Water || Zone3Water || Zone4Water == String(string_table[11])){
digitalWrite(CirculationPump, HIGH);
delay(1500);
};
if (Zone1Water == String(string_table[11])){
Serial.println(Zone1Water),
delay_time = Zone1Delay,
solenoid = Zone1Solenoid,
water_info = string_table[3],
water_routine();
};
if (Zone2Water == String(string_table[11])){
delay_time = Zone2Delay,
solenoid = Zone2Solenoid,
water_info = string_table[4],
water_routine();
};
if (Zone3Water == String(string_table[11])){
delay_time = Zone3Delay,
solenoid = Zone3Solenoid,
water_info = string_table[5],
water_routine();
};
if (Zone4Water == String(string_table[11])){
delay_time = Zone4Delay,
solenoid = Zone4Solenoid,
water_info = string_table[6],
water_routine();
};
digitalWrite(CirculationPump, LOW);
Zone1Water = String(string_table[12]);
Zone2Water = String(string_table[12]);
Zone3Water = String(string_table[12]);
Zone4Water = String(string_table[12]);
};
void loop(){
delay(programDelay);
program();
};