Advertisement
RuiViana

Data_Logger

Feb 23rd, 2016
250
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.65 KB | None | 0 0
  1. /*
  2. Criado em 08 Jan 2016
  3. por Felipe Mendes
  4.  
  5. ***Este exemplo é de domínio público.***
  6.  
  7. [DATALOGGER TRANSMISSOR RF433]
  8.  
  9. Este exemplo mostra como montar um datalogger com transmissor
  10. de dados por RF433 usando um arduino NANO.
  11.  
  12. O circuito:
  13.  
  14. #Rf433:
  15. ** Tx - pin D7
  16.  
  17. #DHT22:
  18. ** Data - pin D8
  19.  
  20. #RTC DS1307
  21. **SCL - pin A5
  22. **SDA - pin A4
  23.  
  24. #LCD I2C:
  25. **SCL - pin A5
  26. **SDA - pin A4
  27.  
  28. */
  29. #include <LiquidCrystal_I2C.h>
  30. #include <VirtualWire.h>
  31. #include "DHT.h"
  32. #include "Wire.h"
  33.  
  34. const int chipSelect = 4;
  35.  
  36. #define DHTPIN 8 // Pino digital 8 conectado DHT22
  37. #define DHTTYPE DHT22 // DHT 22
  38. #define DS1307_ADDRESS 0x68
  39.  
  40. byte zero = 0x00;
  41.  
  42. DHT dht(DHTPIN, DHTTYPE);
  43. int ledPin = 13;
  44. char Msg[50];// String que será enviada através do rf transmissor
  45.  
  46. byte thermometer[8] = //Icone para termômetro
  47. {
  48. B00100, B01010, B01010, B01110, B01110, B11111, B11111, B01110
  49. };
  50.  
  51. byte droplet[8] = //Icone para gota
  52. {
  53. B00100, B00100, B01010, B01010, B10001, B10001, B10001, B01110,
  54. };
  55.  
  56. #define Buzzer 9
  57. #define bUp 6
  58. #define bDown 5
  59. #define bUp0 92
  60. #define bDown0 93
  61.  
  62. boolean aUp, aDown; // Grava o ultimo valor lidos nos botões.
  63. // Utilizado pela função Checkbutton p/ identificar quando há uma alteração no estado do pino dos botões
  64.  
  65. int variavel; // variavel a ser alterada pelo menu
  66. char state=1; // variável que guarda posição atual do menu
  67.  
  68. LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE);
  69.  
  70. int segundos ;
  71. int minutos ;
  72. int horas = ;
  73. int diadasemana ;
  74. int diadomes ;
  75. int mes ;
  76. int ano ;
  77.  
  78. void setup()
  79. {
  80. Wire.begin();
  81. Serial.begin(9600);
  82.  
  83. lcd.begin(16,2);
  84. lcd.backlight(); // finish with backlight on
  85. lcd.createChar(1, thermometer);
  86. lcd.createChar(2, droplet);
  87.  
  88. pinMode(Buzzer, OUTPUT); // Buzzer
  89. pinMode(bUp, INPUT);
  90. pinMode(bDown, INPUT);
  91.  
  92. digitalWrite(bUp, HIGH);
  93. digitalWrite(bDown, HIGH);
  94.  
  95. //A linha abaixo pode ser retirada apos setar a data e hora
  96. //SelecionaDataeHora();
  97.  
  98. dht.begin(); // Inicializando o DHT sensor
  99. pinMode(ledPin,OUTPUT);
  100. // VirtualWire setup
  101. vw_setup(2000); // Bits por seg
  102. vw_set_tx_pin(7);// Set o pino digital 7 Tx pin.
  103.  
  104. }
  105.  
  106. void loop(){
  107.  
  108. // Leia e grave os dados do sensor
  109. int humidity = dht.readHumidity();
  110. int temp = dht.readTemperature();
  111. int f = dht.readTemperature(true);
  112.  
  113. Wire.beginTransmission(DS1307_ADDRESS);
  114. Wire.write(zero);
  115. Wire.endTransmission();
  116. Wire.requestFrom(DS1307_ADDRESS, 7);
  117. segundos = ConverteparaDecimal(Wire.read());
  118. minutos = ConverteparaDecimal(Wire.read());
  119. horas = ConverteparaDecimal(Wire.read() & 0b111111);
  120. diadasemana = ConverteparaDecimal(Wire.read());
  121. diadomes = ConverteparaDecimal(Wire.read());
  122. mes = ConverteparaDecimal(Wire.read());
  123. ano = ConverteparaDecimal(Wire.read());
  124.  
  125. sprintf(Msg, "%d,%d,%d", segundos,minutos,horas);
  126. // Turn on a light to show transmitting
  127.  
  128. digitalWrite(ledPin, HIGH);
  129.  
  130. vw_send((uint8_t *)Msg, strlen(Msg));
  131. vw_wait_tx(); // Aguarda até toda a mensagem ser enviada.
  132. // Turn off a light after transmission
  133. digitalWrite(ledPin, LOW);
  134. for(int i=0;i<75;i++);
  135.  
  136. //Display LCD
  137. switch (state) { // Define checa qual tela atual
  138. case 1: // executado quando na TELA 1
  139. switch (CheckButton()) {
  140. case bUp:
  141. digitalWrite(Buzzer,HIGH);
  142. delay(200);
  143. digitalWrite(Buzzer,LOW);
  144. lcd.clear(); Set_state(4); // antes de mudar de tela, é necessário limpar o
  145. break; // display com a função lcd.clear()
  146. case bDown:
  147. digitalWrite(Buzzer,HIGH);
  148. delay(200);
  149. digitalWrite(Buzzer,LOW);
  150. lcd.clear(); Set_state(2);
  151. break;
  152. default: // Caso nenhum botão tenha sido apertado, ela executa a set_state
  153. Set_state(1); // mesmo assim para atualizar o display.
  154. }
  155. break;
  156.  
  157. case 2: // executado quando na TELA 2
  158. switch (CheckButton()) {
  159. case bUp:
  160. digitalWrite(Buzzer,HIGH);
  161. delay(200);
  162. digitalWrite(Buzzer,LOW);
  163. lcd.clear(); Set_state(1);
  164. break;
  165. case bDown:
  166. digitalWrite(Buzzer,HIGH);
  167. delay(200);
  168. digitalWrite(Buzzer,LOW);
  169. lcd.clear(); Set_state(3);
  170. break;
  171. default:
  172. Set_state(2);
  173. }
  174. break;
  175.  
  176. case 3: // executado quando na TELA 3
  177. switch (CheckButton()) {
  178. case bUp:
  179. digitalWrite(Buzzer,HIGH);
  180. delay(200);
  181. digitalWrite(Buzzer,LOW);
  182. lcd.clear(); Set_state(2);
  183. break;
  184. case bDown:
  185. digitalWrite(Buzzer,HIGH);
  186. delay(200);
  187. digitalWrite(Buzzer,LOW);
  188. lcd.clear(); Set_state(4);
  189. break;
  190. default:
  191. Set_state(3);
  192. }
  193. break;
  194.  
  195. case 4: // executado quando na TELA 4
  196. switch (CheckButton()) {
  197. break;
  198. case bDown:
  199. digitalWrite(Buzzer,HIGH);
  200. delay(200);
  201. digitalWrite(Buzzer,LOW);
  202. lcd.clear(); Set_state(1);
  203. break;
  204. default:
  205. Set_state(4);
  206. }
  207. break;
  208. default: ;
  209. }
  210.  
  211. }
  212.  
  213. void SelecionaDataeHora() // Seta a data e a hora do DS1307
  214. {
  215.  
  216. byte segundos = 40; // Valores de 0 a 59
  217. byte minutos = 35; // Valores de 0 a 59
  218. byte horas = 19; // Valores de 0 a 23
  219. byte diadasemana = 5; // Valores de 0 a 6 (0=Domingo, 1 = Segunda...)
  220. byte diadomes = 29; // Valores de 1 a 31
  221. byte mes = 1; // Valores de 1 a 12
  222. byte ano = 16; // Valores de 0 a 99
  223. Wire.beginTransmission(DS1307_ADDRESS);
  224. // Stop no CI para que o mesmo possa receber os dados
  225. Wire.write(zero);
  226.  
  227. // As linhas abaixo escrevem no CI os valores de
  228. // data e hora que foram colocados nas variaveis acima
  229. Wire.write(ConverteParaBCD(segundos));
  230. Wire.write(ConverteParaBCD(minutos));
  231. Wire.write(ConverteParaBCD(horas));
  232. Wire.write(ConverteParaBCD(diadasemana));
  233. Wire.write(ConverteParaBCD(diadomes));
  234. Wire.write(ConverteParaBCD(mes));
  235. Wire.write(ConverteParaBCD(ano));
  236. Wire.write(zero); //Start no CI
  237. Wire.endTransmission();
  238. }
  239.  
  240. byte ConverteParaBCD(byte val)
  241. {
  242. // Converte o número de decimal para BCD
  243. return ( (val/10*16) + (val%10) );
  244. }
  245.  
  246. byte ConverteparaDecimal(byte val)
  247. {
  248. // Converte de BCD para decimal
  249. return ( (val/16*10) + (val%16) );
  250. }
  251.  
  252. //Função CheckButton
  253. char CheckButton() {
  254. if (aUp!=digitalRead(bUp)) {
  255. aUp=!aUp;
  256. if (aUp) return bUp0; else return bUp;
  257. } else
  258. if (aDown!=digitalRead(bDown)) {
  259. aDown=!aDown;
  260. if (aDown) return bDown0; else return bDown;
  261. } else
  262. return 0;
  263. }
  264.  
  265. void Set_state(char index) {
  266. state = index; // Atualiza a variável state para a nova tela
  267. switch (state) { // verifica qual a tela atual e exibe o conteúdo correspondente
  268. case 1: //==================== state 1
  269. lcd.setCursor(0,0);
  270. lcd.print ("[ ECO LOGGER ]");
  271. lcd.setCursor(0,1);
  272. lcd.print ("By:Felipe Mendes");
  273. break;
  274.  
  275. case 2: //==================== state 2
  276. lcd.setCursor(0,0);
  277. // Mostra a hora atual no display
  278. lcd.print("[ ");
  279. if (horas < 10){
  280. lcd.print("0");}
  281. lcd.print(horas);
  282. lcd.print(":");
  283. if (minutos < 10){
  284. lcd.print("0");}
  285. lcd.print(minutos);
  286. lcd.print(":");
  287. if (segundos < 10){
  288. lcd.print("0");}
  289. lcd.print(segundos);
  290. lcd.print(" ]");
  291. lcd.setCursor(0,1);
  292. // Mostra a data atual no display
  293. lcd.print("[");
  294. if (diadomes < 10){
  295. lcd.print("0");}
  296. lcd.print(diadomes);
  297. lcd.print("/");
  298. if (mes < 10){
  299. lcd.print("0");}
  300. lcd.print(mes);
  301. lcd.print("/");
  302. lcd.print("20");
  303. lcd.print(ano);
  304.  
  305. //Mostra o dia da semana no display
  306. switch(diadasemana)
  307. {
  308. case 0: lcd.print(" Dom]");
  309. break;
  310. case 1: lcd.print(" Seg]");
  311. break;
  312. case 2: lcd.print(" Ter]");
  313. break;
  314. case 3: lcd.print(" Qua]");
  315. break;
  316. case 4: lcd.print(" Qui]");
  317. break;
  318. case 5: lcd.print(" Sex]");
  319. break;
  320. case 6: lcd.print(" Sab]");
  321. }
  322. break;
  323.  
  324. case 3: //==================== state 3
  325. lcd.setCursor(0,0);
  326. lcd.print("[ Temp: ");
  327. lcd.write(1);
  328. lcd.print(26);
  329. lcd.write(0b11011111);
  330. lcd.print("C ]");
  331. lcd.setCursor(0,1);
  332. lcd.print ("[ Umid: ");
  333. lcd.write(2);
  334. lcd.print (97);
  335. lcd.print ("% ]");
  336. break;
  337.  
  338. case 4: //==================== state 4
  339.  
  340. break;
  341. default: ;
  342. }
  343. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement