Часы на Arduino и LCD Keypad Shield 1602

Тема в разделе "Arduino & Shields", создана пользователем Cripkys, 12 дек 2018.

  1. Cripkys

    Cripkys Нуб

    Помогите пожалуйста написать программу "Часы" на Arduino и LCD Keypad Shield 1602 с настройкой часов и минут(это очень важно). Я пытаюсь исходить из кода программы "секундомер", но не знаю как реализовать изменение времени с помощью кнопок. Знаю, что в шильде есть резистивный делитель, и у каждой кнопки свое значение. В интернете полно примеров с "часами реального времени", но там подключено множество библиотек, поэтому я так и не смог разобраться с функцией изменения времени.

    P.s. Поэтому желательно без подключения других библиотек, кроме как библиотеки для дисплея, чтобы наглядно увидеть и понять код и использовать это в дальнейшем.

    Код (C++):
    int h,m,s;// переменные для часов, минут, секунд
    boolean z;
    // подключаем библиотеку индикатора
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
    unsigned long previousMillis = 0;    
    const long interval = 1000;
    void setup() {
    Serial.begin(9600);
    lcd.begin(16, 2);
    }
    void loop()
    {
      int keyAnalog =  analogRead(A0);
      if (keyAnalog < 100) {
        // Значение меньше 100 – нажата кнопка right
        // Выполняем какое-то действие для кнопки вправо.
       
       
       
      } else if (keyAnalog < 200) {
        // Значение больше 100 (иначе мы бы вошли в предыдущий блок результата сравнения, но меньше 200 – нажата кнопка UP
        // Выполняем какое-то действие для кнопки вверх
     
       }
      unsigned long currentMillis = millis();
    if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
    s++;    // добавляем единицу, равносильно записи s=s+1;
    // секция подсчета секунд
    if (s>59)   // если значение s больше 59
    {
    s=0;       // присваиваем значение 0 переменной s
    m++;     // добавляем 1 к переменной m отвечающей за минуты
    }
    // секция подсчета минут
    if (m>59)   // если значение m больше 59
    {
    m=0;       // присваиваем значение 0 переменной m
    h++;     // добавляем 1 к переменной h отвечающей за часы
    }
    // секция подсчета часов
    if (h>23)   // если значение h больше 23
    {
    h=0;       // присваиваем значение 0 переменной h
    }
    // секция вывода информации
    // вывод секунд
    if (s<10) //если секунд меньше 10
    {
    lcd.setCursor(6, 0); // курсор в 6 позицию 0 строки
    lcd.print(0); //печатаем 0
    lcd.setCursor(7, 0); //курсор в 7 позицию 0 строки
    lcd.print(s); //печатаем значение переменной s
    }
    else
    {
    lcd.setCursor(6, 0); //иначе курсор в 6 позицию 0 строки
    lcd.print(s); // печатаем значение переменной s
    }
    lcd.setCursor(5, 0); // курсор в 5 позицию 0 строки
    lcd.print(":"); //  печатаем разделитель между секундами и минутами
     
     
      // вывод минут
    if (m<10)
    {
    lcd.setCursor(3, 0);
    lcd.print(0);
    lcd.setCursor(4, 0);
    lcd.print(m);
    }
    else
    {
    lcd.setCursor(3, 0);
    lcd.print(m);
    }
    lcd.setCursor(2, 0); // курсор в 2 позицию 0 строки
    lcd.print(":"); //  печатаем разделитель между минутами и часами
    // вывод часов
    if (h<10)
    {
    lcd.setCursor(0, 0);
    lcd.print(0);
    lcd.setCursor(1, 0);
    lcd.print(h);
    }
    else
    {
    lcd.setCursor(0, 0);
    lcd.print(h);
    }
    }
    }
     
  2. Cripkys

    Cripkys Нуб

    Как это реализовать на LCD Keypad Shield 1602 ? Там все кнопки подключаются к одному выходу А0.
     
  3. Cripkys

    Cripkys Нуб

    Спасибо, разобрался.
     
  4. koteyka-2

    koteyka-2 Нуб

    Подскажите как разобрались?
    Пример кода можно?
     
  5. Cripkys

    Cripkys Нуб


    Код (C++):
    int h,m,s;// переменные для часов, минут, секунд
    boolean z;
    // подключаем библиотеку индикатора
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);// RS E
    unsigned long previousMillis = 0;  
    const long interval = 1000;
    int keyAnalog;
    void setup() {
    Serial.begin(9600);
    lcd.begin(16, 2);
    }
    void loop()
    {

      if ((keyAnalog =  analogRead(A0)) < 100) {
       
       delay(50);
       s = 0;
       m++;
       if (m > 59) m = 0;
       m = m;
       delay(200);
       }
       
      else if ((keyAnalog =  analogRead(A0) < 200) && (keyAnalog =  analogRead(A0) > 130)) {
       
        delay(50);
      s = 0;
      h++;
      if (h > 23) h = 0;
      h = h;
      delay(200);
       }
       else if ((keyAnalog =  analogRead(A0) < 800) && (keyAnalog =  analogRead(A0) > 600)) {
        delay(50);
        s=0;
        m=0;
        h=0;
        delay(200);
       }
       else if ((keyAnalog =  analogRead(A0) < 600) && (keyAnalog =  analogRead(A0) > 400)){
        delay(50);
        s=0;
        m--;
        if (m < 0) m = 59;
        m=m;
        delay(200);
       }
       else if ((keyAnalog =  analogRead(A0) < 400) && (keyAnalog =  analogRead(A0) > 200)){
       delay(50);
       s=0;
       h--;
       if (h < 0) h = 23;
       h = h;
       delay(200);
       }
      unsigned long currentMillis = millis();
    if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
    s++;    // добавляем единицу, равносильно записи s=s+1;
    // секция подсчета секунд
    if (s>59)   // если значение s больше 59
    {
    s=0;       // присваиваем значение 0 переменной s
    m++;     // добавляем 1 к переменной m отвечающей за минуты
    }
    // секция подсчета минут
    if (m>59)   // если значение m больше 59
    {
    m=0;       // присваиваем значение 0 переменной m
    h++;     // добавляем 1 к переменной h отвечающей за часы
    }
    // секция подсчета часов
    if (h>23)   // если значение h больше 23
    {
    h=0;       // присваиваем значение 0 переменной h
    }
    // секция вывода информации
    // вывод секунд
    if (s<10) //если секунд меньше 10
    {
    lcd.setCursor(6, 0); // курсор в 6 позицию 0 строки
    lcd.print(0); //печатаем 0
    lcd.setCursor(7, 0); //курсор в 7 позицию 0 строки
    lcd.print(s); //печатаем значение переменной s
    }
    else
    {
    lcd.setCursor(6, 0); //иначе курсор в 6 позицию 0 строки
    lcd.print(s); // печатаем значение переменной s
    }
    lcd.setCursor(5, 0); // курсор в 5 позицию 0 строки
    lcd.print(":"); //  печатаем разделитель между секундами и минутами
      // вывод минут
    if (m<10)
    {
    lcd.setCursor(3, 0);
    lcd.print(0);
    lcd.setCursor(4, 0);
    lcd.print(m);
    }
    else
    {
    lcd.setCursor(3, 0);
    lcd.print(m);
    }
    lcd.setCursor(2, 0); // курсор в 2 позицию 0 строки
    lcd.print(":"); //  печатаем разделитель между минутами и часами
    // вывод часов
    if (h<10)
    {
    lcd.setCursor(0, 0);
    lcd.print(0);
    lcd.setCursor(1, 0);
    lcd.print(h);
    }
    else
    {
    lcd.setCursor(0, 0);
    lcd.print(h);
    }
    }
    }