Помогите с индикацией на oled дисплее.
- Войдите на сайт для отправки комментариев
Пт, 05/04/2019 - 14:10
Здравствуйте!
Помогите п-ста с выводом информации на графический олед дисплей. Суть проблемы в том, что при появлении в соответствующем входе уровня "1" отображается какая то иформация. Но она не горит постоянно, а мигает. Уровни на входах постоянные. Если подать сигнал на короткое время, то всё нормально. Как это иправить?
#define pwrPin 2
const int F1 = 15;
const int F2 = 16;
int F1State = 0;
int F2State = 0;
#define LCD_SETGRAPHICMODE 0x1f
#include <LiquidCrystal.h>
LiquidCrystal lcd(9, 4, 8, 7, 6, 5); // RS, E, DB4, DB5, DB6, DB7
void setGraphicMode(){
lcd.command(LCD_SETGRAPHICMODE);
}
void setGraphicCursor( uint8_t x, uint8_t y ){
if( 0 <= x && x <= 99 ){
lcd.command(LCD_SETDDRAMADDR | x);
}
if( 0 <= y && y <= 1 ){
lcd.command(LCD_SETCGRAMADDR | y);
}
}
void resetOLED(unsigned int delaytime ){
pinMode(pwrPin, OUTPUT);
digitalWrite(pwrPin, LOW);
delay(delaytime);
digitalWrite(pwrPin, HIGH);
delay(delaytime);
}
void setup()
{
pinMode(F1, INPUT);
pinMode(F2, INPUT);
}
const byte Data1[2][6] = {{0x00, 0x20, 0x10, 0x08, 0xfc, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x3f, 0x00}
};
const byte Data2[2][8] = {{0x08, 0x04, 0x04, 0x04, 0x04, 0x84, 0x44, 0x38},
{0x30, 0x28, 0x24, 0x22, 0x21, 0x20, 0x20, 0x20}
};
void draw1 (byte x/*горизонтальная позиция*/)
{
for (byte i = x; i<x+6; i++){
setGraphicCursor(i, 0);
lcd.write(Data1[0][i-x]);
setGraphicCursor(i, 1);
lcd.write(Data1[1][i-x]);}
}
void draw2 (byte x/*горизонтальная позиция*/)
{
for (byte i = x; i < x + 8; i++) {
setGraphicCursor(i, 0);
lcd.write(Data2[0][i - x]);
setGraphicCursor(i, 1);
lcd.write(Data2[1][i - x]);}
}
void loop() {
F1State = digitalRead(F1);
F2State = digitalRead(F2);
if (F1State==1) {
resetOLED(1000);
lcd.begin(16, 2);
setGraphicMode();
lcd.clear();
draw1(47);
}
if (F2State==1) {
resetOLED(1000);
lcd.begin(16, 2);
setGraphicMode();
lcd.clear();
draw2(46);
}
}
Во-первых, вставьте код правильно в сообщение. Без этого дальнейшая дискуссия невозможна.
Далее - судя по вопросу. это не ваш код. вы в нем хоть одну строчку понимаете?
А я в песочницу отправлю.
И это, отнеситесь очень внимательно к предыдущему посту.
lcd.begin(16, 2) сделайте 1 раз в сетапе. И вообще - а нахрена Вам графический режим? Пишите в символах, не хватает - создайте свои. А то извращения какие-то на 2-х пинах.
Спасибо, что откликнулись.
На двух пинах, это пример только. Делал индикацию для своего ЦАПа. У меня и так работает на двухстрочном символьном дисплее. Делал на Pic е, писал в Протоне. Буквы больно мелкие и не эстетично. Вот и захотелось на ярком олед сделать с большими буквами и графика то же. Графика и буквы нарисованы, с выводом проблемы, то есть они выводятся, только мерцают.
Забыл написать. Входы подтянуты к общему проводу.
Во-первых, у вас в коде типичная ошибка - вы выодите символы на дисплей, независимо от того, изменились ли они или нет. То есть поясню - например у вас на дисплее цифра "1"и с сенсора вы прочитали 1 - то есть ничего не изменилось. Правильно в этом случае дисплей вообще не трогать - но вы его сначала стираете, а потом снова выводите единицу... Вот он и мигает...
И еще две команды в Вашем скетче вызывают вопросы:
1. setGrpaicMode() - зачем его заново вызывать перед каждым выводом на дисплей? Разве не достаточно один раз задать в сетапе?
2. lcd.clear - нет необходимости чистить ВЕСЬ дисплей перед выводом каждого нового символа
Думаю, основная прична мигания - обновление дисплея при каждом проходе цикла. На втором месте - ненужная очистка
Во-первых, у вас в коде типичная ошибка - вы выодите символы на дисплей, независимо от того, изменились ли они или нет. То есть поясню - например у вас на дисплее цифра "1"и с сенсора вы прочитали 1 - то есть ничего не изменилось. Правильно в этом случае дисплей вообще не трогать - но вы его сначала стираете, а потом снова выводите единицу... Вот он и мигает...
И еще две команды в Вашем скетче вызывают вопросы:
1. setGrpaicMode() - зачем его заново вызывать перед каждым выводом на дисплей? Разве не достаточно один раз задать в сетапе?
2. lcd.clear - нет необходимости чистить ВЕСЬ дисплей перед выводом каждого нового символа
Думаю, основная прична мигания - обновление дисплея при каждом проходе цикла. На втором месте - ненужная очистка
+100500 и я тоже немного посоветовал