Ви не увійшли.
Здесь работающий код для вывода данных на LCD http://ngin.pro/arduino/205-ispolzovanie-i2c_lcd-dlya-otladki-proekta-na-arduino.html
Хочу поделится рабочей версией. Спасибо доброму человеку выручил. Я его совместил со своим кодом и всё прекрасно работает.
/*
#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); // отправка данных
}
}
Green, это досадная случайность )
Rauf_AF, тогда нужно искать
для примера вторую строку никогда не менять
данные выводить в serial для контроля
а что проверяли? какой вариант, это явно не мой код )
для теста проверьте не уходит ли в ресет arduino
например так
lcd.setCursor(0, 0);
lcd.print("restart")
delay (5000); // is it pause в 5 sec?
NoName, а пачиму здесь без пробела "if (*timer > 0 )", а сдесь с: "if ( *timer > 0 )? Вы уж определитесь, а то как то не аккуратненько...
меня никто не заставлял этот код сделать,
все равно когда то пришлось бы делать заготовку,
если поможет в Ваших задачах, уже хорошо )
Здравствуйте
Я проверил не получилось.
Вот Видео там цикличность даже останавливается
https://youtu.be/qk4XUJQPYVI
меня никто не заставлял этот код сделать,
все равно когда то пришлось бы делать заготовку,
если поможет в Ваших задачах, уже хорошо )
У меня всё собранное на работе. Утром поеду проверять. А пока попытаюсь в Протеусе проверить.
Вам ещё раз гигантское спасибо. Я обязательно отпишусь о результате.
Извините что побеспокоил Вас.
ладно я JS учить ), лодку вместо меня никто не сделает )
успеха )
такая штука,
как на картинке
1 может быть stack overflow
2 большая скорость обмена LCD,
3 неправильная команда LCD,
что у Вас незнаю ) я зная точно, msgFlag[8] = 0 должно быть всегда
"
for ( ; c < 8; c++ )
if ( !msgFlag[c] ) break;
А что даёт пробел перед ; в первой строке?"
можно без пробела
for (; c < 8; c++ )
без инициализации c
for ( ; c < 8; c++ )
if ( !msgFlag[c] ) break;
А что даёт пробел перед ; в первой строке?
Мне нужно только исправить правильный вывод сообщений на дисплей.
да,
или так сделайте
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 ;
}
Правильно ли я понял?
// сюда попадаем, если есть хоть одна ошибка
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;
Чтобы тем кто хочет помочь другая часть кода не мешала я выложил только проблемную часть.