Advertisement
RuiViana

Chocadeira_Menu_LCD

Mar 13th, 2016
316
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.18 KB | None | 0 0
  1. /*
  2. Nome do Projeto: Chocadeira
  3. Nome do Aquivo: Choca_DHT11_Menu_V03.ino
  4. link: http://labdegaragem.com/forum/topics/ajuda-com-menu-chocadeira?xg_source=activity
  5. Dependencias: DHT.h Biblioteca de DHT11
  6. LiquidCrystal.h Biblioteca de LCD
  7. MCU: ATmega
  8. Board: Arduino Uno/Mega/Mini
  9. Compilador N/A
  10. IDE: Arduino IDE 1.0.6
  11. Hardware: Arduino UNO/MEGA/Mini
  12. Escrito por: Rui Viana
  13. Modificado por: Rui.Viana
  14. Data: 28/06/2015
  15. Uso: Didático
  16. Desenhos Chocadeira_DHT11.jpg
  17. Copyright @ N/A
  18.  
  19. Este programa é software livre;
  20. e é distribuído na esperança que possa ser útil, mas SEM QUALQUER GARANTIA;
  21. mesmo sem a garantia implícita de COMERCIALIZAÇÃO ou ADEQUAÇÃO A UM DETERMINADO FIM.
  22.  
  23. REVISIONS: (latest entry first)
  24. 2015-06-28 - Choca_DHT11_V01.ino - First release
  25. 2015-07-08 - Choca_DHT11_Menu_V03.ino - Inclusão code de menu
  26.  
  27. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  28. Descricão:
  29.  
  30. Este código utilza a biblioteca DHT.h para ler sensores de humidade e de temperatura.
  31. E a biblioteca LiquidCrystal.h para mostrar a temperatura e a humidade no diplay LCD.
  32. Compara o valor da leitura com o valor programado, e define se liga ou desliga o rele
  33. que alimenta as resistencias de aquecimento.
  34. Tem dois botoes, um para aumentar e outro para diminuir a programação da temperatura
  35.  
  36. Ele usa um sistema de menu em LCD,
  37. com 7 botões sendo 6 nas porta analogicas de A0 até A5 e um na digital 3
  38. O primeiro botão movimenta o menu para cima
  39. O segundo botão movimenta o menu para baixo
  40. O terceiro botão movimenta o sub menu para esquerda
  41. O quarto botão movimenta o sub menu para direita
  42. O Quinto botão incrementa o valor
  43. O sext botão decrementa o valor
  44. O sétimo botão chama uma função para executar qq código com os valores definidos nos botoes anteriores
  45.  
  46. menu0 Sub_menu0 ajusta a temperatura saida rele liga resistencia
  47. menu0 Sub_menu1 ajusta a temperatura saida rele liga secador
  48. menu1 ajusta tempo de virar hh/mm/ss saida rele liga motor
  49. menu2 ajusta horas minutos hh/mm/ss
  50. menu3 ajusta dias ligado dd
  51. */
  52. //--------------------- Variaveis e constantes -----------------
  53. #include <LiquidCrystal.h> // Inclui a biblioteca do LCD
  54. #include "DHT.h" // Inclui a biblioteca do DHT11
  55. #define DHTPIN A0 // pino que estamos conectado
  56. #define DHTTYPE DHT11 // DHT 11
  57. DHT dht(DHTPIN, DHTTYPE);
  58.  
  59. LiquidCrystal lcd( 7, 8, 9, 10, 11, 12); //Ordem dos pinos RS EN D4 D5 D6 D7
  60. // Pino LCD 4 6 11 12 13 14
  61.  
  62. #define botao0 2 // Botão para Menu_Up
  63. #define botao1 3 // Botão para Menu_Down
  64. const int botao2 = A1; // Botão para Sub_Menu_left
  65. const int botao3 = A2; // Botão para Sub_Menu_right
  66. const int botao4 = A3; // Botão para Step_Up
  67. const int botao5 = A4; // Botão para Step_Down
  68. const int botao6 = A5; // Botão exec
  69.  
  70. byte bt0; // Variavel para condição de botão 0
  71. byte fbt0; // Guarda status do botão 0
  72. byte bt1 = 1; // Variavel para condição de botão 1
  73. byte fbt1 = 1; // Guarda status do botão 1
  74. byte bt2 = 1; // Variavel para condição de botão 2
  75. byte fbt2 = 1; // Guarda status do botão 2
  76. byte bt3 = 1; // Variavel para condição de botão 3
  77. byte fbt3 = 1; // Guarda status do botão 3
  78. byte bt4 = 1; // Variavel para condição de botão 4
  79. byte fbt4 = 1; // Guarda status do botão 4
  80. byte bt5 = 1; // Variavel para condição de botão 5
  81. byte fbt5 = 1; // Guarda status do botão 5
  82. byte bt6 = 1; // Variavel para condição de botão 6
  83. byte fbt6 = 1; // Guarda status do botão 6
  84. int tot;
  85. int Nivel = 0; // Variavel para nivel de menu inicie em 0
  86. int Index_Nivel = 0; // Variavel para status de nivel de menu
  87. int Sub_Nivel = 0; // Variavel para sub_nivel de menu inicie em 0
  88. byte Pos = 1; // Variavel para posição de valor posicione em 1
  89. byte Step_M[4][4]; // Matriz para valores
  90. String MeuMenu; // Variavel para titulo do Menu
  91.  
  92. const int ReleR = 13; // Pino de Saída liga resitencia
  93. const int ReleH = 6; // Pino de Saída liga secador
  94. const int Giro = 5; // Pino de Saída liga girador
  95. float TempProg = 27; // Variavel com temperatura programada
  96. float HumidProg = 80; // Variavel com humidade programada
  97. float celsius; // Varialvel para guardar valor de temperatura
  98. byte humidade; // Varialvel para guardar valor de humidade
  99. char cnt = 0;
  100. char cnt2 = 0;
  101. //--------------------- Setup -----------------
  102. void setup()
  103. {
  104. Serial.begin(9600);
  105. lcd.begin(16, 2); // Inicia o LCD com dimensões 16x2(Colunas x Linhas)
  106. pinMode(ReleR, OUTPUT); // Port como saída
  107. pinMode(ReleH, OUTPUT); // Port como saída
  108. pinMode(Giro, OUTPUT); // Port como saída
  109. digitalWrite(ReleR, LOW); // Desliga Rele resistencia
  110. digitalWrite(ReleH, LOW); // Desliga Rele secador
  111. digitalWrite(Giro, LOW); // Desliga Rele girador
  112. dht.begin(); // inicializa o Sensor
  113. delay(1000); // Aguarda 1 seg antes de acessar as informações do sensor
  114.  
  115. lcd.clear(); // Limpa do buffer do LCD
  116. lcd.setCursor(0, 0); // Seleciona posição 0 da linha 0
  117. lcd.print("Chocadeira"); // Imprime texto
  118. lcd.setCursor(11, 1); // Seleciona posição 0 da linha 0
  119. lcd.print(TempProg); // Imprime variavel
  120.  
  121. pinMode(botao0, INPUT_PULLUP); // Meunu UP
  122. pinMode(botao1, INPUT_PULLUP); // Meunu DOWN
  123. pinMode(botao2, INPUT_PULLUP); // Sub_Meunu Left
  124. pinMode(botao3, INPUT_PULLUP); // Sub_Meunu Right
  125. pinMode(botao4, INPUT_PULLUP); // Value Up
  126. pinMode(botao5, INPUT_PULLUP); // Value Down
  127. pinMode(botao6, INPUT_PULLUP); // Confirme
  128. }
  129. //--------------------- Display Menu -----------------
  130. void DSP_Menu() // Função para inicialização das variaveis no LCD
  131. {
  132. lcd.clear(); // Limpa tel LCD
  133. lcd.blink(); // Opção de blinking para cursor
  134. lcd.setCursor(0, 0); // Posiciona o cursor para inicio do titulo
  135. lcd.print(MeuMenu); // Mostra titulo
  136. lcd.setCursor(0, 1); // Posiciona cursor para zerar tela de contadores
  137. lcd.print(" 0 0 0 0"); // Zera tela de contadores
  138. }
  139. //--------------------- Display Index -----------------
  140. void Dsp_Index() // Função para display das variaveis no LCD
  141. {
  142. lcd.setCursor(0, 0); // Posiciona o cursor para inicio do titulo
  143. lcd.print(MeuMenu); // Mostra titulo
  144. byte j = 1; // Variavel para poição dos valores na linha 1
  145. for (byte i = 0; i <=3; i++) // Mostra 4 contadores
  146. {
  147. lcd.setCursor(j, 1); // Posiciona na linha 1
  148. lcd.print(" "); // Limpa valor antigo 2 digitos
  149. lcd.setCursor(j, 1); // Reposiciona na linha 1
  150. lcd.print(Step_M[Index_Nivel][i]); // Mostra valor atual
  151. j = j + 4; // Incrementa posição no LCD
  152. }
  153.  
  154. lcd.setCursor(Pos, 1); // Reposiciona na linha 1 e sub_menu
  155. }
  156. //--------------------- Main_Menu -----------------
  157. void Main_Menu()
  158. {
  159. while(cnt==1)
  160. {
  161. DSP_Menu();
  162. //--------------------- Menu Up -----------------
  163. bt0 = digitalRead(botao0); // Le botão em A0
  164. if ((bt0 == LOW) && (fbt0 == HIGH)) // Se botão apertado e flag ligado
  165. { // Faça
  166. delay(30); // 30 ms de de-bouncing
  167. Nivel =Index_Nivel +1; // Incrementa nivel do Menu
  168. Index_Nivel = Nivel; // Salva valor de Menu em Indexador
  169. Sub_Nivel = 0; // Posiciona em sub menu 0
  170. for (byte i = 0; i <=3; i++) // Faça 4 vezes
  171. Step_M[Index_Nivel][i] = 0; // Zera contadores
  172. if (Nivel > 3) // Se nivel de menu maior que 3
  173. { // Faça
  174. Nivel = 0; // Set nivel de menu para 0
  175. Index_Nivel = 0; // Zera indexador
  176. }
  177. }
  178. fbt0 = bt0; // Faça flag = botão evita debouncing
  179. //--------------------- Menu Down -----------------
  180. bt1 = digitalRead(botao1); // Le botão em A1
  181. if ((bt1 == LOW) && (fbt1 == HIGH)) // Se botão apertado e flag ligado
  182. { // Faça
  183. delay(30); // 30 ms de de-bouncing
  184. Nivel = Index_Nivel -1; // Decrementa nivel do Menu
  185. Index_Nivel = Nivel; // Salva valor de Menu em Indexador
  186. Sub_Nivel = 0; // Posiciona em sub menu 0
  187. for (byte i = 0; i <=3; i++) // Faça 4 vezes
  188. Step_M[Index_Nivel][i] = 0; // Zera contadores
  189. if (Nivel < 0) // Se nivel de menu menor que 0
  190. { // Faça
  191. Nivel = 3; // Set nivel de menu para 3
  192. Index_Nivel = 3; // Set Indexador para 3
  193. }
  194. }
  195. fbt1 = bt1; // Faça flag = botão evita debouncing
  196. //--------------------- Sub_Menu Right -----------------
  197. bt2 = digitalRead(botao2); // Le botão em A2
  198. if ((bt2 == LOW) && (fbt2 == HIGH)) // Se botão apertado e flag ligado
  199. { // Faça
  200. delay(30); // 30 ms de de-bouncing
  201. Sub_Nivel = Sub_Nivel +1; // Incrementa nivel do Sub Menu
  202. Dsp_Index(); // Mostra valores no LCD
  203. if (Sub_Nivel > 3) // Se contagem maior que 3
  204. { // Faça
  205. Sub_Nivel = 0; // Vai par o nivel 0
  206. }
  207. }
  208. fbt2 = bt2; // Faça flag = botão evita debouncing
  209. //--------------------- Sub_Menu left -----------------
  210. bt3 = digitalRead(botao3); // Le botão em A3
  211. if ((bt3 == LOW) && (fbt3 == HIGH)) // Se botão apertado e flag ligado
  212. { // Faça
  213. delay(30); // 30 ms de de-bouncing
  214. Sub_Nivel = Sub_Nivel - 1; // Decrementa nivel do Sub Menu
  215. Dsp_Index(); // Mostra valores no LCD
  216. if (Sub_Nivel < 0) // Se contagem menor que 0
  217. { // Faça
  218. Sub_Nivel = 3; // Vai par o nivel 3
  219. }
  220. }
  221. fbt3 = bt3; // Faça flag = botão evita debouncing
  222. //--------------------- Step_Up -----------------
  223. bt4 = digitalRead(botao4); // Le botão em A4
  224. if ((bt4 == LOW) && (fbt4 == HIGH)) // Se botão apertado e flag ligado
  225. { // Faça
  226. delay(30); // 30 ms de de-bouncing
  227. Step_M[Index_Nivel][Sub_Nivel] = Step_M[Index_Nivel][Sub_Nivel] +1; // Desloca esquerda Item
  228. if (Step_M[Index_Nivel][Sub_Nivel] > 99) // Se contagem maior que 99
  229. { // Faça
  230. Step_M[Index_Nivel][Sub_Nivel]= 0; // Zera contagem
  231. }
  232. Dsp_Index(); // Mostra valores no LCD
  233. }
  234. fbt4 = bt4; // Faça flag = botão evita debouncing
  235. //--------------------- Step_Down -----------------
  236. bt5 = digitalRead(botao5); // Le botão em A5
  237. if ((bt5 == LOW) && (fbt5 == HIGH)) // Se botão apertado e flag ligado
  238. { // Faça
  239. delay(30); // 30 ms de de-bouncing
  240. Step_M[Index_Nivel][Sub_Nivel] = Step_M[Index_Nivel][Sub_Nivel] -1; // Desloca direita Item
  241. if (Step_M[Index_Nivel][Sub_Nivel] > 99) // Se contagem maior que 99
  242. { // Faça
  243. Step_M[Index_Nivel][Sub_Nivel] = 99; // Set 99
  244. }
  245. Dsp_Index(); // Mostra valores no LCD
  246. }
  247. fbt5 = bt5; // Faça flag = botão evita debouncing
  248. //--------------------- Enter -----------------
  249. bt6 = digitalRead(botao6); // Le botão em D3
  250. if ((bt6 == LOW) && (fbt6 == HIGH)) // Se botão apertado e flag ligado
  251. { // Faça
  252. delay(30); // 30 ms de de-bouncing
  253. for (unsigned int t = 0; t <4; t++)
  254. {
  255. for (unsigned int u = 0; u <4; u++)
  256. Serial.println(Step_M[t][u]);
  257. }
  258. Screen();
  259. cnt = 0;
  260. }
  261. fbt6 = bt6; // Faça flag = botão evita debouncing
  262. delay(100); // Retardo de 100ms
  263. //--------------------- switch -----------------
  264. switch (Nivel) // Controle do nivel do Menu
  265. {
  266. case 0: // Se Nivel for 0
  267. MeuMenu = "TEMP UMD "; // Variavel de display
  268. Nivel = 10; // Defina nivel 10 para não reexecutar case 0
  269. Dsp_Index(); // Mostra valores no LCD
  270. break; // Sai do Switch
  271. case 1: // Se Nivel for 1
  272. MeuMenu = " HH MM SS Girar"; // Variavel de display
  273. Nivel = 10; // Defina nivel 10 para não reexecutar case 1
  274. Dsp_Index(); // Mostra valores no LCD
  275. break; // Sai do Switch
  276. case 2: // Se Nivel for 2
  277. MeuMenu = " HH MM SS Set"; // Variavel de display
  278. Nivel = 10; // Defina nivel 10 para não reexecutar case 2
  279. Dsp_Index(); // Mostra valores no LCD
  280. break; // Sai do Switch
  281. case 3: // Se Nivel for 3
  282. MeuMenu = " DD Tempo ligado"; // Variavel de display
  283. Nivel = 10; // Defina nivel 10 para não reexecutar case 3
  284. Dsp_Index(); // Mostra valores no LCD
  285. break; // Sai do Switch
  286. default: // Para qq outro valor
  287. break; // Sai do Switch
  288. }
  289.  
  290. switch (Sub_Nivel) // Controle do nivel do Sub_Menu
  291. {
  292. case 0: // Se sub_Nivel for 0
  293. Pos = 1; // Posiciona cursor em 1
  294. Dsp_Index(); // Mostra valores no LCD
  295. break; // Sai do Switch
  296. case 1: // Se sub_Nivel for 0
  297. Pos = 5; // Posiciona cursor em 5
  298. Dsp_Index(); // Mostra valores no LCD
  299. break; // Sai do Switch
  300. case 2: // Se sub_Nivel for 0
  301. Pos = 9; // Posiciona cursor em 9
  302. Dsp_Index(); // Mostra valores no LCD
  303. break; // Sai do Switch
  304. case 3: // Se sub_Nivel for 0
  305. Pos = 13; // Posiciona cursor em 13
  306. Dsp_Index(); // Mostra valores no LCD
  307. break; // Sai do Switch
  308. }
  309. delay(2000);
  310. }
  311. }
  312. //--------------------- Rotina PressUp -----------------
  313. void PressUp() // Rotina chamada pela interrupcao do botão de Menu_up
  314. {
  315. if (cnt2 ==1)
  316. {
  317. cnt = 1;
  318. detachInterrupt(0);
  319. Main_Menu();
  320. }
  321. cnt2++;
  322. if (cnt2 >1)
  323. cnt2 = 0;
  324. }
  325. //--------------------- Screen -----------------
  326. void Screen()
  327. {
  328. celsius = dht.readTemperature(); // Le temperatura no DHT11
  329. humidade = dht.readHumidity(); // Le humidade no DHT11
  330.  
  331. lcd.clear(); // Limpa do buffer do LCD
  332. lcd.setCursor(0, 0); // Seleciona posição 0 da linha 0
  333. lcd.print("Chocadeira"); // Imprime texto
  334. lcd.setCursor(11, 1); // Seleciona posição 0 da linha 0
  335. TempProg = Step_M[0][0]; // Valor da temperatura programda extraida de menu
  336. lcd.print(TempProg); // Imprime variavel
  337.  
  338. lcd.setCursor(11, 0); // Seleciona posição 0 da linha 0
  339. lcd.print("H "); // Imprime texto
  340. lcd.print(humidade); // Imprime humidade
  341. if (celsius >= TempProg) // Faça se a temperatura for maior que a programada
  342. digitalWrite(ReleR, LOW); // Desliga Rele
  343. else // Ou se não for
  344. digitalWrite(ReleR, HIGH); // Liga Rele
  345.  
  346. HumidProg = Step_M[0][1]; // Valor da umidade programda extraida de menu
  347. if (humidade >= HumidProg) // Faça se a humidade for maior que a programada
  348. digitalWrite(ReleH, HIGH); // Liga Rele
  349. else // Ou se não for
  350. digitalWrite(ReleH, LOW); // Desliga Rele
  351.  
  352. lcd.setCursor(0, 1); // Seleciona posição 0 da linha 0
  353. lcd.print(celsius); // Imprime a gemperatura
  354. lcd.setCursor(6, 1); // Seleciona posição 6 da linha 0
  355. if (digitalRead(ReleR) == 1) // Faça se o rele tiver operado
  356. lcd.print("Lig "); // Imprime texto
  357. else // Ou se não tiver
  358. lcd.print("Desl"); // Imprime texto
  359. lcd.noBlink();
  360. attachInterrupt(0, PressUp, FALLING); // Interrupt de botão ao ficar LOW o pino 2
  361. // Coloque aqui a rotina de tempo de giro, de horario e de dias
  362.  
  363. }
  364. //--------------------- Loop -----------------
  365. void loop() // Função para executar code
  366. {
  367. Screen();
  368.  
  369. delay(1000);
  370. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement