Символы для дисплея 1602

br0lviv
Offline
Зарегистрирован: 11.06.2018

Добрый день, помогите актуализировать символы для дисплея 1602. Хочу создать две шкалы, которые будут уменьшаться или заполняться в зависимости от потенциометра. С одной шкалой проблем нет, а вот как на экран вывести две шкалы от двух потенциометров? с моим кодом они не контактируют .. Помогите советами.

byte black[8] = 
{
  0B11111,
  0B11111,
  0B11111,
  0B11111,
  0B11111,
  0B11111,
  0B11111,
  0B11111
};

byte white[8] = 
{
  0B11111,
  0B10001,
  0B10001,
  0B10001,
  0B10001,
  0B10001,
  0B10001,
  0B11111
};
lcd.createChar(8,black);
lcd.createChar(9,white);

вызываю символы

lcd.write();
if (benzun_ico >= 90){
    lcd.clear();  
    lcd.setCursor(0, 1);
    lcd.write(8);
    lcd.setCursor(1, 1);
    lcd.write(8);
    lcd.setCursor(2, 1);
    lcd.write(8);
    lcd.setCursor(3, 1);
    lcd.write(8);
    lcd.setCursor(4, 1);
    lcd.write(8);
    lcd.setCursor(5, 1);
    lcd.write(8);
    lcd.setCursor(6, 1);
    lcd.write(8);
    }
    if (benzun_ico >= 75 && benzun_ico <= 89){
    lcd.clear();  
    lcd.setCursor(0, 1);
    lcd.write(8);
    lcd.setCursor(1, 1);
    lcd.write(8);
    lcd.setCursor(2, 1);
    lcd.write(8);
    lcd.setCursor(3, 1);
    lcd.write(8);
    lcd.setCursor(4, 1);
    lcd.write(8);
    lcd.setCursor(5, 1);
    lcd.write(8);
    lcd.setCursor(6, 1);
    lcd.write(9);
    }
    if (benzun_ico >= 60 && benzun_ico <= 74){
    lcd.clear();  
    lcd.setCursor(0, 1);
    lcd.write(8);
    lcd.setCursor(1, 1);
    lcd.write(8);
    lcd.setCursor(2, 1);
    lcd.write(8);
    lcd.setCursor(3, 1);
    lcd.write(8);
    lcd.setCursor(4, 1);
    lcd.write(8);
    lcd.setCursor(5, 1);
    lcd.write(9);
    lcd.setCursor(6, 1);
    lcd.write(9);
    }
    if (benzun_ico >= 45 && benzun_ico <= 59){
    lcd.clear();  
    lcd.setCursor(0, 1);
    lcd.write(8);
    lcd.setCursor(1, 1);
    lcd.write(8);
    lcd.setCursor(2, 1);
    lcd.write(8);
    lcd.setCursor(3, 1);
    lcd.write(8);
    lcd.setCursor(4, 1);
    lcd.write(9);
    lcd.setCursor(5, 1);
    lcd.write(9);
    lcd.setCursor(6, 1);
    lcd.write(9);
    }
    if (benzun_ico >= 30 && benzun_ico <= 44){
    lcd.clear();  
    lcd.setCursor(0, 1);
    lcd.write(8);
    lcd.setCursor(1, 1);
    lcd.write(8);
    lcd.setCursor(2, 1);
    lcd.write(8);
    lcd.setCursor(3, 1);
    lcd.write(9);
    lcd.setCursor(4, 1);
    lcd.write(9);
    lcd.setCursor(5, 1);
    lcd.write(9);
    lcd.setCursor(6, 1);
    lcd.write(9);
    }
    if ( benzun_ico >= 15 && benzun_ico <= 29 ){
    lcd.clear();  
    lcd.setCursor(0, 1);
    lcd.write(8);
    lcd.setCursor(1, 1);
    lcd.write(8);
    lcd.setCursor(2, 1);
    lcd.write(9);
    lcd.setCursor(3, 1);
    lcd.write(9);
    lcd.setCursor(4, 1);
    lcd.write(9);
    lcd.setCursor(5, 1);
    lcd.write(9);
    lcd.setCursor(6, 1);
    lcd.write(9);
    }
     if ( benzun_ico >= 0 && benzun_ico <= 14 ){
    lcd.clear();  
    lcd.setCursor(4, 0);
    lcd.print("LOW");
    lcd.setCursor(0, 1);
    lcd.write(8);
    lcd.setCursor(1, 1);
    lcd.write(9);
    lcd.setCursor(2, 1);
    lcd.write(9);
    lcd.setCursor(3, 1);
    lcd.write(9);
    lcd.setCursor(4, 1);
    lcd.write(9);
    lcd.setCursor(5, 1);
    lcd.write(9);
    lcd.setCursor(6, 1);
    lcd.write(9);
    }

То есть, если дублировать просто в вправо, он перезаписывает левую шкалу (

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

а попонятнее? 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

br0lviv пишет:

помогите актуализировать символы для дисплея 1602. 

Чего сделать?

br0lviv пишет:

Хочу создать две шкалы, которые будут уменьшаться или заполняться в зависимости от потенциометра.

А поподробее? Где они будут располагаться, в разных строках В разных концах одной строки? Какого они размера? Каковы правила их рисования?

br0lviv пишет:

С одной шкалой проблем нет

Судя по приведённому коду - есть и очень серьёзные. Кстати, именно эти проблемы и не дают сделать две шкалы.

br0lviv пишет:

как на экран вывести две шкалы от двух потенциометров? 

По очереди. Сначала одну, потому другую. Можно и параллельно, заполняя обе, напмриер слева направо. Как Вам удобнее, так и выводите.

br0lviv пишет:

с моим кодом они не контактируют .. 

Не знаю кто с кем контактирует, но в том огрызке без начала и без конца, который Вы называете кодом, не содержится никаких попыток сделать две шкалы. Вы просто не пробовали.

br0lviv пишет:

То есть, если дублировать просто в вправо, он перезаписывает левую шкалу (

Это я совсем не понял. Кто "он"? Куда перезаписывает? Вы вообще понимаете, кто главный на компьютере? Вы или "он"? Делайте как Вам надо и не позволяйте "ему" лезть не в своё дело.

br0lviv пишет:
Помогите советами.

Помогаю.

Сначала сделайте одну шкалу. Нормально, а не так, как у Вас. Рисование одной шкалы должно выглядеть как вызов функции с параметрами: "начало шкалы", "длина шкалы", "отображаемое значение".

А когда Вы это сделаете, просто вызовите эту функцию два раза с разными параметрами "начало" и "значение". Вот они у Вас две и нарисуются.

И ещё, по секрету, вместо вызова write для каждого симовла с последующей установкой курсора, можно воспользоваться методом print - он печатает сразу столько символов, сколько надо. Ну, или циклом, на худой конец.

 

andryn
Offline
Зарегистрирован: 08.06.2018

br0lviv пишет:

Хочу создать две шкалы, которые будут уменьшаться или заполняться в зависимости от потенциометра. 

Например так:

//******************************************************************

#define ADJ_PIN1 A0
#define ADJ_PIN2 A1

byte black[8] = 
{
  0B11111,
  0B11111,
  0B11111,
  0B11111,
  0B11111,
  0B11111,
  0B11111,
  0B11111
};

byte white[8] = 
{
  0B11111,
  0B10001,
  0B10001,
  0B10001,
  0B10001,
  0B10001,
  0B10001,
  0B11111
};

int benzun_ico1 = -100;
int benzun_ico2 = -100;

void setup()
{
    Serial.begin(115200);        // connect to the serial port
    Serial.println("Test begin");
    pinMode(ADJ_PIN1, INPUT);
    pinMode(ADJ_PIN2, INPUT);
    //LCD дисплей
    lcd.init();               // Инициализация lcd             
    lcd.backlight();          // Включаем подсветку
    lcd.createChar(8,black);
    lcd.createChar(9,white);
    lcd.clear();             // Выводим текст
}

void loop()
{
    int current_val1 = analogRead(ADJ_PIN1)/12; //эмуляция получения значения от 0 до 100
    int current_val2 = analogRead(ADJ_PIN2)/12; //эмуляция получения значения от 0 до 100

    if (abs(benzun_ico1 - current_val1) > 5 || abs(benzun_ico2 - current_val2) > 5){ // Если текущее значение отличается от предыдущего более, чем на 5, будем рефрешить экран
        benzun_ico1 = current_val1; //Сохраним текущее значение
        benzun_ico2 = current_val2; //Сохраним текущее значение
        Serial.println(benzun_ico1);
        Serial.println(benzun_ico2);
        lcd.clear(); //Очистим экран
        drawval(0, benzun_ico1);
        drawval(1, benzun_ico2);
    }
}

void drawval(byte ln, int val) //Нарисовать шкалу, ln - номер строки, val - значение
{
    for (int i=0; i<7; i++) { 
        lcd.setCursor(i, ln);
        if (val > i*100/8) {
            lcd.write(8);
        }
        else {
            lcd.write(9);
        }
    }
}

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Давно где-то видел и сам включал дэмку с двумя аналоговыми шкалами.
Там загружалось 5 символов так как шрифт дисплея 5x8.
Одна вертикаль, две, три , четыре и чёрный квадрат.
Поэтому максимум штрихов в линейках было 16х5 = 80 .
Красиво работало....

br0lviv
Offline
Зарегистрирован: 11.06.2018

andryn пишет:

br0lviv пишет:

Хочу создать две шкалы, которые будут уменьшаться или заполняться в зависимости от потенциометра. 

Например так:

//******************************************************************

#define ADJ_PIN1 A0
#define ADJ_PIN2 A1

byte black[8] = 
{
  0B11111,
  0B11111,
  0B11111,
  0B11111,
  0B11111,
  0B11111,
  0B11111,
  0B11111
};

byte white[8] = 
{
  0B11111,
  0B10001,
  0B10001,
  0B10001,
  0B10001,
  0B10001,
  0B10001,
  0B11111
};

int benzun_ico1 = -100;
int benzun_ico2 = -100;

void setup()
{
    Serial.begin(115200);        // connect to the serial port
    Serial.println("Test begin");
    pinMode(ADJ_PIN1, INPUT);
    pinMode(ADJ_PIN2, INPUT);
    //LCD дисплей
    lcd.init();               // Инициализация lcd             
    lcd.backlight();          // Включаем подсветку
    lcd.createChar(8,black);
    lcd.createChar(9,white);
    lcd.clear();             // Выводим текст
}

void loop()
{
    int current_val1 = analogRead(ADJ_PIN1)/12; //эмуляция получения значения от 0 до 100
    int current_val2 = analogRead(ADJ_PIN2)/12; //эмуляция получения значения от 0 до 100

    if (abs(benzun_ico1 - current_val1) > 5 || abs(benzun_ico2 - current_val2) > 5){ // Если текущее значение отличается от предыдущего более, чем на 5, будем рефрешить экран
        benzun_ico1 = current_val1; //Сохраним текущее значение
        benzun_ico2 = current_val2; //Сохраним текущее значение
        Serial.println(benzun_ico1);
        Serial.println(benzun_ico2);
        lcd.clear(); //Очистим экран
        drawval(0, benzun_ico1);
        drawval(1, benzun_ico2);
    }
}

void drawval(byte ln, int val) //Нарисовать шкалу, ln - номер строки, val - значение
{
    for (int i=0; i<7; i++) { 
        lcd.setCursor(i, ln);
        if (val > i*100/8) {
            lcd.write(8);
        }
        else {
            lcd.write(9);
        }
    }
}

 

Спасибо) Подробно все разобрал и почерпнул для себя на будущее полезную вещь. Еще раз спасибо за помощь.

if (abs(benzun_ico1 - current_val1) > 5 || abs(benzun_ico2 - current_val2) > 5){ // Если текущее значение отличается от предыдущего более, чем на 5, будем рефрешить экран