Відповісти

Введіть повідомлення і натисніть Надіслати
Параметри

Назад

Огляд теми (нові повідомленні вгорі)

tesla
2016-11-10 12:10:29

Здесь работающий код для вывода данных на LCD http://ngin.pro/arduino/205-ispolzovanie-i2c_lcd-dlya-otladki-proekta-na-arduino.html

Rauf_AF
2016-11-02 09:02:23

Хочу поделится рабочей версией. Спасибо доброму человеку выручил. Я его совместил со своим кодом и всё прекрасно работает.

/*
#1 светодиоды led1-led8
#2 I2C LCD1602          GND -> GND
                      +5V -> +5V
                      SDA -> A4(SDA)
                      SCL -> A5(SCL)
  подсветка ->13 (backlight_pin)
#3 кнопка ->2 (BUTTON_PIN)
#4 пищалка ->9 (BUTTON_PIN)
#5 RХ->0
   TХ->1
*/
//#1 флаги
const int MSG_End = 8 ; // количество исслед каналов
uint8_t msgFlag[MSG_End] =      {0, 0, 0, 0, 0, 0, 0, 0}; // флаги текущих состояний UPS (1 - это авария)
void ledControl() { // моргание нужными LED
}
//#2  дисплей
const char * message[MSG_End] = {  // сообщения об авариях
  "1:UPS1 Inver OFF",
  "2:UPS1 On Batter",
  "3:UPS1 Gen Alarm",
  "4:UPS1 Inver OFF",
  "5:UPS2 Inver OFF",
  "6:UPS2 ON Batter",
  "7:UPS2 Gen Alarm",
  "8:UPS2 Inver OFF",
};
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
const int backlight_pin = 13;
LiquidCrystal_I2C lcd(0x27, 16, 2); // Устанавливаем дисплей

void displayData() {// отображение информации
  static uint8_t number_step = 0; // номер шага вывода
  lcd.setCursor(0, 0);
  // вывод верхней строки
  for (int i = 0; i < MSG_End; i++) {
    if (!msgFlag[i]) {
      lcd.print(i + 1);
      lcd.print(" ");
    }
    else {
      if (number_step & 1) lcd.print("X");
      else lcd.print(i + 1);
      lcd.print(" ");
    }
  }
  // вывод нижней строки
  lcd.setCursor(0, 1);
  if (msgFlag[number_step] )lcd.print(message[number_step]);
  number_step++;
  if (number_step >= MSG_End) number_step = 0;
}
//#3 кнопка
const int BUTTON_PIN = 2;
void readButtons(byte pin) {// сканируем кнопку
}
//#4 пищалка
const int BUZZER_PIN = 9;
void buzzer(byte pin) { // звуковые уведомления
}
//#5 сериал
const int RX_PIN = 0;
const int TX_PIN = 1;
void readSerial(byte rxPin) {// слушаем Serial
}
void dataManager() {  // обработка данных
    msgFlag[0] = true;  // авария на 2-м UPS
    msgFlag[5] = true;  // авария на 7-м UPS
    //msgFlag[7] = true;  // авария на 8-м UPS
}
void sendData(byte txPin) {// отправка данных
}
// mail
void setup() {
  //#1   флаги
  //#2   дисплей
  lcd.init()             ; // инициализация LCD
  pinMode ( backlight_pin, OUTPUT );
  digitalWrite ( backlight_pin, 1 );
  lcd.backlight(); // Включаем подсветку дисплея
  //#3 кнопка
  //#4 пищалка
  //#5 сериал
}
void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ;
  //#1 флаги
  ledControl();                 // моргание нужными LED
  //#2 1000 милисек дисплей
  static uint32_t future2 = 0 ;
  if (MILLIS >= future2) {
    future2 = MILLIS + 1000 ;
    displayData();       // отображение информации
  }
  //#3 кнопка
  readButtons(BUTTON_PIN);      // сканируем кнопку
  //#4 пищалка
  buzzer(BUZZER_PIN);           // звуковые уведомления
  //#5 сериал
  static uint32_t future5 = 10000 ;
  if (MILLIS >= future5) {
    future5 = MILLIS + 1000 ;
    readSerial(RX_PIN);           // слушаем Serial
    dataManager();                // обработка данных
    sendData(TX_PIN);             // отправка данных
  }
}
 
NoName
2016-10-29 14:06:48

Green, это досадная случайность )
Rauf_AF, тогда нужно искать

для примера вторую строку никогда не менять
данные выводить в serial для контроля

а что   проверяли? какой вариант, это явно не мой код )
для теста проверьте не уходит ли в ресет  arduino
например так
lcd.setCursor(0, 0);
    lcd.print("restart")
delay (5000);   // is it pause в 5 sec?

Green
2016-10-29 12:12:36

NoName, а пачиму здесь без пробела "if (*timer > 0 )", а сдесь с: "if ( *timer > 0 )? Вы уж определитесь, а то как то не аккуратненько...

Rauf_AF
2016-10-29 11:38:36
NoName пише:

меня никто не заставлял этот код сделать,
все равно когда то пришлось бы делать заготовку,
если поможет в Ваших задачах, уже хорошо )

Здравствуйте
Я проверил не получилось.
Вот Видео там цикличность даже останавливается
https://youtu.be/qk4XUJQPYVI

NoName
2016-10-28 23:15:14

меня никто не заставлял этот код сделать,
все равно когда то пришлось бы делать заготовку,
если поможет в Ваших задачах, уже хорошо )

Rauf_AF
2016-10-28 22:59:15

У меня всё собранное на работе. Утром поеду проверять. А пока попытаюсь в Протеусе проверить.
Вам ещё раз гигантское спасибо. Я обязательно отпишусь о результате.
Извините что побеспокоил Вас.

NoName
2016-10-28 22:57:07

ладно я JS учить ), лодку вместо  меня  никто не сделает )
успеха )

NoName
2016-10-28 22:53:47

такая штука,
как на картинке
1 может быть  stack overflow
2 большая скорость обмена  LCD,
3 неправильная команда LCD,
что у Вас незнаю )  я зная точно,  msgFlag[8] = 0 должно быть всегда

"
for ( ; c < 8; c++ )
if ( !msgFlag[c] ) break;
А что даёт пробел перед ; в первой строке?"
можно без пробела
for (; c < 8; c++ )

без инициализации c

Rauf_AF
2016-10-28 22:51:15

for ( ; c < 8; c++ )
if ( !msgFlag[c] ) break;

А что даёт пробел перед ; в первой строке?

Rauf_AF
2016-10-28 22:48:57

Мне нужно только исправить правильный вывод сообщений на дисплей.

NoName
2016-10-28 22:47:16

да,
или так сделайте

  switch ( с )
      {
      case 0: lcdBuffer[1] = " ERR0           "; break    ;
      case 1: lcdBuffer[1] = " ERR1           "; break    ;
      case 2: lcdBuffer[1] = " ERR2           "; break    ;
      case 3: lcdBuffer[1] = " ERR3           "; break    ;
      case 4: lcdBuffer[1] = " ERR4           "; break    ;
    case 5: lcdBuffer[1] = " ERR5           "; break  ;
    case 6: lcdBuffer[1] = " ERR6           "; break  ;
    case 7: lcdBuffer[1] = " ERR7           "; break  ;
      default: lcdBuffer[1] = " unknown       "; break    ;
      }

Rauf_AF
2016-10-28 22:44:33

Правильно ли я понял?

%D0%A1%D0%BA%D1%80%D0%B8%D0%BD%D1%88%D0%BE%D1%82%202016-10-28%2023.41.21.png

NoName
2016-10-28 22:36:06

// сюда попадаем, если есть хоть одна ошибка
    static byte c = 0;

    ///  тут   нелогично  while (!msgFlag[c]) c++;                 // пропускаем сообщения, к которым ошибка не относится
    lcdBuffer[1] = message[c];               // буферизуем сообщение
    c++;                                     // чередуем все сообщения об ошибках
    if (c > MSG_COUNT - 1) c = 0;



    static byte c = 0;

    ///  тут   нелогично  while (!msgFlag[c]) c++;                 // пропускаем сообщения, к которым ошибка не относится
    lcdBuffer[1] = message[c];               // буферизуем сообщение
    c++;                                     // чередуем все сообщения об ошибках
    if (c > MSG_COUNT - 1) c = 0;

замените на
for ( ; c < 8; c++ )
if ( !msgFlag[c] ) break;

Rauf_AF
2016-10-28 22:29:46

Чтобы тем кто хочет помочь другая часть кода не мешала я выложил только проблемную часть.

Підвал форуму