Advertisement
RuiViana

Chocadeira

Jun 28th, 2015
850
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.26 KB | None | 0 0
  1. /*
  2. Nome do Projeto: Chocadeira
  3. Nome do Aquivo: Choca_DS18b20_V02.ino
  4. Dependencias: OneWire.h Biblioteca de 1Wire
  5. LiquidCrystal.h Biblioteca de LCD
  6. MCU: ATmega
  7. Board: Arduino Uno/Mega/Mini
  8. Compilador N/A
  9. IDE: Arduino IDE 1.0.6
  10. Hardware: Arduino UNO/MEGA/Mini
  11. Escrito por: Rui Viana
  12. Data: 27/06/2015
  13. Uso: Didático
  14. Desenhos Chocadeira.jpg
  15. Copyright @ N/A
  16.  
  17. Este programa é software livre;
  18. e é distribuído na esperança que possa ser útil, mas SEM QUALQUER GARANTIA;
  19. mesmo sem a garantia implícita de COMERCIALIZAÇÃO ou ADEQUAÇÃO A UM DETERMINADO FIM.
  20. A parte do tratamento de 1Wire des código foi copiada do exemplo da biblioteca OneWire.h.
  21.  
  22. REVISIONS: (latest entry first)
  23. 2015-06-26 - Choca_DS18b20_V02.ino - First release
  24. 2015-06-28 - Choca_DS18b20_V02.ino - Adicao de LDC
  25. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  26. Descricão:
  27.  
  28. Este código utilza a biblioteca OneWire.h para ler sensores de temperatura.
  29. E a biblioteca LiquidCrystal.h para mostrar a temperatura no diplsy LCD
  30. Converte o valor lido para oC, e mostra em um diplay LCD.
  31. Compara o valor da leitura com o valor programado, e define se liga ou desliga o rele
  32. que alimenta as resistencias de aquecimento.
  33. Tem dois botoes, um para aumentar e outro para diminuir a programação da temperatura
  34. */
  35. //************ Variaveis e constantes ************
  36. #include <OneWire.h> // Biblioteca de 1Wire
  37. #include <LiquidCrystal.h> // Inclui a biblioteca do LCD
  38. OneWire ds(5); // Seleciona a porta do 1WirwBus on pin 10
  39. LiquidCrystal lcd( 7, 8, 9, 10, 11, 12); // Pinos do LCD
  40. const int Rele = 13; // Pino de Saída
  41. const int Up = 2; // Pino do switch de Up
  42. const int Dn = 3; // Pino do switch de Dn
  43. float TempProg = 27; // Variavel com temperatura programada
  44. long debouncing_time = 15; // Debouncing Time in Milliseconds
  45. volatile unsigned long last_micros; // Variavel para deboucing
  46. //*********************** Setup *******************
  47. void setup()
  48. {
  49. lcd.begin(16, 2); // Inicia o LCD com dimensões 16x2(Colunas x Linhas)
  50. pinMode(Rele, OUTPUT); // Port como saída
  51. digitalWrite(Rele, LOW); // Desliga Rele
  52. pinMode(Up, INPUT_PULLUP); // Port do switch Up como entrada e Pull-Up
  53. pinMode(Dn, INPUT_PULLUP); // Port do switch Dn como entrada e Pull-Up
  54. delay(1000); // Aguarda 1 seg antes de acessar as informações do sensor
  55. attachInterrupt(1, PressUp, RISING); // Interrupt de botão ao ficar HIGH o pino 3
  56. attachInterrupt(0, PressDn, RISING); // Interrupt de botão ao ficar HIGH o pino 2
  57.  
  58. lcd.clear(); // Limpa do buffer do LCD
  59. lcd.setCursor(3, 0); // Seleciona posição 0 da linha 0
  60. lcd.print("Chocadeira"); // Imprime texto
  61. lcd.setCursor(11, 1); // Seleciona posição 0 da linha 0
  62. lcd.print(TempProg); // Imprime variavel
  63. }
  64. //*************** Rotina PressUp *****************
  65. void PressUp() // Rotina chamada pela interrupcao do botão de aumento
  66. {
  67. if((long)(micros() - last_micros) >= debouncing_time * 1000) // Tempo de debouncing
  68. {
  69. TempProg = TempProg + 0.1; // Incrementa temperatura em 0,01 oC
  70. lcd.setCursor(11, 1); // Seleciona posição 0 da linha 0
  71. lcd.print(TempProg); // Imprime variavel
  72. last_micros = micros(); // Tempo de debouncing
  73. }
  74. }
  75. //*************** Rotina PressDn *****************
  76. void PressDn() // Rotina chamada pela interrupcao do botão de reducao
  77. {
  78. if((long)(micros() - last_micros) >= debouncing_time * 1000) // Tempo de debouncing
  79. {
  80. TempProg = TempProg - 0.1; // Decrementa temperatura em 0,01 oC
  81. lcd.setCursor(11, 1); // Seleciona posição 0 da linha 0
  82. lcd.print(TempProg); // Imprime variavel
  83. last_micros = micros(); // Tempo de debouncing
  84. }
  85. }
  86. //*********************** Loop ********************
  87. void loop()
  88. {
  89. byte i; // Variavel de uso geral
  90. byte present = 0; // Variavel para present bit do 1Wire
  91. byte type_s; // Variavel para selecionar o tipo de Sensor
  92. byte data[12]; // Matriz para guardar os dados lidos do sensor
  93. byte addr[8]; // Matriz para guardar endereço lidos do sensor
  94. float celsius; // Variavel para guardar o valor das temperutras
  95. if ( !ds.search(addr)) // Search for the next device.
  96. {
  97. ds.reset_search(); // Begin a new search.
  98. delay(250);
  99. return;
  100. }
  101. if (OneWire::crc8(addr, 7) != addr[7]) // Verifica o CRC
  102. {
  103. return;
  104. }
  105. switch (addr[0]) // Le o byte 0 da ROM
  106. {
  107. case 0x10: // Se for 0x10
  108. type_s = 1; // Set tipo = 1
  109. break;
  110. case 0x28: // Se for 0x28
  111. type_s = 0; // Set tipo = 0
  112. break;
  113. default:
  114. return;
  115. }
  116. ds.reset(); // Reset the 1-wire bus.
  117. ds.select(addr); // Select a device based on its address.
  118. ds.write(0x44,1); // start conversion, with parasite power on at the end
  119. delay(1000); // maybe 750ms is enough, maybe not
  120. present = ds.reset(); // Reset the 1-wire bus. e agurada o Present Pulse
  121. ds.select(addr); // Select a device based on its address.
  122. ds.write(0xBE); // Read Scratchpad
  123.  
  124. for ( i = 0; i < 9; i++) // le os 8 bytes de dados
  125. {
  126. data[i] = ds.read(); // Read a byte
  127. }
  128. unsigned int raw = (data[1] << 8) | data[0]; // Função raw Shift Data[1] 8 bits
  129. // e faz or com data[0]
  130. if (type_s)
  131. {
  132. raw = raw << 3; // 9 bit resolution default
  133. if (data[7] == 0x10)
  134. {
  135. raw = (raw & 0xFFF0) + 12 - data[6]; // count remain gives full 12 bit resolution
  136. }
  137. }
  138. else
  139. {
  140. byte cfg = (data[4] & 0x60);
  141. if (cfg == 0x00) raw = raw << 3; // 9 bit resolution, 93.75 ms
  142. else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
  143. else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
  144. // default is 12 bit resolution, 750 ms conversion time
  145. }
  146. celsius = (float)raw / 16.0;
  147. if (celsius >= TempProg)
  148. digitalWrite(Rele, LOW); // Desliga Rele como entrada e Pull-Up
  149. else
  150. digitalWrite(Rele, HIGH); // Liga Rele como entrada e Pull-Up
  151. lcd.setCursor(0, 1); // Seleciona posição 0 da linha 0
  152. lcd.print(celsius); // Imprime texto
  153. lcd.setCursor(6, 1); // Seleciona posição 0 da linha 0
  154. if (digitalRead(Rele) == 1)
  155. lcd.print("Lig "); // Imprime texto
  156. else
  157. lcd.print("Desl"); // Imprime texto
  158. //Não diminuir o valor abaixo. O ideal é a leitura a cada 2 segundos
  159. delay(2000);
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement