Conceito para a contrução de uma horta que detecta umidade da terra, do ambiente, temperatura e iluminação. Sua lógica pode ser aplicada em outros projetos.
A instrução a seguir descorrerá da seguinte maneira:
- Materiais
- Sensores
- Montagem do painel lcd
- Código para testar o painel lcd
- Código básico do painel
- Montagem do DHT e código básico
- Código do DHT para exibir no lcd
- Montagem sensor LDR (iluminação do ambiente)
- Código LDR
- Código do LDR, DHT e LCD
- Montagem higrômetro
- Código higrômetro
- Código do higrômetro, LDR, DHT e LCD
- Montagem rele (ativador do esguicho de água)
- Código rele
- Código do rele, higrômetro, LDR, DHT e LCD
- Montagem Válvula de vasão
- Painel LCD: JHD204A - 20x4 Nos exemplos do arduino, existe o LiquidCrystal - Hello World
- Arduino Uno
- Jumpers macho-macho e femea-macho
- Protoboard (para prototipagem)
- 1 Resistor 330 Ohms (para o painel)
- 1 Resistor 10k para o método Pull-UP (caso o sensor esteja longe da placa)
- 1 Potenciômetro 10k (usá-lo somente se o painel não tem auto-contraste)
- Rele 5V 1 canal(para liberaçao da agua de irrigação)
- Vávula solenóide água 12VDC ou 110V
- 1 Sensor de temperatura e umidade ambiente: DHT22 (não é necessário, no projeto ele esta instalado na placa do projeto, mas o ideal é instalar ele na estufa ou no ambiente externo proximo da horta). A versão 22 é mais precisa Comprar | Datasheet
- 1 Sensor LDR já com resistor
- 1 Sensor de umidade no solo Higrômetro: DN1619
LCD | LCD | Arduino/Proto |
---|---|---|
Saída | Nome | Pin |
4 | RS | 12 |
6 | Enable | 11 |
11 | D4 | 5 |
12 | D5 | 4 |
13 | D6 | 3 |
14 | D7 | 2 |
5 | R/W | ground |
1 | VSS | ground |
2 | VDD/VCC | VCC |
15 | anodo com resistor de 330 | VCC |
16 | catodo | ground |
3 | V0 | Potenciômetro 10k pino 2 (meio) |
- | - | Potenciometro 10k pino 1 (positivo) |
- | - | Potenciometro 10k pino 3 (ground) |
Para testar o painel LCD
Definir o Arduino Uno e a porta correta
+
Lembre-se sempre de definir o tamanho do painel em lcd.begin(16, 2);
ou lcd.begin(20,4);
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
lcd.begin(20, 4);
lcd.print("hello, world!");
}
void loop() {
lcd.setCursor(0, 1);
lcd.print(millis() / 1000);
}
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
lcd.begin(20, 4);
}
void loop() {
delay(100);
}
lcd.setCursor(0, 0);
lcd.print("Temperatura ");
lcd.setCursor(0, 1);
lcd.print("Umidade ");
}
Para testar o DHT
Incluir Biblioteca: DHT Sensor Library by Adafruit
e
Incluir Biblioteca: Adafruit Unified Sensor
(a última da lista)
DHT | DHT | Ardu/Proto |
---|---|---|
Saída | Nome | Pin |
1 | VDD/VCC | 5V |
2 | DATA | 7 |
3 | NULL | - |
4 | GND | ground/negativo |
#include "DHT.h"
DHT dht(7, DHT22);
void setup() {
dht.begin();
}
void loop() {
delay(2000);
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Incluir este caso haja mais de um sensor, tirar a média em Celsius
//float hic = dht.computeHeatIndex(t, h, false);
lcd.setCursor(0, 0);
lcd.print("Temperatura ");
lcd.print(t); //referencia ao float
lcd.print("˚C");
lcd.setCursor(0, 1);
lcd.print("Umidade ");
lcd.print(h);
lcd.print("%");
}
lcd.print(t);
quando não coloca entre "aspas", significa que você está referenciado/chamando a variável citada anteriormente.
Os dois código
#include "DHT.h"
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
DHT dht(7, DHT22);
void setup() {
lcd.begin(20, 4);
dht.begin();
}
void loop() {
delay(100);
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
lcd.setCursor(0, 0);
lcd.print("Temperatura ");
lcd.print(t); //referencia ao float
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Umidade ");
lcd.print(h);
lcd.print("%");
}
Para farenheit:
float t = dht.readTemperature(); //Se colocar (true) vira farenheit
dai tbm precisa alterar o if (isnan(h) || isnan(t)) {
para if (isnan(h) || isnan(f))
LDR | Arduino |
---|---|
GND | GND |
VCC | VCC |
const int SensorLuz = A0;
int luz;
void setup() {
}
void loop() {
luz = analogRead(SensorLuz);
luz = map(luz,0,1023,0,100) // ele de fábrica lê de 0 a 1023 e agora vai ler de 0 a 100
lcd.setCursor(0,2);
lcd.print("Luminosidade");
lcd.print(luz);
lcd.print(~);
}
#include "DHT.h"
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
DHT dht(7, DHT22);
const int SensorLuz = A0;
int luz;
void setup() {
lcd.begin(20, 4);
dht.begin();
}
void loop() {
delay(100);
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
lcd.println("Failed");
return;
}
luz = analogRead(SensorLuz);
luz = map(luz,0,1023,0,100); // ele de fábrica lê de 0 a 1023 e agora vai ler de 0 a 100
lcd.setCursor(0, 0);
lcd.print("Temperatura ");
lcd.print(t);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Umidade ");
lcd.print(h);
lcd.print("%");
lcd.setCursor(0, 2);
lcd.print("Luminosidade ");
lcd.print(luz);
lcd.print("% ");
}
float t = dht.readTemperature(); //Se colocar (true) vira farenheit
e luz = map(luz,0,1023,0,100); // ele de fábrica lê de 0 a 1023 e agora vai ler de 0 a 100
Higrômetro | Arduino |
---|---|
GND | GND |
VCC | VCC |
A0 | A1 |
const int SensorUmidade = A1;
int TerraUmidade;
void setup() {
}
void loop() {
TerraUmidade = analogRead(SensorUmidade);
TerraUmidade = map(umidade,0,1023,100,0);
lcd.setCursor(0,3);
lcd.print("Umidade ");
lcd.print(TerraUmidade);
lcd.print("%");
}
//aqui se inverter a posição (umidade,0,1023,0,100) ele vai ler oposto
#include "DHT.h"
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
DHT dht(7, DHT22);
const int SensorLuz = A0;
int luz;
const int SensorUmidade = A1;
int TerraUmidade;
void setup() {
lcd.begin(20, 4);
dht.begin();
}
void loop() {
delay(100);
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
lcd.println("Failed");
return;
}
luz = analogRead(SensorLuz);
luz = map(luz,0,1023,0,100);
TerraUmidade = analogRead(SensorUmidade);
TerraUmidade = map(umidade,0,1023,100,0);
lcd.setCursor(0, 0);
lcd.print("Temperatura ");
lcd.print(t);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Umidade ");
lcd.print(h);
lcd.print("%");
lcd.setCursor(0, 2);
lcd.print("Luminosidade ");
lcd.print(luz);
lcd.print("% ");
lcd.setCursor(0,3);
lcd.print("Umidade ");
lcd.print(TerraUmidade);
lcd.print("%");
}
Existe opção de LED e Rele 5V 1 canal, no rele tem um jumper para definir se ele fica sempre em High ou em Low, repare que no código, ele esta em High
LED | Arduino | Rele |
---|---|---|
VCC | 13 | IN |
GND | resisGND | DC- |
- | VCC | DC+ |
const int valvula = 13;
void setup() {
pinMode(valvula,OUTPUT);
}
void loop() {
if ((TerraUmidade < 50) && (luz < 10)){
digitalWrite (valvula, HIGH);
delay(500);
}
else {
digitalWrite(valvula, LOW);
}
}
#include "DHT.h"
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
DHT dht(7, DHT22);
const int SensorLuz = A0;
int luz;
const int SensorUmidade = A1;
int TerraUmidade;
const int valvula = 13;
void setup() {
lcd.begin(20, 4);
dht.begin();
pinMode(valvula, OUTPUT);
}
void loop() {
delay(100);
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
lcd.println("Failed");
return;
}
luz = analogRead(SensorLuz);
luz = map(luz, 0, 1023, 0, 100);
TerraUmidade = analogRead(SensorUmidade);
TerraUmidade = map(TerraUmidade, 0, 1023, 100, 0);
lcd.setCursor(0, 0);
lcd.print("Temperatura ");
lcd.print(t);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Umidade ");
lcd.print(h);
lcd.print("%");
lcd.setCursor(0, 2);
lcd.print("Luminosidade ");
lcd.print(luz);
lcd.print("% ");
lcd.setCursor(0, 3);
lcd.print("Umidade ");
lcd.print(TerraUmidade);
lcd.print("%");
if ((TerraUmidade < 50) && (luz < 10)) {
digitalWrite (valvula, HIGH);
delay(500);
}
else {
digitalWrite(valvula, LOW);
}
}
Válvula de vasão solenóide água 12VDC ou 110V. A 12VDC, tem uma perna prédefinada para o GND e outra para o VCC
12VDC | Fonte Arduino | Rele |
---|---|---|
VCC | - | NO |
GND | GND | - |
- | VCC | COM |
A porta NO, significa Normalmente Aberto (Normally Open), o circuito está aberto, ou seja, não está dando contato e como consequência, esta desativado.
110V | Tomada | Rele |
---|---|---|
VCC | - | NO |
GND | GND | - |
- | VCC | COM |
//Fora do Setup e do loop
#define numeroLeituras 10
int leituras[numeroLeituras];
int indiceLeitura = 0; //começa no primeiro índice (0) e vai até o 9 = 10
int somaTotal = 0; //soma do indice de leitura
int media = 0; //divide a soma total pelo numero de leituras
//Dentro do setup
//para evitar que o registro abra ao ligar, jogamos o valor de cada índice de leitura do sensor,no máximo
//a cada nova leitura ele aumenta +1 na comparação e roda até 10 e finaliza
for (int i = 0; i < numeroLeituras; i++) {
leituras[i] = 1023;
}
--> Missao: testar esse cálculo:
//Fora do Setup e do loop
//Calculo de inercia da luminosidade, movimentação macia
void calculoLuz() {
for (int i = 0; i < numeroLeituras; i++) {
sum += leituras[i];
return ((float) sum) / numeroLeituras;
}
}