Ir para conteúdo
  • Cadastre-se

Problemas com sensor de umidade

Avalie este tópico:


MatheusTCC

Posts em destaque

Estou fazendo meu TCC e cheguei em um problema.

No tinkercad, o circuito funciona normalmente, mas quando faço na pratica, o sensor de umidade fica atualizando no monitor serial o valor 14, e não muda nem mesmo com terra umida e terra seca.

Deixarei o código e o link do projeto para quem conseguir me ajudar.

Obs: Estou utilizando o pino A0 e não o D0

 

"""""""

Você não tem permissão para ver links. Faça login ou cadastre-se.
"""""""""""

 

 

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);

const int sensorUmidadeSoloPin = A0;  // Pino analógico conectado ao sensor de umidade do solo
const int pinoLedVermelho = 5;       // Pino digital conectado ao LED vermelho
const int pinoLedAmarelo = 6;        // Pino digital conectado ao LED amarelo
const int pinoLedVerde = 7;          // Pino digital conectado ao LED verde
const int pinoRele = 10;             // Pino digital conectado ao módulo relé
const int botaoLigarPin = 2;         // Pino digital conectado ao botão de ligar
const int botaoDesligarPin = 3;      // Pino digital conectado ao botão de desligar

const int limiteUmidadeSeco = 250;    // Solo seco (menor que 25%)
const int limiteUmidadeMedio = 500;   // Solo estado médio (50%)
const int limiteUmidadeUmido = 750;   // Solo úmido (75%)

bool sistemaLigado = false; // Variável para rastrear o estado do sistema


void setup() {
 
  lcd.init();
  lcd.begin(16, 2); // Inicializa o LCD
  lcd.backlight();  // Habilita a iluminação do LCD (caso esteja disponível)
 
  lcd.print("Umidade Atual:");
  pinMode(pinoLedVermelho, OUTPUT);
  pinMode(pinoLedAmarelo, OUTPUT);
  pinMode(pinoLedVerde, OUTPUT);
  pinMode(pinoRele, OUTPUT);
  digitalWrite(pinoRele, LOW); // Certifique-se de que a bomba/irrigador esteja desligado inicialmente

  pinMode(botaoLigarPin, INPUT_PULLUP); // Configura o botão de ligar como INPUT_PULLUP
  pinMode(botaoDesligarPin, INPUT_PULLUP); // Configura o botão de desligar como INPUT_PULLUP

}

void loop() {
  // Verificar o estado dos botões
  bool botaoLigarPressionado = digitalRead(botaoLigarPin) == LOW;
  bool botaoDesligarPressionado = digitalRead(botaoDesligarPin) == LOW;

  // Verificar o estado do sistema (ligado ou desligado)
  if (!sistemaLigado && botaoLigarPressionado) {
    sistemaLigado = true;
  } else if (sistemaLigado && botaoDesligarPressionado) {
    sistemaLigado = false;
    desligarIrrigacao(); // Desliga a irrigação manualmente ao desligar o sistema
  }

  if (sistemaLigado) {
    int umidadeSolo = lerUmidadeSolo();

    if (umidadeSolo < limiteUmidadeSeco) {
      digitalWrite(pinoLedVermelho, HIGH);
      digitalWrite(pinoLedAmarelo, LOW);
      digitalWrite(pinoLedVerde, LOW);
      acionarIrrigacao();
    } else if (umidadeSolo < limiteUmidadeUmido) {
      digitalWrite(pinoLedVermelho, LOW);
      digitalWrite(pinoLedAmarelo, HIGH);
      digitalWrite(pinoLedVerde, LOW);
      acionarIrrigacao();
    } else if (umidadeSolo >= limiteUmidadeUmido) {
      digitalWrite(pinoLedVermelho, LOW);
      digitalWrite(pinoLedAmarelo, LOW);
      digitalWrite(pinoLedVerde, HIGH);
      desligarIrrigacao();
    }

    // Mostrar a porcentagem de umidade ideal no LCD
    int porcentagemUmidadeIdeal = map(umidadeSolo, 0, 1023, 0, 100);
    lcd.setCursor(0, 1);
    lcd.print("                "); // Limpar a linha antes de escrever a nova informação
    lcd.setCursor(0, 1);
    lcd.print(porcentagemUmidadeIdeal);
    lcd.print("%");
  } else {
    // Se o sistema estiver desligado, desliga todos os LEDs e a irrigação
    digitalWrite(pinoLedVermelho, LOW);
    digitalWrite(pinoLedAmarelo, LOW);
    digitalWrite(pinoLedVerde, LOW);
    desligarIrrigacao();
  }

  delay(100); // Pequeno atraso para evitar o bounce dos botões
}

int lerUmidadeSolo() {
  int valorAnalogico = analogRead(sensorUmidadeSoloPin);
  Serial.print("Valor de Umidade do Solo: ");
  Serial.println(valorAnalogico);
  return valorAnalogico;
}

void acionarIrrigacao() {
  digitalWrite(pinoRele, HIGH); // Ligar a bomba/irrigador
}

void desligarIrrigacao() {
  digitalWrite(pinoRele, LOW); // Desligar a bomba/irrigador
}

Link para o comentário
Compartilhar em outros sites

Pelo que eu vi ali no seu código, está faltando você inicializar a Serial, incluindo a diretiva #include <SoftwareSerial.h> e no setup() a linha  Serial.begin(x);  (mas esse não é o problema principal).

 

Quando está imprimindo o valor 14, quer dizer que A0 está em ponto flutuante... Verifique o hardware, a fiação ou experimente usar um trimpot ou potenciômetro (10K, por exemplo) com o pino central ligado no A0, e os outros dois pinos ligados em VCC e GND respectivamente, ou ainda, "jumpear" um fio do A0 para VCC e ver a leitura (1023) e posteriormente para GND e ver a leitura (0).


Flw...

Editado: por nagkiller
  • Joinha 1
Link para o comentário
Compartilhar em outros sites

  • 6 meses depois...
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);

const int sensorUmidadeSoloPin = A0;
const int pinoLedVermelho = 5;
const int pinoLedAmarelo = 6;
const int pinoLedVerde = 7;
const int pinoRele = 10;
const int botaoLigarPin = 2;
const int botaoDesligarPin = 3;

const int limiteUmidadeSeco = 250;
const int limiteUmidadeUmido = 750;

bool sistemaLigado = false;

void setup() {
  Serial.begin(9600); // Inicializa a comunicação serial com 9600 bauds
  lcd.init();
  lcd.begin(16, 2);
  lcd.backlight();
  lcd.print("Umidade Atual:");

  pinMode(pinoLedVermelho, OUTPUT);
  pinMode(pinoLedAmarelo, OUTPUT);
  pinMode(pinoLedVerde, OUTPUT);
  pinMode(pinoRele, OUTPUT);
  digitalWrite(pinoRele, LOW);

  pinMode(botaoLigarPin, INPUT_PULLUP);
  pinMode(botaoDesligarPin, INPUT_PULLUP);
}

void loop() {
  atualizarEstadoSistema();

  if (sistemaLigado) {
    int umidadeSolo = lerUmidadeSolo();
    Serial.print("Umidade do Solo: ");
    Serial.println(umidadeSolo); // Envia o valor da umidade do solo pela comunicação serial
    atualizarStatusIrrigacao(umidadeSolo);
    mostrarUmidadeLCD(umidadeSolo);
  } else {
    desligarSistema();
  }
}

int lerUmidadeSolo() {
  return analogRead(sensorUmidadeSoloPin);
}

void atualizarEstadoSistema() {
  sistemaLigado = sistemaLigado ^ digitalRead(botaoLigarPin) == LOW;
  if (digitalRead(botaoDesligarPin) == LOW) {
    sistemaLigado = false;
    desligarIrrigacao();
  }
}

void atualizarStatusIrrigacao(int umidade) {
  if (umidade < limiteUmidadeSeco) {
    acionarIrrigacao();
    setLedStatus(HIGH, LOW, LOW);
  } else if (umidade < limiteUmidadeUmido) {
    acionarIrrigacao();
    setLedStatus(LOW, HIGH, LOW);
  } else {
    desligarIrrigacao();
    setLedStatus(LOW, LOW, HIGH);
  }
}

void mostrarUmidadeLCD(int umidade) {
  int porcentagemUmidade = map(umidade, 0, 1023, 0, 100);
  lcd.setCursor(0, 1);
  lcd.print("                ");
  lcd.setCursor(0, 1);
  lcd.print(porcentagemUmidade);
  lcd.print("%");
}

void acionarIrrigacao() {
  digitalWrite(pinoRele, HIGH);
}

void desligarIrrigacao() {
  digitalWrite(pinoRele, LOW);
}

void desligarSistema() {
  setLedStatus(LOW, LOW, LOW);
  desligarIrrigacao();
}

void setLedStatus(bool vermelho, bool amarelo, bool verde) {
  digitalWrite(pinoLedVermelho, vermelho);
  digitalWrite(pinoLedAmarelo, amarelo);
  digitalWrite(pinoLedVerde, verde);
}

 

Link para o comentário
Compartilhar em outros sites

Mateus vi que no seu código você fez a função Map apenas uma vez em :

 

" int porcentagemUmidadeIdeal = map(umidadeSolo, 0, 1023, 0, 100);"

 

Para que o Arduino consiga ler o sensor analógico que você conectou a entrada A0 é precisa fazer um map para ele também.

O Map é fazer o Arduino entender o sensor analógico conectado a suas entradas  de forma digital, tendo em vista que o sensor de umidade analógico varia sua tensão de 0 a 5 volts o Arduino precisa fatiar e dividir essas tensões e agrupá-las em forma de bits para que ele a consiga ler, ou seja ele vai fazer um Mapeamento da tensão e dividi-la em "1024" partes por assim dizer, cada numero 1, 2, 3, 4 .... 1021, 1022, 1023... será um bit para o Arduino e será um valor de tensão do seu dispositivo analógico, quando ele estiver meio seco e meio molhado estará com sua tensão em 2,5 volts, mas o Arduino não entende assim, mas com a função map feita o Arduino saberá que esta tensão é o numero de bit 512 e você poderá dizer a ele que o bit 512 é 50% de umidade do solo.

Não vi estas associações no seu código com a constante que você declarou :

"const int sensorUmidadeSoloPin = A0;  // Pino analógico conectado ao sensor de umidade do solo"

 

De uma analisada nisto que disse e veja se ficou claro, caso não por favor me fale para que eu possa explicar de outra maneira. Há e o Chat GPT pode ajuda-lo muito a tirar duvidas sobre Arduino, ele pode embora com algumas limitações ser bem interativo quando se trata do assunto. Um abraço Mateus.

Editado: por Ranieli Araujo
  • Joinha 1
Link para o comentário
Compartilhar em outros sites

Algumas coisas que eu percebi (não testei se realmente o código compila e/ou faz o que deveria fazer). Da menor prioridade para a maior prioridade temos:

  1. Quando se trata de programação C/C++ (que por baixo dos panos é isso que se trata Arduino), recomenda-se a criação de protótipos para os métodos que estão abaixo do método loop (apesar de que a própria plataforma Arduino, pode ignorar os protótipos).
  2. Deveria ser declarado long (por causa do tipo que o map retorna) => 'int porcentagemUmidade = map(umidade, 0, 1023, 0, 100);' => 
    Você não tem permissão para ver links. Faça login ou cadastre-se.
      => apesar de a doc exibir um exemplo com int;
  3. Há um erro aqui sobre a operação com bitwise XOR : 'sistemaLigado = sistemaLigado ^ digitalRead(botaoLigarPin) == LOW;' => Entendo que: se botaoLigarPin ficar em nível lógico 0, ficará sempre alternado o status entre 0 e 1 e se botaoLigarPin ficar em nível lógico 1, retornará sempre o ultimo status (causando um bug, exibindo informação errada) seria mais simples, ler o status do botão diretamente.


Flw...

Editado: por nagkiller
Link para o comentário
Compartilhar em outros sites

  • 3 meses depois...
Em 26/03/2024 às 22:46, nagkiller disse:

Algumas coisas que eu percebi (não testei se realmente o código compila e/ou faz o que deveria fazer). Da menor prioridade para a maior prioridade temos:

  1. Quando se trata de programação C/C++ (que por baixo dos panos é isso que se trata Arduino), recomenda-se a criação de protótipos para os métodos que estão abaixo do método loop (apesar de que a própria plataforma Arduino, pode ignorar os protótipos).
  2. Deveria ser declarado long (por causa do tipo que o map retorna) => 'int porcentagemUmidade = map(umidade, 0, 1023, 0, 100);' => 
    Você não tem permissão para ver links. Faça login ou cadastre-se.
      => apesar de a doc exibir um exemplo com int;
  3. Há um erro aqui sobre a operação com bitwise XOR : 'sistemaLigado = sistemaLigado ^ digitalRead(botaoLigarPin) == LOW;' => Entendo que: se botaoLigarPin ficar em nível lógico 0, ficará sempre alternado o status entre 0 e 1 e se botaoLigarPin ficar em nível lógico 1, retornará sempre o ultimo status (causando um bug, exibindo informação errada) seria mais simples, ler o status do botão diretamente.


Flw...

Obrigado pela informação

Link para o comentário
Compartilhar em outros sites

Participe agora da conversa!

Você pode postar agora e se cadastrar mais tarde. Se você tiver uma conta, faça login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Restaurar formatação

  Apenas 75 emoticons máximos são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir apenas como um link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Você não pode colar imagens diretamente. Envie ou insira imagens do URL.

SOBRE O ELETRÔNICABR

EletrônicaBR é o melhor fórum técnico online, temos o maior e mais atualizado acervo de Esquemas, Bios e Firmwares da internet. Através de nosso sistema de créditos, usuários participativos têm acesso totalmente gratuito. Os melhores técnicos do mundo estão aqui!
Técnico sem o EletrônicaBR não é um técnico completo! Leia Mais...
×
×
  • Criar Novo...