Ir para conteúdo
View in the app

A better way to browse. Learn more.

EletrônicaBR.com

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Navegação Limpa e Sem Anúncios! (Cadastre-se)

O melhor fórum técnico do mundo está de cara nova e de portas abertas! Estamos de cara nova e com ferramentas ainda mais poderosas para a sua bancada. Faça o seu cadastro de forma rápida e simples para acessar o maior e mais atualizado acervo de Esquemas Elétricos, BIOS e Firmwares da internet.

Aqui, o conhecimento vale muito: através do nosso sistema de créditos, membros participativos ganham acesso totalmente gratuito aos downloads. Venha trocar experiências com os melhores especialistas do mercado!

👉 Técnico sem o EletrônicaBR não é um técnico completo!

 

Problemas com sensor de umidade

Featured Replies

Postado

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 visualizar 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
}

Postado

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

Postado
  • Autor

@nagkiller vou verificar isso na escola então, muito obrigado.
Você poderia me passar seu discord para conseguir me ajudar melhor?

  • 6 meses depois...
Postado
#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);
}

 

Postado

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

Postado

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 visualizar 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

  • 3 meses depois...
Postado
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 visualizar 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

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

Account

Navigation

Pesquisar

Pesquisar

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.