[AJUDA]Irrigacao - Sensor + rele + RTC

Ola Amigos,

Estou precisando de uma ajuda com um sistema de irrigacao que estou montando, sou novo nesta area de eletronica/arduino e tenho um conhecimento bem basico ainda, mas vamos la... Os componentes que estou utilizando sao:

-Arduino UNO
-Modulo Rele Songle SRD-05VDC (da china)
-Sonsor de umidade do solo FC-28 (com conversor digital.. acho que eh isso kkk)
-Modulo RTC DS1307
-LED

Funcao: o Rele ira ativar uma valvula solenoide em um horario determinado do dia validando se o solo esta seco ou nao.

Problema: quando o sensor identifica o solo seco ativando o rele, as vezes acontece do rele ativar o restante dos modulos, ligando o led, ativando o sensor e ativando o rele (o que nao deveria ocorrer), neste caso ele fica ligando e desligando repetidamente... as vezes (nao sei dizer pq) ele funciona corretamente, porem a luz do DO do sensor fica levemente energizada (o que indica que tem algo errado.. kkk.)

Segue o circuito como esta:

Segue um video do que ocorre (desculpe a qualidade do video...)

Obs: Ha momentos que funciona normal... :~

Segue o Codigo:

// Programa : Data e Hora com DS1307
// Autor : Arduino e Cia

#include "Wire.h"

#define DS1307_ADDRESS 0x68

byte zero = 0x00; 
int horaRelogio, minutoRelogio;
int ledPin13  =  13;
int rele  =  8; 


void setup()
{
  Wire.begin();
  Serial.begin(9600);
  
  pinMode(11, INPUT); //Sensor de Solo
  pinMode(ledPin13, OUTPUT); // Led
  pinMode(rele, OUTPUT); // rele  
  digitalWrite(rele, HIGH);
  //SelecionaDataeHora() ;
}

void loop()
{
  Mostrarelogio();
  delay(1000);

  int umidadeSolo;
  umidadeSolo = digitalRead (11);
  Serial.print("Umidade: ");
  Serial.println (umidadeSolo);
  
  if(horaRelogio >=7 && horaRelogio <=18 || horaRelogio >=18 && horaRelogio <=22)
  {
  if (umidadeSolo == 1 )
  {
    digitalWrite(13, HIGH);
    digitalWrite(rele, LOW);
  }
  if (umidadeSolo == 0 )
  {
    digitalWrite(13, LOW);
    digitalWrite(rele, HIGH);
  }
  }
  else{
 //   digitalWrite(13, LOW);
   // digitalWrite(rele, HIGH);
  }

}

void SelecionaDataeHora()   //Seta a data e a hora do DS1307
{
  byte segundos = 40; //Valores de 0 a 59
  byte minutos = 46; //Valores de 0 a 59
  byte horas = 13; //Valores de 0 a 23
  byte diadasemana = 1; //Valores de 0 a 6 - 0=Domingo, 1 = Segunda, etc.
  byte diadomes = 15; //Valores de 1 a 31
  byte mes = 9; //Valores de 1 a 12
  byte ano = 14; //Valores de 0 a 99
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero); //Stop no CI para que o mesmo possa receber os dados

  //As linhas abaixo escrevem no CI os valores de 
  //data e hora que foram colocados nas variaveis acima
  Wire.write(ConverteParaBCD(segundos));
  Wire.write(ConverteParaBCD(minutos));
  Wire.write(ConverteParaBCD(horas));
  Wire.write(ConverteParaBCD(diadasemana));
  Wire.write(ConverteParaBCD(diadomes));
  Wire.write(ConverteParaBCD(mes));
  Wire.write(ConverteParaBCD(ano));
  Wire.write(zero); //Start no CI
  Wire.endTransmission(); 
}

byte ConverteParaBCD(byte val){ //Converte o número de decimal para BCD
  return ( (val/10*16) + (val%10) );
}

byte ConverteparaDecimal(byte val)  { //Converte de BCD para decimal
  return ( (val/16*10) + (val%16) );
}

void Mostrarelogio()
{
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);
  Wire.endTransmission();
  Wire.requestFrom(DS1307_ADDRESS, 7);
  int segundos = ConverteparaDecimal(Wire.read());
  int minutos = ConverteparaDecimal(Wire.read());
  minutoRelogio = minutos;
  int horas = ConverteparaDecimal(Wire.read() & 0b111111); 
  horaRelogio = horas;
  int diadasemana = ConverteparaDecimal(Wire.read()); 
  int diadomes = ConverteparaDecimal(Wire.read());
  int mes = ConverteparaDecimal(Wire.read());
  int ano = ConverteparaDecimal(Wire.read());
  //Mostra a data no Serial Monitor
  Serial.print("Data: ");
  Serial.print(diadomes);
  Serial.print("/");
  Serial.print(mes);
  Serial.print("/");
  Serial.print(ano);
  Serial.print(" ");
  Serial.print("Hora : ");
  Serial.print(horas);
  Serial.print(":");
  Serial.print(minutos);
  Serial.print(":");
  Serial.print(segundos);
  switch(diadasemana)
    {
      case 0:Serial.println(", Domingo");
      break;
      case 1:Serial.println(", Segunda");
      break;
      case 2:Serial.println(", Terca");
      break;
      case 3:Serial.println(", Quarta");
      break;
      case 4:Serial.println(", Quinta");
      break;
      case 5:Serial.println(", Sexta");
      break;
      case 6:Serial.println(", Sabado");
    }
}

Obs: O codigo esta bem pobre... nao foquei nele uma vez que nao tenho certeza do circuito...

O que estaria errado? O que estaria faltando nessa joca kkk?

Desde ja agradeco a vossa ajuda!

Não faltou um driver pro Rele ali? Coloca um BC546//BC337 (qualquer coisa na verdade) para acionar o Rele, e um diodo comum em paralelo com a bobina

transistor:
base-----1k-----D8
coletor-----(fio azul rele)
emissor-----gnd

diodo:
Anodo-----(fio azul)
catodo-----(fio verde)

Desculpe, acho que não informei no desenho... mas o Rele é um desses:

mesmo com este modulo precisaria do diodo?

Na minha óptica o problema é que o conversor digital é de fraca qualidade. O facto de o led se mostrar com a luz fraca, quer dizer que nesse ponto ele está a receber o sinal de sensor seco seguido de sensor molhado consecutivamente e muito rápido.
Pode ser feito um debounce a esse sinal, que deverá atenuar esse efeito, pode ser configurado um valor mais extremo para o fornecimento do sinal digital de saída, ou pode ser procurado outro conversor. Também se pode eliminar esse conversor digital e enviar o sensor analógico directamente ao Arduino.

Não serás o primeiro utilizador com problemas a utilizar relés.

Já reparaste se essa plaquinha tem um snubber na bobine do relé?

Desculpem, mas o problema não é o relé. O problema está simplesmente no sensor. Vejam o vídeo, o sensor está constantemente a ligar e a desligar (daí a luz fraca do LED que indica o estado da saída do sensor) e isso não é problema do relé. Talvez alterando o valor do potenciómetro (para configurar um valor diferente) solucione o problema. Mas na realidade o único problema é a falta do Schmitt trigger no comparador desse tal "conversor digital".

Entao, acredito que nao seja o sensor, removi o sensor do circuito e o problema persistiu, se eu remover o rele, o sensor funciona corretamente acendendo o led.

Fiz outro video de como fica (removendo o sensor faz a mesma coisa):

Percebi que se eu inverter o estado do rele(no outro video eu havia feito isto sem perceber), ligando ele quando o sensor estiver molhado, ele para de piscar como no video acima, porem fica tudo travado... ele liga... desliga... o led nao acende...etc..
Ontem quando estava testando ele funcionou desta forma :

quando desliguei e liguei nao se comportava mais do mesmo jeito..

Ha a possibilidade do Rele estar "enviando" alguma carga devida a ativacao da bobina? seria pela entrada "in" dele? eu poderia utilizar um diodo em serie? (Desculpe se eu estou falando alguma besteira kkk)

Bubulindo, nao saberia lhe responder.. :~

Eu acredito que é a imprecisão do sensor. Há muita flutuação. O link que você mencionou não está disponível. A alternativa poderia ser criar um array ou um contador para obter um valor médio das medições, com isto estas variações seriam eliminadas.