К сожалению, разводка индикаторов оказалась нескольько другой чем известные на алике аналоги, например, Tm74hc595. Но Martian так же прислал схему с примером для АВР где были указаны шестнадцатиричные коды цифр. Мне не удалось переделать библиотеку https://alexgyver.ru/tm74hc595_display/ ... 4622313349 от Алекса Гайвера, чего-то не хватило, наверно ума.
Поэтому решил гугллением , интернет -примерами, и чатом GPT написать код , который заряжает эти дисплейи. Тот же чатГПТ, конечно, обладается огромной эрудицией, но в плане интеллекта, не сильно убежал вперед. Целый вечер я уговарил его написать функцию для вывода на этот модуль чисел с плаввающей точкой, но так и не добился от него толку. В итого написал сам условно рабочий достаточно костыльный код, в надежде что он поправит его и оптимизирует, но Чат наоборот изувечил его логику и сделал непригодным. Это достаточно странно, я то думал, что неверно ставлю задачу, но всего лишь повторить логику имеющегося кода, оптимизировав где надо - та что может быть проще.
Короче, получился вот такой код. Поэтому приглашаю энтизуастов обратить внимание на функцию displayFloatOnIndicators(float number) и может быть что-то подсказать. Допустим 25.10 выводится как 25.10, ахотелось бы как _25.1
Код: Выделить всё
const int DATA_PIN = 5; // Пин для данных (подключен к PADDR0)
const int CLK_PIN = 7; // Пин для сигнала тактового импульса (подключен к PADDR1)
const int LATCH_PIN = 6; // Пин для сигнала защелкивания (подключен к PADDR3)
unsigned char const led_table[] = { // цифры без точки
0b00000110,
0b10011111,
0b10100010,
0b10010010,
0b00011011,
0b01010010,
0b01000010,
0b10011110,
0b00000010,
0b00010010
};
unsigned char const led_table_dot[] = { // цифры с точкой (точка 1бит справа, он у всех 0)
0b00000100,
0b10011101,
0b10100000,
0b10010000,
0b00011001,
0b01010000,
0b01000000,
0b10011100,
0b00000000,
0b00010000
};
//unsigned char dot = 0x00;
// Массив состояние анодов (питания индикаторов)
unsigned char const dig_n[] = {0xfe,0xfb, 0xfd,0xf7 };
unsigned char x;
void d(unsigned char c) {
for (x = 0; x < 8; x++) {
digitalWrite(DATA_PIN, LOW);
if (c & 0x01) digitalWrite(DATA_PIN, HIGH);
c >>= 1;
digitalWrite(CLK_PIN, HIGH);
digitalWrite(CLK_PIN, LOW);
}
}
void dig(unsigned char d1, unsigned char d2) {
digitalWrite(LATCH_PIN, LOW);
d(d1);
d(d2);
digitalWrite(LATCH_PIN, HIGH);
}
void setup() {
pinMode(DATA_PIN, OUTPUT);
pinMode(CLK_PIN, OUTPUT);
pinMode(LATCH_PIN, OUTPUT);
Serial.begin(9600);
}
void loop() {
static float currentNumber = 1.0; // Текущее значение для отображения
static unsigned long lastDisplayTime = 0; // Переменная для отслеживания времени
if (millis() - lastDisplayTime > 100) { // Обновляем значение каждые 500 мс
currentNumber+= 0.01; // Увеличиваем текущее значение
if (currentNumber > 9999) currentNumber = 0; // Сбрасываем, если достигнуто максимальное значение
lastDisplayTime = millis(); // Обновляем время последнего обновления
}
//displayFourDigitNumber(currentNumber); // Отображаем текущее число
displayFloatOnIndicators(currentNumber);
//displayFloatOnIndicatorsII(25.3);
}
void displayFourDigitNumber(int number) {
// Функция вывода целочисленных чисел
// Переводим число в строку
char buffer[5];
sprintf(buffer, "%04d", number); // Форматируем число
int startIndex = 0; // Сдвигаем в право, не выводим незначащие нули слева, например 25 выведется как __25, а не 25__
while (buffer[startIndex] == '0') {
startIndex++;}
// Отображаем каждую цифру на соответствующем индикаторе
for (int i = startIndex; i < 4; ++i) {
char digit = buffer[i];
dig(dig_n[i], led_table[digit - '0']); // Отображаем цифру
}
}
void displayFloatOnIndicators(float number) {
// Суть алгоритма. Вывести цифры, но без точки (берем из массива цифр) led_table[]
// Определить позицию точки
// Из массива цифр с точками led_table_dot[] вывести ПОВТОРНО цифру, но уже с точкой
char bufferNoDot[10]; // Сюда положу цифры без точки
char buffer[10]; // Здесь будут цифры с точкой
dtostrf(number, 4, 3, buffer); // Преобразуем число типа float в строку с 3 знаками после запятой
//dtostrf(number*1000, 4, 0, bufferNoDot); // Число без точки
// Определяем позицию точки в строке
int dotPosition = strchr(buffer, '.') - buffer;
//
dtostrf(number*pow(10,(4-dotPosition)), 4, 0, bufferNoDot); // тут я умножаю на степень 10 найденну по позиции точки что бы получить целое число (МФТИ, ФПМИ- простите ребята)
int dotDigit=buffer[dotPosition-1]; // значение цифра за которой идет точка (в конце будет ее выводить)
int startIndex = 0; // Здесь искал незначащие нули впереди( для вывода чисел int)
while (bufferNoDot[startIndex] == '0') {
startIndex++;}
// Отображаем каждую цифру на соответствующем индикаторе из массива без точек bufferNoDot
for (int i = startIndex; i < 4; ++i) {
char digit = bufferNoDot[i];
dig(dig_n[i], led_table[digit - '0']); // Отображаем цифру
}
// Когда все цифры выведены Отображаем цифру с точкой ПОВТОРНО
dig(dig_n[dotPosition-1], led_table_dot[dotDigit - '0']);
}


