Sistema De Irrigação Automática Feito Com Arduino

by Bovokaiser in Circuits > Arduino

22 Views, 0 Favorites, 0 Comments

Sistema De Irrigação Automática Feito Com Arduino

Raphanus_sativus.jpg

O projeto consta com um sistema de verificação de umidade do solo, armazenamento de informações e rega de plantios de forma autonoma

Supplies


1 Placa Arduino UNO R3

2 Sensores de umidade resistivos

1 Adaptador jack

1 Módulo relé de 2 canais com optoacoplador

2 Protoboard

1 Módulo Micro SD

1 Fonte 5V 1A com saída jack

1 Fonte 9V 1A com saída jack

2 Mini-bombas de água 1,5L/min

40 Jumpers macho-macho

40 Jumpers macho-fêmea

2m cano silicone 4mm


Conexões

Faça as seguintes conexões:

Sensor 1:

VCC → Linha 5V da protoboard

GND → Linha GND da protoboard

AO → A0

Sensor 2:

VCC → Linha 5V da protoboard

GND → Linha GND da protoboard

AO → A1

Módulo SD:

VCC → Linha 5V da protoboard

GND → Linha GND da protoboard

MOSI → D11

MISO → D12

SCK → D13

CS → D4

Módulo Relé:

IN1→D8

IN2→D9

Pino VCC-JD → Postivo da Fonte 5V

Pino GND→ Negativo da Fonte 5V

Pino VCC→ Linha 5V da protoboard

Calibração

Obtenha os dados de calibração utilizando o código abaixo no arduino:

const int PINO_SENSOR_1 = A0;
const int PINO_SENSOR_2 = A1;

void setup() {
Serial.begin(9600);
Serial.println("--- Calibracao de Sensores ---");
}

void loop() {
int valorSensor1 = analogRead(PINO_SENSOR_1);
int valorSensor2 = analogRead(PINO_SENSOR_2);

Serial.print("Sensor 1: ");
Serial.print(valorSensor1);
Serial.print(" | Sensor 2: ");
Serial.println(valorSensor2);

delay(1000);
}

Código Arduino

Altere a const LIMIAR_SECURA_VASO_1 e LIMIAR_SECURA_VASO_2 para as variaveis obtidas no último passo e carregue o código no arduino:

#include <SPI.h>
#include <SD.h>

const int PINO_SENSOR_VASO_1 = A0;
const int PINO_SENSOR_VASO_2 = A1;
const int PINO_RELE_BOMBA_1 = 8;
const int PINO_RELE_BOMBA_2 = 9;
const int PINO_CS_SD = 4;

const int LIMIAR_SECURA_VASO_1 = 750;
const int LIMIAR_SECURA_VASO_2 = 780;
const unsigned long DURACAO_IRRIGACAO_MS = 800;
const unsigned long INTERVALO_MINIMO_IRRIGACAO_MS = 6 * 60 * 60 * 1000UL;

const char* NOME_ARQUIVO_LOG = "datalog.csv";

unsigned long tempoUltimaIrrigacaoVaso1 = 0;
unsigned long tempoUltimaIrrigacaoVaso2 = 0;

void setup() {
Serial.begin(9600);
while (!Serial);

pinMode(PINO_RELE_BOMBA_1, OUTPUT);
pinMode(PINO_RELE_BOMBA_2, OUTPUT);
digitalWrite(PINO_RELE_BOMBA_1, HIGH);
digitalWrite(PINO_RELE_BOMBA_2, HIGH);

Serial.print("Inicializando cartao SD...");
if (!SD.begin(PINO_CS_SD)) {
Serial.println(" falhou!");
while (1);
}
Serial.println(" OK.");

if (!SD.exists(NOME_ARQUIVO_LOG)) {
Serial.println("Criando arquivo de log...");
File arquivoLog = SD.open(NOME_ARQUIVO_LOG, FILE_WRITE);
if (arquivoLog) {
arquivoLog.println("Uptime_ms,ID_Vaso,Umidade_Lida,Duracao_Irrigacao_ms");
arquivoLog.close();
Serial.println("Arquivo criado.");
} else {
Serial.println("Erro ao criar arquivo.");
}
} else {
Serial.println("Arquivo de log encontrado.");
}
}

void loop() {
verificarVaso1();
verificarVaso2();
delay(1000);
}

void verificarVaso1() {
unsigned long tempoAtual = millis();
int umidadeAtual = analogRead(PINO_SENSOR_VASO_1);
Serial.print("Vaso 1 - Umidade: ");
Serial.println(umidadeAtual);

bool tempoMinimoAtingido = (tempoAtual - tempoUltimaIrrigacaoVaso1 >= INTERVALO_MINIMO_IRRIGACAO_MS);
bool nuncaIrrigou = (tempoUltimaIrrigacaoVaso1 == 0);

if (tempoMinimoAtingido || nuncaIrrigou) {
if (umidadeAtual > LIMIAR_SECURA_VASO_1) {
executarIrrigacao(1, PINO_RELE_BOMBA_1, umidadeAtual);
tempoUltimaIrrigacaoVaso1 = millis();
} else {
registrarLogNoSD(1, umidadeAtual, 0);
}
} else {
registrarLogNoSD(1, umidadeAtual, 0);
}
}

void verificarVaso2() {
unsigned long tempoAtual = millis();
int umidadeAtual = analogRead(PINO_SENSOR_VASO_2);
Serial.print("Vaso 2 - Umidade: ");
Serial.println(umidadeAtual);

bool tempoMinimoAtingido = (tempoAtual - tempoUltimaIrrigacaoVaso2 >= INTERVALO_MINIMO_IRRIGACAO_MS);
bool nuncaIrrigou = (tempoUltimaIrrigacaoVaso2 == 0);

if (tempoMinimoAtingido || nuncaIrrigou) {
if (umidadeAtual > LIMIAR_SECURA_VASO_2) {
executarIrrigacao(2, PINO_RELE_BOMBA_2, umidadeAtual);
tempoUltimaIrrigacaoVaso2 = millis();
} else {
registrarLogNoSD(2, umidadeAtual, 0);
}
} else {
registrarLogNoSD(2, umidadeAtual, 0);
}
}

void executarIrrigacao(int idVaso, int pinoRele, int umidadeDoDisparo) {
Serial.print("Iniciando irrigacao para o Vaso ");
Serial.println(idVaso);

digitalWrite(pinoRele, LOW);
registrarLogNoSD(idVaso, umidadeDoDisparo, DURACAO_IRRIGACAO_MS);
delay(DURACAO_IRRIGACAO_MS);
digitalWrite(pinoRele, HIGH);

Serial.print("Irrigacao para o Vaso ");
Serial.print(idVaso);
Serial.println(" concluida.");
}

void registrarLogNoSD(int idVaso, int umidade, unsigned long duracao) {
File arquivoLog = SD.open(NOME_ARQUIVO_LOG, FILE_WRITE);
if (arquivoLog) {
String linhaDeDados = String(millis()) + "," + String(idVaso) + "," + String(umidade) + "," + String(duracao);
arquivoLog.println(linhaDeDados);
arquivoLog.close();
Serial.print("Log registrado: ");
Serial.println(linhaDeDados);
} else {
Serial.println("Erro ao abrir o arquivo de log para escrita!");
}
}

Ligue O Sistema

Conecte as bombas de água aos canos, aptando o tamanho se necessário, e ligue o sistema.