TM1628 + DS 1302 и time.blinktime
- Войдите на сайт для отправки комментариев
Чт, 18/04/2019 - 00:46
Уважаемые груру этого форума! Мне опять таки нужна ваша помощь! По написанному примеру Уважаемого Евгения П, из темы по 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(); }
Вопрос такой я по вашему коду сделал свой для работы с микросхемой TM1628 го дисплей у меня не стандартный от увлажнителя. Так вот вопрос в том что, символ SEG_H всегда горит и после перезаписи с помощью функции Digit не тухнет. Увидел такую у вас вещь:
ЗАчем там в конце SEG_H думаю что по
тмоу причине он именно этот сегмент не гасит. Как поправить не скажите?