Advertisement
rogerin

Untitled

Sep 26th, 2015
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.91 KB | None | 0 0
  1. #include <Wire.h>
  2. #include <DS1307.h>
  3. #include "Thread.h"
  4. #include "ThreadController.h"
  5. ThreadController cpu;
  6.  
  7. // Armazena o buffer dos caractares que cheram pela serial
  8. #define BUFFER_SIZE 20
  9.  
  10. // Tamanho maximo do array de bytes que chegam da serial
  11. int buf[BUFFER_SIZE];
  12.  
  13.  
  14. // Posicao de cada dado salvo em memoria.
  15. int memoria[20]    = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
  16.  
  17. // cada item e um dia da semana
  18. //int dia_semana[8] = {0,0,0,0,0,0,0,0};
  19. //int intervalo[8]  = {0,0,0,0,0,0,0,0};
  20.  
  21. int recebe;
  22. int valor;
  23. //int resposta;
  24. int PIN_ALARME = 9;
  25. int regra;
  26.  
  27. boolean acionado = false;
  28. boolean primeiraVez = true;
  29.  
  30. int configuracao = 0;
  31. // mega
  32. //DS1307  rtc(20, 21);
  33.  
  34. // acionamento
  35. int ultimoAcionamento = 0;
  36. int intervalorTempo = 0;
  37.  
  38. // uno
  39. DS1307 rtc(A4, A5);
  40.  
  41. Time t;
  42.  
  43. Thread acionamento;
  44. void verificaAcionamento() {
  45.  
  46.   t = rtc.getTime();
  47.   /*
  48.     t.down retorna o dia da semana
  49.     onde:
  50.       1 - segunda
  51.       2 - terca
  52.       3 - quarta
  53.       4 - quinta
  54.       5 - sexta
  55.       6 - sabado
  56.       7 - domingo
  57.      
  58.      
  59.       Salvando na variavel "memoria"
  60.      
  61.       eu pego o item do array, para pegar apartir do primeiro, se o primeiro dia da semana eh o numero 1, eu faco "dia_da_semana-1" e pego o primeiro item do array
  62.      
  63.       Pegando o dia da semana atual, eu verifico se neste dia da semana, eh para fazer o acionamento.
  64.      
  65.   */
  66.  
  67.  
  68.   // pegando o dia dasemana para saber se aciona ou nao.
  69.   int dia_da_semana = (int) rtc.peek(memoria[t.dow - 1]);
  70.  
  71.     /*
  72.       verifica se no dia atual resgatado do array acima eh para acionar ou nao
  73.       nos primeiros 7 itens do array salvo na variavel "memoria", esta em ordem, os dias da semana retorando entre 0 e 1, e 0 ele nao aciona e 1 ele aciona
  74.       , mas, essa porra ta pegando da tabela ascii, entao o 0 eh igual a 48 e o 1 eh igual a 49
  75.     */
  76.    
  77.   // se neste dia eh para acionar, entra nesse if  
  78.   if (dia_da_semana == 49) {
  79.    
  80.    
  81.     Serial.println("Hoje aciona!");
  82.    
  83.    
  84.     regra = rtc.peek(memoria[7]);
  85.     /*  
  86.    
  87.       Esta REGRA, retorna do APP entre 0 e 9, que sao os intervalos de acionamento.
  88.       Onde essa regra fica salvo no indice 7, memoria[7] do array "memoria"
  89.       A regra de intervalo eh:
  90.         0 - 15 min
  91.         1 - 20 min
  92.         2 - 25 min
  93.         3 - 30 min
  94.         4 - 35 min
  95.         5 - 40 min
  96.         6 - 45 min
  97.         7 - 50 min
  98.         8 - 55 min
  99.         9 - 60 min
  100.        
  101.       REGRA
  102.       48    0
  103.       49    1
  104.       50    2
  105.       51    3
  106.       52    4
  107.       53    5
  108.       54    6
  109.       55    7
  110.       56    8
  111.       57    9
  112.     */
  113.    
  114.     if(ultimoAcionamento ==0) {
  115.       primeiraVez = true;
  116.     }
  117.    
  118.     intervalorTempo = (int)(((t.hour*100) + t.min) - ultimoAcionamento);
  119.    
  120.     // 15mim
  121.     if((intervalorTempo == 15 && regra == 48 && intervalorTempo > 2) || (primeiraVez && regra == 48)) {
  122.       Serial.println("PASSOU 15 MIM");
  123.       acionado = true;
  124.       primeiraVez = false;
  125.     }
  126.    
  127.     // 20min
  128.     if((intervalorTempo == 20 && regra == 49 && intervalorTempo > 2) || (primeiraVez && regra == 49)) {
  129.       Serial.println("PASSOU 20 MIM");
  130.       acionado = true;
  131.       primeiraVez = false;
  132.     }
  133.    
  134.  
  135.     // 25min
  136.     if((intervalorTempo == 25 && regra == 50 && intervalorTempo > 2 ) || (primeiraVez && regra == 50)) {
  137.       Serial.println("PASSOU 25 MIM");
  138.       acionado = true;
  139.       primeiraVez = false;
  140.     }
  141.    
  142.     // 30min
  143.     if((intervalorTempo == 30 && regra == 51 && intervalorTempo > 2) || (primeiraVez && regra == 51)) {
  144.       Serial.println("PASSOU 30 MIM");
  145.       acionado = true;
  146.       primeiraVez = false;
  147.     }
  148.    
  149.     // 35min
  150.     if((intervalorTempo == 35 && regra == 52 && intervalorTempo > 2) || (primeiraVez && regra == 52)) {
  151.       Serial.println("PASSOU 35 MIM");
  152.       acionado = true;
  153.       primeiraVez = false;
  154.     }
  155.    
  156.     // 40min
  157.     if((intervalorTempo == 40 && regra == 53 && intervalorTempo > 2 ) || (primeiraVez && regra == 53)) {
  158.       Serial.println("PASSOU 40 MIM");
  159.       acionado = true;
  160.       primeiraVez = false;
  161.     }
  162.    
  163.     // 45min
  164.     if((intervalorTempo == 45 && regra == 54 && intervalorTempo > 2) || (primeiraVez && regra == 54)) {
  165.       Serial.println("PASSOU 45 MIM");
  166.       acionado = true;
  167.       primeiraVez = false;
  168.     }
  169.    
  170.     // 50min
  171.     if((intervalorTempo == 50 && regra == 55 && intervalorTempo > 2) || (primeiraVez && regra == 55)) {
  172.       Serial.println("PASSOU 50 MIM");
  173.       acionado = true;
  174.       primeiraVez = false;
  175.     }
  176.    
  177.     // 55min
  178.     if((intervalorTempo == 55 && regra == 56 && intervalorTempo > 2) || (primeiraVez && regra == 56)) {
  179.       Serial.println("PASSOU 55 MIM");
  180.       acionado = true;
  181.       primeiraVez = false;
  182.     }
  183.    
  184.     // 60min
  185.     if((intervalorTempo == 60 && regra == 57 && intervalorTempo > 2) || (primeiraVez && regra == 57)) {
  186.       Serial.println("PASSOU 60 MIM");
  187.       acionado = true;
  188.       primeiraVez = false;
  189.     }
  190.    
  191.    
  192.    
  193.    
  194.     if(acionado) {
  195.       ultimoAcionamento = (t.hour*100) + t.min;
  196.       acionaAlarme();
  197.       primeiraVez = false;
  198.       acionado = false;
  199.     }
  200.    
  201.    
  202.     Serial.println();
  203.     Serial.print("Passou min: ");
  204.     Serial.print(intervalorTempo, DEC);
  205.     Serial.println();
  206.        
  207.     Serial.println();
  208.     Serial.print("REGRA: ");
  209.     Serial.print(regra, DEC);
  210.     Serial.println();
  211.    
  212.    
  213.      
  214.    
  215.   }
  216.   else {
  217.     Serial.println("Hoje NAO aciona!");
  218.   }
  219.  
  220.  
  221. }
  222.  
  223.  
  224. /*
  225.   Esta thread apena mostra a serial, a Data atual salva na memoria do filho da puta do RTC maldito.
  226. */
  227. Thread thread1;
  228. void mostraDataHora(){
  229.   //thread1.enabled = false;
  230.   t = rtc.getTime();
  231.  
  232.   // Send date over serial connection
  233.   Serial.print("Dia ");
  234.   Serial.print(t.date);
  235.   Serial.print(". Mes ");
  236.   Serial.print(rtc.getMonthStr());
  237.   Serial.print(" ano ");
  238.   Serial.print(t.year);
  239.   //Serial.println(".");
  240.  
  241.   // Send Day-of-Week and time
  242.   Serial.print(" dia ");
  243.   Serial.print(t.dow);
  244.   Serial.print(". ");
  245.   Serial.print(t.hour);
  246.   Serial.print(" : ");
  247.   Serial.print(t.min);
  248.   Serial.write(" : ");
  249.   Serial.print(t.sec);
  250.   Serial.print("");
  251. }
  252.  
  253.  
  254.  
  255.  
  256. Thread Memoria;
  257. void StatusDaMemoria(){
  258.  
  259.  t = rtc.getTime();
  260.   Serial.print("{ \"dias\":[");
  261.  
  262.   // um for pelos indices do array memoria, onde esta os dias da semana de 0 a 6, para saber se eh para acionar ou nao
  263.   // e pego o indice 7 que esta  a regra de intervalos de tempo
  264.   for (int a = 0; a < 7; a++) {
  265.     int aciona = rtc.peek(memoria[a]);
  266.  
  267.     Serial.print("{ \"dia\":\"");
  268.     Serial.print(a,DEC);
  269.     Serial.print("\",\"valor\":\"");  
  270.     Serial.print(aciona,DEC);
  271.     if(a != 6) {
  272.       Serial.print("\"},");
  273.     }
  274.     else {
  275.       Serial.print("\"}");
  276.     }
  277.     delay(1);
  278.   }
  279.   //Serial.print("]}");
  280.  
  281.   Serial.print("], \"intervalo\":\"");
  282.   Serial.print(rtc.peek(memoria[7]),DEC);
  283.   Serial.print("\",\"dia\":\"");
  284.   Serial.print(t.date);
  285.   Serial.print("\",\"mes\":\"");
  286.   Serial.print(rtc.getMonthStr());
  287.   Serial.print("\",\"ano\":\"");
  288.   Serial.print(t.year);
  289.   Serial.print("\",\"hora\":\"");
  290.   Serial.print(t.hour);
  291.   Serial.print("\",\"minuto\":\"");
  292.   Serial.print(t.min);
  293.   Serial.print("\",\"segundo\":\"");
  294.   Serial.print(t.sec);
  295.   Serial.print("\"}");
  296.  
  297.   Serial.println();
  298.  
  299. }
  300.  
  301. void setup(){
  302.   Serial.begin(9600);
  303.   pinMode(PIN_ALARME, OUTPUT);
  304.   digitalWrite(PIN_ALARME, LOW);
  305.  
  306.   thread1.setInterval(5000);
  307.   thread1.onRun(mostraDataHora);
  308.  
  309.  
  310.  
  311.   acionamento.setInterval(2000);
  312.   acionamento.onRun(verificaAcionamento);
  313.  
  314.   Memoria.setInterval(2000);
  315.   Memoria.onRun(StatusDaMemoria);
  316.  
  317.  
  318.   cpu.add(&thread1);
  319.   //cpu.add(&threadMemoria);
  320.   cpu.add(&acionamento);
  321.   cpu.add(&Memoria);
  322.  
  323.  
  324.  
  325.  
  326.  
  327.     Wire.begin();
  328.     rtc.begin();
  329.    
  330.     rtc.halt(false);
  331.  
  332.    
  333.     t = rtc.getTime();
  334.  
  335.     rtc.setDOW(6);        // Set Day-of-Week to SUNDAY
  336.     rtc.setTime(11, 56, 0);     // Set the time to 12:00:00 (24hr format)
  337.     rtc.setDate(9, 26, 2015);   // Set the date to October 3th, 201
  338.  
  339. }
  340.  
  341. unsigned int len = 0;
  342.  
  343.  
  344. void loop()
  345. {
  346.   cpu.run();
  347.  
  348.   //Serial.write( msg, 7 );
  349.  
  350.   //Serial.write('rogerio');
  351.  
  352.  
  353.   while (Serial.available()) {
  354.     unsigned int c = Serial.read();
  355.     if (c == 0xA || c == 0xD) { // \n or \r
  356.       sendData();
  357.     }
  358.     else {
  359.       bufferData(c);
  360.     }
  361.   }
  362. }
  363.  
  364.  
  365.  
  366.  
  367. void bufferData(int c) {
  368.   if (len < 21) {
  369.     buf[len++] = (int) c;
  370.     //rtc.poke(memoria[c], buf[c]);
  371.   } // TODO warn, or send data
  372. }
  373.  
  374. void sendData() {
  375.   //Serial.write("Us: ");
  376.  
  377.    for (int i = 0; i < len; i++) {
  378.     Serial.write(buf[i]);
  379.     rtc.poke(memoria[i], buf[i]);
  380.    }
  381.  
  382.   /*for (int i = 0; i < len; i++) {
  383.       rtc.poke(memoria[i], buf[i]);
  384.   }*/
  385.  
  386.   Serial.write(0xA); // TODO test on windows
  387.   len = 0;  
  388. }
  389.  
  390.  
  391. void acionaAlarme() {
  392.     Serial.println("ligou,desliga");
  393.     digitalWrite(PIN_ALARME, HIGH);
  394.     delay(300);
  395.     digitalWrite(PIN_ALARME, LOW);
  396. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement