Неудобство с библиоткеой LCD по I2C
- Войдите на сайт для отправки комментариев
Перешел с 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);
}
П-дить после нескольких выпитых бутылок пива или портвейна легко, а написать по делу ?
а написать по делу ?
Он по делу написал. Если бы Вы взяли на себя труд прочиать руководство (хоть прямо на этом же сайте, чего далеко ходить), то мне не пришлось бы Вам сейчас объяснять, что A4 и A5 забиты под I2C аппаратно прямо в микросхеме контроллера, а 0x27 - уникальный адрес устройства на шине. Всё это описано в миллионе мест, достаточно набрать I2C в гугле или просто посмотреть прямо здесь.
Так что по делу он написал, не обижайтесь.
Как изменить управляющие выводы A4 и A5 на другие, тк эти заняты под другие нужды?
Никак, интерфейс I2C аппаратно на них выведен.
Что такое адрес 0x27 в программе?
Адрес I2C-устройства.
искал на форуме руководство на библиотеку LiquidCrystal_I2C. Тем много, а руководство не нашел.
А частная проблема ?
Зачем ты такой злой?
лучше дай ссылку на толковое описание библиотеки
Он не злой )) http://www.gdemozg.ru/images/demot/PATAMUSHTA_DYATEL___.jpg
Вот даташит про адресс и да его можно менять при помощи паяльника и перемычек. http://www.ti.com/lit/ds/symlink/pcf8574.pdf
дайте пожалуйста ссылку на описание библиотеки LiquidCrystal_I2C. Насчет адреса I2C интересуюсь, чтобы не иметь проблем и не понимаю зачем подкалывать.
http://elchupanibrei.livejournal.com/27443.html
Но где там описание классов и функций?
Мучаюсь с lcd.write и не могу найти аналог lcd.print, которую раньше использовал в LiquidCrystal.h
Это первоисточник мне так быстро не переварить, чтобы понять причину. Почему так выводит (не выводит ) на дисплей?
так print и пользуйся. обе библиотеки есть наследники класса print
#20
Поставил LiquidCrystal_I2C_V112 с ней lcd. print работает, а с версией Arduino-LiquidCrystal-I2C-library-master не компилировалась. Можете посоветовать проверенную версию LCD I2C, которую используете сами ?
и зачем в программе #20 две строки с разными адресами устройств на I2C 0x26 и 0x27, я видел на дисплеях 16х4 две залитых компаундом микросхемы контроллера, это тот самый случай , когда на I2C подлкючены 2 "независимых" устройства?
Еще второстепенная проблема, визуально кажется символы на текущем LCD перерисовываются медленнее чем раньше на другой матрице, как это решить ? http://arduino.ru/forum/apparatnye-voprosy/tip-matritsy-lcd1602-i-bystrodeistvie-ekrana
Сам я использую штатную. Скетч>Подключить библиотеку>Управлять Библиотекой > и там выбираю поиском. И да компилятор Тупой. Надо выкинуть предыдущие. I2C медленее прямого. Но это все херня. Скорее всего у вас программа тупо составлена.Когда быстро рисовала , то норм, а вот медлеенее полезли косяки. Адреса меняются не в компаунде микросхемы, а на дополнительной платке напаяной сверху. Если вы напрямую без 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); }Вот здесь мой скетч #1128
Вот там одновременно тоже подключены две 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 // вот так все просто.Вчера ардуину купил. И тоже решил по i2c lcd зацепить. В скачанной библиотеке оказалась весьма любопытная адресация. Весь адрес нужно сдвигать на 1 бит вправо. То-есть если имеем I2C адаптер на редкой PCF8574, то нужно писать 0х27 вместо 0х3Е.
А если на частой PCF8574А, то нужно писать 0х3F вместо 0х7Е.
Дятел, потому что строка на LCD дисплее состоит из 40 символов, а видимых - 16 из них, это сделано, чтобы ее можно было прокручивать, типа бегущей строки. Поэтому, адрес 1-й строки - 0, адрес второй - 40. Длина обеих - 40 байт.
Из непонятного осталось:
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]