Lcd 2004a (как убрать артефакты?)

Тема в разделе "Arduino & Shields", создана пользователем Artyom, 5 дек 2022.

  1. Artyom

    Artyom Нуб

    Здравствуйте, помогите разобраться с выводом значений с датчиков на lcd2004a проблема заключается в артефактах после значения (видно на фото).
    Значения выводятся с модуля времени DS3231 (аналогичная ситуация происходит с другими датчиками.)[​IMG]
    Пробовал использовать разные библиотеки LiquidCrystal_I2C, также откатывал на более ранние версии IDE (сейчас использую 1.8.19).
    С Arduino (использую китайский клон nano на ATmega168) знаком не давно.
    Используемый мною код:
    Код (C++):
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    const byte DS3231 = 0x68; // I2C адрес таймера DS3231
    LiquidCrystal_I2C lcd(0x27, 20, 4);  // адрес, столбцов, строк
    void setup() {
         Wire.begin();

         lcd.init();           // инициализация
         lcd.backlight();      // включить подсветку
    }

    void loop() {
      Wire.beginTransmission(DS3231); // начинаем обмен с DS3231
      Wire.write(byte(0x00)); // записываем адрес регистра, с которого начинаем чтение!!!
      Wire.endTransmission(); // завершаем передачу

      byte t[7]; // массив для хранения даты и времени
      int i = 0; // индекс текущего элемента массива
      Wire.beginTransmission(DS3231); // начинаем обмен с DS3231
      Wire.requestFrom(DS3231, 7); // запрашиваем 7 байтов у DS3231
      while(Wire.available()) { // пока есть данные от DS3231
        t[i] = Wire.read(); // читаем 1 байт и сохраняем в массив t
        i++; // инкрементируем индекс элемента массива
      }
      Wire.endTransmission(); // завершаем обмен

      printDateTime(t); // выводим дату и время
      delay(1000); // пауза 1 секунда
    }

    // разбирает считанный массив и выводит дату и время
    void printDateTime(byte *arr) {

      lcd.setCursor(0, 0);
      if (arr[4]<10) lcd.print("0"); // дополнение нулями слева для выравнивания
      lcd.print(arr[4], HEX); // выводим дату
      lcd.print(".");

      if (arr[5]<10) lcd.print("0");
      lcd.print(arr[5], HEX); // выводим месяц

      lcd.print(".20"); // 2000-ые годы подразумеваются
      lcd.print(arr[6], HEX); // выводим год

      lcd.setCursor(0, 1);
      if (arr[2]<10) lcd.print("0");
      lcd.println(arr[2], HEX); // выводим час
      lcd.print(":");

      if (arr[1]<10) lcd.print("0");
      lcd.print(arr[1], HEX); // выводим минуты
      lcd.print(":");

      if (arr[0]<10) lcd.print("0");
      lcd.println(arr[0], HEX); // выводим секунды


    }
     
  2. KindMan

    KindMan Гуру

    А lcd.println, которые у вас выводят часы и секунды - это что?
     
  3. Airbus

    Airbus Радиохулиган Модератор

    Тоже меня смутило. Зачем println на LCD? A если вместо println-print?
     
  4. Artyom

    Artyom Нуб

    Не заметил(. Осталось от экспериментов, когда знакомился с библиотекой.
    Большое спасибо помогло).