Ничего не найдено :(
    В гостях у Самоделкина! » Темы » Советы » Часы на светодиодной матрице и ардуино

    Часы на светодиодной матрице и ардуино


    Приветствую всех любителей паяльников и микроконтроллеров! Сегодня будем собирать простые часы на светодиодной матрице (MAX7219) и Arduino Nano с ручной настройкой времени.

    Для этого на понадобится:
    1. Светодиодная матрица на MAX7219.
    2. Плата Arduino Nano (хотя в идеале взять Pro Mini)
    3. Модуль часов реального времени DS1302.
    4. Тонкий провод (в моём случае это МГТФ-0,25).
    5. Стойки, винты и гайки к ним.
    6. Двухсторонний скотч.
    7. Термоклей и клеевой пистолет.
    8. Ненужный USB провод.
    9. Два разъёма типа "мама".
    10. Три тактовые кнопочки, кусочек макетной платы.
    11. Три SMD резистора по 10 кОм.
    12. Паяльник, припой, канифоль и т.д.

    1. Прошивка микроконтроллера
    Я постарался максимально понятно написать код с комментариями. Единственное, что вам нужно будет сделать перед прошивкой, это скачать три библиотеки и в функции watch.settime(0,36,13); (15 строчка кода) изменить время, в которое вы будете прошивать МК, хотя это не обязательно т.к. время потом можно будет настроить кнопками.

    Собственно вот сам код:

    #include <SPI.h> // библиотеки   
    #include <Wire.h>  
    #include <Adafruit_GFX.h> // эти 3 скачиваем из итернета
    #include <Max72xxPanel.h>
    #include <iarduino_RTC.h> // эта библиотека версии 1.3.4 от 09.01.2020
    
    uint8_t h,m,s; // переменные для хранения времени
    Max72xxPanel matrix = Max72xxPanel(10, 1, 4); // пин CS, кол-во матриц по вертикали, кол-во матриц по горезонтали
    iarduino_RTC watch(RTC_DS1302,2,3,4); //rst clk dat модуля часов
    
    void setup(void) {
    matrix.setIntensity(1); // Яркость от 0 до 15
    matrix.setRotation(matrix.getRotation()+1); // положение матриц  +1 - 90  +2 - 180   +3 - 270 градусов 
       watch.begin(); // запуск часов
       watch.settime(0,36,13); // установка текущего времени  (сек, мин, час) 
    pinMode(8, OUTPUT); // настройка пинов для кнопок
    digitalWrite(8,1);
    pinMode(7, INPUT);
    pinMode(6, INPUT);
    pinMode(5, INPUT);
    }
    
    void loop(void){
      Display();
      watch.gettime();
      if(millis()%1000==0){ // если прошла 1 секунда
       h = watch.Hours;    // Получаем текущие часы 
       m = watch.minutes;  // Получаем текущие минуты    
       s = watch.seconds;   // Получаем текущие секунды
       delay(2);
      }
       bool button_setup = digitalRead(7); // считываем состояние кнопок
      bool button_plus = digitalRead(6); 
      bool button_minus = digitalRead(5); 
      
      //Проверка нажатий
     int regim=1;
      int flag=0; 
       if(button_setup==1&&flag==0)  
         { 
           regim++;   
           flag=1;                        
            if(regim>3) regim=1;             
         }       
          if(button_setup==0&&flag==1) flag=0;    
        if(regim==1)//настройка часов
        { 
          if(button_plus==1){
             h++;
             if(h>23) h=0;
              watch.settime(0,m,h);
             delay(300);
          }
         if(button_minus==1){
             h--;
             if(h<=0) h=0;
              watch.settime(0,m,h);
             delay(300);
          }
        }     
        if(regim==2)//настройка минут
        { 
          if(button_plus==1){
             m++;
             if(m>59) m=0;
              watch.settime(0,m,h);
             delay(300);
          }
         if(button_minus==1){
             m--;
             if(m<=0) m=0;
             watch.settime(0,m,h);
             delay(300);
          }
        }      
    }
    void Display(){
        matrix.fillScreen(0);
        int y = (matrix.height() - 8) / 2; // центрирование по вертикали
      
        if(watch.seconds & 1)  // мигающее двоеточие
        {
          matrix.drawChar(14, y, (String(":"))[0], HIGH, LOW, 1);
        } 
        else
        {
          matrix.drawChar(14, y, (String(" "))[0], HIGH, LOW, 1);
          }
        
        String hour1 = String (h/10); // преобразовываем числа для вывода
        String hour2 = String (h%10);
        String min1 = String (m/10);
        String min2 = String (m%10);
        String sec1 = String (s/10);
        String sec2 = String (s%10);
        int xh = 2;
        int xm = 19;
    
        matrix.drawChar(xh, y, hour1[0], HIGH, LOW, 1);
        matrix.drawChar(xh+6, y, hour2[0], HIGH, LOW, 1);
        matrix.drawChar(xm, y, min1[0], HIGH, LOW, 1);
        matrix.drawChar(xm+6, y, min2[0], HIGH, LOW, 1);
     
        matrix.write(); // Вывод на дисплей
    }
    


    2. Сборка, пайка
    После успешной прошивки переходим к сборке часов. Прикручиваем стойки к матрице по краям для крепления в корпус. Крепим Arduino, модуль часов и кнопки на двухсторонний скотч к обратной стороне платы матрицы. Кстати о кнопках, их припаиваем к кусочку макетной платы, припаиваем резисторы с обратной стороны и соединяем по схеме. Конечно, кнопки можно "вынести" на длинных проводах, но для моего корпуса удобнее так. Соединяем всё проводами. Схема:

    Сборка:

    Чтобы провода не торчали закрепим их термоклеем к плате.


    3. Провод питания
    Берём ненужный USB-провод от зарядки и откусываем разъём микро-USB (в моём случае). Теперь зачищаем провода и аккуратно припаиваем разъёмы "мама". Места спайки изолируем термоусадкой. Соблюдая полярность питания подключаем провод к разъёму ISP для программатора.



    4. Настройка часов
    Настройка осуществляется тремя кнопками.
    При нажатии кнопки 2, увеличиваем час на 1.
    При нажатии кнопки 3, уменьшаем час на 1.
    Для настройки минут тоже самое, только нужно удерживать кнопку 1.

    На этом у меня всё, удачных всем проектов и самоделок!

    Простые часы на Arduino и матричном индикаторе

    Как сделать быстро и бесплатно водосточный желоб из бывших в употреблении панелей ПВХ

    Добавить комментарий

    5 комментариев
    SeGAD #84799
    Гость Виталий,


    Тут все просто, это надо для начальной установки времени, потом ее можно закомментить и прошить снова, и часы будут идти норм

    Гость Виталий #59804
    watch.settime(0,36,13); // установка текущего времени  (сек, мин, час)
    Считаю данную строчку лишней. Если отключить питание и снова включить, то время опять установится в 13:36. Смысл тогда в DS1302?
    Если строчку убрать (или закомментировать), то после выключения и включения питания время устанавливается то, которое натикали DS1302, работая от батарейки.
    Korolev #55870
    pogranec,
    какие хорошие?
    Не знаю, какие хорошие, но часики понравились, в отличие от недавних на сайте, с кубиками. good  
    pogranec #55861
    Цитата: Гость Миша
    Ds1302 самые плохие часы реального времени. 
    какие хорошие?
    Гость Миша #55860
    Ds1302 самые плохие часы реального времени. 

    Привет, Гость!


    Зарегистрируйтесь

    Или войдите на сайт, если уже зарегистрированы...

    Войти

    Добавьте самоделку

    Добавьте тему

    Онлайн чат

    Последние комментарии

    Все комментарии