установка параметров времени через кнопки и LCD 16x2

Тема в разделе "Arduino & Shields", создана пользователем Толик Иванов, 6 дек 2015.

  1. Толик Иванов

    Толик Иванов Administrator Администратор

    у меня есть проект часов на RTC с выводом времени на LCD 16x2 и установкой времени через 4 кнопки подключенные через резисторы на аналоговый вход. когда я добавил возможность настроить ЧАС, по принципу что я описал ниже все работало, когда добавил возможность установить минуты все работает только до момента нажатия кнопки далее чтоб перейти в режим установки текущего числа. тоесть минуты установить я могу но на нажатии кнопки далее уже реакции нет.

    Код (C++):
    // библиотека для работы I²C
    #include <Wire.h>
    // библиотека для работы с часами реального времени
    #include "TroykaRTC.h"
    #include <LiquidCrystal.h>

    // EEPROM — энергонезависимая память
    // библиотека для записи и считывания информации с EEPROM
    #include <EEPROM.h>

    // размер массива для времени с учётом завершающего нуля
    #define LEN_TIME 12
    // размер массива для даты с учётом завершающего нуля
    #define LEN_DATE 12
    // размер массива для дня недели с учётом завершающего нуля
    #define LEN_DOW 12

    // создаём объект для работы с часами реального времени
    RTC clock;

    // опишем подключение дисплея
    LiquidCrystal lcd(4, 5, 10, 11, 12, 13);
    // добавим в проект переменные в которые будем записывать данные с часов
      int h=10;
      int m=25;
      int s=00;
      int d=8;
      int mo=5;
      int y=2015;
      int w=5;
      // добавим переменную в которую будем записывать сколько раз
      //была нажата кнопка чтоб отобразить необходимый пункт настройки
      int buttonset=0;
      int button= A0;

    void setup(){

      // инициализация часов и дисплея
      clock.begin();
      lcd.begin(16, 2);
    }

    void loop() {
        //запишем в переменные текущее показания с часов
        m= clock.getMinute();
        s= clock.getSecond();
        h= clock.getHour();
        w= clock.getDOW();
        d= clock.getDay();
        mo= clock.getMonth();
        y= clock.getYear();
     
      // считываем нажатие кнопки buttonset и в зависимости от того какой режим
      // в данный момент выбран переходим в следующий режим

      // у меня подключены через резисторы 4 кнопки к аналоговому входу
      // при нажатии кнопки "УСТАНОВКА" на аналоговый вход подается значение =70
      // при нажатии кнопки "+" значение равно 500
      // при нажатии кнопки "-" значение равно 700
      // при нажатии кнопки "далее" значение равно 950
     
      int keyValue = analogRead(button);

      //если кнопка не нажата то значение buttonset=0 и на экран выводяться просто часы,
      //если buttonset=1 то выводятся установка часа
      // если buttonset=2 то выводятся установка минут
      // если buttonset=3 то выводятся установка дня

      //считываем нажалась ли кнопка, если да то к текущему значению прибавим 1
      //и тем самым перейдем на сл екран с установкой часа
      if(keyValue>0&&keyValue<100&&buttonset==0){
        buttonset=1;
        lcd.clear();
      }

      //далее на экране установки часа при нажатии "+" или "-" меняем значение переменной h
      //и сразу устанавливаем это значение в часы чтоб оно отобразилось на экране
      if(keyValue>100&&keyValue<600&&buttonset==1){
       if(h<23){
       h=h+1;
       } else {
         lcd.clear();
         h=00;
         }
       clock.set(h,m,00,d,mo,y,w);
      }
      if(keyValue>600&&keyValue<800&&buttonset==1){
      if(h>0){
      h= h-1;
      lcd.clear();
      } else {
         h=23;
         }
       clock.set(h,m,00,d,mo,y,w);
      }

      //после нажатия кнопки "далее" добавляем к buttonset единицу чтоб отобразился другой экран
      if(keyValue>900&&keyValue<1000&&buttonset==1){
      buttonset=buttonset+1;
      lcd.clear();
      }

    // экран отобразился с начтройкой минут
    if(keyValue>100&&keyValue<600&&buttonset==2){
       if(m<59){
       m=m+1;
       } else {
         lcd.clear();
         m=00;
         }
       clock.set(h,m,00,d,mo,y,w);
      }
      if(keyValue>600&&keyValue<800&&buttonset==2){
      if(m>0){
      m= m-1;
      lcd.clear();
      } else {
         m=59;
         }
       clock.set(h,m,00,d,mo,y,w);
      }

      // после нажатия кнопки "далее" должен отобразиться экран настройки текущего числа
      if (keyValue>900&&keyValue<1000&&buttonset==2){
      buttonset=buttonset+1;
      lcd.clear();
      }



    if(keyValue>100&&keyValue<600&&buttonset==3){
       if(d<31){
       d=d+1;
       } else {
         lcd.clear();
         d=1;
         }
       clock.set(h,m,00,d,mo,y,w);
      }
      if(keyValue>600&&keyValue<800&&buttonset==3){
      if(d>0){
      d= d-1;
      lcd.clear();
      } else {
         d=31;
         }
       clock.set(h,m,00,d,mo,y,w);
      }


      // после установки числа нажимаем кнопку "далее" и попадаем на экран с отображением часов
      //где уже применились все наши коректировки
      if(keyValue>900&&keyValue<1000&&buttonset==3){
      buttonset=0;
      lcd.clear();
      }

     
      // массив для хранения текущего времени
      char time[LEN_TIME]={0};
      // массив для хранения текущей даты
      char date[LEN_DATE]={0};
      // массив для хранения текущего дня недели
      char dow[LEN_DOW]={0};

      // запрашиваем данные с часов
      clock.read();

      // сохраняем текущее время в массив time
      clock.getTimeStr(time, LEN_TIME);
      // сохраняем текущую дату в массив date
      clock.getDateStr(date, LEN_DATE);
      // сохраняем текущий день недели в массив dow
      clock.getDOWStr(dow, LEN_DOW);


     
      // выводим на дисплей текущее время или экраны настройки параметров в зависимости от того чему равно buttonset
      if (buttonset==0){
       
        lcd.setCursor(11, 0);
        lcd.print(time);
        lcd.setCursor(0,0);
        lcd.print(date);
        lcd.setCursor(9, 1);
        lcd.print(dow);
      }
      if (buttonset==1) {
       
        lcd.setCursor(4, 0);
        lcd.print("Set Hour");
        lcd.setCursor(6,1);
        lcd.print(h);
      }
      if (buttonset==2) {
       
        lcd.setCursor(4, 0);
        lcd.print("Set Minute");
        lcd.setCursor(6,1);
        lcd.print(m);
      }
      if (buttonset==3) {
       
        lcd.setCursor(4, 0);
        lcd.print("Set Day");
        lcd.setCursor(6,1);
        lcd.print(d);
      }
      // ждём пол секунды
      delay(500);  
    }
     
  2. Толик Иванов

    Толик Иванов Administrator Администратор

    виде проблемы

     
  3. DrProg

    DrProg Вечный нерд

    Для начала вот вам функция обработки нажатой кнопки. Возвращает цифру от 0 до 5 (подписано). Для своей схемы подкорректировать показания пина. Уже упростит ваш код, а так же ускорит и возможно исправит:
    Код (C++):
    byte buttonPress () {             // обработка нажатия кнопок на LСD (срабатывает после отжатия)
      byte bP = 0;
      int tx = analogRead (BUTTONS);
      if (tx < 60) {                  // right
        bP = 5;
      }  else if (tx < 200) {         // up
        bP = 3;
      }  else if (tx < 350) {         // down
        bP = 4;
      }  else if (tx < 600) {         // left
        bP = 2;
      }  else if (tx < 800) {         // select
        bP = 1;
      }
      if (tx < 800) {                 // ждем отжатия кнопки
        delay(10);
        while ((analogRead (BUTTONS)) < 800);
      }
      return bP;
    }
     
     
    ИгорьК и Толик Иванов нравится это.
  4. Толик Иванов

    Толик Иванов Administrator Администратор

    Спасибо! опробую