Advertisement
dimoura

Untitled

Mar 15th, 2018
271
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 22.01 KB | None | 0 0
  1. // --- Bibliotecas Auxiliares ---
  2. //Biblioteca para o display LCD
  3. #include <Wire.h>
  4. #include <LiquidCrystal_I2C.h>
  5.  
  6. // Carrega a biblioteca do cartão de memória
  7. #include <SPI.h>
  8. #include <SD.h>
  9.  
  10. // Carrega a biblioteca virtuabotixRTC
  11. #include <virtuabotixRTC.h>
  12.  
  13. // Determina os pinos ligados ao modulo
  14. // myRTC(clock, data, rst)
  15. virtuabotixRTC myRTC(6, 7, 8);
  16.  
  17. // Inclui a biblioteca do sensor DHT
  18. #include <DHT.h>
  19.  
  20. // --- Declaração de variáveis ---
  21. int sensor1; //variável do sensor 1
  22. int sensor2; //variável do sensor 2
  23. int sensor3; //variável do sensor 3
  24. int sensor4; //variável do sensor 4
  25. int media; //variável da média
  26. int soma;
  27. String status;
  28. String nivel_umidade; //variável do nível de umidade
  29.  
  30. //Variáveis para temporizar o leitor de umidade do solo e outros
  31. unsigned long tempoAnterior = 0; // Variável utilizada para guardar o tempo anterior
  32. unsigned long tempoAnterior1 = 0;
  33. unsigned long intervalo_leitura = 2000; // Intervalo de tempo em MS para cada leitura
  34. unsigned long intervalo_gravacao = 10000; // Intervalo de tempo em MS para gravação
  35.  
  36.  
  37.  
  38. int porta_rele = 48; //Porta ligada ao pino IN do módulo rele
  39. const int chipSelect = 53; // Constante que indica em qual pino está conectado o Chip Select do módulo de comunicação
  40.  
  41. // Objeto responsável por escrever/Ler do cartão SD
  42. File dataFile;
  43. bool cartaoOk = true;
  44.  
  45. // Definição dos pinos para comunicação do sensor
  46. #define DHTPIN A5 // Define o pino que estamos conectado
  47. #define DHTTYPE DHT11 //Define o tipo de sensor DHT utilizado
  48. DHT dht(DHTPIN, DHTTYPE);
  49.  
  50.  
  51.  
  52. //Array simbolo grau
  53. byte grau[8] ={ B00001100,
  54. B00010010,
  55. B00010010,
  56. B00001100,
  57. B00000000,
  58. B00000000,
  59. B00000000,
  60. B00000000,};
  61.  
  62.  
  63. // --- Mapeamento de Hardware ---
  64. #define butUp 42 //Botão para selecionar tela acima no digital 12
  65. #define butDown 43 //Botão para selecionar tela abaixo no digital 11
  66. #define butP 40 //Botão de ajuste mais no digital 10
  67. #define butM 41 //Botão de ajuste menos no digital 9
  68. #define Lamp1 A2 //Saída para lâmpada 1 no A0 (será usado como digital)
  69. #define Lamp2 A3 //Saída para lâmpada 2 no A1 (será usado como digital)
  70.  
  71. #define s1 A0 //variável do sensor 1
  72. #define s2 A1 //variável do sensor 2
  73. #define s3 A2 //variável do sensor 3
  74. #define s4 A3 //variável do sensor 4
  75.  
  76. // --- Protótipo das Funções Auxiliares ---
  77. void changeMenu(); //Função para modificar o menu atual
  78. void dispMenu(); //Função para mostrar o menu atual
  79. void leitura_sensores(); //Função que realiza a leitura dos sensores
  80. void data_hora(); //Função do menu1, data e hora
  81. void temperatura(); //Função do menu2, temperatura
  82. void lights(); //Função do menu3, acionamento de lampadas
  83. void imprime_sensores(); //Função do menu4, monitoramento dos sensores
  84. void bomba(); //Função do menu5, acionamento da bomba de irrigação
  85. void cartao_de_memoria(); //Função que realiza a gravação no Cartão de memória
  86. void imprime_data_hora(); //Função que exibe as horas em loop
  87.  
  88. // --- Variáveis Globais ---
  89. char menu = 0x01; //Variável para selecionar o menu
  90. char set1 = 0x00, set2 = 0x00; //Controle das lâmpadas
  91. boolean t_butUp, t_butDown, t_butP, t_butM; //Flags para armazenar o estado dos botões
  92.  
  93. // --- Hardware do LCD ---
  94.  
  95. // Inicializa o display no endereco 0x27
  96. LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE);
  97.  
  98.  
  99. void setup()
  100. {
  101. Serial.begin(9600);
  102. //Informacoes iniciais de data e hora
  103. //Apos setar as informacoes, comente a linha abaixo
  104. //myRTC.setDS1302Time(00, 14, 15, 7, 10, 03, 2018); //(segundos, minutos, hora, dia da semana, dia do mes, mes, ano)
  105. lcd.begin(16,2); //Inicializa LCD 16 x 2
  106. lcd.createChar(0, grau); //Cria o caractere customizado com o simbolo do grau
  107.  
  108. //Define pinos para o rele como saida
  109. pinMode(porta_rele, OUTPUT);
  110.  
  111. // Verifica comunicação com o cartão SD
  112. if (!SD.begin(chipSelect)) {
  113. Serial.println("Erro na leitura do arquivo não existe um cartão SD ou o módulo está conectado corretamente ?");
  114. cartaoOk = false;
  115. return;
  116. }
  117.  
  118. //Escreve o Cabeçalho no arquivo datalog.csv
  119. if (cartaoOk){
  120. dataFile = SD.open("datalog.csv", FILE_WRITE);
  121. //logFile.println(", , ,"); //Just a leading blank line, incase there was previous data
  122. dataFile.println("SENSOR 1; SENSOR 2; SENSOR 3; SENSOR 4; SOMA; MEDIA; DIA DA SEMANA; DIA; MES; ANO; HORAS; MINUTOS; SEGUNDOS; STATUS");
  123. dataFile.close();
  124. }
  125.  
  126.  
  127.  
  128. for(char i=9; i<13; i++) pinMode(i, INPUT_PULLUP); //Entrada para os botões (digitais 9 a 12) com pull-ups internos
  129.  
  130. pinMode(Lamp1, OUTPUT); //Configura saída para lâmpada 1
  131. pinMode(Lamp2, OUTPUT); //Configura saída para lâmpara 2
  132.  
  133. t_butUp = 0x00; //limpa flag do botão Up
  134. t_butDown = 0x00; //limpa flag do botão Down
  135. t_butP = 0x00; //limpa flag do botão P
  136. t_butM = 0x00; //limpa flag do botão M
  137.  
  138. digitalWrite(Lamp1, LOW); //Lâmpada 1 inicia apagada
  139. digitalWrite(Lamp2, LOW); //Lâmpada 2 inicia apagada
  140.  
  141. } //end setup
  142.  
  143.  
  144. // --- Loop Infinito ---
  145. void loop()
  146. {
  147.  
  148. changeMenu();
  149. dispMenu();
  150. leitura_sensores();
  151. cartao_de_memoria();
  152. imprime_data_hora();
  153.  
  154. } //end loop
  155.  
  156. // --- Desenvolvimento das Funções Auxiliares ---
  157. void changeMenu() //Modifica o menu atual
  158. {
  159. if(!digitalRead(butUp)) t_butUp = 0x01; //Botão Up pressionado? Seta flag
  160. if(!digitalRead(butDown)) t_butDown = 0x01; //Botão Down pressionado? Seta flag
  161.  
  162. if(digitalRead(butUp) && t_butUp) //Botão Up solto e flag setada?
  163. { //Sim...
  164. t_butUp = 0x00; //Limpa flag
  165.  
  166. lcd.clear(); //Limpa display
  167. menu++; //Incrementa menu
  168.  
  169. if(menu > 0x05) menu = 0x01; //Se menu maior que 6, volta a ser 1
  170.  
  171. } //end butUp
  172.  
  173. if(digitalRead(butDown) && t_butDown) //Botão Down solto e flag setada?
  174. { //Sim...
  175. t_butDown = 0x00; //Limpa flag
  176.  
  177. lcd.clear(); //Limpa display
  178. menu--; //Decrementa menu
  179.  
  180. if(menu < 0x01) menu = 0x05; //Se menu menor que 1, volta a ser 6
  181.  
  182. } //end butDown
  183.  
  184. } //end changeMenu
  185.  
  186. void dispMenu() //Mostra o menu atual
  187. {
  188. switch(menu) //Controle da variável menu
  189. {
  190. // case 0x01: //Caso 6
  191. // cartao_de_memoria(); //Chama função da bomba
  192.  
  193. // break; //break
  194.  
  195. case 0x01: //Caso 1
  196. data_hora(); //Chama a função de relógio
  197.  
  198. break; //break
  199. case 0x02: //Caso 2
  200. temperatura(); //Chama a função do termômetro
  201.  
  202. break; //break
  203. case 0x03: //Caso 3
  204. lights(); //Chama função para acionamento de lâmpadas
  205.  
  206. break; //break
  207. case 0x04: //Caso 4
  208. imprime_sensores(); //Chama função para exibir dados dos sensores
  209.  
  210. break; //break
  211. case 0x05: //Caso 5
  212. bomba(); //Chama função da bomba
  213.  
  214. break; //break
  215.  
  216.  
  217. } //end switch menu
  218.  
  219. } //end dispMenu
  220.  
  221. void imprime_data_hora() //Função responsável pela impressão da Data e Hora (roda constantemente no loop)
  222. {
  223. // Le as informacoes do CI
  224. myRTC.updateTime();
  225. } //end data_hora
  226.  
  227.  
  228. void data_hora() //Data e Hora (menu1)
  229. {
  230. // Le as informacoes do CI
  231. myRTC.updateTime();
  232.  
  233. // Imprime as informacoes no LCD
  234. lcd.setCursor(0,0);
  235. lcd.print("Data e Hora");
  236.  
  237. lcd.setCursor(0,1);
  238.  
  239. // Chama a rotina que imprime o dia da semana
  240. //imprime_dia_da_semana(myRTC.dayofweek);
  241. lcd.print(myRTC.dayofmonth);
  242. lcd.print("/");
  243. lcd.print(myRTC.month);
  244. lcd.print("/");
  245. lcd.print(myRTC.year-2000);
  246. lcd.print(" ");
  247.  
  248. // Adiciona um 0 caso o valor da hora seja <10
  249. if (myRTC.hours < 10)
  250. {
  251. lcd.print("0");
  252. }
  253. lcd.print(myRTC.hours);
  254. lcd.print(":");
  255. // Adiciona um 0 caso o valor dos minutos seja <10
  256. if (myRTC.minutes < 10)
  257. {
  258. lcd.print("0");
  259. }
  260. lcd.print(myRTC.minutes);
  261. lcd.print(":");
  262. // Adiciona um 0 caso o valor dos segundos seja <10
  263. if (myRTC.seconds < 10)
  264. {
  265. lcd.print("0");
  266. }
  267. lcd.print(myRTC.seconds);
  268.  
  269. } //end data_hora
  270.  
  271. void temperatura() //Temperatura (menu2)
  272. {
  273. float h = dht.readHumidity(); //Le o valor da umidade
  274. float t = dht.readTemperature(); //Le o valor da temperatura
  275. lcd.setCursor(0,0);
  276. lcd.print("Temp : ");
  277. lcd.print(" ");
  278. lcd.setCursor(7,0);
  279. lcd.print(t,1);
  280. lcd.setCursor(12,0);
  281.  
  282. //Mostra o simbolo do grau formado pelo array
  283. lcd.write((byte)0);
  284.  
  285. //Mostra as informações lidas pelo sensor
  286. lcd.setCursor(0,1);
  287. lcd.print("Umid : ");
  288. lcd.print(" ");
  289. lcd.setCursor(7,1);
  290. lcd.print(h,1);
  291. lcd.setCursor(12,1);
  292. lcd.print("%");
  293.  
  294. } //end temperatura()
  295.  
  296. void lights() //Acionamento de lâmpadas (menu3)
  297. {
  298. lcd.setCursor(0,0); //Posiciona cursor na coluna 1, linha 1
  299. lcd.print("Acionar Lampadas"); //Imprime mensagem do menu 3
  300.  
  301.  
  302. if(!digitalRead(butP)) t_butP = 0x01; //Botão P pressionado? Seta flag
  303. if(!digitalRead(butM)) t_butM = 0x01; //Botão M pressionado? Seta flag
  304.  
  305. if(digitalRead(butP) && t_butP) //Botão P solto e flag setada?
  306. { //Sim...
  307. t_butP = 0x00; //Limpa flag
  308.  
  309. set1++; //Incrementa set1
  310.  
  311. if(set1 > 2) set1 = 0x01; //Se maior que 2, volta a ser 1
  312.  
  313. switch(set1) //Controle do set1
  314. {
  315. case 0x01: //Caso 1
  316. lcd.setCursor(0,1); //Posiciona cursor na coluna 1, linha 2
  317. lcd.print("L1 on "); //Imprime mensagem
  318. digitalWrite(Lamp1, HIGH); //Liga lâmpada 1
  319. break; //Break
  320. case 0x02: //Caso 2
  321. lcd.setCursor(0,1); //Posiciona cursor na coluna 1, linha 2
  322. lcd.print("L1 off"); //Imprime mensagem
  323. digitalWrite(Lamp1, LOW); //Desliga lâmpada 1
  324. break; //Break
  325.  
  326. } //end switch set1
  327.  
  328. } //end butP
  329.  
  330. if(digitalRead(butM) && t_butM) //Botão D solto e flag setada?
  331. { //Sim...
  332. t_butM = 0x00; //Limpa flag
  333.  
  334. set2++; //Incrementa set2
  335.  
  336. if(set2 > 2) set2 = 0x01; //Se maior que 2, volta a ser 1
  337.  
  338. switch(set2) //Controle do set2
  339. {
  340. case 0x01: //Caso 1
  341. lcd.setCursor(8,1); //Posiciona cursor na coluna 8, linha 2
  342. lcd.print("L2 on "); //Imprime mensagem
  343. digitalWrite(Lamp2, HIGH); //Liga lâmpada 2
  344. break; //Break
  345. case 0x02: //Caso 2
  346. lcd.setCursor(8,1); //Posiciona cursor na coluna 8, linha 2
  347. lcd.print("L2 off"); //Imprime mensagem
  348. digitalWrite(Lamp2, LOW); //Liga lâmpada 1
  349. break; //Break
  350.  
  351. } //end switch set1
  352.  
  353. } //end butM
  354.  
  355. } //end lights
  356.  
  357. void leitura_sensores() //Função sensores menu (4)
  358. {
  359.  
  360.  
  361. //Função que realiza a gravação no Cartão de memória
  362. unsigned long tempoAtual = millis(); // Realizamos a leitura atual do tempo em que o nosso Arduino Nano está ligado
  363. if (tempoAtual-tempoAnterior1 > intervalo_leitura){ // Pequena lógica para realizar leituras temporizadas sem parar o microcontrolador
  364. tempoAnterior1=tempoAtual; // Guardamos o tempo anterior como o ultimo intervalo de tempo lido
  365.  
  366. //Realiza as leituras dos sensores
  367. sensor1 = analogRead(s1);
  368. sensor2 = analogRead(s2);
  369. sensor3 = analogRead(s3);
  370. sensor4 = analogRead(s4);
  371.  
  372.  
  373. //Calcula a soma
  374. soma = sensor1+sensor2+sensor3+sensor4;
  375. //Calcula a média
  376. media = soma/4;
  377.  
  378.  
  379. //Faz a comparação dos valores obtidos pelos sensores e dispara o comando para ligar o rele
  380. 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
  381. digitalWrite(porta_rele, LOW); //Liga o rele
  382. Serial.println("Nível de Umidade Baixo");
  383. nivel_umidade = ("Umidade Baixa");
  384. }else{
  385. 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
  386. digitalWrite(porta_rele, HIGH); //Desliga o rele
  387. Serial.println("Nível de Umidade Médio");
  388. nivel_umidade = ("Umidade Media");
  389. }
  390. else{
  391. 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
  392. Serial.println("Nível de Umidade Alto");
  393. nivel_umidade = ("Umidade Alta");
  394. }
  395. }
  396. }
  397. }
  398. } //end menu4
  399.  
  400. void imprime_sensores() //Função que exibe informações dos sensores
  401. {
  402.  
  403. //limpa a terceira casa se a media for menor que 100
  404. if (media<100){
  405. lcd.setCursor(2,0);
  406. lcd.print(" ");
  407. }
  408. lcd.setCursor(0,0);
  409. lcd.print(media);
  410. lcd.setCursor(0,1);
  411. lcd.print(nivel_umidade);
  412.  
  413. }//end imprime_sensores
  414.  
  415. void bomba() //Acionamento da bomba (menu5)
  416. {
  417.  
  418. lcd.setCursor(0,0); //Posiciona cursor na coluna 1, linha 1
  419. lcd.print("Acionar Bomba?"); //Imprime mensagem do menu 3
  420.  
  421.  
  422. if(!digitalRead(butP)) t_butP = 0x01; //Botão P pressionado? Seta flag
  423. if(!digitalRead(butM)) t_butM = 0x01; //Botão M pressionado? Seta flag
  424.  
  425. if(digitalRead(butP) && t_butP) //Botão P solto e flag setada?
  426. { //Sim...
  427. t_butP = 0x00; //Limpa flag
  428.  
  429. set1++; //Incrementa set1
  430.  
  431. if(set1 > 2) set1 = 0x01; //Se maior que 2, volta a ser 1
  432.  
  433. switch(set1) //Controle do set1
  434. {
  435. case 0x01: //Caso 1
  436. lcd.setCursor(12,1);
  437. lcd.print(" ");
  438. lcd.setCursor(0,1); //Posiciona cursor na coluna 1, linha 2
  439. lcd.print("Bomba Ligada"); //Imprime mensagem
  440. digitalWrite(porta_rele, LOW); //Liga o rele 1
  441. break; //Break
  442. case 0x02: //Caso 2
  443. lcd.setCursor(0,1); //Posiciona cursor na coluna 1, linha 2
  444. lcd.print("Bomba Desligada"); //Imprime mensagem
  445. digitalWrite(porta_rele, HIGH); //Desliga o rele 1
  446. break; //Break
  447.  
  448. } //end switch set1
  449.  
  450. } //end butP
  451.  
  452. if(digitalRead(butM) && t_butM) //Botão D solto e flag setada?
  453. { //Sim...
  454. t_butM = 0x00; //Limpa flag
  455.  
  456. set2++; //Incrementa set2
  457.  
  458. if(set2 > 2) set2 = 0x01; //Se maior que 2, volta a ser 1
  459.  
  460. switch(set2) //Controle do set2
  461. {
  462. case 0x01: //Caso 1
  463. lcd.setCursor(8,1); //Posiciona cursor na coluna 8, linha 2
  464. lcd.print("L2 on "); //Imprime mensagem
  465. digitalWrite(Lamp2, HIGH); //Liga lâmpada 2
  466. break; //Break
  467. case 0x02: //Caso 2
  468. lcd.setCursor(8,1); //Posiciona cursor na coluna 8, linha 2
  469. lcd.print("L2 off"); //Imprime mensagem
  470. digitalWrite(Lamp2, LOW); //Liga lâmpada 1
  471. break; //Break
  472.  
  473. } //end switch set1
  474.  
  475. } //end butM
  476.  
  477. } //end bomba
  478.  
  479. void cartao_de_memoria() //Função grava as informções dos sensores no cartão de memória
  480. {
  481. //Função que realiza a gravação no Cartão de memória
  482. unsigned long tempoAtual = millis(); // Realizamos a leitura atual do tempo em que o nosso Arduino Nano está ligado
  483. if (tempoAtual-tempoAnterior > intervalo_gravacao){ // Pequena lógica para realizar leituras temporizadas sem parar o microcontrolador
  484. tempoAnterior=tempoAtual; // Guardamos o tempo anterior como o ultimo intervalo de tempo lido
  485.  
  486.  
  487. //Grava os dados dos sensores no cartão de memória
  488. if (cartaoOk){
  489. dataFile = SD.open("datalog.csv", FILE_WRITE);
  490. }
  491.  
  492. //Limpando Variáveis
  493. String leitura = ""; // Limpo campo contendo string que será armazenada em arquivo CSV
  494.  
  495. // Caso os valores lidos do sensor não sejam válidos executamos as seguintes linhas
  496. if (isnan(sensor1) || isnan(sensor2) || isnan(sensor3) || isnan(sensor4)){
  497. return ; // Retornamos a função para o seu ponto inicial
  498. }
  499.  
  500. // Se tudo estiver ok, escrevemos os dados a serem armazenados em uma String
  501. 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) + ";";
  502.  
  503. // Se o arquivo estiver realmente aberto para leitura executamos as seguintes linhas de código
  504. if (dataFile) {
  505. // Serial.println(leitura); // Mostramos no monitor a linha que será escrita
  506. dataFile.println(leitura); // Escrevemos no arquivos e pulamos uma linha
  507. dataFile.close(); // Fechamos o arquivo
  508. }
  509. }
  510. } //end cartao_de_memória
  511.  
  512.  
  513.  
  514. //pode-se implementar quantos menus quiser
  515. //............
  516.  
  517. /*void imprime_dia_da_semana(int dia)
  518. {
  519. switch (dia)
  520. {
  521. case 1:
  522. Serial.print("Domingo");
  523. break;
  524. case 2:
  525. Serial.print("Segunda");
  526. break;
  527. case 3:
  528. Serial.print("Terca");
  529. break;
  530. case 4:
  531. Serial.print("Quarta");
  532. break;
  533. case 5:
  534. Serial.print("Quinta");
  535. break;
  536. case 6:
  537. Serial.print("Sexta");
  538. break;
  539. case 7:
  540. Serial.print("Sabado");
  541. break;
  542. }
  543. }
  544. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement