Помогите вывести дни недели на LCD1602

Тема в разделе "Arduino & Shields", создана пользователем alex7106, 5 фев 2017.

  1. alex7106

    alex7106 Нуб

    Ребята, помогите пожалуйста новичку. Слепил скетч, не могу на LSD 1602 вывести дни недели. Один раз слуыайно получилось, потом исчезло... Я в этом чайник, если где неправильно, поправте пожалуйста.
    Код (C++):
    #include "Wire.h"
    #include "DS1307new.h"
    #include "LiquidCrystal.h" // библиотека экрана
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
    void setup(){
      Serial.begin(9600);
      if(RTC.isPresent()){ // обнаружен ли модуль?
        Serial.println("RTC Ready"); // все хорошо
      } else {
        Serial.println("Error!!!! RTC Module not found"); // сообщаем о проблеме
        while(1); // и останавливаем скетч
      }
      lcd.begin(16, 2); // запускаем библиотеку экрана
    }
    void loop(){
      RTC.getTime();// получить время от модуля
      printTimeToSerial(); // выводим полученное время в лог
      printTimeToLCD();; // выводи время на экран
      doSerialCommands(); // слушаем и выполняем команды из Serial
    }
    // Выводит текущие время в Serial
    void printTimeToSerial(){
      byte static prevSecond=0; // тут будем хранить, сколько секунд было при прошлом отчете
     
      if(RTC.second!=prevSecond){ // что-то делаем только если секунды поменялись
        Serial.print(RTC.hour); // часы
     
        Serial.print(":"); // разделитель
        Serial.print(RTC.minute);
     
        Serial.print(":");
        Serial.println(RTC.second);
       
        prevSecond=RTC.second; // запомнили когда мы "отчитались"
      }
    }
    // Выводит текущие время на LCD
    void printTimeToLCD(){
        byte static prevSecond=0; // тут будем хранить, сколько секунд было при выводе
       
         if(RTC.second!=prevSecond){ // что-то делаем только если секунды поменялись
          lcd.setCursor(4,1); // устанавливаем позицию курсора
           
          if(RTC.hour<10)lcd.print(" ");
          lcd.print(RTC.hour); // часы
       
          lcd.print(":"); // разделитель
         
          if(RTC.minute<10)lcd.print(0); // лидирующий ноль, если нужен
          lcd.print(RTC.minute);
         
          lcd.print(":");
          if (RTC.second < 10)                  // correct second if necessary
     
          lcd.print("0");
          lcd.print(RTC.second);
         
          lcd.setCursor(5,0); // устанавливаем позицию курсора

          lcd.print(" ");
          if (RTC.day < 10)                    // correct date if necessary
          {
          lcd.print("");
          lcd.print(RTC.day);
          }
          else
          {
          lcd.print(RTC.day);
          }
          lcd.print(".");
          if (RTC.month < 10)                   // correct month if necessary
          {
          lcd.print("0");
          lcd.print(RTC.month);
          }
          else
          {
          lcd.print(RTC.month);
          }
          lcd.print(".");
          lcd.print(RTC.year);          // Year need not to be changed
          lcd.print(" ");

          lcd.setCursor(1,0); // устанавливаем позицию курсора



          switch (RTC.dow)                      // вывести день недели
      {
        case 1:
          lcd.print("MON");
          break;
        case 2:
          lcd.print("TUE");
          break;
        case 3:
          lcd.print("WED");
          break;
        case 4:
          lcd.print("THU");
          break;
        case 5:
          lcd.print("FRI");
          break;
        case 6:
          lcd.print("SAT");
          break;
        case 7:
          lcd.print("SUN");
          break;
      }
        prevSecond=RTC.second; // запомнили когда мы "отчитались"
      }
    }
    // устанавливает часы модуля на какое-то заранее определенное время
    void setSomeTime(){
      RTC.stopClock();// останавливаем часы
      RTC.fillByHMS(14,29,0);       // подкручиваем стрелки на 14:29:00
      RTC.fillByYMD(2017,2,3);      // установить дату 2017,2,3
      RTC.setTime();// отправляем "подкрученное время" самому модулю
      RTC.startClock(); // и опять запускаем часы
    }
    // слушает из Serial команды и выполняет их. Каждая команда - один символ.
    // доступны команды:
    //  s - установить время указанное в функции setSomeTime()
    void doSerialCommands(){
      if(Serial.available()){ // что-нибудь пришло?
        char ch=Serial.read(); // читаем что пришло
       
        switch(ch){
          case 's': // команда установки времени
               setSomeTime(); // устанавливаем
               break;
               
           // тут, в будущем, мы можем добавлять дополнительные команды
          default:;
               // на неизвестную команду - ничего не делаем
        };
      }
    [LIST=1]
    [*]}
    [/LIST]
     
  2. sslobodyan

    sslobodyan Гик

    Я бы не объявлял переменную в начале функции вывода времени на экран с одновременным обнулением - тогда нет смысла запоминать ее в конце этой функции. Перенесите лучше в глобальные переменные. И проверьте в какую позицию вы пытаетесь вывести день недели.
     
    alex7106 нравится это.
  3. alex7106

    alex7106 Нуб

    Спасибо, Но я конкретный чайник в этом вопросе, занимаюсь самоучением всего около двух недель, да и то если есть время. Мне нужно тыкнуть пальцем, а я начну разбираться. Хотел показать экран с пустым местом, где должны находиться дни недели, а там всё в порядке. Попробовал загрузить скетч отсюда, всё работает. Не знаю в чём была причина. Пожалуйста, укажите какую переменную и куда можно перенести, а я буду изучать. 20170206_123.jpg
     
  4. mcureenab

    mcureenab Гуру

    Это переменная (prevSecond) с модификатором static. Фактически она обнуляется во время запуска программы. Далее она хранит присвоенное значение как любая глобальная переменная. Тут не нужно ничего менять.

    Код (C++):
    void printTimeToSerial(){
      byte static prevSecond=0; // тут будем хранить, сколько секунд было при прошлом отчете
     
    День недели выводится в позицию 1,0. Читайте комментарии в коде. Они на русском.

    Код (C++):
    lcd.setCursor(1,0); // устанавливаем позицию курсора

          switch (RTC.dow)                      // вывести день недели
     
     
  5. alex7106

    alex7106 Нуб

    Спасибо, буду разбираться, у меня скорее всего ардуина глюканула. Сейчас пока всё в норме.