Robótica Livre
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Ir para baixo
alvaro 123456
alvaro 123456
Mensagens : 476
Data de inscrição : 27/04/2019
Idade : 17

Programa da Horta Empty Programa da Horta

Sáb Jun 03, 2023 8:49 pm
...


Última edição por alvaro 123456 em Sáb Jun 10, 2023 2:43 pm, editado 3 vez(es)
Paulo Augusto Batista
Paulo Augusto Batista
Admin
Mensagens : 5039
Data de inscrição : 11/02/2019
Idade : 52
Escola : Colegio Lindaura
https://roboticalivre.forumeiros.com

Programa da Horta Empty Re: Programa da Horta

Dom Jun 04, 2023 11:55 am
Oi Alvaro, muito bom, demonstra muita evolução como programador. Estou adaptando seu código para fazer o setup.
- Dai instalei a briblioteca DHT Sensor Library e reconheceu o DHT
- No liquidCrystal não deu, vai precisar da biblioteca Liquid Crystal I2C , dai os comandos deram certo.
- Outro detalhe de compatibilização, são os nomes dados para os pinos no #define, seria legal se ficassem com os mesmos nomes do simulador. Apesar de não interferir no programa, vai facilitar a identificação na hora de programar. Então tomei a liberdade de mudar.
- Outro detalhe é o controle do tempo, pode fazer no loop() para chamar as funções ou dentro de cada função testar os tempos. Por exemplo, gravar no cartão SD vai ser a cada 10 minutos, ler a temperatura a cada 1 minuto, checar a humidade do solo a cada 30 minutos, e assim por diante.
- O LED de potencia chamado de carga, será acionado pela potencia de 0 a 100, então precisa considerar essa forma de acionamento. Chama a função com a potencia que quer colocar.
Paulo Augusto Batista
Paulo Augusto Batista
Admin
Mensagens : 5039
Data de inscrição : 11/02/2019
Idade : 52
Escola : Colegio Lindaura
https://roboticalivre.forumeiros.com

Programa da Horta Empty Re: Programa da Horta

Dom Jun 04, 2023 12:01 pm
Fiz uns complementos, arrumei o nome dos pinos, coloquei a função de acionamento da carga e interrupção
Veja que nela estou controlando o tempo dentro da função.
Não corrigi todos os defeitos, ainda tem que repassar muito erro de sentaxe

Código:
/*
* CONCURSO AGRINHO 2023
* Objetivo: Estufa automatizada.
* Hardware: Montar sensores no arduino nano e fazer o monitoramento.
* Comandos: analogRead(); analogWrite(); if(); map(); cartão SD; bluetooth; entre outros
* Descritivo: A estufa sustentável automatizada consiste em:

      1. Leitura de umidade e temperatura da estufa.
      2. Controle de temperatura com coolers.
      3. Monitoramento dos níveis de dióxido de carbono.
      4. Leitura da umidade do solo e acionamento da bomba d'água se abaixo do limite.
      5. Comparação da temperatura interna com a externa para climatização ou acionamento do LED de espectro.
      6. Leitura de luminosidade para controle do LED de espectro.
      7. Armazenamento dos dados dos sensores no cartão SD para análise.                    

Referencias Bibliográficas:
* 01 - https://lobodarobotica.com/blog/ler-temperatura-e-umidade-com-arduino-e-o-dht11/
* 02 - https://blogmasterwalkershop.com.br/arduino/como-usar-com-arduino-sensor-detector-de-gas-inflamavel-fumaca-mq-2
* 03 - https://www.usinainfo.com.br/blog/projeto-arduino-de-irrigacao-automatica-sua-planta-sempre-bem-cuidada/
*
*/

//---------------------------------------------------------GREEN LIFE-------------------------------------------------------------------------------------
#include <Servo.h>

#include <Wire.h>
#include <LiquidCrystal_I2C.h>  // Inclui a biblioteca LiquidCrystal para controlar o display LCD

#include <SD.h>  // Inclui a biblioteca SD para acesso ao cartão SD
#include <SPI.h> // Inclui a biblioteca SPI para comunicação com o cartão SD

#include <DHT.h>  // Inclui a biblioteca DHT para leitura do sensor de temperatura e umidade
#include <DHT_U.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

#define pinAmostraEletrica 2  // Amostra da rede para sincronizar em fase
#define pinServo           3  // Define o pino do servo para direcionar o calor para dentro da estufa
#define pinDhtExt          4  // Sensor de umidade e temperatura fora da estufa
#define pinBombaExt        5  // Aciona a bomba de irrigação fora da estufa
#define pinBombaInt        6  // Aciona a bomba de irrigação dentro da estufa
#define pinDhtInt          7  // Sensor de umidade e temperatura dentro da estufa
#define pinCarga           8  // Aciona o Led de potencia
#define pinCooler          9  // Liga os ventiladores para exaustao e resfriamento do LED
#define pinTecla1          10 // Tecla UP
#define pinMOSI            11 // Pino de comunicacao com cartão SD
#define pinMISO            12 // Pino de comunicacao com cartão SD
#define pinTecla2          13 // Tecla DOWN
#define DHTTYPE            DHT11  // Define o tipo de sensor DHT (DHT11)
#define pinLdrExt          A0  // Sensor de luminosodade Externo
#define pinLdrInt          A1  // Sensor de luminosodade Interno
#define pinNtcCooler1      A2  // Sensor de Temperatura do COOLER1
#define pinNtcCooler1      A3  // Sensor de Temperatura do COOLER2
#define pinSDA             A4  // comunicação i2c SDA
#define pinSCL             A5  // comunicacao i2c SCL
#define pinHumSoloExt      A6  // Sensor de humidade do solo fora da estufa
#define pinHumSoloInt      A7  // Sensor de humidade do solo dentro da estufa

DHT dhtInt(pinDhtInt, DHTTYPE);  // Cria uma instância do objeto DHT com o pino do sensor de umidade e o tipo de sensor
DHT dhtExt(pinDhtExt, DHTTYPE);  // Cria uma instância do objeto DHT com o pino do sensor de umidade e o tipo de sensor

File dataFile;  // Cria um objeto do tipo File para manipulação de arquivos no cartão SD
Servo servoMotor; // Cria um objeto Servo

//DECLARAcAO DE VARIAVEIS DE CONTROLE DA CARGA
volatile int potencia = 4000;   //variavel para guardar a potencia enter 0 e 8333
volatile long tempo0rad; //Variavel que vai guardar o momento que a senoide da rede elétrica passou pelo zero volts
volatile long disparo; // guarda o resultado da conta do tempo que deve ser disparado o TRIAC conforme potencia
volatile int periodo = 1000000/120; // assume o valor do periodo de 60Hz que é retificado vira 120HZ e igual a 8333,33 microsegundos
int pulso = 100; //pulso de 100 microsegundos para disparo, datasheet informa que acima de 2us é suficiente
volatile byte interrompido = 0; //variavel de controle da interrupção, disparo e fim do pulso após o periodo programado

float umidade          = 0;  // Variável para armazenar o valor da umidade do ar

byte ValorDoLDR        = 0;  // Variável para armazenar o valor do sensor de luminosidade

//Variaveis da temperatura da estufa
float temperatura      = 0;  // Variável para armazenar o valor da temperatura

float tempMax          = 25;  // Variável para armazenar o valor máximo da temperatura
float tempMin          = 10;  // Variável para armazenar o valor mínimo da temperatura

//Variaveis da umidade do solo
float umidade_Do_Solo  = 0;  // Variável para armazenar o valor da umidade do solo

float maxSolo          = 90;  // Variável para armazenar o valor da umidade máxima do solo
float minSolo          = 70;  // Variável para armazenar o valor da umidade mínimo do solo

//Variaveis do C02 da estufa
int valor_CO2          = 0;  // Variável para armazenar o valor do sensor de dióxido de carbono

int miniCO2            = 250;  // Valor mínimo de dióxido de carbono desejado
int maxCO2            = 1200;  // Valor máximo de dióxido de carbono desejado

void setup() {
  // Inicializações

  servoMotor.attach(ServoM); // Anexa o objeto servoMotor ao ServoM
  dht.begin();  // Inicializa o sensor DHT
  Serial.begin(9600);  // Inicializa a comunicação serial
  lcd.begin(16, 2);  // Inicializa o display LCD com 16 colunas e 2 linhas

  pinMode(sol, OUTPUT);  // Configurado como saída
  pinMode(ventilador, OUTPUT);  // Configurado como saída
  pinMode(Bomba_Da_Agua, OUTPUT);  // Configurado como saída

  if (!SD.begin(chipSet)) {
    Serial.println("Falha na inicialização do cartão SD.");  // Imprime mensagem de erro no caso de falha na inicialização do cartão SD
    return;

  pinMode(pinAmostraEletrica, INPUT); //pino que vai receber o resultado do comparador de tensão
  pinMode(pinCarga, OUTPUT);          //pino que vai ser usado para disparar o TRIAC, controlador de potencia
  attachInterrupt(0, carga, FALLING); //Habilita a interrupção
  }
}

// Função da Interrupção
void carga(){  
  tempo0rad = micros(); //guarda o tempo em que ocorreu a interrupção, aqui sincroniza com a rede elétrica
  interrompido = 1; //quando igual a 1 informa que foi interrompido
  disparo = tempo0rad + potencia; // valor do tempo que deve realizar o disparo do TRIAC
}

void acionaCarga(){
  if(micros() > disparo and interrompido == 1){ //Quando passar do tempo do disparo
    if(micros() - tempo0rad > potencia / 2){    // Controle do erro, se isso não for verdade é erro
      digitalWrite(pinCarga, HIGH);   //Aciona o pino que vai fazer o disparo do TRIAC e transferir a tensão para a carga
      interrompido = 2;    // Informa que foi disparado
    }
  }
  if(micros() > disparo + pulso and interrompido == 2){ //Se foi disparado e o tempo do pulso foi cumprido
    digitalWrite(pinCarga, LOW); //Baixa o sinal do pino de disparo (linha vermelha do osciloscopio no video)
    interrompido = 0;    // Informa que acabou o ciclo e aguarda nova interrupção.
  }

void ValorDaUmidade() {
  /*
  Função que faz a análise da umidade do ambiente e toma uma ação correspondente
  */
  umidade = dhtInt.readHumidity();  // Lê o valor da umidade do sensor DHT
  if (!isnan(umidade)) {  // Verifica se o valor de umidade é válido
    lcd.setCursor(0, 0);  // Define a posição do cursor no display LCD
    lcd.print(umidade);  // Imprime o valor da umidade no display LCD
    lcd.print(" % ");  // Imprime o símbolo de porcentagem no display LCD

    if (umidade <= 30) {  // Verifica se a umidade está abaixo ou igual ao valor mínimo desejado
      Serial.print("Níveis de umidade baixos!");  // Imprime uma mensagem no monitor serial
    }
  } else {
    Serial.println("Falha na leitura do sensor DHT11");  // Imprime uma mensagem de erro no monitor serial no caso de falha na leitura do sensor DHT11
  }
}

void ValorDaTemperatura() {
  /*
  Função que faz a análise da temperatura do ambiente e toma uma ação correspondente
  */
  temperatura = dhtInt.readTemperature();  // Lê o valor da temperatura do sensor DHT
  if (!isnan(temperatura)) {  // Verifica se o valor da temperatura é válido
    lcd.setCursor(8, 0);  // Define a posição do cursor no display LCD
    lcd.print(temperatura);  // Imprime o valor da temperatura no display LCD
    lcd.print(" °C ");  // Imprime o símbolo de grau Celsius no display LCD

    if (temperatura > tempMax) {  // Verifica se a temperatura está acima ou igual ao valor mínimo desejado
      Serial.println("Ligando o ventilador");  // Imprime uma mensagem no monitor serial
      digitalWrite(ventilador, HIGH);  // Liga o motor de água
        servoMotor.write(90); // O servo rotaciona 90 graus
    } else if(temperatura < tempMin) { // E se a temperatura for menor que a tempMin
      servoMotor.write(180); // O servo rotaciona 90 graus
      digitalWrite(ventilador, LOW);  // Desliga o motor de água
      digitalWrite(sol, HIGH); // liga o motor de água
    }
  } else {
    Serial.println("Falha na leitura do sensor DHT11");  // Imprime uma mensagem de erro no monitor serial no caso de falha na leitura do sensor DHT11
  }
}

void Dioxido_de_Carbono() {
  /*
  Função que faz a análise do dióxido de carbono e toma uma ação correspondente
  */
  valor_CO2 = map(analogRead(Sensor_de_Carbono), 0, 1023, 0, 255);  // Lê o valor do sensor de CO2 e o mapeia para um valor entre 0 e 255
  lcd.setCursor(0, 1);  // Configura o cursor do LCD na linha 1, coluna 0
  lcd.print(valor_CO2);  // Exibe o valor do CO2 no LCD
  lcd.print(" ep ");  // Exibe a unidade de medida no LCD
  if (miniCO2 < valor_CO2) {  // Verifica se o valor do CO2 está abaixo do mínimo definido
    Serial.print("Níveis de CO2 baixos");  // Exibe a mensagem no monitor serial
  } else if (maxCO2 > valor_CO2) {  // Verifica se o valor do CO2 está acima do máximo definido
    Serial.print("Níveis de CO2 altos");  // Exibe a mensagem no monitor serial
    analogWrite(ventilador, valor_CO2);  // Liga o motor de água usando a intensidade do CO2 como sinal PWM
  }
}

void ValorDaUmidadeDoSolo() {
  /*
  Função que faz a análise da umidade do solo e toma uma ação correspondente
  */
  umidade_Do_Solo = map(analogRead(pinHumSoloInt), 0, 1023, 255, 0);  // Lê o valor da umidade do solo e o mapeia para um valor entre 255 e 0
  lcd.setCursor(0, 1);  // Configura o cursor do LCD na linha 1, coluna 0
  lcd.print("Solo ");  // Exibe a mensagem no LCD
  lcd.print(umidade_Do_Solo);  // Exibe o valor da umidade do solo no LCD
  lcd.print(" % ");  // Exibe a unidade de medida no LCD
  if (umidade_Do_Solo < minSolo) {  // Verifica se o valor da umidade do solo está abaixo de minSolo
    analogWrite(pinBombaInt, umidade_Do_Solo);  // Liga o motor da bomba de água usando a intensidade da umidade do solo como sinal PWM
  } else if(umidade_Do_Solo > maxSolo) { //E se o valor da umidade do solo for maior que maxSolo
    digitalWrite(pinBombaInt, LOW);  // Desliga o motor da bomba de água
  }
}

void ValorDaTemp() {
  /*
  Função que faz a análise das temperaturas do exterior e interior e toma uma ação correspondente
  */
  ValorDoNTC = map(analogRead(pinNtcCooler1), 0, 1023, 0, 255);  // Lê o valor do sensor de temperatura externa e o mapeia para um valor entre 0 e 255
  Serial.print("Valor da temperatura no exterior ");  // Exibe a mensagem no LCD
  Serial.print(ValorDoNTC);  // Exibe o valor da temperatura externa no monitor serial
  if (temperatura > ValorDoNTC) {  // Verifica se a temperatura interna é maior que a temperatura externa
    analogWrite(pinCooler, ValorDoNTC);  // Liga o motor do ventilador usando a
    } else { //Senão
      digitalWrite(pinCooler, LOW);  // Desliga o motor de água
    }

}

void AcendeLuz() {
  /*
  Função responsável por acender o LED conforme a luminosidade
  */
  ValorDoLDR = map(analogRead(ldr), 0, 1023, 255, 0);  // Lê o valor do sensor de luminosidade e o mapeia para um valor entre 255 e 0
  Serial.print("Valor da intensidade luminosa ");
  Serial.print(ValorDoLDR);  // Exibe o valor da intensidade luminosa no monitor serial
  if (analogRead(pinLdrInt) < 50) {  // Verifica se a intensidade luminosa está abaixo de 50
    analogWrite(pinCarga, ValorDoLDR);  // Acende o LED utilizando a intensidade luminosa como sinal PWM
  } else {  //Senão
    digitalWrite(pinCarga, LOW);  // Desliga o LED
  }
}

void Grava_SD() {
  /*
  Cria uma pasta no cartão SD para guardar os dados para análise futura
  */
  dataFile = SD.open("Analise.csv", FILE_WRITE);  // Abre o arquivo "Analise.csv" no cartão SD para escrita
 
  if (dataFile) {
    dataFile.print(umidade_Do_Solo);  // Escreve o valor da umidade do solo no arquivo
    dataFile.print(",");
    dataFile.print(umidade);  // Escreve o valor da umidade no arquivo
    dataFile.print(",");
    dataFile.println(temperatura);  // Escreve o valor da temperatura no arquivo
    dataFile.print(",");
    dataFile.print(valor_CO2);  // Escreve o valor do CO2 no arquivo
    dataFile.print(",");
    dataFile.println(ValorDoNTC);  // Escreve o valor da temperatura externa no arquivo
    dataFile.print(",");
    dataFile.println(ValorDoLDR);  // Escreve o valor da intensidade luminosa no arquivo
    dataFile.print(",");
    dataFile.close();  // Fecha o arquivo
  } else {
    Serial.println("Erro ao abrir o arquivo.");  // Exibe uma mensagem de erro no monitor serial caso não seja possível abrir o arquivo
  }
}

void loop() {
  /*
  O loop chama todas as funções do programa
  */
  acionaCarga();
  ValorDaUmidade();
  ValorDaTemperatura();
  Dioxido_de_Carbono();
  ValorDaUmidadeDoSolo();
  ValorDaTemp();
  AcendeLuz();
  Grava_SD();
}

lucca senn dallagassa gosta desta mensagem

Conteúdo patrocinado

Programa da Horta Empty Re: Programa da Horta

Ir para o topo
Tópicos semelhantes
Permissões neste sub-fórum
Não podes responder a tópicos