Неудобство с библиоткеой LCD по I2C

Дятел
Offline
Зарегистрирован: 27.05.2017

Перешел с 4+++  проводного LCD1620 на LCD1620 с  I2C. Неудобно то, что не могу найти в библиотеке функцию lcd.print и приходится выводить печатные символы и строки в виде их кодов на lcd.write

Библиотека работает, но :

Клонов библиотек много и мне попалась версия без lcd.print ?

Как изменить управляющие выводы A4 и A5 на другие, тк эти заняты под другие нужды?

Что такое адрес 0x27 в программе?

Почему при выводе на LCD одиночного символа, сначала заполняется первая строка, потом в отображении наступает непонятная пауза (пишет куда-то в буфер мимо экране?), а примерно после 40-го символа опять продолжает писать на экран в строку 2. Почему не пишет во вторую строку символ #17?

Где взять полное толковое описание библиотеки LiquidCrustal_I2C или хорошей аналогичной?

 

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup()
{
  lcd.init();                      
  lcd.backlight();
  lcd.clear();
}

void loop()
{    byte ascii_code=55;
    lcd.write('+');
    delay(1000);
}
qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Дятел пишет:
Как изменить управляющие выводы A4 и A5 на другие, тк эти заняты под другие нужды?Что такое адрес 0x27 в программе?
https://www.youtube.com/watch?v=54raQD9FjQo

Дятел
Offline
Зарегистрирован: 27.05.2017

qwone пишет:
Дятел пишет:
Как изменить управляющие выводы A4 и A5 на другие, тк эти заняты под другие нужды?Что такое адрес 0x27 в программе?
https://www.youtube.com/watch?v=54raQD9FjQo

П-дить после нескольких выпитых бутылок пива или портвейна легко, а написать  по делу ?

 

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

Дятел пишет:

а написать  по делу ?

Он по делу написал. Если бы Вы взяли на себя труд прочиать руководство (хоть прямо на этом же сайте, чего далеко ходить), то мне не пришлось бы Вам сейчас объяснять, что A4 и A5 забиты под I2C аппаратно прямо в микросхеме контроллера, а 0x27 - уникальный адрес устройства на шине. Всё это описано в миллионе мест, достаточно набрать I2C в гугле или просто посмотреть прямо здесь.

Так что по делу он написал, не обижайтесь.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Дятел пишет:

Как изменить управляющие выводы A4 и A5 на другие, тк эти заняты под другие нужды?

Никак, интерфейс I2C аппаратно на них выведен.

Дятел пишет:

Что такое адрес 0x27 в программе?

Адрес I2C-устройства.

Дятел
Offline
Зарегистрирован: 27.05.2017

ЕвгенийП пишет:
0x27 - уникальный адрес устройства на шине.
у всех LCD будет фиксированный 0x27 на I2C?

Дятел
Offline
Зарегистрирован: 27.05.2017

ЕвгенийП пишет:
Всё это описано в миллионе мест, достаточно набрать I2C в гугле или просто посмотреть прямо здесь.

искал на форуме руководство на библиотеку LiquidCrystal_I2C. Тем много, а руководство не нашел.

А частная проблема ?

Цитата:
Почему при выводе на LCD одиночного символа, сначала заполняется первая строка, потом в отображении наступает непонятная пауза (пишет куда-то в буфер мимо экране?), а примерно после 40-го символа опять продолжает писать на экран в строку 2. Почему не пишет во вторую строку символ #17?

kalapanga
Offline
Зарегистрирован: 23.10.2016

qwone пишет:

Дятел пишет:
Как изменить управляющие выводы A4 и A5 на другие, тк эти заняты под другие нужды?Что такое адрес 0x27 в программе?
https://www.youtube.com/watch?v=54raQD9FjQo

Зачем ты такой злой?

Дятел
Offline
Зарегистрирован: 27.05.2017
mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016
qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Дятел пишет:
у всех LCD будет фиксированный 0x27 на I2C?

Ну как вам объяснять.  Вы же дятел. Сделано так. Это как у мужуков есть пиписка, а у баб нет.

Вот даташит про адресс и да его можно менять при помощи паяльника и перемычек. http://www.ti.com/lit/ds/symlink/pcf8574.pdf

Дятел пишет:
Почему при выводе на LCD одиночного символа, сначала заполняется первая строка, потом в отображении наступает непонятная пауза (пишет куда-то в буфер мимо экране?), а примерно после 40-го символа опять продолжает писать на экран в строку 2. Почему не пишет во вторую строку символ #17?
Такой же ответ. https://www.sparkfun.com/datasheets/LCD/HD44780.pdf

Дятел
Offline
Зарегистрирован: 27.05.2017

дайте пожалуйста ссылку на описание библиотеки LiquidCrystal_I2C. Насчет адреса I2C интересуюсь, чтобы не иметь проблем и не  понимаю  зачем подкалывать.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
Дятел
Offline
Зарегистрирован: 27.05.2017

Спасибо, тоже скачивал с  с https://github.com/enjoyneering/LiquidCrystal_I2C , как и в этой статье по ссылке.

Но где там описание классов и функций?

Мучаюсь с lcd.write и не могу найти аналог lcd.print, которую раньше использовал в LiquidCrystal.h

 

Дятел
Offline
Зарегистрирован: 27.05.2017

qwone пишет:
Дятел пишет:
Почему при выводе на LCD одиночного символа, сначала заполняется первая строка, потом в отображении наступает непонятная пауза (пишет куда-то в буфер мимо экране?), а примерно после 40-го символа опять продолжает писать на экран в строку 2. Почему не пишет во вторую строку символ #17?
Такой же ответ. https://www.sparkfun.com/datasheets/LCD/HD44780.pdf

Это первоисточник мне так быстро не переварить, чтобы понять причину. Почему так выводит (не выводит )  на дисплей?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

так print и пользуйся. обе библиотеки есть наследники класса print

#20

Дятел
Offline
Зарегистрирован: 27.05.2017

qwone пишет:
так print и пользуйся. обе библиотеки есть наследники класса print    #20

Поставил LiquidCrystal_I2C_V112 с ней lcd. print работает, а с версией Arduino-LiquidCrystal-I2C-library-master не компилировалась. Можете посоветовать проверенную версию LCD I2C, которую используете сами ?

 

и зачем в программе     #20  две строки с разными адресами устройств на I2C 0x26 и 0x27, я видел на дисплеях 16х4 две залитых компаундом микросхемы контроллера, это тот самый случай , когда на I2C подлкючены 2 "независимых" устройства?

LiquidCrystal_I2C lcd(0x27,16,2);
LiquidCrystal_I2C lcd1(0x26,16,2);

 

Еще второстепенная  проблема, визуально кажется символы на текущем LCD перерисовываются медленнее чем раньше на другой матрице, как это решить ?  http://arduino.ru/forum/apparatnye-voprosy/tip-matritsy-lcd1602-i-bystrodeistvie-ekrana

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Сам я использую штатную. Скетч>Подключить библиотеку>Управлять Библиотекой >  и там выбираю поиском. И да компилятор Тупой. Надо выкинуть предыдущие.  I2C медленее прямого. Но это все херня. Скорее всего у вас программа тупо составлена.Когда быстро рисовала , то норм, а вот медлеенее полезли косяки. Адреса меняются не в компаунде микросхемы, а на дополнительной платке напаяной сверху. Если вы напрямую без I2C подключили, то адреса разумеется нет. Я вам очевидные вещи говорю. Что вы должны знать уже из этой темы и ссылок выложеных тут же. 

Дятел
Offline
Зарегистрирован: 27.05.2017

qwone пишет:
Скорее всего у вас программа тупо составлена.Когда быстро рисовала , то норм, а вот медлеенее полезли косяки. Адреса меняются не в компаунде микросхемы, а на дополнительной платке напаяной сверху. Если вы напрямую без I2C подключили, то адреса разумеется нет. Я вам очевидные вещи говорю. Что вы должны знать уже из этой темы и ссылок выложеных тут же. 

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

qwone, спасибо за ответы, жаль что вызвал Вашу обиду ником Дятел :-) .

Из непонятного осталось:

1. почему первая строка LCD от тестовой программы заполняется симвролами полностью,  а на второй появляются символы начиная с 40-го цикла loop?  Тестовая программа:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
void setup(){  lcd.init();               lcd.backlight();   lcd.clear(); }
void loop() {   lcd.write('+');     delay(1000);}


2. и зачем в программе по ссылке http://arduino.ru/forum/programmirovanie/etyudy-dlya-nachinayushchikh-po... используют два адреса I2C 0x26 0x27. Если убрать любой из них, то возникает ошибка компиляции. 
 В моей тестовой программе используется только один адрес 0x27. Программа  с двумя адресами:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <SD.h>

LiquidCrystal_I2C lcd(0x27,16,2);
LiquidCrystal_I2C lcd1(0x26,16,2);

#define sens A0
#define sensmq A1
int chipSelect = 10;
int t;
template <typename T> inline Print & operator << (Print &s, T n) { s.print(n); return s; }
struct SSensorValue : public Printable {
  unsigned long timeStamp;  //  Время съёма показаний (мс от запуска МК)
  float temperture;         //  температура в градусах С
  float humidity;           //  влажность в %
  float pressure;           //  давление в мм.рт.ст.

  size_t printTo(Print& p) const { // в качестве p нам передадут, например, Serial
    size_t res = p.print("SENSOR VALUE: Time:");
    res += p.print(timeStamp);
    res += p.print("ms; T:");
    res += p.print(temperture);
    res += p.print("C; H:");
    res += p.print(humidity);
    res += p.print("%; P:");
    res += p.print(pressure);
    return res + p.println("mm");
  }
};

void setup() {
    t=0;
    Serial.begin(9600);
    while (!Serial);                
    lcd1.init();
    lcd.init();
    lcd.backlight();
    lcd1.backlight();
    lcd1.setCursor(0,0);
    lcd1.print("Initializing ");
    lcd1.setCursor(0,1);
    lcd1.print("SD card...");
    delay(1000);
    
            if (!SD.begin(chipSelect)) 
                { 
                  lcd1.setCursor(11,1);
                  lcd1.print("ERROR");
                  delay(1000);
                  lcd1.clear();
                  lcd1.setCursor(0,0);
                  lcd1.print("Card failed,");
                  lcd1.setCursor(0,1);
                  lcd1.print("or not present.");
                  delay(1000);
                  return;
                }
                
    lcd1.setCursor(11,1);
    lcd1.print("DONE");
    delay(1000);
    pinMode(sens, INPUT);
    pinMode(sensmq, INPUT);
   
  }

void loop() {
  int data = analogRead(sens);
  int data1 = analogRead(sensmq);
  
  File dataFile = SD.open("datalog.txt", FILE_WRITE);

            if (dataFile) 
                {
                  /*
                  dataFile.print(t++);
                  dataFile.print(" ");
                  dataFile.print(data);
                  dataFile.print(" ");
                  dataFile.print(data1);
                  dataFile.print(" ");
                  dataFile.print(data);
                  dataFile.print(" ");
                  dataFile.println(data1);
                  dataFile.close();*/
                  
  File dataFile = SD.open("datalog.txt", FILE_WRITE);
  
  //
  //  Объявляем структуру и заполняем какими-то значениями
  //
  SSensorValue sv;
  sv.timeStamp = millis();
  sv.temperture = analogRead(sens);
  sv.humidity = analogRead(sensmq);;
  sv.pressure = 755;
  //
  //  Печатаем структуру
  //
  dataFile.print(sv);
  dataFile.close();

                }
  
            else {
                  lcd1.clear();
                  lcd1.setCursor(0,0);
                  lcd1.print("Error opening ");
                  lcd1.setCursor(0,1);
                  lcd1.print("datalog.txt");
                  delay(1000);
                }
              
    lcd.setCursor(0,0);
    lcd.print("CO       ");
    lcd.setCursor(data < 100 ? 6 : 5, 0);
    lcd.print(data);
    lcd.setCursor(0,1);
    lcd.print("CH4      ");
    lcd.setCursor(data1 < 100 ? 6 : 5, 1);
    lcd.print(data1);
    lcd.setCursor(9,0);
    lcd.print("H2     ");
    lcd.setCursor(data < 100 ? 14 : 13, 0);
    lcd.print(data);
    lcd.setCursor(9,1);
    lcd.print("LPG     ");
    lcd.setCursor(data1 < 100 ? 14 : 13, 1);
    lcd.print(data1);
    delay(1000);
}
  

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Дятел пишет:
qwone, спасибо за ответы, жаль что вызвал Вашу обиду ником Дятел :-) .
Я обиделся не на ник. А на фразу где вы понесли полную пургу про I2C.  Это просто маркер полной некомпитентности. Ведь на форуме впечатление составляют по словам и компитентности в вопросах Ардуины . И если я начну нести хрень, то меня ровно так же отдернут, что бы не засирал форум.

Вот здесь мой скетч #1128   

  LCD1602  I2C(0x27) <== Wire
  LCD2004  I2C(0x3F) <== Wire

 Вот там одновременно тоже подключены две Lcd. Да они у меня есть в реальности. И у них разные адреса подключеные к I2C. И в каждую могу отправить свое сообщение.

CL_Lcd_I2C lcd (0x27, 16, 2) ; // 0x3F/0x27 // < --- это       lcd
CL_Lcd_I2C lcd1(0x3F, 20, 4) ; // 0x3F/0x27// < --- а это     lcd1

//******

 lcd.print("   Hello, world!"); // < --- это   печать в   lcd
  
lcd1.print("Arduino LCD I2C 2017"); // < ---  а это   печать в   lcd1

// вот так все просто.


 

murzik
Offline
Зарегистрирован: 27.05.2017

Вчера ардуину купил. И тоже решил по i2c lcd зацепить. В скачанной библиотеке оказалась весьма любопытная адресация. Весь адрес нужно сдвигать на 1 бит вправо. То-есть если имеем I2C адаптер на редкой PCF8574, то нужно писать 0х27 вместо 0х3Е.

А если на частой PCF8574А, то нужно писать 0х3F вместо 0х7Е.

Дятел
Offline
Зарегистрирован: 27.05.2017

qwone пишет:
Дятел пишет:
qwone, спасибо за ответы, жаль что вызвал Вашу обиду ником Дятел :-) .
Я обиделся не на ник. А на фразу где вы понесли полную пургу про I2C.  Это просто маркер полной некомпитентности. Ведь на форуме впечатление составляют по словам и компитентности в вопросах Ардуины .
Я некомпетентен в I2C и поэтому попросил помощи.

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

Дятел, потому что строка на LCD дисплее состоит из 40 символов, а видимых - 16 из них, это сделано, чтобы ее можно было прокручивать, типа бегущей строки.  Поэтому, адрес 1-й строки - 0, адрес второй - 40.  Длина обеих - 40 байт. 

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

Дятел пишет:

Из непонятного осталось:

1. почему первая строка LCD от тестовой программы заполняется симвролами полностью,  а на второй появляются символы начиная с 40-го цикла loop? 

Родной контроллер ммеет размер 2 на 40
И он стоит на всех подобных индикаторах.

https://hubstub.ru/display/71-inicializaciya-lcd-displeya-1602a-s-upravlyayuschim-kontrollerom-ks0066u.html

Дятел пишет:

2. и зачем в программе по ссылке http://arduino.ru/forum/programmirovanie/etyudy-dlya-nachinayushchikh-potokovyi-vyvod-v-serial#comment-194635 используют два адреса I2C 0x26 0x27. Если убрать любой из них, то возникает ошибка компиляции. 
 В моей тестовой программе используется только один адрес 0x27. Программа  с двумя адресами:

Два адрес - два индикатора. Им так надо было.
Вы убрали инициализацию одного из них, а потом к нему обращаетесь

Кстати этот адрес не у индикатора, а у И2Ц  регистра к которому подключены пины ЛЦД.
Кстати этот  адрес обычно можно менять перемычками на плате, три последних бита адреса.
 

[/quote]