[Решено]Часы формата чч.мм.сс на двух сдвиговых регистрах.(Можно ли скампоновать код?).

Тема в разделе "Arduino & Shields", создана пользователем olegoriy, 22 июн 2015.

  1. olegoriy

    olegoriy Гик

    Добрый день.
    Попросили на заказ :) сделать часы с календарем. Использовал часы реального времени, два сдвиговых регистра и два семисигментных индикатора по три цифры. И вроде бы все получаеться , только смущает код в моменте заливки битов в регистры. Всю голову сломал но не могу придумать как код в этом моменте сделать меньше. Будут ли каие ни будь предложения или оставить как есть?
    Код (Text):
      long p = 0;              
      long i = 15000;
      long k = 3000;
      #include <Time.h>
      #include <Wire.h>
      #include <DS1307RTC.h>
      int y = 0;
      int t = 0;
      int r = 0;
      int e = 0;
      int w = 0;
      int q = 0;
      int z = 0;
      int c = 2;
    #define latch_Pin  9
    #define CLOCK_PIN  13
    #define data_Pin  11
    byte segments[11] = {
      0b01111110, 0b00110000, 0b01101101, 0b01111001, 0b00110011,
      0b01011011, 0b01011111, 0b01110000, 0b01111111, 0b01111011,
      0b00000000
    };
    byte segment[7] = {
      0b11111111, 0b10111111, 0b11011111, 0b11101111, 0b11110111,
      0b11111011, 0b11111101
    };


    void setup() {
      pinMode(latch_Pin, OUTPUT);
      pinMode(CLOCK_PIN, OUTPUT);
      pinMode(data_Pin, OUTPUT);
      setSyncProvider(RTC.get);
    }

    void loop() {
     
        unsigned long r = millis();
        if(r - p > k){
        z = 0;
        if(r - p > i){
        p = r;
        z = 1;
        }}
     
        if(z == 1){
        y = (year()-2000);
        if(y > 9) y = (year()-2000)%10;
        t = (year()-2000)/10;
     
        r = month();
        if(r > 9) r = month()%10;
        e = month()/10;
     
        w = day();
        if(w > 9) w = day()%10;
        q = day()/10;
        }
     
        if(z == 0){
        y = second();
        if(y > 9) y = second()%10;
        t = second()/10;
     
        r = minute();
        if(r > 9) r = minute()%10;
        e = minute()/10;
     
        w = hour();
        if(w > 9) w = hour()%10;
        q = hour()/10;
        }
     
        digitalWrite(latch_Pin, LOW);                            
        shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segment[1]);    
        shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segments[q]);        
        digitalWrite(latch_Pin, HIGH);
        delay(c);
        digitalWrite(latch_Pin, LOW);                            
        shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segment[2]);    
        shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segments[w]);        
        digitalWrite(latch_Pin, HIGH);
        delay(c);
        digitalWrite(latch_Pin, LOW);                            
        shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segment[3]);    
        shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segments[e]);        
        digitalWrite(latch_Pin, HIGH);
        delay(c);
        digitalWrite(latch_Pin, LOW);                            
        shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segment[4]);    
        shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segments[r]);        
        digitalWrite(latch_Pin, HIGH);
        delay(c);
        digitalWrite(latch_Pin, LOW);                            
        shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segment[5]);    
        shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segments[t]);        
        digitalWrite(latch_Pin, HIGH);
        delay(c);
        digitalWrite(latch_Pin, LOW);                            
        shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segment[6]);    
        shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segments[y]);        
        digitalWrite(latch_Pin, HIGH);
        delay(c);
        }
     
    Вот фотка кому интересно:
    [​IMG]
     
    Последнее редактирование: 22 июн 2015
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    запихнуть повторяющийся код в функцию:
    Код (Text):

    #include <Time.h>
    #include <Wire.h>
    #include <DS1307RTC.h>

    #define LATCH_PIN  9
    #define CLOCK_PIN  13
    #define DATA_PIN  11

    long p = 0;              
    long i = 15000;
    long k = 3000;
    byte y = 0;
    byte t = 0;
    byte r = 0;
    byte e = 0;
    byte w = 0;
    byte q = 0;
    byte z = 0;
    byte c = 2;
    byte segments[11] = {
      0b01111110, 0b00110000, 0b01101101, 0b01111001, 0b00110011,
      0b01011011, 0b01011111, 0b01110000, 0b01111111, 0b01111011,
      0b00000000
    };
    byte segment[7] = {
      0b11111111, 0b10111111, 0b11011111, 0b11101111, 0b11110111,
      0b11111011, 0b11111101
    };


    void setup() {
      pinMode(LATCH_PIN, OUTPUT);
      pinMode(CLOCK_PIN, OUTPUT);
      pinMode(DATA_PIN, OUTPUT);
      setSyncProvider(RTC.get);
    }

    void loop() {
      unsigned long r = millis();
      if(r - p > k){
        z = 0;
        if(r - p > i){
          p = r;
          z = 1;
        }
      }

      if(z == 1){
        y = (year()-2000);
        if(y > 9) y = (year()-2000)%10;
        t = (year()-2000)/10;

        r = month();
        if(r > 9) r = month()%10;
        e = month()/10;

        w = day();
        if(w > 9) w = day()%10;
        q = day()/10;
      }

      if(z == 0){
        y = second();
        if(y > 9) y = second()%10;
        t = second()/10;

        r = minute();
        if(r > 9) r = minute()%10;
        e = minute()/10;

        w = hour();
        if(w > 9) w = hour()%10;
        q = hour()/10;
      }
      displayData(1, q); delay(c);
      displayData(2, w); delay(c);
      displayData(3, e); delay(c);
      displayData(4, r); delay(c);
      displayData(5, t); delay(c);
    }


    void displayData(byte poz, byte num){  
      digitalWrite(LATCH_PIN, LOW);                            
      shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, segment[poz]);    
      shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, segments[num]);        
      digitalWrite(LATCH_PIN, HIGH);
    }
     
     
  3. olegoriy

    olegoriy Гик

    Большое спасибо!! Я чувствовал что решение существует, просто пока с функцией не сталкивался.
     
    Последнее редактирование: 22 июн 2015