#include #include #include #include "i2c.h" #define LCD_ADDRESS 0x27 struct DisplayData { char topLine[64]; int value1; int value2; int value3; }; struct TextCounter { unsigned long startTime; int incrementValue; }; TextCounter textCounter; void setup() { i2c_init(); textCounter.startTime = millis(); // Запоминаем время запуска программы } void loop() { unsigned long currentTime = millis(); // Текущее время // Проверяем, прошло ли 500 мс с момента последнего увеличения incrementValue if (currentTime - textCounter.startTime >= 500) { textCounter.incrementValue++; // Увеличиваем incrementValue на 1 textCounter.startTime = currentTime; // Обновляем время } DisplayData displayData; strncpy(displayData.topLine, "we are responsible for those who have been tame ", sizeof(displayData.topLine) - 1); displayData.topLine[sizeof(displayData.topLine) - 1] = '\0'; displayData.value1 = 500; displayData.value2 = 800; displayData.value3 = 855; // Буферы для заполнения данных char buffer1[17]; char buffer2[17]; // Заполнение буфера 1 fillBuffer1(displayData.topLine, buffer1, sizeof(buffer1), textCounter.incrementValue); // Заполнение буфера 2 fillBuffer2(displayData.value1, displayData.value2, displayData.value3, buffer2, sizeof(buffer2)); // Создание массива для вывода на дисплей char displayArray[32]; strncpy(displayArray, buffer1, 16); // Копирование первых 16 символов из buffer1 в displayArray strncpy(displayArray + 16, buffer2, 16); // Копирование первых 16 символов из buffer2 в displayArray, начиная с позиции 16 // Вывод данных на экран i2c_start(); i2c_send_byte(LCD_ADDRESS << 1); i2c_send_byte(0x80); for (int i = 0; i < 16; i++) { i2c_send_byte(displayArray[i]); } i2c_send_byte(0xC0); for (int i = 16; i < 32; i++) { i2c_send_byte(displayArray[i]); } i2c_stop(); _delay_ms(500); // Задержка 500 мс } void fillBuffer1(const char *source, char *buffer, size_t bufferSize, int incrementValue) { int startIndex = incrementValue % strlen(source); // Определяем начальный индекс на основе incrementValue int endIndex = startIndex + 16; if (endIndex > strlen(source)) { // Если endIndex превышает длину строки source, переносим его на начало строки endIndex = endIndex - strlen(source); // Копируем символы с конца строки source strncpy(buffer, source + startIndex, strlen(source) - startIndex); // Копируем оставшиеся символы с начала строки source strncat(buffer, source, endIndex); } else { strncpy(buffer, source + startIndex, endIndex - startIndex); } buffer[endIndex - startIndex] = '\0'; // Установка нулевого символа в конце буфера } void fillBuffer2(int value1, int value2, int value3, char *buffer, size_t bufferSize) { snprintf(buffer, bufferSize, "%d.%d.%d", value1, value2, value3); }