есть программа часов на модуле ds1302 и четырех матрицах MAX7219
#include <iarduino_Encoder_tmr.h>
iarduino_Encoder_tmr enc(5, 6);
#include <DS1302.h>
DS1302 rtc(2, 3, 4); //CE, I/O, SCLK
#include <LedControl.h>
int DIN = 13;
int CS = 12;
int CLK = 11;
byte N[10][4] = { { 62, 65, 65, 62 }, //масив знаков 0-9
{ 0, 127, 2, 0 },
{ 70, 73, 81, 98 },
{ 54, 73, 65, 34 },
{ 127, 8, 8, 15 },
{ 57, 69, 69, 39 },
{ 48, 73, 73, 62 },
{ 7, 25, 97, 1 },
{ 54, 73, 73, 54 },
{ 62, 73, 73, 6 } };
byte nn[10][3] = { { 60, 66, 60 }, //масив знаков 0-9
{ 0, 126, 4 },
{ 76, 82, 100 },
{ 52, 74, 66 },
{ 126, 8, 14 },
{ 50, 74, 78 },
{ 50, 74, 60 },
{ 14, 114, 2 },
{ 52, 74, 52 },
{ 60, 82, 76 } };
byte IND[6][4];
byte k[6];
byte s[6]{ 10, 10, 10, 10, 10, 10 };
int a;
byte hour_;
byte minute_;
byte second_;
LedControl lc = LedControl(DIN, CLK, CS, 4); // установка входов/выходов и количества матриц в индикаторе
void setup() {
lc.shutdown(0, false);
lc.shutdown(1, false);
lc.shutdown(2, false);
lc.shutdown(3, false);
lc.setIntensity(0, 1); // установка яркости матрици
lc.setIntensity(1, 1);
lc.setIntensity(2, 1);
lc.setIntensity(3, 1);
Serial.begin(9600);
enc.begin(); // Инициируем работу с энкодером
// rtc.halt(false);//Управление флагом СН (запуск-останов часов).true: Установить флаг CH. false: очистить флаг CH
/* Когда флаг установлен, тактовый генератор останавливается и DS1302 находится в режиме ожидания с низким энергопотреблением с током менее 100nA. Если флаг сбрасывается, часы начинают отсчет времени.*/
// rtc.writeProtect(false);//Установка или сброс WP-бита. true: Установить WP-бит. false: Сбросить WP бит. WP: (Write-Protect) бит. Блокирует запись информации в DS1302
// rtc.setDOW(FRIDAY); // Set Day-of-Week to FRIDAY
// rtc.setTime(20, 52, 0); // Set the time to 12:00:00 (24hr format)
// rtc.setDate(19, 2, 2017); // Set the date to August 6th, 2010
lc.setColumn(1, 5, 128);
}
void loop() {
String stringOne = rtc.getTimeStr(FORMAT_LONG); // Считываем из DS1302 в строку stringOne
// Serial.println(stringOne);
k[0] = stringOne.charAt(7) - 48;
k[1] = stringOne.charAt(6) - 48;
k[2] = stringOne.charAt(4) - 48;
k[3] = stringOne.charAt(3) - 48;
k[4] = stringOne.charAt(1) - 48;
k[5] = stringOne.charAt(0) - 48;
if (k[0] != s[0] | k[1] != s[1] | k[2] != s[2] | k[3] != s[3] | k[4] != s[4] | k[5] != s[5]) printType(N, nn, IND, k, s);
a = enc.read(); // Читаем состояние энкодера в переменную a
if (a) { // Если энкодер зафиксировал поворот, то …
if (a == encRIGHT) {
hour_ = k[5] * 10 + k[4] + 1;
if (hour_ > 23) hour_ = 0;
minute_ = k[3] * 10 + k[2];
second_ = k[1] * 10 + k[0];
rtc.setTime(hour_, minute_, second_);
}
if (a == encLEFT) {
hour_ = k[5] * 10 + k[4];
minute_ = k[3] * 10 + k[2] + 1;
if (minute_ > 59) minute_ = 0;
second_ = k[1] * 10 + k[0];
rtc.setTime(hour_, minute_, second_);
}
}
s[0] = k[0];
s[1] = k[1];
s[2] = k[2];
s[3] = k[3];
s[4] = k[4];
s[5] = k[5];
}
void printType(byte N[10][4], byte nn[10][3], byte IND[6][4], byte k[6], byte s[6]) {
byte m;
if (k[0] != s[0]) {
for (m = 8; m > 0; m–) {
IND[0][0] = (IND[0][0] << 1) | (nn[k[0]][0] >> m - 1);
IND[0][1] = (IND[0][1] << 1) | (nn[k[0]][1] >> m - 1);
IND[0][2] = (IND[0][2] << 1) | (nn[k[0]][2] >> m - 1);
lc.setColumn(3, 0, IND[0][0]);
lc.setColumn(3, 1, IND[0][1]);
lc.setColumn(3, 2, IND[0][2]);
}
}
if (k[1] != s[1]) {
for (m = 8; m > 0; m–) {
IND[1][0] = (IND[1][0] << 1) | (nn[k[1]][0] >> m - 1);
IND[1][1] = (IND[1][1] << 1) | (nn[k[1]][1] >> m - 1);
IND[1][2] = (IND[1][2] << 1) | (nn[k[1]][2] >> m - 1);
lc.setColumn(3, 4, IND[1][0]);
lc.setColumn(3, 5, IND[1][1]);
lc.setColumn(3, 6, IND[1][2]);
}
}
if (k[2] != s[2]) {
for (m = 8; m > 0; m–) {
IND[2][0] = (IND[2][0] << 1) | (N[k[2]][0] >> m - 1);
IND[2][1] = (IND[2][1] << 1) | (N[k[2]][1] >> m - 1);
IND[2][2] = (IND[2][2] << 1) | (N[k[2]][2] >> m - 1);
IND[2][3] = (IND[2][3] << 1) | (N[k[2]][3] >> m - 1);
lc.setColumn(2, 3, IND[2][0]);
lc.setColumn(2, 4, IND[2][1]);
lc.setColumn(2, 5, IND[2][2]);
lc.setColumn(2, 6, IND[2][3]);
}
}
if (k[3] != s[3]) {
for (m = 8; m > 0; m–) {
IND[3][0] = (IND[3][0] << 1) | (N[k[3]][0] >> m - 1);
IND[3][1] = (IND[3][1] << 1) | (N[k[3]][1] >> m - 1);
IND[3][2] = (IND[3][2] << 1) | (N[k[3]][2] >> m - 1);
IND[3][3] = (IND[3][3] << 1) | (N[k[3]][3] >> m - 1);
lc.setColumn(1, 0, IND[3][0]);
lc.setColumn(1, 1, IND[3][1]);
lc.setColumn(1, 2, IND[3][2]);
lc.setColumn(1, 3, IND[3][3]);
}
}
if (k[4] != s[4]) {
for (m = 8; m > 0; m–) {
IND[4][0] = (IND[4][0] << 1) | (N[k[4]][0] >> m - 1);
IND[4][1] = (IND[4][1] << 1) | (N[k[4]][1] >> m - 1);
IND[4][2] = (IND[4][2] << 1) | (N[k[4]][2] >> m - 1);
IND[4][3] = (IND[4][3] << 1) | (N[k[4]][3] >> m - 1);
lc.setColumn(1, 7, IND[4][0]);
lc.setColumn(0, 0, IND[4][1]);
lc.setColumn(0, 1, IND[4][2]);
lc.setColumn(0, 2, IND[4][3]);
}
}
if (k[5] != s[5]) {
for (m = 8; m > 0; m–) {
IND[5][0] = (IND[5][0] << 1) | (N[k[5]][0] >> m - 1);
IND[5][1] = (IND[5][1] << 1) | (N[k[5]][1] >> m - 1);
IND[5][2] = (IND[5][2] << 1) | (N[k[5]][2] >> m - 1);
IND[5][3] = (IND[5][3] << 1) | (N[k[5]][3] >> m - 1);
lc.setColumn(0, 4, IND[5][0]);
lc.setColumn(0, 5, IND[5][1]);
lc.setColumn(0, 6, IND[5][2]);
lc.setColumn(0, 7, IND[5][3]);
}
}
}
Фишка этого кода :он на индикаторах позволяет плавно с верху в низ выводить на матрицу новую цифру. Я использую часовой модуль DS3231. Столкнулся с проблемой, в оригинальной программе данные из модуля считываются в строку:
String stringOne = rtc.getTimeStr(FORMAT_LONG); // Считываем из DS1302 в строку stringOne
после они раскладываются в масив k:
k[0] = stringOne.charAt(7) - 48;
k[1] = stringOne.charAt(6) - 48;
k[2] = stringOne.charAt(4) - 48;
k[3] = stringOne.charAt(3) - 48;
k[4] = stringOne.charAt(1) - 48;
k[5] = stringOne.charAt(0) - 48;
Часы нам передают восемь символов ‘10:20:30’ Часы, минуты, секунды, с разделителями. То есть из строки мы берём нулевой, первый, третий, четвёртый, шестой и седьмой символ. Отнимает от каждого символа сорок восемь и получаем из символа число цифры (от 0 до 9). Помещаем всё это в массив (k(6)) шести чисел, которые соответствуют шести цифрам.
В моей проге вытряхнуть эти даныые из моего модуля не получается (ругается компилятор). Я попробовал эти данные вытащить класичиским путем:
time.gettime(); //раскладываем переменные в масив
k[0] = time.seconds;
k[1] = time.minutes;
k[2] = time.Hours;
Но проблема в том чтобы использовать функцию вывода цифр на матрицы
void printType(byte N[10][4], byte nn[10][3], byte IND[6][4], byte k[6], byte s[6])
необходимо чтобы в каждой ячейки масива k лежал только один разряд, где в итоге получится 6 цифр(часы_минуты_секунды). Вот и вопрос, как из переменной(например) k[0] (в которую я поместил общее количиство секунд прочитаное из модуля часов) извлечь отдельно старший раз ряд секунд и отдельно младьший разряд секунд?