Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // http://labdegaragem.com/forum/topics/ajuda-com-timer?page=6&commentId=6223006%3AComment%3A481438&x=1#6223006Comment481438
- /*
- Nome do Projeto: irrigação03
- Nome do Aquivo: irrigação03.ino
- Dependências: Wire.h
- LiquidCrystal.h
- DS1307.h
- MCU: Atmega
- Board: Arduino
- Compilador Arduino
- IDE: Arduino 1.0.6
- Hardware: Arduino UNO
- Escrito por: Rui Viana
- Data: 03/10/2015
- Uso: Didático
- Desenhos N/A
- Copyright @ N/A
- Este programa é software livre;
- e é distribuído na esperança que possa ser útil, mas SEM QUALQUER GARANTIA;
- mesmo sem a garantia implícita de COMERCIALIZAÇÃO ou ADEQUAÇÃO A UM DETERMINADO FIM.
- REVISIONS: (latest entry first)
- 2015-03-10 - irrigação03 - First release
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Descrição:
- Programa para sistema de irrigação usando DS1307.
- Funcionamento:
- Ao ligar o sistema, o relógio do RTC deverá ser acertado para a hora correta.
- Após isto o operador deverá entrar com os valores:
- Dia da semana que deverão ocorrer as irrigações;
- Número de Irrigações diárias (até 3);
- Dias da semana que deverão ocorrer as irrigações
- Hora/minuto/segundo do inicio das irrigações diárias;
- Duração das irrigações.
- Após isto o operador aperta Início para começar o contrôle.
- Ai inicia a rotina principal que fica lendo o relogio, mostrando no LCD
- e salvando em Ano/Mes/Dia/DiadaSemana/Hora/Minuto/Segundo.
- Em seguida fica verificando se o o dia da semana tem irrigação programada
- (Se não tiver irrigação planejada para o dia, o valor deve ser 8) e chama a rotina que comparando com o valor
- lido da matriz de controle de irrigação.
- Se coincidir, entra na rotina de irrigar, usando o tempo definido na duração.
- Executa a irrigação nos 3 setores e volta para a rotina principal.
- Durante a irrigação não há necessidade de verificar o horário de irrigação novamente.
- */
- // Definicoes ---------------------------------------------------------------
- #include "Wire.h"
- #include <LiquidCrystal.h> // Biblioteca do LCD
- #define Bomba 10 // variavel e pino do rele da bomba
- #define vs1 6 // variavel e pino do rele do setor1
- #define vs2 7 // variavel e pino do rele do setor2
- #define vs3 8 // variavel e pino do rele do setor3
- #define vs4 9 // variavel e pino do rele do setor4
- #define DS1307_ADDRESS 0x68
- LiquidCrystal lcd(12, 11, 5, 4, 3, 2);//Portas do lcd
- byte Ir = 3; // Numero de irrigaçoes
- byte Di[7] = {0,1,2,3,8,8,8}; // Dias Semana programados (8 Não será ativado o sistema)
- byte Ho[] = {9,17,21}; // Horas programadas
- byte Mn[] = {8,34,47}; // Minutos programados
- byte Se[] = {2,22,54}; // Segundos programados
- int ano;
- byte mes;
- byte diadomes;
- byte diadasemana;
- byte horas;
- byte minutos;
- byte segundos;
- long Tempo = 100;
- long Duracao;
- byte zero = 0x00;
- // Setup --------------------------------------------------------------
- void setup()
- {
- Wire.begin();
- Serial.begin(9600);
- lcd.begin(16, 2); // iniciando o lcd
- //A linha abaixo pode ser retirada apos setar a data e hora
- SelecionaDataeHora();
- }
- // SetTime ------------------------------------------------------------
- void SelecionaDataeHora() //Seta a data e a hora do DS1307
- {
- byte segundos = 40; //Valores de 0 a 59
- byte minutos = 59; //Valores de 0 a 59
- byte horas = 23; //Valores de 0 a 23
- byte diadasemana = 1; //Valores de 0 a 6 - 0=Domingo, 1 = Segunda, etc.
- byte diadomes = 17; //Valores de 1 a 31
- byte mes = 4; //Valores de 1 a 12
- byte ano = 13; //Valores de 0 a 99
- Wire.beginTransmission(DS1307_ADDRESS);
- Wire.write(zero); //Stop no CI para que o mesmo possa receber os dados
- //As linhas abaixo escrevem no CI os valores de
- //data e hora que foram colocados nas variaveis acima
- Wire.write(ConverteParaBCD(segundos));
- Wire.write(ConverteParaBCD(minutos));
- Wire.write(ConverteParaBCD(horas));
- Wire.write(ConverteParaBCD(diadasemana));
- Wire.write(ConverteParaBCD(diadomes));
- Wire.write(ConverteParaBCD(mes));
- Wire.write(ConverteParaBCD(ano));
- Wire.write(zero); //Start no CI
- Wire.endTransmission();
- }
- // CV_B ------------------------------------------------------------
- byte ConverteParaBCD(byte val){ //Converte o número de decimal para BCD
- return ( (val/10*16) + (val%10) );
- }
- // SetTime ------------------------------------------------------------
- byte ConverteparaDecimal(byte val) { //Converte de BCD para decimal
- return ( (val/16*10) + (val%16) );
- }
- // Diplay -------------------------------------------------------------
- void Mostrarelogio()
- {
- Wire.beginTransmission(DS1307_ADDRESS);
- Wire.write(zero);
- Wire.endTransmission();
- Wire.requestFrom(DS1307_ADDRESS, 7);
- segundos = ConverteparaDecimal(Wire.read());
- minutos = ConverteparaDecimal(Wire.read());
- horas = ConverteparaDecimal(Wire.read() & 0b111111);
- diadasemana = ConverteparaDecimal(Wire.read());
- diadomes = ConverteparaDecimal(Wire.read());
- mes = ConverteparaDecimal(Wire.read());
- ano = ConverteparaDecimal(Wire.read());
- // diadasemana = 4; // Teste
- lcd.print(diadomes); //Mostra a data no Serial Monitor
- lcd.print("/");
- lcd.print(mes);
- lcd.print("/");
- lcd.print(ano);
- lcd.print(" ");
- lcd.print(horas);
- lcd.print(":");
- lcd.print(minutos);
- lcd.print(":");
- lcd.println(segundos);
- switch(diadasemana)
- {
- case 0:lcd.print(", Domingo"); break;
- case 1:lcd.print(", Segunda"); break;
- case 2:lcd.print(", Terca"); break;
- case 3:lcd.print(", Quarta"); break;
- case 4:lcd.print(", Quinta"); break;
- case 5:lcd.print(", Sexta"); break;
- case 6:lcd.print(", Sabado");
- }
- }
- // Identificas dia Semana-------------------------------------------------------
- void Dia_irriga()
- {
- switch (Di[diadasemana])
- {
- case 0:Inicia_irriga(); break;
- case 1:Inicia_irriga(); break;
- case 2:Inicia_irriga(); break;
- case 3:Inicia_irriga(); break;
- case 4:Inicia_irriga(); break;
- case 5:Inicia_irriga(); break;
- case 6:Inicia_irriga();
- }
- }
- // Calc Inicio ---------------------------------------------------------------
- void Inicia_irriga()
- {
- for (byte i = 0; i<Ir; i++) // Executa o n umero definido de irrigação
- {
- if ((Ho[i] == horas) & (Mn[i] == minutos) ) // Se for hora de irrigar
- { // Faça
- digitalWrite(Bomba, LOW); // Liga bomba dágua
- Duracao = Tempo; // Carregue o tempo de irrigar para o setor1
- while (Duracao>0) // Verifica se terminou o tempo de irrigar
- { // Se não, faça
- digitalWrite(vs1, LOW); // Ligue válvula setor1
- Duracao--; // Decremente o tempo
- }
- digitalWrite(vs1, HIGH); // Desligue válvula setor1
- Duracao = Tempo; // Carregue o tempo de irrigar para o setor2
- while (Duracao>0) // Verifica se terminou o tempo de irrigar
- { // Se não, faça
- digitalWrite(vs2, LOW); // Ligue válvula setor2
- Duracao--; // Decremente o tempo
- }
- digitalWrite(vs2, HIGH); // Desligue válvula setor2
- Duracao = Tempo; // Carregue o tempo de irrigar para o setor3
- while (Duracao>0) // Verifica se terminou o tempo de irrigar
- { // Se não, faça
- digitalWrite(vs3, LOW); // Ligue válvula setor3
- Duracao--; // Decremente o tempo
- }
- digitalWrite(vs3, HIGH); // Desligue válvula setor3
- Duracao = Tempo; // Carregue o tempo de irrigar para o setor4
- while (Duracao>0) // Verifica se terminou o tempo de irrigar
- { // Se não, faça
- digitalWrite(vs4, LOW); // Ligue válvula setor4
- Duracao--; // Decremente o tempo
- }
- digitalWrite(vs4, HIGH); // Desligue válvula setor4
- }
- digitalWrite(Bomba, HIGH); // Desliga bomba dágua
- }
- }
- // Loop ---------------------------------------------------------------
- void loop()
- {
- Mostrarelogio(); // Rotina para ler o relógio
- Dia_irriga(); // Rotina para verificar se é dia de irrigação
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement