Помогите с индикацией на oled дисплее.

jauvit
Offline
Зарегистрирован: 18.03.2019

Здравствуйте! 

Помогите п-ста с выводом информации на графический олед дисплей. Суть проблемы в том, что при появлении в соответствующем входе уровня "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);
}
}
 
b707
Offline
Зарегистрирован: 26.05.2017

Во-первых, вставьте код правильно в сообщение. Без этого дальнейшая дискуссия невозможна.

Далее - судя по вопросу. это не ваш код. вы в нем хоть одну строчку понимаете?

bwn
Offline
Зарегистрирован: 25.08.2014

А я в песочницу отправлю.

И это, отнеситесь очень внимательно к предыдущему посту.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

lcd.begin(16, 2) сделайте 1 раз в сетапе. И вообще - а нахрена Вам графический режим? Пишите в символах, не хватает - создайте свои. А то извращения какие-то на 2-х пинах.

jauvit
Offline
Зарегистрирован: 18.03.2019

Спасибо, что откликнулись.

 На двух пинах, это пример только. Делал индикацию для своего ЦАПа. У меня и так работает на двухстрочном символьном дисплее. Делал на Pic е, писал в Протоне. Буквы больно мелкие и не эстетично. Вот и захотелось на ярком олед сделать с большими буквами и графика то же. Графика и буквы нарисованы, с выводом проблемы, то есть они выводятся, только мерцают.

int F1 = 15;
int F2 = 16;  
#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 setup()
{
  pinMode(F1, INPUT);
 // digitalWrite(F1, LOW);
  pinMode(F2, INPUT); 
}
 
const byte Data1[2][6] = {{0x00, 0x20, 0x10, 0x08, 0xfc, 0x00},//двумерный массив цифры "1"
                          {0x00, 0x00, 0x00, 0x00, 0x3f, 0x00} 
};
const byte Data2[2][8] = {{0x08, 0x04, 0x04, 0x04, 0x04, 0x84, 0x44, 0x38},//"2"
                          {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() {

if (digitalRead(F1)==1) { //считываем информацию, 
  lcd.begin(16, 2);       //
  setGraphicMode();
  lcd.clear();     
    draw1(47);           //если "1" выводим цифру 1
 }  
if (digitalRead(F2)) {
  lcd.begin(16, 2);
 setGraphicMode();
 lcd.clear();
 draw2(46);
}
}

 

jauvit
Offline
Зарегистрирован: 18.03.2019

Забыл написать. Входы подтянуты к общему проводу.

b707
Offline
Зарегистрирован: 26.05.2017

Во-первых, у вас в коде типичная ошибка  - вы выодите символы на дисплей, независимо от того, изменились ли они или нет. То есть поясню - например у вас на дисплее цифра "1"и с сенсора вы прочитали 1 - то есть ничего не изменилось. Правильно в этом случае дисплей вообще не трогать - но вы его сначала стираете, а потом снова выводите единицу... Вот он и мигает...

И еще две команды в Вашем скетче вызывают вопросы:

 1. setGrpaicMode() - зачем его заново вызывать перед каждым выводом на дисплей? Разве не достаточно один раз задать в сетапе?

2. lcd.clear - нет необходимости чистить ВЕСЬ дисплей перед выводом каждого нового символа

 

Думаю, основная прична мигания - обновление дисплея при каждом проходе цикла. На втором месте - ненужная очистка

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

b707 пишет:

Во-первых, у вас в коде типичная ошибка  - вы выодите символы на дисплей, независимо от того, изменились ли они или нет. То есть поясню - например у вас на дисплее цифра "1"и с сенсора вы прочитали 1 - то есть ничего не изменилось. Правильно в этом случае дисплей вообще не трогать - но вы его сначала стираете, а потом снова выводите единицу... Вот он и мигает...

И еще две команды в Вашем скетче вызывают вопросы:

 1. setGrpaicMode() - зачем его заново вызывать перед каждым выводом на дисплей? Разве не достаточно один раз задать в сетапе?

2. lcd.clear - нет необходимости чистить ВЕСЬ дисплей перед выводом каждого нового символа

 

Думаю, основная прична мигания - обновление дисплея при каждом проходе цикла. На втором месте - ненужная очистка

+100500 и я тоже немного посоветовал