Последовательный вывод данных на LCD

Wiring, Processing, библиотеки

Последовательный вывод данных на LCD

Сообщение RaufAf » 28 окт 2016, 12:23

Здравствуйте.
Прошу Вас оказать помощь в нахождении ошибки в коде. Ниже приведён код цель которого выдавать соответствующие события на дисплей. Но при комбинации 1 го и 6 сообщения на экран циклично выходит абракадабра. Также прилагаю ссылку на видео демонстрирующую данную проблему. За ранее благодарю.

https://youtu.be/lFPrrpiXIzY

Код: Выделить всё
#include <LiquidCrystal_I2C.h>

#include <Wire.h>

LiquidCrystal_I2C lcd(0x27,16,2);  // устанавливаем адрес 0x27, и дисплей 16 символов в 2 строки (16х2)

#define BUTTON_PIN                 2
#define RX_PIN                     0
#define TX_PIN                     1
#define BUZZER_PIN                 9
#define BACKLIGHT_PIN              13
#define LCD_HEIGHT                 2
#define LCD_WIDTH                  16
#define MSG_COUNT                  8

boolean needUpdateLCD =            true;                    // флаг-признак необходимости одновить данные на дисплее
String lcdBuffer[LCD_HEIGHT];
const unsigned int updateTime =    2000;                    // интервал смены надписей в нижней строке
const unsigned int flashTime =     250;                     // интервал мигания цифр (при аварии)
boolean msgFlag[MSG_COUNT] =      {0, 0, 0, 0, 0, 0, 0, 0 }; // флаги текущих состояний UPS (1 - это авария)
const String message[MSG_COUNT] = {                         // сообщения об авариях
  "UPS 1 Inverter Off ",
  "UPS 1 On Battery   ",
  "UPS 1 General Alarm",
  "UPS 1 Inverter Off ",
  "UPS 2 Inverter Off ",
  "UPS 2 On Battery   ",
  "UPS 2 General Alarm",
  "UPS 2 Inverter Off ",
};

#define TIMEOUT(tm, lastTm) (millis() - lastTm > tm)         // принять как аксиому :)

/*-----( Import needed libraries )-----*/




// Set the pins on the I2C chip used for LCD connections:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
//LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

//LiquidCrystal_I2C lcd(0x27, BACKLIGHT_PIN, POSITIVE);  // Set the LCD I2C address

// Прототипы функций (чтобы компилятор не ругался)
void displayData();
void dataManager();
void buzzer(byte pin);
void readButtons(byte pin);
void readSerial(byte rxPin);
void sendData(byte txPin);


void loop()
{
  readButtons(BUTTON_PIN);      // сканируем кнопку
  readSerial(RX_PIN);           // слушаем Serial
  dataManager();                // обработка данных
  sendData(TX_PIN);             // отправка данных
  displayData();                // отображение информации
  buzzer(BUZZER_PIN);           // звуковые уведомления
  ledControl();                 // моргание нужными LED
}


void dataManager()
{
  // тут обработка каких-то данных
  // ...

  // эмуляция неисправности трех UPS через 1 мин после включения питания
  if (millis() > 5000)
  {
    msgFlag[0] = true;  // авария на 2-м UPS
    msgFlag[5] = true;  // авария на 7-м UPS
    //msgFlag[7] = true;  // авария на 8-м UPS
  }

}



void displayData()
{
  // формирование первой строки для вывода на дисплей
  static unsigned long lastFlashTime;
  lcdBuffer[0] = "1 2 3 4 5 6 7 8";          // шаблон для первой строки
  if (TIMEOUT(flashTime, lastFlashTime))     // каждые 0,25 сек формируем первую строку
  {
    static boolean flashFlag = true;
    if (flashFlag)
    {                                        // проверяем флаги на наличие ошибок
      for (byte ups = 1; ups <= MSG_COUNT; ups++)
        if (msgFlag[ups - 1]) lcdBuffer[0].replace(String(ups), "x"); // где ошибка - ставим хер
    }
    flashFlag = !flashFlag;
    lastFlashTime = millis();
    needUpdateLCD = true;
  }

  // формирование второй строки для вывода на дисплей
  static unsigned long lastUpdateTime;
  if (TIMEOUT(updateTime, lastUpdateTime))   // каждые 2 сек формируем вторую строку
  {
    lcdBuffer[1] = "                ";   // 20 пробелов (у меня 20 знаков на дисплее)
    lastUpdateTime = millis();
    //needUpdateLCD = true;                  // не нужно, т.к. первая строка все равно чаще обновляет ЖК
    byte ups = 0;
    while (!msgFlag[ups])                    // проверяем флаги на наличие ошибок
    {
      ups++;
      if (ups >= MSG_COUNT)                  // если нет ни одной ошибки, то выходим
      {
        ups = 0;
        return;
      }
    }
    // сюда попадаем, если есть хоть одна ошибка
    static byte c = 0;
    while (!msgFlag[c]) c++;                 // пропускаем сообщения, к которым ошибка не относится
    lcdBuffer[1] = message[c];               // буферизуем сообщение
    c++;                                     // чередуем все сообщения об ошибках
    if (c >= MSG_COUNT - 1) c = 0;

  }

  // обновление данных на дисплее
  if (needUpdateLCD)
  {
    lcd.setCursor(0, 0);
    lcd.print(lcdBuffer[0]);

    lcd.setCursor(0, 1);
    lcd.print(lcdBuffer[1]);

    needUpdateLCD = false;
  } // if
} // displayData



void ledControl()
{
}



void buzzer(byte pin)
{
}



void readButtons(byte pin)
{
}



void readSerial(byte rxPin)
{
}



void sendData(byte txPin)
{
}


void setup()
{
  lcd.init();                     // инициализация LCD
  lcd.backlight();                // включаем подсветку
  pinMode ( BACKLIGHT_PIN, OUTPUT );
  digitalWrite ( BACKLIGHT_PIN, HIGH );
  lcd.begin(LCD_WIDTH, LCD_HEIGHT);
  lcd.backlight(); // finish with backlight on
  lcd.clear();
}
RaufAf
 
Сообщения: 1
Зарегистрирован: 28 окт 2016, 12:11

Re: Последовательный вывод данных на LCD

Сообщение admin » 03 ноя 2016, 11:05

1. Обязательно добавьте вывод отладочных сообщений в консоль - должно помочь выявить возможную ошибку в коде.

2. Не помешает добавить
Код: Выделить всё
lcd.clear();

после
Код: Выделить всё
if (needUpdateLCD) {

3. Переработайте алгоритм.
4. Попробуйте уменьшить длину проводов, идущих к LCD.
Аватара пользователя
admin
Администратор
 
Сообщения: 303
Зарегистрирован: 05 май 2011, 14:57
Откуда: Калининград


Вернуться в Программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

cron
© 2009-2017 |  О проекте  |  Политика Конфиденциальности  |