Sorry again, I was not even thinking about the code, I was thinking about the hardware, so I've read the sketch and imagined the drawing of the harware....
this is the code, it is really not the smart way to do the job, but is does...
#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h> //adafruit
#include <Wire.h>//nativo
#include <EEPROM.h>//nativo
LiquidCrystal_I2C lcd(0x27, 16, 2);
// constantes - define os pinos
#define pinobotaoInicio 4
#define pinobotaoSeletor 14
#define pinobotaoMais 0
#define pinobotaoMenos 1
#define pinobotaoCancela 3
#define pinobotaoManual 2
#define rele1 6
#define rele2 7
#define rele3 8
#define rele4 9
#define rele5 10
#define rele6 11
#define rele7 12
#define bomba 5
//define estados
#define ATIVO 1
#define INATIVO 0
#define BLIGADO LOW
#define BDESLIGADO HIGH
#define VLIGADO LOW
#define VDESLIGADO HIGH
#define AGUA 1
#define ADUBO 0
#define AddAgua 0
#define AddAdubo 1
#define AddModo 2
#define AddManual 3
#define AddNrele 4
#define Automatico 0
#define Manual 1
#define Ajuste 2
#define INICIADO 0
#define TERMINADO 1
#define NAFILA 2
#define tempomaxagua 30
#define tempomaxadubo 30
//variáveis para debounce dos botões
int tempoDebounce = 50;
int tempoDebounceLongo = 500;
int tempoDebounceSuperLongo = 2000;
int estadobotaoInicio;
int estadobotaoSeletor;
int estadobotaoMais;
int estadobotaoMenos;
int estadobotaoCancela;
int estadobotaoManual;
int anteriorbotaoInicio = BDESLIGADO;
int anteriorbotaoSeletor = BDESLIGADO;
int anteriorbotaoMais = BDESLIGADO;
int anteriorbotaoMenos = BDESLIGADO;
int anteriorbotaoCancela = BDESLIGADO;
int anteriorbotaoManual = BDESLIGADO;
unsigned long bouncebotaoInicio;
unsigned long bouncebotaoSeletor;
unsigned long bouncebotaoMais;
unsigned long bouncebotaoMenos;
unsigned long bouncebotaoCancela;
unsigned long bouncebotaoManual;
int arqbmais;
int arqbmenos;
int arqbseletor;
int arqbinicio;
int arqbcancela;
int arqbmanual;
//variáveis dos botões
int botaoInicio;
int botaoSeletor;
int botaoMais;
int botaoMenos;
int botaoCancela;
int botaoManual;
// variáveis de tempo
byte minutosAgua;
byte minutosAdubo;
byte minutos;
unsigned long tempoAgora;
unsigned long tempoDesliga;
unsigned long tempoInicio;
//Variável de estado de irrigação
int irrigando = INATIVO;
byte modoIrrigacao;
byte autoManual;
byte Nrele;
int X = 1;
unsigned long Rtempo = 60000;//60000 pra minutos
int releAgora = 1;
int valvulaAgora = 21;
int valvula1 = TERMINADO;
int valvula2 = TERMINADO;
int valvula3 = TERMINADO;
int valvula4 = TERMINADO;
int valvula5 = TERMINADO;
int valvula6 = TERMINADO;
int valvula7 = TERMINADO;
void setup()
{
//inicia serial
//Serial.begin(9600);
//inicia biblioteca wire
Wire.begin();
//configura as entradas
pinMode(pinobotaoInicio, INPUT_PULLUP);
pinMode(pinobotaoSeletor, INPUT_PULLUP);
pinMode(pinobotaoMais, INPUT_PULLUP);
pinMode(pinobotaoMenos, INPUT_PULLUP);
pinMode(pinobotaoCancela, INPUT_PULLUP);
pinMode(pinobotaoManual, INPUT_PULLUP);
//configura saídas
pinMode(rele1, OUTPUT);
pinMode(rele2, OUTPUT);
pinMode(rele3, OUTPUT);
pinMode(rele4, OUTPUT);
pinMode(rele5, OUTPUT);
pinMode(rele6, OUTPUT);
pinMode(rele7, OUTPUT);
/*
pinMode(rele8, OUTPUT);
pinMode(rele9, OUTPUT);
pinMode(rele10, OUTPUT);
pinMode(rele11, OUTPUT);
pinMode(rele12, OUTPUT);
pinMode(rele13, OUTPUT);
pinMode(rele14, OUTPUT);
pinMode(rele15, OUTPUT);
pinMode(rele16, OUTPUT);
pinMode(rele17, OUTPUT);
pinMode(rele18, OUTPUT);
pinMode(rele19, OUTPUT);
pinMode(rele20, OUTPUT);
*/
pinMode(bomba, OUTPUT);
//desliga as saídas
digitalWrite(rele1, VDESLIGADO);
digitalWrite(rele2, VDESLIGADO);
digitalWrite(rele3, VDESLIGADO);
digitalWrite(rele4, VDESLIGADO);
digitalWrite(rele5, VDESLIGADO);
digitalWrite(rele6, VDESLIGADO);
digitalWrite(rele7, VDESLIGADO);
/*
digitalWrite(rele8, VDESLIGADO);
digitalWrite(rele9, VDESLIGADO);
digitalWrite(rele10, VDESLIGADO);
digitalWrite(rele11, VDESLIGADO);
digitalWrite(rele12, VDESLIGADO);
digitalWrite(rele13, VDESLIGADO);
digitalWrite(rele14, VDESLIGADO);
digitalWrite(rele15, VDESLIGADO);
digitalWrite(rele16, VDESLIGADO);
digitalWrite(rele17, VDESLIGADO);
digitalWrite(rele18, VDESLIGADO);
digitalWrite(rele19, VDESLIGADO);
digitalWrite(rele20, VDESLIGADO);
*/
digitalWrite(bomba, VDESLIGADO);
//inicia LCD
lcd.init(); // Inicializando o LCD
lcd.backlight(); // Ligando o BackLight do LCD
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(" ");
/*//inicia oled
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //INICIALIZA O DISPLAY COM ENDEREÇO I2C 0x3C
display.setTextColor(WHITE); //DEFINE A COR DO TEXTO
display.setTextSize(1); //DEFINE O TAMANHO DA FONTE DO TEXTO
display.clearDisplay(); //LIMPA AS INFORMAÇÕES DO DISPLAY
*/
//lê a EEPROM
if (EEPROM.read(AddAgua) <= tempomaxagua) {
minutosAgua = EEPROM.read(AddAgua);
}
else {
minutosAgua = 1;
}
if (EEPROM.read(AddAdubo) <= tempomaxadubo) {
minutosAdubo = EEPROM.read(AddAdubo);
}
else {
minutosAdubo = 1;
}
if (EEPROM.read(AddModo) == AGUA || EEPROM.read(AddModo) == ADUBO) {
modoIrrigacao = EEPROM.read(AddModo);
}
else {
modoIrrigacao = ADUBO;
}
if (EEPROM.read(AddManual) == Automatico || EEPROM.read(AddManual) == Manual) {
autoManual = EEPROM.read(AddManual);
}
else {
autoManual = Automatico;
}
if (EEPROM.read(AddNrele) >= 1 && EEPROM.read(AddNrele) <= 7) {
Nrele = EEPROM.read(AddNrele);
}
else {
Nrele = 1;
}
}
/* código em loop
le os botões com debounce se está inativo
grava tempo no eeprom
controla os reles se está ativo
*/
void loop()
{
// Ler botões
estadobotaoInicio = digitalRead(pinobotaoInicio);
estadobotaoSeletor = digitalRead(pinobotaoSeletor);
estadobotaoMais = digitalRead(pinobotaoMais);
estadobotaoMenos = digitalRead(pinobotaoMenos);
estadobotaoCancela = digitalRead(pinobotaoCancela);
estadobotaoManual = digitalRead(pinobotaoManual);
//debounce dos botões
//inicio
if (estadobotaoInicio != anteriorbotaoInicio) {
bouncebotaoInicio = millis();
anteriorbotaoInicio = estadobotaoInicio;
}
if (estadobotaoInicio == anteriorbotaoInicio) {
if ((millis() - bouncebotaoInicio) > tempoDebounceLongo) {
botaoInicio = estadobotaoInicio;
}
}
//seletor
if(autoManual==Automatico){
if (estadobotaoSeletor != anteriorbotaoSeletor) {
bouncebotaoSeletor = millis();
anteriorbotaoSeletor = estadobotaoSeletor;
}
if (estadobotaoSeletor == anteriorbotaoSeletor) {
if ((millis() - bouncebotaoSeletor) > tempoDebounce) {
botaoSeletor = estadobotaoSeletor;
}
}
}
if(autoManual!=Automatico){
if (estadobotaoSeletor != anteriorbotaoSeletor) {
bouncebotaoSeletor = millis();
anteriorbotaoSeletor = estadobotaoSeletor;
}
if (estadobotaoSeletor == anteriorbotaoSeletor) {
if ((millis() - bouncebotaoSeletor) > tempoDebounceSuperLongo) {
botaoSeletor = estadobotaoSeletor;
}
}
}
//Mais
if (estadobotaoMais != anteriorbotaoMais) {
bouncebotaoMais = millis();
anteriorbotaoMais = estadobotaoMais;
}
if (estadobotaoMais == anteriorbotaoMais) {
if ((millis() - bouncebotaoMais) > tempoDebounce) {
botaoMais = estadobotaoMais;
}
}
//Menos
if (estadobotaoMenos != anteriorbotaoMenos) {
bouncebotaoMenos = millis();
anteriorbotaoMenos = estadobotaoMenos;
}
if (estadobotaoMenos == anteriorbotaoMenos) {
if ((millis() - bouncebotaoMenos) > tempoDebounce) {
botaoMenos = estadobotaoMenos;
}
}
//cancela
if (estadobotaoCancela != anteriorbotaoCancela) {
bouncebotaoCancela = millis();
anteriorbotaoCancela = estadobotaoCancela;
}
if (estadobotaoCancela == anteriorbotaoCancela) {
if ((millis() - bouncebotaoCancela) > tempoDebounce) {
botaoCancela = estadobotaoCancela;
}
}
//Auto/manual
if (estadobotaoManual != anteriorbotaoManual) {
bouncebotaoManual = millis();
anteriorbotaoManual = estadobotaoManual;
}
if (estadobotaoManual == anteriorbotaoManual) {
if ((millis() - bouncebotaoManual) > tempoDebounce) {
botaoManual = estadobotaoManual;
}
}
// se a irrigação estiver inativa:
if (irrigando == INATIVO && autoManual != Ajuste) {
if(autoManual==Automatico){
if (modoIrrigacao == AGUA) {
//define tempos
if (arqbmais == BDESLIGADO && botaoMais == BLIGADO) {
if (minutosAgua < tempomaxagua) {
minutosAgua = minutosAgua + 1;
EEPROM.write(AddAgua, minutosAgua);
}
}
if (arqbmenos == BDESLIGADO && botaoMenos == BLIGADO) {
if (minutosAgua > 1) {
minutosAgua = minutosAgua - 1;
EEPROM.write(AddAgua, minutosAgua);
}
}
}
if (modoIrrigacao == ADUBO) {
if (arqbmais == BDESLIGADO && botaoMais == BLIGADO) {
if (minutosAdubo < tempomaxadubo) {
minutosAdubo = minutosAdubo + 1;
EEPROM.write(AddAdubo, minutosAdubo);
}
}
if (arqbmenos == BDESLIGADO && botaoMenos == BLIGADO) {
if (minutosAdubo > 1) {
minutosAdubo = minutosAdubo - 1;
EEPROM.write(AddAdubo, minutosAdubo);
}
}
}
}
//Seletor automatico ou manual
if(autoManual!=Ajuste){
if (arqbmanual == BDESLIGADO && botaoManual == BLIGADO) {
if (autoManual == Automatico) {
autoManual = Manual;
}
else {
autoManual = Automatico;
}
EEPROM.write(AddManual,autoManual);
}
}
//àgua ou adubo
if(autoManual==Automatico){
if(arqbseletor==BDESLIGADO&&botaoSeletor==BLIGADO){
if(modoIrrigacao==ADUBO){
modoIrrigacao=AGUA;
}
else {
modoIrrigacao=ADUBO;
}
EEPROM.write(AddModo,modoIrrigacao);
}
}
if(autoManual==Manual){
if(arqbseletor==BDESLIGADO&&botaoSeletor==BLIGADO){
autoManual=Ajuste;
EEPROM.write(AddManual,autoManual);
}
}
//ativa irrigação
if (arqbinicio == BDESLIGADO && botaoInicio == BLIGADO && autoManual != Ajuste) {
X = 1;
irrigando = ATIVO;
valvula1 = NAFILA;
valvula2 = NAFILA;
valvula3 = NAFILA;
valvula4 = NAFILA;
valvula5 = NAFILA;
valvula6 = NAFILA;
valvula7 = NAFILA;
/*
valvula8 = TERMINADO;
valvula9 = TERMINADO;
valvula10 = TERMINADO;
valvula11 = TERMINADO;
valvula12 = TERMINADO;
valvula13 = TERMINADO;
valvula14 = TERMINADO;
valvula15 = TERMINADO;
valvula16 = TERMINADO;
valvula17 = TERMINADO;
valvula18 = TERMINADO;
valvula19 = TERMINADO;
valvula20 = TERMINADO;
*/
if (modoIrrigacao == AGUA) {
minutos = minutosAgua;
}
if (modoIrrigacao == ADUBO) {
minutos = minutosAdubo;
}
}
}
if(autoManual==Ajuste){
if (arqbmais == BDESLIGADO && botaoMais == BLIGADO) {
if (Nrele < 7) {
Nrele = Nrele + 1;
EEPROM.write(AddNrele, Nrele);
}
}
if (arqbmenos == BDESLIGADO && botaoMenos == BLIGADO) {
if (Nrele > 1) {
Nrele = Nrele - 1;
EEPROM.write(AddNrele,Nrele);
}
}
if(arqbcancela==BDESLIGADO&&botaoCancela==BLIGADO){
autoManual=Manual;
EEPROM.write(AddManual,autoManual);
}
}
//controle das saídas
//permite cancelamento
// inicia automático
if (irrigando == ATIVO && autoManual==Automatico) {
if(X < 8){
if(X==1){
valvulaAgora=valvula1;
releAgora=rele1;
}
if(X==2){
valvulaAgora=valvula2;
releAgora=rele2;
}
if(X==3){
valvulaAgora=valvula3;
releAgora=rele3;
}
if(X==4){
valvulaAgora=valvula4;
releAgora=rele4;
}
if(X==5){
valvulaAgora=valvula5;
releAgora=rele5;
}
if(X==6){
valvulaAgora=valvula6;
releAgora=rele6;
}
if(X==7){
valvulaAgora=valvula7;
releAgora=rele7;
}
/*
if(X==8){
valvulaAgora=valvula8;
releAgora=rele8;
}
if(X==9){
valvulaAgora=valvula9;
releAgora=rele9;
}
if(X==10){
valvulaAgora=valvula10;
releAgora=rele10;
}
if(X==11){
valvulaAgora=valvula11;
releAgora=rele11;
}
if(X==12){
valvulaAgora=valvula12;
releAgora=rele12;
}
if(X==13){
valvulaAgora=valvula13;
releAgora=rele13;
}
if(X==14){
valvulaAgora=valvula14;
releAgora=rele14;
}
if(X==15){
valvulaAgora=valvula15;
releAgora=rele15;
}
if(X==16){
valvulaAgora=valvula16;
releAgora=rele16;
}
if(X==17){
valvulaAgora=valvula17;
releAgora=rele17;
}
if(X==18){
valvulaAgora=valvula18;
releAgora=rele18;
}
if(X==19){
valvulaAgora=valvula19;
releAgora=rele19;
}
if(X==20){
valvulaAgora=valvula20;
releAgora=rele20;
}
*/
if (valvulaAgora == NAFILA) {
tempoInicio = millis();
valvulaAgora = INICIADO;
digitalWrite(releAgora, VLIGADO);
//lcd.setCursor(14,1);
//lcd.print(X);
}
if (valvulaAgora == INICIADO) {
if ((millis() - tempoInicio) > (minutos * Rtempo)) {
valvulaAgora = TERMINADO;
digitalWrite(releAgora, VDESLIGADO);
}
}
if(X==1){
valvula1=valvulaAgora;
}
if(X==2){
valvula2=valvulaAgora;
}
if(X==3){
valvula3=valvulaAgora;
}
if(X==4){
valvula4=valvulaAgora;
}
if(X==5){
valvula5=valvulaAgora;
}
if(X==6){
valvula6=valvulaAgora;
}
if(X==7){
valvula7=valvulaAgora;
}
/*
if(X==8){
valvula8=valvulaAgora;
}
if(X==9){
valvula9=valvulaAgora;
}
if(X==10){
valvula10=valvulaAgora;
}
if(X==11){
valvula11=valvulaAgora;
}
if(X==12){
valvula12=valvulaAgora;
}
if(X==13){
valvula13=valvulaAgora;
}
if(X==14){
valvula14=valvulaAgora;
}
if(X==15){
valvula15=valvulaAgora;
}
if(X==16){
valvula16=valvulaAgora;
}
if(X==17){
valvula17=valvulaAgora;
}
if(X==18){
valvula18=valvulaAgora;
}
if(X==19){
valvula19=valvulaAgora;
}
if(X==20){
valvula20=valvulaAgora;
}
*/
if (valvulaAgora == TERMINADO) {
X++;
//lcd.setCursor(14,1);
//lcd.print(" ");
}
}
if(X>Nrele){
irrigando = INATIVO;
//lcd.setCursor(14,1);
//lcd.print(" ");
}
}
if (botaoCancela == BLIGADO) {
//desativa irrigação
irrigando = INATIVO;
}
if (irrigando == INATIVO) {
digitalWrite(bomba, VDESLIGADO);
valvula1 = TERMINADO;
valvula2 = TERMINADO;
valvula3 = TERMINADO;
valvula4 = TERMINADO;
valvula5 = TERMINADO;
valvula6 = TERMINADO;
valvula7 = TERMINADO;
/*
valvula8 = TERMINADO;
valvula9 = TERMINADO;
valvula10 = TERMINADO;
valvula11 = TERMINADO;
valvula12 = TERMINADO;
valvula13 = TERMINADO;
valvula14 = TERMINADO;
valvula15 = TERMINADO;
valvula16 = TERMINADO;
valvula17 = TERMINADO;
valvula18 = TERMINADO;
valvula19 = TERMINADO;
valvula20 = TERMINADO;
*/
digitalWrite(rele1, VDESLIGADO);
digitalWrite(rele2, VDESLIGADO);
digitalWrite(rele3, VDESLIGADO);
digitalWrite(rele4, VDESLIGADO);
digitalWrite(rele5, VDESLIGADO);
digitalWrite(rele6, VDESLIGADO);
digitalWrite(rele7, VDESLIGADO);
/*
digitalWrite(rele8, VDESLIGADO);
digitalWrite(rele9, VDESLIGADO);
digitalWrite(rele10, VDESLIGADO);
digitalWrite(rele11, VDESLIGADO);
digitalWrite(rele12, VDESLIGADO);
digitalWrite(rele13, VDESLIGADO);
digitalWrite(rele14, VDESLIGADO);
digitalWrite(rele15, VDESLIGADO);
digitalWrite(rele16, VDESLIGADO);
digitalWrite(rele17, VDESLIGADO);
digitalWrite(rele18, VDESLIGADO);
digitalWrite(rele19, VDESLIGADO);
digitalWrite(rele20, VDESLIGADO);
*/
lcd.setCursor(14,1);
lcd.print(" ");
}
if (irrigando == ATIVO) {
digitalWrite(bomba, VLIGADO);
}
//guarda o estado anterior dos botões
arqbmais = botaoMais;
arqbmenos = botaoMenos;
arqbseletor = botaoSeletor;
arqbinicio = botaoInicio;
arqbcancela = botaoCancela;
arqbmanual = botaoManual;
//print no LCD
if (irrigando == ATIVO) {
lcd.setCursor(7, 0);
lcd.print("ativo ");
lcd.setCursor(14, 1);
if(autoManual==Automatico){
if(X>10){
lcd.print("0");
}
lcd.print(X);
}
if(autoManual==Manual){
lcd.print(" B");
}
}
if (irrigando == INATIVO && autoManual != Ajuste) {
lcd.setCursor(7, 0);
lcd.print("inativo ");
lcd.setCursor(14, 1);
lcd.print(" ");
}
if(autoManual==Automatico){
lcd.setCursor(0,0);
lcd.print("Auto ");
if (modoIrrigacao == AGUA) {
lcd.setCursor(0, 1);
lcd.print("Agua ");
if (minutosAgua < 10) {
lcd.print(" ");
}
lcd.print(minutosAgua);
lcd.print(" min");
}
if (modoIrrigacao == ADUBO) {
lcd.setCursor(0, 1);
lcd.print("Adubo ");
if (minutosAdubo < 10) {
lcd.print(" ");
}
lcd.print(minutosAdubo);
lcd.print(" min");
}
}
if(autoManual==Manual){
lcd.setCursor(0,0);
lcd.print("Manual ");
lcd.setCursor(0,1);
lcd.print(" ");
}
if(autoManual==Ajuste){
lcd.setCursor(0,0);
lcd.print("Ajuste de saidas");
lcd.setCursor(0,1);
lcd.print("Num. valv = ");
lcd.print(Nrele);
lcd.print(" ");
}