TM1628 + DS 1302 и time.blinktime

Kam41
Offline
Зарегистрирован: 06.04.2019

Уважаемые груру этого форума! Мне опять таки нужна ваша помощь! По написанному примеру Уважаемого Евгения П, из темы по TM1668 мне удалось запустить свой экран. Так-же на борту находится микросхема DS1302 с которой удалось вывести время на экран. Установка времени осуществляется с помощью 3-х кнопок по IR протоколу.  Библиотека для часов iarduino_RTC.h. Часы и установка времени работают, а вот команда time.blinktime должна мигать выбранным элементом но это не происходит. Подскажите пожайлуста, как заставить работать данную команду?

 

#include <boarddefs.h>
#include <IRremote.h>
#include <IRremoteInt.h>
#include <ir_Lego_PF_BitStreamEncoder.h>

#include <iarduino_RTC.h>




//  Подключение пинов
//  
//    GND 5V  CLK DIO STB OUT-IR  
//
    #define PIN_CLK 8
    #define PIN_DIO 9
    #define PIN_STB 7  
    #define PIN_IR  2


/////////////////////////////////////////////////////////////
/////////////         ТИПА "библиотека"          ////////////
/////////////////////////////////////////////////////////////

//
// 
// достаточно может быть 14 байтов на  светодиоды и 2 на кнопки
//
#define LED_DATA_LENGTH 14
#define KEY_DATA_LENGTH 2
#define INIT_7x11   7  //7 семи сегментных индикатора

//
// Маски нажатых кнопок 
//
#define POWER         0x51DA01F8
#define TIME_SETTING  0x1F72CFA1
#define TEMPERATURE   0xA83B8E71 
#define HEATING       0x974D2F31
#define VACUUM        0xCE53E021
#define TIMING        0x1B4F8AC1
#define PLUS          0x8876C5E1
#define MINUS         0xD080A1B1

//
// Подключено 7 "цифр". 
// 
// 1-4 - собственно цифры слева направо.
// В цифрах задействовано 7 битов под сегменты (с 0-го по 6-ой)
// и 7-ой бит под доплнительный символ (питание, конверт и т.п.) 
//

//                                             _A__
#define SEG_A 0x01  // цифры с 1 по 6        F|    |B
#define SEG_B 0x02  // цифры с 1 по 6         |_G__|
#define SEG_C 0x04  // цифры с 1 по 6        E|    |C
#define SEG_D 0x08  // цифры с 1 по 6         |_D__|
#define SEG_E 0x10  // цифры с 1 по 6
#define SEG_F 0x20  // цифры с 1 по 6
#define SEG_G 0x80  // цифры с 1 по 6

#define SEG_H0 0x40    // Знак F (фаренгейт)
#define SEG_H1 0x100   // Знак нагрева нижний тен
#define SEG_H2 0x200   // Знак нагрева верхний тен
#define SEG_H3 0x340   // Знак TEMPERAYURE
#define SEG_H4 0x40    // Знак DATE
#define SEG_H5 0x100   // Знак С (Цельсий)
#define SEG_H6 0x340    // Знак VACUUM
#define SEG_H7 0x40     // Знак TIME_SETTING_первая половина
#define SEG_H8 0x100    // Знак Часы
#define SEG_H9 0x300    // Знак TAME_SETTING_вторая половина
//#define TIME_SETTING  (SEG_H7 | SEG_H9) // таймсетинг
#define SEG_H 0x200    // Знак MIN

#define SEG_DT  0x200  // Двоеточие



//
// Символы (цифры / буквы, можно ещё добавить всяких)
//
#define SYMBOL_0 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F)
#define SYMBOL_1 (SEG_B | SEG_C)
#define SYMBOL_2 (SEG_A | SEG_B | SEG_D | SEG_E | SEG_G)
#define SYMBOL_3 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_G)
#define SYMBOL_4 (SEG_B | SEG_C | SEG_F | SEG_G)
#define SYMBOL_5 (SEG_A | SEG_C | SEG_D | SEG_F | SEG_G)
#define SYMBOL_6 (SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define SYMBOL_7 (SEG_A | SEG_B | SEG_C)
#define SYMBOL_8 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define SYMBOL_9 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G)

#define SYMBOL_MINUS (SEG_G)
#define SYMBOL_A (SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G)
#define SYMBOL_C (SEG_A | SEG_E | SEG_F | SEG_D)
#define SYMBOL_E (SEG_A | SEG_D | SEG_E | SEG_F | SEG_G)
#define SYMBOL_H (SEG_B | SEG_C | SEG_E | SEG_F | SEG_G)
#define SYMBOL_P (SEG_A | SEG_B | SEG_E | SEG_F | SEG_G)
#define SYMBOL_G (SEG_A | SEG_E | SEG_F)
#define SYMBOL_L (SEG_D | SEG_E | SEG_F)
#define SYMBOL_F (SEG_A | SEG_E | SEG_F | SEG_G)
#define SYMBOL_d (SEG_B | SEG_C | SEG_D | SEG_E | SEG_G)
#define SYMBOL_b (SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define SYMBOL_rP (SEG_A | SEG_B | SEG_C | SEG_E | SEG_F)

//
// Глобальные переменные
//
static uint16_t ledGRID[LED_DATA_LENGTH / 2]; // текущее состояние экрана
static uint8_t currentBrightness = 5; // текущая яркость
static uint8_t digits[] = { SYMBOL_0, SYMBOL_1, SYMBOL_2, SYMBOL_3, SYMBOL_4, SYMBOL_5, SYMBOL_6, SYMBOL_7, SYMBOL_8, SYMBOL_9 };



//


//
//  Запись одиночной команды 
//
void writeSingleCommand(const uint8_t command) {
  digitalWrite(PIN_STB, LOW);
  shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, command);
  digitalWrite(PIN_STB, HIGH);
  delayMicroseconds(1); // Пауза до следующей команды
}

//
//  Запись состояния дисплея 
//
void updateDisplay(void) {
  writeSingleCommand(0x40);  // запись данных, автоматический адрес
  digitalWrite(PIN_STB, LOW);
  shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, 0xC0); // Установка адреса в 0
  uint8_t * p = (uint8_t *) ledGRID;
  for (int8_t i = 0; i < LED_DATA_LENGTH; i++, p++) shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, *p); // запись данных
  digitalWrite(PIN_STB, HIGH);
  delayMicroseconds(1); // Пауза до следующей команды
}
//

//
// Установить яркость от 0 (выключено) до 8
// (возвращает старую яркость)
//
static inline uint8_t setBrightness(const uint8_t newBrighness) {
  const uint8_t res = currentBrightness;
  currentBrightness = (newBrighness > 8) ? 8 : newBrighness;
  if (currentBrightness == 0) writeSingleCommand(0x80); // Выключить дисплей
  else writeSingleCommand(0x88 + (currentBrightness - 1)); // Установить яркость
  return res;
}

//
//  Увеличить яркость на 1 (возвращает старую яркость)
//
static inline uint8_t increaseBrightness(void) {
  const uint8_t res = currentBrightness;
  if (currentBrightness < 8) setBrightness(currentBrightness + 1);
  return res;
}

//
//  Уменьшить яркость на 1 (возвращает старую яркость)
//
static inline uint8_t decreaseBrightness(void) {
  const uint8_t res = currentBrightness;
  if (currentBrightness > 0) setBrightness(currentBrightness - 1);
  return res;
}


//  Показать/скрыть/инвертировать дополнительный символ 
//


      static inline void F_LED_ON(void) { ledGRID[0] |= SEG_H0; }
      static inline void F_LED_OFF(void) { ledGRID[0] &= ~SEG_H0; }
      static inline void invert_F(void) { ledGRID[0] ^= SEG_H0; }


      static inline void TEN1_LED_ON(void) { ledGRID[0] |= SEG_H1; }
      static inline void TEN1_LED_OFF(void) { ledGRID[0] &= ~SEG_H1; }
      static inline void invert_TEN1(void) { ledGRID[0] ^= SEG_H1; }


      static inline void TEN2_LED_ON(void) { ledGRID[0] |= SEG_H2; }
      static inline void TEN2_LED_OFF(void) { ledGRID[0] &= ~SEG_H2; }
      static inline void invert_TEN2(void) { ledGRID[0] ^= SEG_H2; }


      static inline void TEMP_LED_ON(void) { ledGRID[1] |= SEG_H3; }
      static inline void TEMP_LED_OFF(void) { ledGRID[1] &= ~SEG_H3; }
      static inline void invert_TEMP(void) { ledGRID[1] ^= SEG_H3; }


      static inline void DATE_LED_ON(void) { ledGRID[2] |= SEG_H4; }
      static inline void DATE_LED_OFF(void) { ledGRID[2] &= ~SEG_H4; }
      static inline void invert_DATE(void) { ledGRID[2] ^= SEG_H4; }


      static inline void C_LED_ON(void) { ledGRID[2] |= SEG_H5; }
      static inline void C_LED_OFF(void) { ledGRID[2] &= ~SEG_H5; }
      static inline void invert_C(void) { ledGRID[2] ^= SEG_H5; }


      static inline void VACUUM_LED_ON(void) { ledGRID[3] |= SEG_H6; }
      static inline void VACUUM_LED_OFF(void) { ledGRID[3] &= ~SEG_H6; }
      static inline void invert_VACUUM(void) { ledGRID[3] ^= SEG_H6; }


      static inline void CHASIKI_LED_ON(void) { ledGRID[4] |= SEG_H8; }
      static inline void CHASIKI_LED_OFF(void) { ledGRID[4] &= ~SEG_H8; }
      static inline void invert_CHASIKI(void) { ledGRID[4] ^= SEG_H8; }


      static inline void TIMESET_LED_ON(void) { (ledGRID[4] |= SEG_H7),( ledGRID[5] |= SEG_H9); }
      static inline void TIMESET_LED_OFF(void) {(ledGRID[4] &= ~SEG_H7),( ledGRID[5] &= ~SEG_H9); }
      static inline void invert_TIMESET(void) { (ledGRID[4] ^= SEG_H7),( ledGRID[5] ^= SEG_H9); }


      static inline void MIN_LED_ON(void) { ledGRID[6] |= SEG_H; }
      static inline void MIN_LED_OFF(void) { ledGRID[6] &= ~SEG_H; }
      static inline void invert_MIN(void) { ledGRID[6] ^= SEG_H; }

//
//  Показать/скрыть/инвертировать двоеточие
//
      static inline void POINT_LED_ON(void) { ledGRID[4] |= SEG_DT; }
      static inline void POINT_LED_OFF(void) { ledGRID[4] &= ~SEG_DT; }
      static inline void invert_POINT(void) { ledGRID[4] ^= SEG_DT; }

//
//  Показать цифру value (0-9) в позиции digit (1-4)
// при этом, если у цифры горит дополнительный символ, сохраняем его
//
      static inline void setDigit(const int8_t digit, const uint8_t value) {
     if (digit < 0 || digit > 6) return; // цифры у нас с 1-ой по 4-ую слева направо
     ledGRID[digit] = value | (ledGRID[digit] & SEG_H  ) | (ledGRID[digit] & SEG_H6) | (ledGRID[digit] & SEG_H0) | (ledGRID[digit] & SEG_H1)
     | (ledGRID[digit] & SEG_H2) | (ledGRID[digit] & SEG_H3) | (ledGRID[digit] & SEG_H4) | (ledGRID[digit] & SEG_H5) 
     | (ledGRID[digit] & SEG_H8) |  (ledGRID[digit] & SEG_H7) | (ledGRID[digit] & SEG_H9); // не обижать дополнительный символ, если есть 
}

//
//  Показать число m в двух правых цифрах (типа минуты или там секунды)
//
    static inline void show_Minutes (const int8_t m) {
    setDigit(6, digits[m % 10]);
    setDigit(5, digits[m / 10]);
}

//
//  Показать число h в двух левых цифрах (типа часы или там минуты)
//
    static inline void show_Hours (const int8_t h) {
    setDigit (4, digits[h % 10]);
    setDigit(3, digits[h / 10]);
}
// Показать дату  
    static inline void  show_Date (const int8_t d) {
    setDigit (2, digits[d % 10]);
    setDigit(1, digits[d / 10]);
    
}
 

//
//  Показать дату, часы и минуты
//
    static inline void show_Clock(const int8_t d, const int8_t h, const int8_t m) {
    show_Date   (d);
    show_Hours  (h);
    show_Minutes(m);


}
    


/////////////////////////////////////////////////////////////
////////////          КОНЕЦ "библиотеки"         ////////////
/////////////////////////////////////////////////////////////


 
  iarduino_RTC time(RTC_DS1302, 11, 12, 13);
  int RECEIVE_PIN = 2;
  IRrecv irrecv(RECEIVE_PIN);
  decode_results results;
  
unsigned long last = millis();

int set_clock = 0;

long previousMillis = 0;
long interval = 500;


void setup(void) {

  Serial.begin(9600);
   delay(300);                  // Ждем готовности модуля отвечать на запросы
   time.begin();
   irrecv.enableIRIn();
  
  // Инициализация пинов
  //------------  TM1628 PIN  ------------  

  
  pinMode(PIN_CLK, OUTPUT);
  pinMode(PIN_DIO, OUTPUT);
  pinMode(PIN_STB, OUTPUT);
  digitalWrite(PIN_STB, HIGH);
  digitalWrite(PIN_CLK, HIGH);
  
  pinMode(PIN_IR, INPUT);

  
   //
  // Инициализация экрана
  writeSingleCommand(0x40); // Режим отображения (1 и 2 - ничего не меняется)
  setBrightness(currentBrightness);
  //
  // Пишем на экране слово ПОПА
  setDigit(1, SYMBOL_rP);
  setDigit(2, SYMBOL_0);
  setDigit(3, SYMBOL_rP);
  setDigit(4, SYMBOL_A);
  updateDisplay();
  //

  // Даём 5 секунд полюбоваться
  delay(5000);

//Высвечиваем все элементы экрана
  TEN1_LED_ON();
  TEN2_LED_ON();
  F_LED_ON();
  TEMP_LED_ON();
  DATE_LED_ON();
  C_LED_ON();
  VACUUM_LED_ON();
  TIMESET_LED_ON();
  CHASIKI_LED_ON();
  MIN_LED_ON();

}


void loop(void) {
  
Serial.println(time.gettime("d-m-Y, H:i:s, D"));

//
 // Выводим часы на экран
//
int d = time.day,  h = time.Hours, m = time.minutes;
    time.gettime();

   show_Clock(d, h, m); //Показываем дни, часы, минуты
 
//Мигаем двоиточием    
    unsigned long currentMillis = millis();
    
  if(currentMillis - previousMillis > interval) { 
    previousMillis = currentMillis; 
    
    invert_POINT();
}

//-----------------------Блок установки времени----------------------------------------

if ((irrecv.decode(&results)) && (results.value==TIME_SETTING) ) {
  
    if (millis() - last > 250) {  
           set_clock ++;
           if(set_clock>3){set_clock = 0;}

    } 
        last = millis();
        irrecv.resume();     
}

    if(set_clock==0){          //Выходим из установки времени
             TIMESET_LED_OFF();
             time.blinktime(0);  //Ни какой элемент не мигает
             }

    if(set_clock==1){         //Установка даты
       
       TIMESET_LED_ON();
       time.blinktime(4, 1);    // Должны мигать датой но не мигает.
           
    if ((irrecv.decode(&results)) && (results.value==PLUS) ){
    
    if (millis() - last > 250) {
        
        time.day ++;                          // прибавляем единицу в днях
    
    if (time.day > 31) {time.day = 0;}        // если вылезли за границы присваеваем 0
        time.settime(-1, -1, -1, time.day);   // установит дату, а секунды и минуты, оставит без изменений.
 
 }
        last = millis();
        irrecv.resume();
 }
   
    if ((irrecv.decode(&results)) && (results.value==MINUS) ){
    if (millis() - last > 250) {
        
        time.day --;                         // убовляем единицу в днях
    if (time.day > 31) time.day = 0;         // если вылезли за границы присваеваем 0
        time.settime(-1, -1, -1,time.day);   // установит дату, а секунды и минуты, оставит без изменений.
}
    last = millis();
    irrecv.resume();
 }
}
 
    if(set_clock==2){           //Установка часов
       TIMESET_LED_ON();
       time.blinktime(3, 1);    //Должны мигать часами но не мигает
           
    if ((irrecv.decode(&results)) && (results.value==PLUS) ){
    if (millis() - last > 250) {
        
        time.Hours ++;                            // прибавляем единицу в часах
    if (time.Hours > 23) time.Hours = 0;          // если вылезли за границы присваеваем 0
        time.settime(-1, -1, time.Hours, -1);     // установит часы, а секунды, минуты и дату, оставит без изменений.
 
 }
    last = millis();
    irrecv.resume();
 }
   
    if ((irrecv.decode(&results)) && (results.value==MINUS) ){
    if (millis() - last > 250) {
        
        time.Hours --;                            // убовляем единицу в часах
    if (time.Hours > 23) time.Hours = 0;          // если вылезли за границы присваеваем 0
        time.settime(-1, -1, time.Hours, -1);     // установит часы, а секунды, минуты и дату, оставит без изменений.
}
    last = millis();
    irrecv.resume();
 }
}  
     if(set_clock==3){        //Установка минут
        
        TIMESET_LED_ON();
        time.blinktime(2, 1);   //Должны мигать минутами но не мигает
          
     if ((irrecv.decode(&results)) && (results.value==PLUS) ){
     if (millis() - last > 250) {
         
         time.minutes ++;                            // прибавляем единицу в минутах
     if (time.minutes > 59) time.minutes = 0;        // если вылезли за границы присваеваем 0
         time.settime(0, time.minutes, -1, -1);      // установит минуты, секунды сбросит на 0, минуты и дату, оставит без изменений.
 }
    last = millis();
    irrecv.resume();
 }
      if ((irrecv.decode(&results)) && (results.value==MINUS) ){
      if (millis() - last > 250) {
          
          time.minutes --;                            // убовляем единицу в минутах
      if (time.minutes > 59) time.minutes = 0;        // если вылезли за границы присваеваем 0
          time.settime(0, time.minutes, -1, -1);      // установит минуты, секунды сбросит на 0, минуты и дату, оставит без изменений.
              }
    last = millis();
    irrecv.resume();
 }
}
  
  updateDisplay();
  }
   
 

 

Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

Вопрос такой я по вашему коду сделал свой для работы с микросхемой TM1628 го дисплей у меня не стандартный от увлажнителя. Так вот вопрос в том что, символ SEG_H всегда горит и после перезаписи с помощью функции Digit не тухнет. Увидел такую у вас вещь:

static inline void setDigit(const int8_t digit, const uint8_t value) {
  if (digit < 1 || digit > 7) return;
  ledGRID[digit] = value | (ledGRID[digit] & SEG_H);} 

ЗАчем там в конце SEG_H думаю что по 

тмоу причине он именно этот сегмент не гасит. Как поправить не скажите?