Advertisement
Guest User

Reginaldo Freires

a guest
Jul 5th, 2015
303
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 28.54 KB | None | 0 0
  1. Srs,
  2.  
  3. Estou precisando de ajuda. Preciso deixar a hora e data sempre atualizados. Porém sempre que faço o reset ou desligo o arduino o RTC volta na ultima hora gravada.
  4.  
  5. Obrigado.
  6.  
  7. /*==============================================================================
  8.  
  9.    ARQUIVO FONTE:      Medidor de energia.ino
  10.    DATA DE CRIAÇÃO:    16/04/2015
  11.    REVISÃO:            1.0
  12.    DATA DA ULTIMA REV: 16/04/2015  (REV.: 1.0)
  13.    MICROCONTROLADOR:   FAMILIA ARDUINO DUE
  14.  
  15.    AUTOR:              REGINALDO FREIES
  16.  
  17. ================================================================================
  18.  
  19.  Pinos Display LCD:
  20.  * LCD RS pino do digital do arduino 12 / 7
  21.  * LCD Enable pino do digital do arduino 11 / 6
  22.  * LCD D4 pino do digital do arduino 5
  23.  * LCD D5 pino do digital do arduino 4
  24.  * LCD D6 pino do digital do arduino 3
  25.  * LCD D7 pino do digital do arduino 2
  26.  * LCD R/W pino colocado ao comum
  27.  * 10K resistor:
  28.  * Alimentação em +5V e comun
  29.  * Deixar aberto o  LCD VO (pino 3)
  30.  
  31.  Pinos Modulo SD:
  32.  ** MOSI - pin 11
  33.  ** MISO - pin 12
  34.  ** CLK - pin 13
  35.  ** CS - pin 4
  36.  
  37. // Definições das Bibliotecas do Projeto
  38. =============================================================================*/
  39.  
  40. #include <rtc_clock.h>          // Biblioteca do Relogio de Tempo Real
  41. #include <LiquidCrystal.h>      // Biblioteca do Display
  42. #include <chip.h>               // Biblioteca do Arduino
  43. #include <SPI.h>                // Biblioteca da Comunicação Serial
  44. #include <SD.h>                 // Biblioteca do Carto SD
  45. #include <MenuBackend.h>        // Biblioteca do Menu
  46. #include <EmonLib.h>            // Biblioteca de Energia
  47. #include <DueTimer.h>           // Biblioteca de interrupção
  48.  
  49. // Definições das variaves Gerais do Projeto
  50. //=============================================================================
  51. const int chipSelect = 10; //4; Pino CS do Modulo SD
  52. int analogPin;
  53. int sensor;
  54. String dataString = "", TempStamp = "", StrArq = "", CabArq = "", PartNameFile = "",
  55.        TempStampAux = "";
  56. int TamH = 0, Minutos = 0, Segundo = 0, ZeroMin = 0;
  57. boolean State = true;
  58. String Nome, LcdAux;
  59. const int buttonPinLeft = A6;      // pin for the Up button
  60. const int buttonPinRight = A5;    // pin for the Down button
  61. const int buttonPinEsc = A7;     // pin for the Esc button
  62. const int buttonPinEnter = A8;   // pin for the Enter button
  63.  
  64. int buttonEnterState = LOW;            // Leitura Corrente da tecla Enter
  65. int buttonEscState = LOW;              // Leitura Corrente da tecla Sair
  66. int buttonLeftState = LOW;             // Leitura Corrente da tecla Esquerda
  67. int buttonRightState = LOW;            // Leitura Corrente da tecla Direita
  68.  
  69. int lastButtonPushed = 0;
  70.  
  71. int lastButtonEnterState = LOW;   // the previous reading from the Enter input pin
  72. int lastButtonEscState = LOW;   // the previous reading from the Esc input pin
  73. int lastButtonLeftState = LOW;   // the previous reading from the Left input pin
  74. int lastButtonRightState = LOW;   // the previous reading from the Right input pin
  75.  
  76.  
  77. long lastEnterDebounceTime = 0;  // the last time the output pin was toggled
  78. long lastEscDebounceTime = 0;  // the last time the output pin was toggled
  79. long lastLeftDebounceTime = 0;  // the last time the output pin was toggled
  80. long lastRightDebounceTime = 0;  // the last time the output pin was toggled
  81. //long debounceDelay = 200;    // the debounce time
  82.  
  83.  
  84.  
  85. // Definições das variaves do Relogio de Tempo Real
  86. //=============================================================================
  87. RTC_clock rtc_clock(XTAL);
  88.  
  89. char* daynames[] = {"Seg", "Ter", "Qua", "Qui", "Sex", "Sab", "Dom"};
  90. int hh, mm, ss, dow, dd, mon, yyyy;
  91. int Ah, Am, As, Ad, Ams, Aa;
  92. static long waitTimeG = 0;
  93. // initialize the library with the numbers of the interface pins
  94. LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
  95.  
  96.  
  97.  
  98. // Definições das variaves do MENU
  99. //=============================================================================
  100. MenuBackend menu = MenuBackend(menuUsed, menuChanged);
  101. //initialize menuitems
  102. MenuItem menu1Item1 = MenuItem("Hora e Data"); //Item1
  103. MenuItem menuItem1SubItem1 = MenuItem("Hora"); //Item1SubItem1
  104. MenuItem menuItem1SubItem2 = MenuItem("Data"); //Item1SubItem2
  105. MenuItem menu1Item2 = MenuItem("Acionamento"); // Item2
  106. MenuItem menuItem2SubItem1 = MenuItem("Carga 00"); //Item2SubItem1
  107. MenuItem menuItem2SubItem2 = MenuItem("Carga 01"); //Item2SubItem2
  108. MenuItem menuItem2SubItem3 = MenuItem("Carga 02"); //Item2SubItem3
  109. MenuItem menu1Item3 = MenuItem("Valor Kwh"); // Item3
  110. MenuItem menuItem3SubItem1 = MenuItem("Alt Valor"); //Item3SubItem1
  111. MenuItem menuItem3SubItem2 = MenuItem("Informacao"); //Item3SubItem2
  112.  
  113. /*==============================================================================
  114.  
  115.     FUNÇÃO:       VOID SETUP()
  116.     PARÂMETROS:   NENHUM
  117.     RETORNO:      NENHUM
  118.  
  119.     DESCRIÇÃO:    INICIALIZA FUNÇOES GERAIS
  120.  
  121. ==============================================================================*/
  122. void setup()
  123. {
  124.  
  125.   rtc_clock.init();
  126.   rtc_clock.set_clock(__DATE__, __TIME__);
  127.   // set up the LCD's number of columns and rows:
  128.   lcd.begin(16, 2);
  129.   Serial.begin(9600);
  130.   while (!Serial)
  131.   {
  132.     ; // wait for serial port to connect. Needed for Leonardo only
  133.   }
  134.   Serial.print("Initializing SD card...");
  135.   // make sure that the default chip select pin is set to
  136.   // output, even if you don't use it:
  137.   pinMode(10, OUTPUT);
  138.  
  139.   // see if the card is present and can be initialized:
  140.   if (!SD.begin(chipSelect))
  141.   {
  142.     Serial.println("Card failed, or not present");
  143.     // don't do anything more:
  144.     return;
  145.   }
  146.   Serial.println("card initialized.");
  147.  
  148.   //configuraçao do menu
  149.   pinMode(buttonPinLeft, INPUT);
  150.   pinMode(buttonPinRight, INPUT);
  151.   pinMode(buttonPinEnter, INPUT);
  152.   pinMode(buttonPinEsc, INPUT);
  153.   menu.getRoot().add(menu1Item1);
  154.   menu1Item1.addRight(menu1Item2).addRight(menu1Item3);
  155.   menu1Item1.add(menuItem1SubItem1).addRight(menuItem1SubItem2);
  156.   menu1Item2.add(menuItem2SubItem1).addRight(menuItem2SubItem2).addRight(menuItem2SubItem3);
  157.   menu1Item3.add(menuItem3SubItem1).addRight(menuItem3SubItem2);
  158.   menu.toRoot();
  159.  
  160.   //configuraçao do Timer
  161.   Timer3.attachInterrupt(GravaArq);
  162.   Timer3.start(1000000);             // Chamada a cada 1000ms
  163.  
  164. }
  165. /*==============================================================================
  166.  
  167.     FUNÇÃO:       VOID LOOP()
  168.     PARÂMETROS:   NENHUM
  169.     RETORNO:      NENHUM
  170.  
  171.     DESCRIÇÃO:    ROTINA PRINCIPAL DO PROGRAMA
  172.  
  173. ==============================================================================*/
  174. void loop()
  175. {
  176.   analogReadResolution(16);
  177.  
  178.   rtc_clock.get_time(&hh, &mm, &ss);
  179.   rtc_clock.get_date(&dow, &dd, &mon, &yyyy);
  180.  
  181.   if ((Segundo < ss) or (ss == 0))
  182.   {
  183.     Segundo = ss;
  184.     if (State) MostraLCD();
  185.   }
  186.  
  187.   readButtons(150);    // Eu parcelo a leitura do botão e a navegação em dois procedimentos porque
  188.   navigateMenus();  //em algumas situações eu quero usar o botão para outros fins
  189.   //(por exemplo. para alterar algumas configurações)
  190.   if ( waitTimeG > 5000000)
  191.   {
  192.     State = true;
  193.     menu.toRoot();
  194.   }
  195.   else if (!State)
  196.   {
  197.     waitTimeG++;
  198.   }
  199.   else
  200.   {
  201.     waitTimeG = 0;
  202.   }
  203.  
  204.  
  205. }
  206. /*==============================================================================
  207.  
  208.     FUNÇÃO:       VOID DIGITPRINT()
  209.     PARÂMETROS:   VALUE e LENGHT
  210.     RETORNO:      NENHUM
  211.  
  212.     DESCRIÇÃO:    DIMENSIONAR VARIAVEL
  213.  
  214. ==============================================================================*/
  215. void digitprint(int value, int lenght)
  216. {
  217.   for (int i = 0; i < (lenght - numdigits(value)); i++)
  218.   {
  219.     //Serial.print("0");
  220.     lcd.write("0");
  221.   }
  222.   //Serial.print(value);
  223.   lcd.print(value);
  224. }
  225. /*==============================================================================
  226.  
  227.     FUNÇÃO:       VOID DIGITPRINT()
  228.     PARÂMETROS:   I
  229.     RETORNO:      DIGITS
  230.  
  231.     DESCRIÇÃO:    DIMENSIONAR VARIAVEL
  232.  
  233. ==============================================================================*/
  234. int numdigits(int i) {
  235.   int digits;
  236.   if (i < 10)
  237.     digits = 1;
  238.   else
  239.     digits = (int)(log10((double)i)) + 1;
  240.   return digits;
  241. }
  242. /*==============================================================================
  243.  
  244.     FUNÇÃO:       VOID MONTASTAMP()
  245.     PARÂMETROS:   NENHUM
  246.     RETORNO:      NENHUM
  247.  
  248.     DESCRIÇÃO:    MONTA VARIAVEL COM DADOS DE HORA E DATA
  249.  
  250. ==============================================================================*/
  251. void MontaStamp()
  252. {
  253.   int X = 2;
  254.   TempStamp     = "\0";
  255.   PartNameFile  = "\0";
  256.   TempStamp     = "Data: ";
  257.  
  258.   for (int i = 0; i < (X - numdigits(dd)); i++)
  259.   {
  260.     TempStamp     += ("0");
  261.     PartNameFile  += ("0");
  262.   }
  263.   TempStamp     += String(dd);
  264.   PartNameFile  += String(dd);
  265.   TempStamp     += "/";
  266.  
  267.   for (int i = 0; i < (X - numdigits(mon)); i++)
  268.   {
  269.     TempStamp     += ("0");
  270.     PartNameFile  += ("0");
  271.   }
  272.   TempStamp     += String(mon);
  273.   PartNameFile  += String(mon);
  274.   TempStamp     += "/";
  275.  
  276.   X = 4;
  277.   for (int i = 0; i < (X - numdigits(yyyy)); i++)
  278.   {
  279.     TempStamp     += ("0");
  280.     PartNameFile  += ("0");
  281.   }
  282.   TempStamp     += String(yyyy);
  283.   PartNameFile  += String(yyyy);
  284.  
  285.  
  286.   TempStamp += "; ";
  287.   TempStamp += "Hora: ";
  288.  
  289.   X = 2;
  290.   for (int i = 0; i < (X - numdigits(hh)); i++)
  291.   {
  292.     TempStamp += ("0");
  293.   }
  294.   TempStamp += String(hh);
  295.   TempStamp += ":";
  296.  
  297.   for (int i = 0; i < (X - numdigits(mm)); i++)
  298.   {
  299.     TempStamp += ("0");
  300.   }
  301.   TempStamp += String(mm);
  302.   TempStamp += ":";
  303.  
  304.   for (int i = 0; i < (X - numdigits(ss)); i++)
  305.   {
  306.     TempStamp += ("0");
  307.   }
  308.   TempStamp += String(ss);
  309.   TempStamp += "; ";
  310. }
  311.  
  312. /*==============================================================================
  313.  
  314.     FUNÇÃO:       VOID LERSENSOR()
  315.     PARÂMETROS:   NENHUM
  316.     RETORNO:      NENHUM
  317.  
  318.     DESCRIÇÃO:    LEITURA DAS ANALOGICAS DO PROJETO
  319.  
  320. ==============================================================================*/
  321. void LerSensor()
  322. {
  323.   dataString = "\0";
  324.   // read three sensors and append to the string:
  325.   for (analogPin = 0; analogPin < 3; analogPin++)
  326.   {
  327.     sensor = analogRead(analogPin);
  328.     dataString += String(sensor);
  329.     if (analogPin < 2)
  330.     {
  331.       dataString += "; ";
  332.     }
  333.   }
  334.   dataString += ";";
  335.   dataString += "\n";
  336.  
  337. }
  338. /*==============================================================================
  339.  
  340.     FUNÇÃO:       VOID MOSTRALCD()
  341.     PARÂMETROS:   NENHUM
  342.     RETORNO:      NENHUM
  343.  
  344.     DESCRIÇÃO:    MOSTRAR DADOS NO DISPLAY
  345.  
  346. ==============================================================================*/
  347. void MostraLCD()
  348. {
  349.   // clear the screen
  350.   lcd.clear();
  351.   lcd.setCursor(0, 0); //
  352.   lcd.write("Hora: ");
  353.  
  354.   digitprint(hh, 2);
  355.   lcd.write(":");
  356.  
  357.   digitprint(mm, 2);
  358.   lcd.write(":");
  359.  
  360.   digitprint(ss, 2);
  361.   lcd.setCursor(0, 1); //
  362.  
  363.   lcd.print("Data:");
  364.  
  365.   //Serial.print(daynames[dow-1]);
  366.   //lcd.print(daynames[dow-1]);
  367.  
  368.   lcd.write(" ");
  369.   digitprint(dd, 2);
  370.  
  371.   lcd.write(".");
  372.   digitprint(mon, 2);
  373.  
  374.   lcd.write(".");
  375.   lcd.print(yyyy);
  376. }
  377. /*==============================================================================
  378.  
  379.     FUNÇÃO:       VOID STAMPARQUIVO()
  380.     PARÂMETROS:   NENHUM
  381.     RETORNO:      NENHUM
  382.  
  383.     DESCRIÇÃO:    GRAVA ARQUIVO CARTÃO SD
  384.  
  385. ==============================================================================*/
  386. void StampArquivo()
  387. {
  388.  
  389.   CabArq  = "ARQUIVO DE DADOS DO SISTEMA \r\nAutor : Reginaldo Freires\r\n";
  390.   //CabArq  += "\n";
  391.   //CabArq  += "Autor : Reginaldo Freires";
  392.   //CabArq  += "\n";
  393.   PartNameFile = PartNameFile += "_datalog.txt";
  394.   if (SD.exists("datalog.txt"))
  395.     //if (SD.exists(PartNameFile))
  396.   {
  397.  
  398.     File dataFile = SD.open("datalog.txt", FILE_WRITE);
  399.     StrArq = "\0";
  400.     // if the file is available, write to it:
  401.     if (dataFile)
  402.     {
  403.       StrArq = TempStamp + dataString;
  404.       dataFile.println(StrArq);
  405.       dataFile.close();
  406.     }
  407.     // if the file isn't open, pop up an error:
  408.     else
  409.     {
  410.       Serial.println("error opening datalog.txt");
  411.     }
  412.   }
  413.   else
  414.   {
  415.  
  416.     File dataFile = SD.open("datalog.txt", FILE_WRITE);
  417.     // if the file is available, write to it:
  418.     if (dataFile)
  419.     {
  420.       dataFile.println(CabArq);
  421.       Serial.print(CabArq);
  422.       dataFile.close();
  423.     }
  424.     // if the file isn't open, pop up an error:
  425.     else
  426.     {
  427.       Serial.println("error opening datalog.txt");
  428.     }
  429.  
  430.   }
  431. }
  432.  
  433. /*==============================================================================
  434.  
  435.     FUNÇÃO:       VOID MENUCHANGED()
  436.     PARÂMETROS:   MENUCHANGEEVENT
  437.     RETORNO:      NENHUM
  438.  
  439.     DESCRIÇÃO:    MONITORA AS TECLAS
  440.  
  441. ==============================================================================*/
  442. void menuChanged(MenuChangeEvent changed)
  443. {
  444.  
  445.   MenuItem newMenuItem = changed.to; //get the destination menu
  446.  
  447.   lcd.setCursor(0, 1); //set the start position for lcd printing to the second row
  448.  
  449.   if (newMenuItem.getName() == menu.getRoot())
  450.   {
  451.     //lcd.print("Medicao          ");
  452.     State = true;
  453.  
  454.   }
  455.   else if (newMenuItem.getName() == "Hora e Data")
  456.   {
  457.     lcd.print("Hora e Data       ");
  458.   }
  459.   else if (newMenuItem.getName() == "Hora")
  460.   {
  461.     lcd.print("Hora            ");
  462.   }
  463.   else if (newMenuItem.getName() == "Data")
  464.   {
  465.     lcd.print("Data            ");
  466.   }
  467.   else if (newMenuItem.getName() == "Acionamento")
  468.   {
  469.     lcd.print("Acionamento              ");
  470.   }
  471.   else if (newMenuItem.getName() == "Carga 00")
  472.   {
  473.     lcd.print("Carga 00      ");
  474.   }
  475.   else if (newMenuItem.getName() == "Carga 01")
  476.   {
  477.     lcd.print("Carga 01      ");
  478.   }
  479.   else if (newMenuItem.getName() == "Carga 02")
  480.   {
  481.     lcd.print("Carga 02      ");
  482.   }
  483.   else if (newMenuItem.getName() == "Valor Kwh")
  484.   {
  485.     lcd.print("Valor Kwh          ");
  486.   }
  487.   else if (newMenuItem.getName() == "Alt Valor")
  488.   {
  489.     lcd.print("Alt Valor          ");
  490.   }
  491.   else if (newMenuItem.getName() == "Informacao")
  492.   {
  493.     lcd.print("Informacao         ");
  494.   }
  495. }
  496.  
  497. /*==============================================================================
  498.  
  499.     FUNÇÃO:       VOID MENUUSED()
  500.     PARÂMETROS:   MENUUSEEVENT
  501.     RETORNO:      NENHUM
  502.  
  503.     DESCRIÇÃO:    MONITORA AS TECLAS
  504.  
  505. ==============================================================================*/
  506. void menuUsed(MenuUseEvent used)
  507. {
  508.  
  509.   Nome = used.item.getName();
  510.   if (Nome == "Hora")
  511.   {
  512.     Ah = hh;
  513.     AtualHora();
  514.     goto Saida;
  515.   }
  516.   else if (Nome == "Data")
  517.   {
  518.     Ad = dd;
  519.     AtualData();
  520.     goto Saida;
  521.   }
  522.   else
  523.   {
  524.     lcd.setCursor(0, 0);
  525.     lcd.print("Digite a Hora        ");
  526.     lcd.setCursor(0, 1);
  527.     lcd.print("Hora:");
  528.   }
  529.   //delay(300);  //delay to allow message reading
  530.   //lcd.setCursor(0,0);
  531.   //lcd.print("www.3rf.org");
  532. Saida:
  533.   State = true;
  534.   menu.toRoot();
  535.  
  536. }
  537.  
  538. /*==============================================================================
  539.  
  540.     FUNÇÃO:       VOID READBUTTONS()
  541.     PARÂMETROS:   NENHUM
  542.     RETORNO:      NENHUM
  543.  
  544.     DESCRIÇÃO:    MONITORA AS TECLAS
  545.  
  546. ==============================================================================*/
  547. void  readButtons(long debounceDelay)
  548. {
  549.   int   reading;
  550.   buttonEnterState = LOW;            // Leitura Corrente da tecla Enter
  551.   buttonEscState = LOW;              // Leitura Corrente da tecla Sair
  552.   buttonLeftState = LOW;             // Leitura Corrente da tecla Esquerda
  553.   buttonRightState = LOW;            // Leitura Corrente da tecla Direita
  554.  
  555.   //Botão Enter
  556.   // Ler o estado do botão em varivel local:
  557.   reading = digitalRead(buttonPinEnter);
  558.  
  559.   // verificar para ver se você apertou apenas o botão enter
  560.   // (ou seja, a entrada foi de baixa para alta), e você esperou
  561.   // tempo suficiente desde a última tecla pressionada para ignorar qualquer ruído:
  562.  
  563.   // Se a tecla mudou, devido ao ruído ou pressionando:
  564.   if (reading != lastButtonEnterState) {
  565.     // Reset do tempo de debounce da tecla
  566.     lastEnterDebounceTime = millis();
  567.   }
  568.  
  569.   if ((millis() - lastEnterDebounceTime) > debounceDelay) {
  570.     // Qualquer que seja a leitura está, ele foi lá por mais tempo
  571.     // Que o atraso de debounce, para levá-lo como o estado atual:
  572.     buttonEnterState = reading;
  573.     lastEnterDebounceTime = millis();
  574.   }
  575.  
  576.   //Salvar a leitura. Da próxima vez através do laço,
  577.   // Vai ser o lastButtonState:
  578.   lastButtonEnterState = reading;
  579.  
  580.  
  581.   //Botão Sair
  582.   // Ler o estado do botão em varivel local:
  583.   reading = digitalRead(buttonPinEsc);
  584.  
  585.   // verificar para ver se você apertou apenas o botão enter
  586.   // (ou seja, a entrada foi de baixa para alta), e você esperou
  587.   // tempo suficiente desde a última tecla pressionada para ignorar qualquer ruído:
  588.  
  589.   // Se a tecla mudou, devido ao ruído ou pressionando:
  590.   if (reading != lastButtonEscState) {
  591.     // Reset do tempo de debounce da tecla
  592.     lastEscDebounceTime = millis();
  593.   }
  594.  
  595.   if ((millis() - lastEscDebounceTime) > debounceDelay) {
  596.     // Qualquer que seja a leitura está, ele foi lá por mais tempo
  597.     // Que o atraso de debounce, para levá-lo como o estado atual:
  598.     buttonEscState = reading;
  599.     lastEscDebounceTime = millis();
  600.   }
  601.  
  602.   //Salvar a leitura. Da próxima vez através do laço,
  603.   // Vai ser o lastButtonState:
  604.   lastButtonEscState = reading;
  605.  
  606.  
  607.   //Botão Baixar
  608.   // Ler o estado do botão em varivel local:
  609.   reading = digitalRead(buttonPinRight);
  610.  
  611.   // verificar para ver se você apertou apenas o botão enter
  612.   // (ou seja, a entrada foi de baixa para alta), e você esperou
  613.   // tempo suficiente desde a última tecla pressionada para ignorar qualquer ruído:
  614.  
  615.   // Se a tecla mudou, devido ao ruído ou pressionando:
  616.   if (reading != lastButtonRightState) {
  617.     // Reset do tempo de debounce da tecla
  618.     lastRightDebounceTime = millis();
  619.   }
  620.  
  621.   if ((millis() - lastRightDebounceTime) > debounceDelay) {
  622.     // Qualquer que seja a leitura está, ele foi lá por mais tempo
  623.     // Que o atraso de debounce, para levá-lo como o estado atual:
  624.     buttonRightState = reading;
  625.     lastRightDebounceTime = millis();
  626.   }
  627.  
  628.   //Salvar a leitura. Da próxima vez através do laço,
  629.   // Vai ser o lastButtonState:
  630.   lastButtonRightState = reading;
  631.  
  632.  
  633.   //Botão Subir
  634.   // Ler o estado do botão em varivel local:
  635.   reading = digitalRead(buttonPinLeft);
  636.  
  637.   // verificar para ver se você apertou apenas o botão enter
  638.   // (ou seja, a entrada foi de baixa para alta), e você esperou
  639.   // tempo suficiente desde a última tecla pressionada para ignorar qualquer ruído:
  640.  
  641.   // Se a tecla mudou, devido ao ruído ou pressionando:
  642.   if (reading != lastButtonLeftState) {
  643.     // Reset do tempo de debounce da tecla
  644.     lastLeftDebounceTime = millis();
  645.   }
  646.  
  647.   if ((millis() - lastLeftDebounceTime) > debounceDelay) {
  648.     // Qualquer que seja a leitura está, ele foi lá por mais tempo
  649.     // Que o atraso de debounce, para levá-lo como o estado atual:
  650.     buttonLeftState = reading;
  651.     lastLeftDebounceTime = millis();;
  652.   }
  653.  
  654.   //Salvar a leitura. Da próxima vez através do laço,
  655.   // Vai ser o lastButtonState:
  656.   lastButtonLeftState = reading;
  657.  
  658.   //Grava qual botão foi pressionado
  659.   if (buttonEnterState == HIGH) {
  660.     lastButtonPushed = buttonPinEnter;
  661.  
  662.   } else if (buttonEscState == HIGH) {
  663.     lastButtonPushed = buttonPinEsc;
  664.  
  665.   } else if (buttonRightState == HIGH) {
  666.     lastButtonPushed = buttonPinRight;
  667.  
  668.   } else if (buttonLeftState == HIGH) {
  669.     lastButtonPushed = buttonPinLeft;
  670.  
  671.   } else {
  672.     lastButtonPushed = 0;
  673.   }
  674.  
  675.   if (lastButtonPushed  != 0)
  676.   {
  677.     waitTimeG = 0;
  678.   }
  679.  
  680. }
  681.  
  682. /*==============================================================================
  683.  
  684.     FUNÇÃO:       VOID NAVIGATEMENUS()
  685.     PARÂMETROS:   NENHUM
  686.     RETORNO:      NENHUM
  687.  
  688.     DESCRIÇÃO:    IDENTIFICA AS FUNÇÕES
  689.  
  690. ==============================================================================*/
  691.  
  692. void navigateMenus()
  693. {
  694.   //MenuItem newMenuItem = changed.to;
  695.   MenuItem currentMenu = menu.getCurrent();
  696.  
  697.   switch (lastButtonPushed)
  698.   {
  699.     case buttonPinEnter:
  700.       State = false;
  701.       if (!(currentMenu.moveDown())) { //Se o menu atual tem um subitem e foi pressionado entrar,
  702.         //em seguida, navegue até Menu do item abaixo
  703.         menu.use();
  704.       }
  705.       else
  706.       { //Caso contrário, se o menu não tem nenhum subitem e
  707.         //foi pressionado entrar no menu atual é usada
  708.         menu.moveDown();
  709.       }
  710.       break;
  711.     case buttonPinEsc:
  712.       State = true;
  713.       //if(!(newMenuItem.getName()==menu.getRoot()))
  714.       menu.toRoot();
  715.       break;
  716.     case buttonPinRight:
  717.       menu.moveRight();
  718.       State = false;
  719.       break;
  720.     case buttonPinLeft:
  721.       menu.moveLeft();
  722.       State = false;
  723.       break;
  724.   }
  725.  
  726.   lastButtonPushed = 0; //resete da variavel lastButtonPushed
  727. }
  728. /*==============================================================================
  729.  
  730.     FUNÇÃO:       VOID GRAVAARQ()
  731.     PARÂMETROS:   NENHUM
  732.     RETORNO:      NENHUM
  733.  
  734.     DESCRIÇÃO:    GRAVA ARQUIVO DATALOGER
  735.  
  736. ==============================================================================*/
  737. void GravaArq ()
  738. {
  739.   LerSensor();
  740.   if ((Minutos < ss) or ((ss == 0) & ZeroMin == 0))
  741.   {
  742.     Minutos = ss;
  743.     ZeroMin = 1;
  744.     MontaStamp();
  745.     StampArquivo();
  746.     Serial.println(StrArq);
  747.   }
  748.  
  749.   if (ss == 0)
  750.   {
  751.     Minutos = 0;
  752.   }
  753.   else
  754.   {
  755.     ZeroMin = 0;
  756.   }
  757.  
  758. }
  759.  
  760. /*==============================================================================
  761.  
  762.     FUNÇÃO:       VOID ATUALHORA()
  763.     PARÂMETROS:   NENHUM
  764.     RETORNO:      NENHUM
  765.  
  766.     DESCRIÇÃO:    AJUSTA A HORA DO RELOGIO
  767.  
  768. ==============================================================================*/
  769. void AtualHora ()
  770. {
  771.   bool saida = false;
  772.   long waitTime = 0;
  773.   int x = 1;
  774.   lastLeftDebounceTime = 0;
  775.   LcdAux = "Hora: " + String(Ah);
  776.   lcd.setCursor(0, 0);
  777.   lcd.print("Atualize a Hora      ");
  778.   lcd.setCursor(0, 1);
  779.   lcd.print(LcdAux);
  780.   do
  781.   {
  782.     readButtons(150);
  783.     if ((x == 1) && (lastButtonPushed))
  784.     {
  785.  
  786.  
  787.       switch (lastButtonPushed)
  788.       {
  789.         case buttonPinRight:
  790.           Ah++;
  791.           if (Ah > 23) Ah = 0;
  792.           lcd.setCursor(0, 1);
  793.           lcd.print("Hora:                ");
  794.           lcd.setCursor(6, 1);
  795.           lcd.print(Ah);
  796.           saida = false;
  797.           waitTime = 0;
  798.           break;
  799.         case buttonPinLeft:
  800.           Ah--;
  801.           if (Ah < 0)  Ah = 23;
  802.           lcd.setCursor(0, 1);
  803.           lcd.print("Hora:                ");
  804.           lcd.setCursor(6, 1);
  805.           lcd.print(Ah);
  806.           saida = false;
  807.           waitTime = 0;
  808.           break;
  809.         case buttonPinEnter:
  810.           saida = false;
  811.           x++;
  812.           Am = mm;
  813.           LcdAux = "Minuto: " + String(Am);
  814.           lcd.setCursor(0, 0);
  815.           lcd.print("Atualize Minuto      ");
  816.           lcd.setCursor(0, 1);
  817.           lcd.print(LcdAux);
  818.           break;
  819.  
  820.       }
  821.     }
  822.     else  if ((x == 2) && (lastButtonPushed))
  823.     {
  824.       switch (lastButtonPushed)
  825.       {
  826.         case buttonPinRight:
  827.           Am++;
  828.           if (Am > 59) Am = 0;
  829.           lcd.setCursor(0, 1);
  830.           lcd.print("Minuto:                ");
  831.           lcd.setCursor(8, 1);
  832.           lcd.print(Am);
  833.           saida = false;
  834.           waitTime = 0;
  835.           break;
  836.         case buttonPinLeft:
  837.           Am--;
  838.           if (Am < 0)  Am = 59;
  839.           lcd.setCursor(0, 1);
  840.           lcd.print("Minuto:                ");
  841.           lcd.setCursor(8, 1);
  842.           lcd.print(Am);
  843.           saida = false;
  844.           waitTime = 0;
  845.           break;
  846.         case buttonPinEnter:
  847.           saida = false;
  848.           x++;
  849.           As = ss;
  850.           LcdAux = "Segundo: " + String(As);
  851.           lcd.setCursor(0, 0);
  852.           lcd.print("Atualize Segundo      ");
  853.           lcd.setCursor(0, 1);
  854.           lcd.print(LcdAux);
  855.           break;
  856.  
  857.       }
  858.     }
  859.     else  if ((x == 3) && (lastButtonPushed))
  860.     {
  861.       switch (lastButtonPushed)
  862.       {
  863.         case buttonPinRight:
  864.           As++;
  865.           if (As > 59) As = 0;
  866.           lcd.setCursor(0, 1);
  867.           lcd.print("Segundo:                ");
  868.           lcd.setCursor(9, 1);
  869.           lcd.print(As);
  870.           saida = false;
  871.           waitTime = 0;
  872.           break;
  873.         case buttonPinLeft:
  874.           As--;
  875.           if (As < 0)  As = 59;
  876.           lcd.setCursor(0, 1);
  877.           lcd.print("Segundo:                ");
  878.           lcd.setCursor(9, 1);
  879.           lcd.print(As);
  880.           saida = false;
  881.           waitTime = 0;
  882.           break;
  883.         case buttonPinEnter:
  884.           saida = true;
  885.           rtc_clock.set_time(Ah, Am, As);
  886.           break;
  887.       }
  888.     }
  889.     //if (((2 * millis()) - lastLeftDebounceTime) < waitTime)
  890.     if ( waitTime > 1000000)
  891.     {
  892.       saida = true;
  893.     }
  894.     else
  895.     {
  896.       waitTime++;
  897.     }
  898.  
  899.     if (buttonEscState == HIGH)
  900.     {
  901.       saida = true;
  902.     }
  903.     lastButtonPushed = LOW;
  904.   } while (!saida);
  905. }
  906.  
  907. /*==============================================================================
  908.  
  909.     FUNÇÃO:       VOID ATUALDATA()
  910.     PARÂMETROS:   NENHUM
  911.     RETORNO:      NENHUM
  912.  
  913.     DESCRIÇÃO:    AJUSTA A DATA DO RELOGIO
  914.  
  915. ==============================================================================*/
  916. void AtualData ()
  917. {
  918.   bool saida = false;
  919.   long waitTime = 0;
  920.   int x = 1;
  921.   lastLeftDebounceTime = 0;
  922.   LcdAux = "Dia: " + String(Ad);
  923.   lcd.setCursor(0, 0);
  924.   lcd.print("Atualize o Dia      ");
  925.   lcd.setCursor(0, 1);
  926.   lcd.print(LcdAux);
  927.   do
  928.   {
  929.     readButtons(150);
  930.     if ((x == 1) && (lastButtonPushed))
  931.     {
  932.       switch (lastButtonPushed)
  933.       {
  934.         case buttonPinRight:
  935.           Ad++;
  936.           if (Ad > 31) Ad = 1;
  937.           lcd.setCursor(0, 1);
  938.           lcd.print("Dia:                ");
  939.           lcd.setCursor(5, 1);
  940.           lcd.print(Ad);
  941.           saida = false;
  942.           waitTime = 0;
  943.           break;
  944.         case buttonPinLeft:
  945.           Ad--;
  946.           if (Ad < 1)  Ad = 31;
  947.           lcd.setCursor(0, 1);
  948.           lcd.print("Dia:                ");
  949.           lcd.setCursor(5, 1);
  950.           lcd.print(Ad);
  951.           saida = false;
  952.           waitTime = 0;
  953.           break;
  954.         case buttonPinEnter:
  955.           saida = false;
  956.           x++;
  957.           Ams = mon;
  958.           LcdAux = "Mes: " + String(Ams);
  959.           lcd.setCursor(0, 0);
  960.           lcd.print("Atualize o Mes      ");
  961.           lcd.setCursor(0, 1);
  962.           lcd.print("                 ");
  963.           lcd.setCursor(0, 1);
  964.           lcd.print(LcdAux);
  965.           break;
  966.  
  967.       }
  968.     }
  969.     else  if ((x == 2) && (lastButtonPushed))
  970.     {
  971.       switch (lastButtonPushed)
  972.       {
  973.         case buttonPinRight:
  974.           Ams++;
  975.           if (Ams > 12) Ams = 0;
  976.           lcd.setCursor(0, 1);
  977.           lcd.print("Mes:                ");
  978.           lcd.setCursor(5, 1);
  979.           lcd.print(Ams);
  980.           saida = false;
  981.           waitTime = 0;
  982.           break;
  983.         case buttonPinLeft:
  984.           Ams--;
  985.           if (Ams < 0)  Ams = 12;
  986.           lcd.setCursor(0, 1);
  987.           lcd.print("Mes:                ");
  988.           lcd.setCursor(5, 1);
  989.           lcd.print(Ams);
  990.           saida = false;
  991.           waitTime = 0;
  992.           break;
  993.         case buttonPinEnter:
  994.           saida = false;
  995.           x++;
  996.           Aa = yyyy;
  997.           LcdAux = "Ano: " + String(Aa);
  998.           lcd.setCursor(0, 0);
  999.           lcd.print("Atualize o Ano      ");
  1000.           lcd.setCursor(0, 1);
  1001.           lcd.print("                 ");
  1002.           lcd.setCursor(0, 1);
  1003.           lcd.print(LcdAux);
  1004.           break;
  1005.  
  1006.       }
  1007.     }
  1008.     else  if ((x == 3) && (lastButtonPushed))
  1009.     {
  1010.       switch (lastButtonPushed)
  1011.       {
  1012.         case buttonPinRight:
  1013.           Aa++;
  1014.           if (Aa > 3000) Aa = 1000;
  1015.           lcd.setCursor(0, 1);
  1016.           lcd.print("Ano:                ");
  1017.           lcd.setCursor(5, 1);
  1018.           lcd.print(Aa);
  1019.           saida = false;
  1020.           waitTime = 0;
  1021.           break;
  1022.         case buttonPinLeft:
  1023.           Aa--;
  1024.           if (Aa < 0)  Aa = 1000;
  1025.           lcd.setCursor(0, 1);
  1026.           lcd.print("Ano:                ");
  1027.           lcd.setCursor(5, 1);
  1028.           lcd.print(Aa);
  1029.           saida = false;
  1030.           waitTime = 0;
  1031.           break;
  1032.         case buttonPinEnter:
  1033.           saida = true;
  1034.           rtc_clock.set_date(Ad, Ams, Aa);
  1035.           break;
  1036.       }
  1037.     }
  1038.     //if (((2 * millis()) - lastLeftDebounceTime) < waitTime)
  1039.     if ( waitTime > 1000000)
  1040.     {
  1041.       saida = true;
  1042.     }
  1043.     else
  1044.     {
  1045.       //lastLeftDebounceTime = (2 * millis());
  1046.       waitTime++;
  1047.     }
  1048.  
  1049.     if (buttonEscState == HIGH)
  1050.     {
  1051.       saida = true;
  1052.     }
  1053.     lastButtonPushed = LOW;
  1054.   } while (!saida);
  1055. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement