пятница, 9 декабря 2016 г.

Arduino UNO + DS1302 + OLED. Часы с отображением даты на русском языке

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

В общем в наличии у меня имеется:

  • Arduino UNO  ATmega328P/CH340G 
Выбирал с разъемом microUSB, т.к. постоянно к компьютеру подключен какой либо кабель с этим интерфейсом.


  • Часы реального времени DS1302
Батарейку взял из старой материнской платы, где она играла ту же роль питания часов для неё.
Лучшим вариантом конечно были бы часы DS1307. Они и меньше по размеру значительно.

Например такие: 









  • Голубой OLED монитор 0.96" 128X64 с подключением i2c




    Весьма неплохой экран, в ярком свете весь текст отлично видно.

    Их в последствии легче будет спрятать, но так как цена самих часов в среднем не выше 60 руб. то я не сильно расстроился.



    К сожалению на текущий момент испытываю острый дефицит с хорошими контактными проводами, по этому приходится в разъемы макетной платы подключать просто голые провода, а к самим контактам часов подпаиваться.

    Библиотека с русским шрифтом: ссылка
    Библиотека для часов: ссылка (с удобным описанием)

    Скетч:
    #include <DS1302.h>
    #include <OLED_I2C.h>

    OLED  lcd(SDA, SCL, 2); //подключение к SDA SCL и 2й пин как кнопка RESET для монитора
    DS1302 RTC(8,7,13); //подключение RST=D8, DAT=D7, CLK=D13
    //объявляем шрифты
    extern uint8_t RusFont[];
    extern uint8_t BigNumbers[];

    char dat;
    Time t;

    void setup() {
      lcd.begin();
      Serial.begin(9600);
      RTC.halt(false);
      RTC.writeProtect(false);   
    }

    //устанавливаем наименование каждому дню
    String dowToDay(int day){
      String nameday;
      switch (day){
        case 1: {nameday = "Gjytltkmybr"; //понедельник
          break;}
        case 2:{nameday = "Dnjhybr"; //вторник
          break;}
        case 3:{nameday = "Chtlf"; //среда
          break;}
        case 4:{nameday = "Xtndthu"; //четверг
          break;}
        case 5:{nameday = "Gznybwf"; //пятница
          break;}
        case 6:{nameday = "Ce,,jnf"; //суббота
          break;}
        case 7:{nameday = "Djcrhtctymt"; //воскресенье
          break;}
                 }
      return nameday;
    }

    void loop() {
      
          t = RTC.getTime();  //Запрос времени
          
          String h = String(t.hour, DEC); //Библиотека понимает только формат String приходится в него переводить
          String m = String(t.min, DEC);
          String s = String(t.sec, DEC);
          String day = dowToDay(t.dow);
          
     //Рисуем впереди ноль для заполнения пустоты    
          if (t.hour<10) h = "0" + h; 
          if (t.min<10) m = "0" + m;
          if (t.sec<10) s = "0" + s;
          
    //чистим экран и устанавливаем цифровой шрифт       
          lcd.clrScr();   
          lcd.setFont(BigNumbers);
          
    //Выводим на экран часы минуты секунды     
          lcd.print(h,10,10); 
          lcd.print(m,46,10);
          lcd.print(s,80,10);
          
    //меняем шрифт на русский и печатаем день недели
          lcd.setFont(RusFont);
          lcd.print(day,0,50);
          
    //рисуются точки (:) между час и минута        
          lcd.drawLine(42,15,42,17); 
          lcd.drawLine(43,15,43,17);
          lcd.drawLine(42,27,42,29);
          lcd.drawLine(43,27,43,29);
          
    //рисуются точки (:) между минута и секунда
          lcd.drawLine(76,15,76,17);  
          lcd.drawLine(77,15,77,17);
          lcd.drawLine(76,27,76,29);
          lcd.drawLine(77,27,77,29);
          
    //Для отладки выдаем в COM порт информацию      
           Serial.print(t.hour, DEC);
           Serial.print(" : ");
           Serial.print(t.min, DEC);
           Serial.print(" : ");
           Serial.print(t.sec, DEC);
           Serial.print(" День: ");
           Serial.println(day);
         
           lcd.update(); 
           delay(450);  //Оптимальная задержка для корректного отражения времени
    }

    Изображения взяты с ресурсов:
    aliexpress.com
    iarduino.ru

    1 комментарий:

    1. Sands Casino: Luxury Hotel & Resort in Las Vegas
      Come out 샌즈카지노 and play at Sands 카지노 Casino, where fun and excitement are always present, right at your fingertips. From table games and 1xbet korean live-action

      ОтветитьУдалить