Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // --- Bibliotecas Auxiliares ---
- //Biblioteca para o display LCD
- #include <Wire.h>
- #include <LiquidCrystal_I2C.h>
- // Carrega a biblioteca do cartão de memória
- #include <SPI.h>
- #include <SD.h>
- // Carrega a biblioteca virtuabotixRTC
- #include <virtuabotixRTC.h>
- // Determina os pinos ligados ao modulo
- // myRTC(clock, data, rst)
- virtuabotixRTC myRTC(6, 7, 8);
- // Inclui a biblioteca do sensor DHT
- #include <DHT.h>
- // --- Declaração de variáveis ---
- int sensor1; //variável do sensor 1
- int sensor2; //variável do sensor 2
- int sensor3; //variável do sensor 3
- int sensor4; //variável do sensor 4
- int media; //variável da média
- int soma;
- String status;
- String nivel_umidade; //variável do nível de umidade
- //Variáveis para temporizar o leitor de umidade do solo e outros
- unsigned long tempoAnterior = 0; // Variável utilizada para guardar o tempo anterior
- unsigned long tempoAnterior1 = 0;
- unsigned long intervalo_leitura = 2000; // Intervalo de tempo em MS para cada leitura
- unsigned long intervalo_gravacao = 10000; // Intervalo de tempo em MS para gravação
- int porta_rele = 48; //Porta ligada ao pino IN do módulo rele
- const int chipSelect = 53; // Constante que indica em qual pino está conectado o Chip Select do módulo de comunicação
- // Objeto responsável por escrever/Ler do cartão SD
- File dataFile;
- bool cartaoOk = true;
- // Definição dos pinos para comunicação do sensor
- #define DHTPIN A5 // Define o pino que estamos conectado
- #define DHTTYPE DHT11 //Define o tipo de sensor DHT utilizado
- DHT dht(DHTPIN, DHTTYPE);
- //Array simbolo grau
- byte grau[8] ={ B00001100,
- B00010010,
- B00010010,
- B00001100,
- B00000000,
- B00000000,
- B00000000,
- B00000000,};
- // --- Mapeamento de Hardware ---
- #define butUp 42 //Botão para selecionar tela acima no digital 12
- #define butDown 43 //Botão para selecionar tela abaixo no digital 11
- #define butP 40 //Botão de ajuste mais no digital 10
- #define butM 41 //Botão de ajuste menos no digital 9
- #define Lamp1 A2 //Saída para lâmpada 1 no A0 (será usado como digital)
- #define Lamp2 A3 //Saída para lâmpada 2 no A1 (será usado como digital)
- #define s1 A0 //variável do sensor 1
- #define s2 A1 //variável do sensor 2
- #define s3 A2 //variável do sensor 3
- #define s4 A3 //variável do sensor 4
- // --- Protótipo das Funções Auxiliares ---
- void changeMenu(); //Função para modificar o menu atual
- void dispMenu(); //Função para mostrar o menu atual
- void leitura_sensores(); //Função que realiza a leitura dos sensores
- void data_hora(); //Função do menu1, data e hora
- void temperatura(); //Função do menu2, temperatura
- void lights(); //Função do menu3, acionamento de lampadas
- void imprime_sensores(); //Função do menu4, monitoramento dos sensores
- void bomba(); //Função do menu5, acionamento da bomba de irrigação
- void cartao_de_memoria(); //Função que realiza a gravação no Cartão de memória
- void imprime_data_hora(); //Função que exibe as horas em loop
- // --- Variáveis Globais ---
- char menu = 0x01; //Variável para selecionar o menu
- char set1 = 0x00, set2 = 0x00; //Controle das lâmpadas
- boolean t_butUp, t_butDown, t_butP, t_butM; //Flags para armazenar o estado dos botões
- // --- Hardware do LCD ---
- // Inicializa o display no endereco 0x27
- LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE);
- void setup()
- {
- Serial.begin(9600);
- //Informacoes iniciais de data e hora
- //Apos setar as informacoes, comente a linha abaixo
- //myRTC.setDS1302Time(00, 14, 15, 7, 10, 03, 2018); //(segundos, minutos, hora, dia da semana, dia do mes, mes, ano)
- lcd.begin(16,2); //Inicializa LCD 16 x 2
- lcd.createChar(0, grau); //Cria o caractere customizado com o simbolo do grau
- //Define pinos para o rele como saida
- pinMode(porta_rele, OUTPUT);
- // Verifica comunicação com o cartão SD
- if (!SD.begin(chipSelect)) {
- Serial.println("Erro na leitura do arquivo não existe um cartão SD ou o módulo está conectado corretamente ?");
- cartaoOk = false;
- return;
- }
- //Escreve o Cabeçalho no arquivo datalog.csv
- if (cartaoOk){
- dataFile = SD.open("datalog.csv", FILE_WRITE);
- //logFile.println(", , ,"); //Just a leading blank line, incase there was previous data
- dataFile.println("SENSOR 1; SENSOR 2; SENSOR 3; SENSOR 4; SOMA; MEDIA; DIA DA SEMANA; DIA; MES; ANO; HORAS; MINUTOS; SEGUNDOS; STATUS");
- dataFile.close();
- }
- for(char i=9; i<13; i++) pinMode(i, INPUT_PULLUP); //Entrada para os botões (digitais 9 a 12) com pull-ups internos
- pinMode(Lamp1, OUTPUT); //Configura saída para lâmpada 1
- pinMode(Lamp2, OUTPUT); //Configura saída para lâmpara 2
- t_butUp = 0x00; //limpa flag do botão Up
- t_butDown = 0x00; //limpa flag do botão Down
- t_butP = 0x00; //limpa flag do botão P
- t_butM = 0x00; //limpa flag do botão M
- digitalWrite(Lamp1, LOW); //Lâmpada 1 inicia apagada
- digitalWrite(Lamp2, LOW); //Lâmpada 2 inicia apagada
- } //end setup
- // --- Loop Infinito ---
- void loop()
- {
- changeMenu();
- dispMenu();
- leitura_sensores();
- cartao_de_memoria();
- imprime_data_hora();
- } //end loop
- // --- Desenvolvimento das Funções Auxiliares ---
- void changeMenu() //Modifica o menu atual
- {
- if(!digitalRead(butUp)) t_butUp = 0x01; //Botão Up pressionado? Seta flag
- if(!digitalRead(butDown)) t_butDown = 0x01; //Botão Down pressionado? Seta flag
- if(digitalRead(butUp) && t_butUp) //Botão Up solto e flag setada?
- { //Sim...
- t_butUp = 0x00; //Limpa flag
- lcd.clear(); //Limpa display
- menu++; //Incrementa menu
- if(menu > 0x05) menu = 0x01; //Se menu maior que 6, volta a ser 1
- } //end butUp
- if(digitalRead(butDown) && t_butDown) //Botão Down solto e flag setada?
- { //Sim...
- t_butDown = 0x00; //Limpa flag
- lcd.clear(); //Limpa display
- menu--; //Decrementa menu
- if(menu < 0x01) menu = 0x05; //Se menu menor que 1, volta a ser 6
- } //end butDown
- } //end changeMenu
- void dispMenu() //Mostra o menu atual
- {
- switch(menu) //Controle da variável menu
- {
- // case 0x01: //Caso 6
- // cartao_de_memoria(); //Chama função da bomba
- // break; //break
- case 0x01: //Caso 1
- data_hora(); //Chama a função de relógio
- break; //break
- case 0x02: //Caso 2
- temperatura(); //Chama a função do termômetro
- break; //break
- case 0x03: //Caso 3
- lights(); //Chama função para acionamento de lâmpadas
- break; //break
- case 0x04: //Caso 4
- imprime_sensores(); //Chama função para exibir dados dos sensores
- break; //break
- case 0x05: //Caso 5
- bomba(); //Chama função da bomba
- break; //break
- } //end switch menu
- } //end dispMenu
- void imprime_data_hora() //Função responsável pela impressão da Data e Hora (roda constantemente no loop)
- {
- // Le as informacoes do CI
- myRTC.updateTime();
- } //end data_hora
- void data_hora() //Data e Hora (menu1)
- {
- // Le as informacoes do CI
- myRTC.updateTime();
- // Imprime as informacoes no LCD
- lcd.setCursor(0,0);
- lcd.print("Data e Hora");
- lcd.setCursor(0,1);
- // Chama a rotina que imprime o dia da semana
- //imprime_dia_da_semana(myRTC.dayofweek);
- lcd.print(myRTC.dayofmonth);
- lcd.print("/");
- lcd.print(myRTC.month);
- lcd.print("/");
- lcd.print(myRTC.year-2000);
- lcd.print(" ");
- // Adiciona um 0 caso o valor da hora seja <10
- if (myRTC.hours < 10)
- {
- lcd.print("0");
- }
- lcd.print(myRTC.hours);
- lcd.print(":");
- // Adiciona um 0 caso o valor dos minutos seja <10
- if (myRTC.minutes < 10)
- {
- lcd.print("0");
- }
- lcd.print(myRTC.minutes);
- lcd.print(":");
- // Adiciona um 0 caso o valor dos segundos seja <10
- if (myRTC.seconds < 10)
- {
- lcd.print("0");
- }
- lcd.print(myRTC.seconds);
- } //end data_hora
- void temperatura() //Temperatura (menu2)
- {
- float h = dht.readHumidity(); //Le o valor da umidade
- float t = dht.readTemperature(); //Le o valor da temperatura
- lcd.setCursor(0,0);
- lcd.print("Temp : ");
- lcd.print(" ");
- lcd.setCursor(7,0);
- lcd.print(t,1);
- lcd.setCursor(12,0);
- //Mostra o simbolo do grau formado pelo array
- lcd.write((byte)0);
- //Mostra as informações lidas pelo sensor
- lcd.setCursor(0,1);
- lcd.print("Umid : ");
- lcd.print(" ");
- lcd.setCursor(7,1);
- lcd.print(h,1);
- lcd.setCursor(12,1);
- lcd.print("%");
- } //end temperatura()
- void lights() //Acionamento de lâmpadas (menu3)
- {
- lcd.setCursor(0,0); //Posiciona cursor na coluna 1, linha 1
- lcd.print("Acionar Lampadas"); //Imprime mensagem do menu 3
- if(!digitalRead(butP)) t_butP = 0x01; //Botão P pressionado? Seta flag
- if(!digitalRead(butM)) t_butM = 0x01; //Botão M pressionado? Seta flag
- if(digitalRead(butP) && t_butP) //Botão P solto e flag setada?
- { //Sim...
- t_butP = 0x00; //Limpa flag
- set1++; //Incrementa set1
- if(set1 > 2) set1 = 0x01; //Se maior que 2, volta a ser 1
- switch(set1) //Controle do set1
- {
- case 0x01: //Caso 1
- lcd.setCursor(0,1); //Posiciona cursor na coluna 1, linha 2
- lcd.print("L1 on "); //Imprime mensagem
- digitalWrite(Lamp1, HIGH); //Liga lâmpada 1
- break; //Break
- case 0x02: //Caso 2
- lcd.setCursor(0,1); //Posiciona cursor na coluna 1, linha 2
- lcd.print("L1 off"); //Imprime mensagem
- digitalWrite(Lamp1, LOW); //Desliga lâmpada 1
- break; //Break
- } //end switch set1
- } //end butP
- if(digitalRead(butM) && t_butM) //Botão D solto e flag setada?
- { //Sim...
- t_butM = 0x00; //Limpa flag
- set2++; //Incrementa set2
- if(set2 > 2) set2 = 0x01; //Se maior que 2, volta a ser 1
- switch(set2) //Controle do set2
- {
- case 0x01: //Caso 1
- lcd.setCursor(8,1); //Posiciona cursor na coluna 8, linha 2
- lcd.print("L2 on "); //Imprime mensagem
- digitalWrite(Lamp2, HIGH); //Liga lâmpada 2
- break; //Break
- case 0x02: //Caso 2
- lcd.setCursor(8,1); //Posiciona cursor na coluna 8, linha 2
- lcd.print("L2 off"); //Imprime mensagem
- digitalWrite(Lamp2, LOW); //Liga lâmpada 1
- break; //Break
- } //end switch set1
- } //end butM
- } //end lights
- void leitura_sensores() //Função sensores menu (4)
- {
- //Função que realiza a gravação no Cartão de memória
- unsigned long tempoAtual = millis(); // Realizamos a leitura atual do tempo em que o nosso Arduino Nano está ligado
- if (tempoAtual-tempoAnterior1 > intervalo_leitura){ // Pequena lógica para realizar leituras temporizadas sem parar o microcontrolador
- tempoAnterior1=tempoAtual; // Guardamos o tempo anterior como o ultimo intervalo de tempo lido
- //Realiza as leituras dos sensores
- sensor1 = analogRead(s1);
- sensor2 = analogRead(s2);
- sensor3 = analogRead(s3);
- sensor4 = analogRead(s4);
- //Calcula a soma
- soma = sensor1+sensor2+sensor3+sensor4;
- //Calcula a média
- media = soma/4;
- //Faz a comparação dos valores obtidos pelos sensores e dispara o comando para ligar o rele
- if (media<=160 && media>=80){ // Se a leitura feita for um valor entre 80 e 160 podemos definir que o solo está com uma baixa condutividade, logo a planta deve ser regada
- digitalWrite(porta_rele, LOW); //Liga o rele
- Serial.println("Nível de Umidade Baixo");
- nivel_umidade = ("Umidade Baixa");
- }else{
- if (media<=240 && media>=161){ // Se a leitura feita for um valor entre 161 e 240 podemos definir que o solo está com um nível médio de umidade, logo dependendo da planta pode ou não ser vantajoso regar
- digitalWrite(porta_rele, HIGH); //Desliga o rele
- Serial.println("Nível de Umidade Médio");
- nivel_umidade = ("Umidade Media");
- }
- else{
- if (media<=500 && media>=241){ // Se a leitura feita for um valor entre 241 e 500 podemos definir que o solo está com um nível aceitável de umidade, logo talvez não seja interessante regar neste momento
- Serial.println("Nível de Umidade Alto");
- nivel_umidade = ("Umidade Alta");
- }
- }
- }
- }
- } //end menu4
- void imprime_sensores() //Função que exibe informações dos sensores
- {
- //limpa a terceira casa se a media for menor que 100
- if (media<100){
- lcd.setCursor(2,0);
- lcd.print(" ");
- }
- lcd.setCursor(0,0);
- lcd.print(media);
- lcd.setCursor(0,1);
- lcd.print(nivel_umidade);
- }//end imprime_sensores
- void bomba() //Acionamento da bomba (menu5)
- {
- lcd.setCursor(0,0); //Posiciona cursor na coluna 1, linha 1
- lcd.print("Acionar Bomba?"); //Imprime mensagem do menu 3
- if(!digitalRead(butP)) t_butP = 0x01; //Botão P pressionado? Seta flag
- if(!digitalRead(butM)) t_butM = 0x01; //Botão M pressionado? Seta flag
- if(digitalRead(butP) && t_butP) //Botão P solto e flag setada?
- { //Sim...
- t_butP = 0x00; //Limpa flag
- set1++; //Incrementa set1
- if(set1 > 2) set1 = 0x01; //Se maior que 2, volta a ser 1
- switch(set1) //Controle do set1
- {
- case 0x01: //Caso 1
- lcd.setCursor(12,1);
- lcd.print(" ");
- lcd.setCursor(0,1); //Posiciona cursor na coluna 1, linha 2
- lcd.print("Bomba Ligada"); //Imprime mensagem
- digitalWrite(porta_rele, LOW); //Liga o rele 1
- break; //Break
- case 0x02: //Caso 2
- lcd.setCursor(0,1); //Posiciona cursor na coluna 1, linha 2
- lcd.print("Bomba Desligada"); //Imprime mensagem
- digitalWrite(porta_rele, HIGH); //Desliga o rele 1
- break; //Break
- } //end switch set1
- } //end butP
- if(digitalRead(butM) && t_butM) //Botão D solto e flag setada?
- { //Sim...
- t_butM = 0x00; //Limpa flag
- set2++; //Incrementa set2
- if(set2 > 2) set2 = 0x01; //Se maior que 2, volta a ser 1
- switch(set2) //Controle do set2
- {
- case 0x01: //Caso 1
- lcd.setCursor(8,1); //Posiciona cursor na coluna 8, linha 2
- lcd.print("L2 on "); //Imprime mensagem
- digitalWrite(Lamp2, HIGH); //Liga lâmpada 2
- break; //Break
- case 0x02: //Caso 2
- lcd.setCursor(8,1); //Posiciona cursor na coluna 8, linha 2
- lcd.print("L2 off"); //Imprime mensagem
- digitalWrite(Lamp2, LOW); //Liga lâmpada 1
- break; //Break
- } //end switch set1
- } //end butM
- } //end bomba
- void cartao_de_memoria() //Função grava as informções dos sensores no cartão de memória
- {
- //Função que realiza a gravação no Cartão de memória
- unsigned long tempoAtual = millis(); // Realizamos a leitura atual do tempo em que o nosso Arduino Nano está ligado
- if (tempoAtual-tempoAnterior > intervalo_gravacao){ // Pequena lógica para realizar leituras temporizadas sem parar o microcontrolador
- tempoAnterior=tempoAtual; // Guardamos o tempo anterior como o ultimo intervalo de tempo lido
- //Grava os dados dos sensores no cartão de memória
- if (cartaoOk){
- dataFile = SD.open("datalog.csv", FILE_WRITE);
- }
- //Limpando Variáveis
- String leitura = ""; // Limpo campo contendo string que será armazenada em arquivo CSV
- // Caso os valores lidos do sensor não sejam válidos executamos as seguintes linhas
- if (isnan(sensor1) || isnan(sensor2) || isnan(sensor3) || isnan(sensor4)){
- return ; // Retornamos a função para o seu ponto inicial
- }
- // Se tudo estiver ok, escrevemos os dados a serem armazenados em uma String
- leitura = String(sensor1) + ";" + String(sensor2) + ";" + String(sensor3) + ";" + String(sensor4) + ";" + String(soma) + ";" + String(media) + ";" + String(myRTC.dayofweek) + ";" + String(myRTC.dayofmonth) + ";" + String(myRTC.month) + ";" + String(myRTC.year) + ";" + String(myRTC.hours) + ";" + String(myRTC.minutes) + ";" + String(myRTC.seconds) + ";" + String(status) + ";";
- // Se o arquivo estiver realmente aberto para leitura executamos as seguintes linhas de código
- if (dataFile) {
- // Serial.println(leitura); // Mostramos no monitor a linha que será escrita
- dataFile.println(leitura); // Escrevemos no arquivos e pulamos uma linha
- dataFile.close(); // Fechamos o arquivo
- }
- }
- } //end cartao_de_memória
- //pode-se implementar quantos menus quiser
- //............
- /*void imprime_dia_da_semana(int dia)
- {
- switch (dia)
- {
- case 1:
- Serial.print("Domingo");
- break;
- case 2:
- Serial.print("Segunda");
- break;
- case 3:
- Serial.print("Terca");
- break;
- case 4:
- Serial.print("Quarta");
- break;
- case 5:
- Serial.print("Quinta");
- break;
- case 6:
- Serial.print("Sexta");
- break;
- case 7:
- Serial.print("Sabado");
- break;
- }
- }
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement