Advertisement
RuiViana

Irrigação03

Oct 3rd, 2015
250
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.28 KB | None | 0 0
  1. // http://labdegaragem.com/forum/topics/ajuda-com-timer?page=6&commentId=6223006%3AComment%3A481438&x=1#6223006Comment481438
  2.  
  3. /*
  4. Nome do Projeto: irrigação03
  5. Nome do Aquivo: irrigação03.ino
  6. Dependências: Wire.h
  7. LiquidCrystal.h
  8. DS1307.h
  9. MCU: Atmega
  10. Board: Arduino
  11. Compilador Arduino
  12. IDE: Arduino 1.0.6
  13. Hardware: Arduino UNO
  14. Escrito por: Rui Viana
  15. Data: 03/10/2015
  16. Uso: Didático
  17. Desenhos N/A
  18. Copyright @ N/A
  19.  
  20. Este programa é software livre;
  21. e é distribuído na esperança que possa ser útil, mas SEM QUALQUER GARANTIA;
  22. mesmo sem a garantia implícita de COMERCIALIZAÇÃO ou ADEQUAÇÃO A UM DETERMINADO FIM.
  23.  
  24. REVISIONS: (latest entry first)
  25. 2015-03-10 - irrigação03 - First release
  26. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  27. Descrição:
  28. Programa para sistema de irrigação usando DS1307.
  29.  
  30. Funcionamento:
  31. Ao ligar o sistema, o relógio do RTC deverá ser acertado para a hora correta.
  32. Após isto o operador deverá entrar com os valores:
  33. Dia da semana que deverão ocorrer as irrigações;
  34. Número de Irrigações diárias (até 3);
  35. Dias da semana que deverão ocorrer as irrigações
  36. Hora/minuto/segundo do inicio das irrigações diárias;
  37. Duração das irrigações.
  38. Após isto o operador aperta Início para começar o contrôle.
  39. Ai inicia a rotina principal que fica lendo o relogio, mostrando no LCD
  40. e salvando em Ano/Mes/Dia/DiadaSemana/Hora/Minuto/Segundo.
  41. Em seguida fica verificando se o o dia da semana tem irrigação programada
  42. (Se não tiver irrigação planejada para o dia, o valor deve ser 8) e chama a rotina que comparando com o valor
  43. lido da matriz de controle de irrigação.
  44. Se coincidir, entra na rotina de irrigar, usando o tempo definido na duração.
  45. Executa a irrigação nos 3 setores e volta para a rotina principal.
  46. Durante a irrigação não há necessidade de verificar o horário de irrigação novamente.
  47. */
  48. // Definicoes ---------------------------------------------------------------
  49. #include "Wire.h"
  50. #include <LiquidCrystal.h> // Biblioteca do LCD
  51. #define Bomba 10 // variavel e pino do rele da bomba
  52. #define vs1 6 // variavel e pino do rele do setor1
  53. #define vs2 7 // variavel e pino do rele do setor2
  54. #define vs3 8 // variavel e pino do rele do setor3
  55. #define vs4 9 // variavel e pino do rele do setor4
  56.  
  57. #define DS1307_ADDRESS 0x68
  58.  
  59. LiquidCrystal lcd(12, 11, 5, 4, 3, 2);//Portas do lcd
  60. byte Ir = 3; // Numero de irrigaçoes
  61. byte Di[7] = {0,1,2,3,8,8,8}; // Dias Semana programados (8 Não será ativado o sistema)
  62. byte Ho[] = {9,17,21}; // Horas programadas
  63. byte Mn[] = {8,34,47}; // Minutos programados
  64. byte Se[] = {2,22,54}; // Segundos programados
  65.  
  66. int ano;
  67. byte mes;
  68. byte diadomes;
  69. byte diadasemana;
  70. byte horas;
  71. byte minutos;
  72. byte segundos;
  73. long Tempo = 100;
  74. long Duracao;
  75. byte zero = 0x00;
  76.  
  77. // Setup --------------------------------------------------------------
  78. void setup()
  79. {
  80. Wire.begin();
  81. Serial.begin(9600);
  82. lcd.begin(16, 2); // iniciando o lcd
  83. //A linha abaixo pode ser retirada apos setar a data e hora
  84. SelecionaDataeHora();
  85. }
  86.  
  87. // SetTime ------------------------------------------------------------
  88. void SelecionaDataeHora() //Seta a data e a hora do DS1307
  89. {
  90. byte segundos = 40; //Valores de 0 a 59
  91. byte minutos = 59; //Valores de 0 a 59
  92. byte horas = 23; //Valores de 0 a 23
  93. byte diadasemana = 1; //Valores de 0 a 6 - 0=Domingo, 1 = Segunda, etc.
  94. byte diadomes = 17; //Valores de 1 a 31
  95. byte mes = 4; //Valores de 1 a 12
  96. byte ano = 13; //Valores de 0 a 99
  97. Wire.beginTransmission(DS1307_ADDRESS);
  98. Wire.write(zero); //Stop no CI para que o mesmo possa receber os dados
  99.  
  100. //As linhas abaixo escrevem no CI os valores de
  101. //data e hora que foram colocados nas variaveis acima
  102. Wire.write(ConverteParaBCD(segundos));
  103. Wire.write(ConverteParaBCD(minutos));
  104. Wire.write(ConverteParaBCD(horas));
  105. Wire.write(ConverteParaBCD(diadasemana));
  106. Wire.write(ConverteParaBCD(diadomes));
  107. Wire.write(ConverteParaBCD(mes));
  108. Wire.write(ConverteParaBCD(ano));
  109. Wire.write(zero); //Start no CI
  110. Wire.endTransmission();
  111. }
  112.  
  113. // CV_B ------------------------------------------------------------
  114. byte ConverteParaBCD(byte val){ //Converte o número de decimal para BCD
  115. return ( (val/10*16) + (val%10) );
  116. }
  117.  
  118. // SetTime ------------------------------------------------------------
  119. byte ConverteparaDecimal(byte val) { //Converte de BCD para decimal
  120. return ( (val/16*10) + (val%16) );
  121. }
  122. // Diplay -------------------------------------------------------------
  123. void Mostrarelogio()
  124. {
  125. Wire.beginTransmission(DS1307_ADDRESS);
  126. Wire.write(zero);
  127. Wire.endTransmission();
  128. Wire.requestFrom(DS1307_ADDRESS, 7);
  129. segundos = ConverteparaDecimal(Wire.read());
  130. minutos = ConverteparaDecimal(Wire.read());
  131. horas = ConverteparaDecimal(Wire.read() & 0b111111);
  132. diadasemana = ConverteparaDecimal(Wire.read());
  133. diadomes = ConverteparaDecimal(Wire.read());
  134. mes = ConverteparaDecimal(Wire.read());
  135. ano = ConverteparaDecimal(Wire.read());
  136. // diadasemana = 4; // Teste
  137.  
  138. lcd.print(diadomes); //Mostra a data no Serial Monitor
  139. lcd.print("/");
  140. lcd.print(mes);
  141. lcd.print("/");
  142. lcd.print(ano);
  143. lcd.print(" ");
  144.  
  145. lcd.print(horas);
  146. lcd.print(":");
  147. lcd.print(minutos);
  148. lcd.print(":");
  149. lcd.println(segundos);
  150. switch(diadasemana)
  151. {
  152. case 0:lcd.print(", Domingo"); break;
  153. case 1:lcd.print(", Segunda"); break;
  154. case 2:lcd.print(", Terca"); break;
  155. case 3:lcd.print(", Quarta"); break;
  156. case 4:lcd.print(", Quinta"); break;
  157. case 5:lcd.print(", Sexta"); break;
  158. case 6:lcd.print(", Sabado");
  159. }
  160. }
  161. // Identificas dia Semana-------------------------------------------------------
  162. void Dia_irriga()
  163. {
  164. switch (Di[diadasemana])
  165. {
  166. case 0:Inicia_irriga(); break;
  167. case 1:Inicia_irriga(); break;
  168. case 2:Inicia_irriga(); break;
  169. case 3:Inicia_irriga(); break;
  170. case 4:Inicia_irriga(); break;
  171. case 5:Inicia_irriga(); break;
  172. case 6:Inicia_irriga();
  173. }
  174. }
  175.  
  176. // Calc Inicio ---------------------------------------------------------------
  177. void Inicia_irriga()
  178. {
  179. for (byte i = 0; i<Ir; i++) // Executa o n umero definido de irrigação
  180. {
  181. if ((Ho[i] == horas) & (Mn[i] == minutos) ) // Se for hora de irrigar
  182. { // Faça
  183. digitalWrite(Bomba, LOW); // Liga bomba dágua
  184. Duracao = Tempo; // Carregue o tempo de irrigar para o setor1
  185. while (Duracao>0) // Verifica se terminou o tempo de irrigar
  186. { // Se não, faça
  187. digitalWrite(vs1, LOW); // Ligue válvula setor1
  188. Duracao--; // Decremente o tempo
  189. }
  190. digitalWrite(vs1, HIGH); // Desligue válvula setor1
  191. Duracao = Tempo; // Carregue o tempo de irrigar para o setor2
  192. while (Duracao>0) // Verifica se terminou o tempo de irrigar
  193. { // Se não, faça
  194. digitalWrite(vs2, LOW); // Ligue válvula setor2
  195. Duracao--; // Decremente o tempo
  196. }
  197. digitalWrite(vs2, HIGH); // Desligue válvula setor2
  198. Duracao = Tempo; // Carregue o tempo de irrigar para o setor3
  199. while (Duracao>0) // Verifica se terminou o tempo de irrigar
  200. { // Se não, faça
  201. digitalWrite(vs3, LOW); // Ligue válvula setor3
  202. Duracao--; // Decremente o tempo
  203. }
  204. digitalWrite(vs3, HIGH); // Desligue válvula setor3
  205. Duracao = Tempo; // Carregue o tempo de irrigar para o setor4
  206. while (Duracao>0) // Verifica se terminou o tempo de irrigar
  207. { // Se não, faça
  208. digitalWrite(vs4, LOW); // Ligue válvula setor4
  209. Duracao--; // Decremente o tempo
  210. }
  211. digitalWrite(vs4, HIGH); // Desligue válvula setor4
  212. }
  213. digitalWrite(Bomba, HIGH); // Desliga bomba dágua
  214. }
  215. }
  216. // Loop ---------------------------------------------------------------
  217. void loop()
  218. {
  219. Mostrarelogio(); // Rotina para ler o relógio
  220. Dia_irriga(); // Rotina para verificar se é dia de irrigação
  221. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement