два lcd дисплея
- Войдите на сайт для отправки комментариев
Вс, 11/03/2012 - 21:36
имею два девайса для работы LCD по и2С на PCF8574. каждый из девайсов работает со своей библиотекой, это вызвано разным задействованием выводов микросхемы.
вопрос- возмоли-ли организовать работу дисплеев но каждого с своей библиотекой в рамках одного скетча??? тоисть как определенному дисплею назначить именно свою библиотеку???
простое добавление второй библиотеки желаемого результата недает, хотя и оба дисплея запускаются. но на одном подсветка невключается а у второго она наоборот моргает. в тоже время все данные на дисплеи выводятся, но на одном с лишними сегментами....
простое добавление второй библиотеки желаемого результата недает,
А покажите как вы добавляете вторую. Будет достаточно функции setup и все что выше.
И, если не трудно, дайте еще раз тут ссылочки на библиотеки. А то опять получается "вы то в теме" (я частично), а если кто-то другой будет читать эту ветку? Что он увидит?
Название чипа (без ссылок на даташит), упоминание каких-то двух библиотек (неизвестных), упоминание каких-то неизвестных экранов с неизвестным подключением, неизвестный скетч в котором вы не известно как пытались совместить библиотеки.
Не, ну вы правда думаете что с такими исходными данными вам кто-то сможет что-то подсказать?
схема подключения 1 дисплея- http://jt5.ru/image/data/examples/OLED_I2C.gif
схема подключения второго дисплея- http://www.dfrobot.com/image/data/DFR0175/I2C%20LCD%20Backpack%20schematic.pdf
библиотека для первого дисплея здесь- http://hmario.home.xs4all.nl/arduino/LiquidCrystal_I2C/
для второго дисплея здесь- http://www.dfrobot.com/index.php?route=product/product&path=53&product_id=593
по последней ссылке и даташит на микросхему есть.
дисплеи для обоих схем одинаковые- http://www.kosmodrom.com.ua/pdf/WH2004D.pdf
собсно скетч который безглючно работает с двумя дисплеями но с одинаковой схемой подключения микросхем дисплеев по и2С, собран из нескольких-
// Arduino IDE 1. //Library version:1.1 #include <Wire.h> #include <LiquidCrystal_I2C.h> #if defined(ARDUINO) && ARDUINO >= 100 #define printByte(args) write(args); #else #define printByte(args) print(args,BYTE); #endif uint8_t cross[8] = {0x0,0x1b,0xe,0x4,0xe,0x1b,0x0}; LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 20 chars and 4 line display LiquidCrystal_I2C lcd2(0x20,20,4); // set the LCD address to 0x20 for a 20 chars and 4 line display float opn=4.99; //опорное напряжение вольты int voltage = 0; // Переменная для хранения данных считаных с АЦП вывода (НАПРЯЖЕНИЕ) int current = 0; // Переменная для хранения данных считаных с АЦП вывода (ТОК) float u = 0; // Переменная для вычислений (НАПРЯЖЕНИЕ) float i = 0; // Переменная для вычислений (ТОК) float p = 0; // Переменная для вычислений (МОЩНОСТЬ) float T = 0; // Переменная в которой храним конечное значение температуры термодатчик (LM35) измеряем температуру аккумулятора float var2; int del = 30; // Переменная для паузы int ledPin = 9; // Переменная номера вывода подключения светодиода. int ledPin1 = 12; // Переменная номера вывода подключения светодиода. int ledPin2 = 11; // Переменная номера вывода подключения светодиода. int ledPin3 = 10; // Переменная номера вывода подключения светодиода. int ledPin4 = 13; // Переменная номера вывода подключения светодиода. int ledState = LOW; long previousMillis = 0; long interval = 100; long prevmicros = 0; //переменная для хранения значений таймера int sek=0; //значения секунд int minu=0; //значение минут int chas=0; //значение часов boolean counter=false; // счетчик для полусекунд void setup() { lcd.init(); //инициализация LCD lcd2.init(); //инициализация LCD2 lcd.backlight(); //инициализация подсветки LCD lcd2.backlight(); //инициализация подсветки LCD2 pinMode(ledPin, OUTPUT); // Указываем что 9 вывод это ВЫХОД. (светодиод) pinMode(ledPin1, OUTPUT); // Указываем что 12 вывод это ВЫХОД. (светодиод) pinMode(ledPin2, OUTPUT); // Указываем что 11 вывод это ВЫХОД. (светодиод) pinMode(ledPin3, OUTPUT); // Указываем что 10 вывод это ВЫХОД. (светодиод) pinMode(ledPin4, OUTPUT); // Указываем что 13 вывод это ВЫХОД. (светодиод) lcd.createChar(6, cross); lcd.setCursor(0, 0); for(int i = 0;i < 20; i++) lcd.printByte(6); lcd.setCursor(0, 1); lcd.printByte(6); lcd.print(" -------------- "); lcd.printByte(6); lcd.setCursor(0, 2); lcd.printByte(6); lcd.print(" multidisplay "); lcd.printByte(6); lcd.setCursor(0, 3); for(int i = 0;i < 20; i++) lcd.printByte(6); delay(3000); lcd.clear(); } void loop() { if (micros() - prevmicros >500000) { prevmicros = micros(); //принимает значение каждые полсекунды counter=!counter; if (counter==false) { sek++; //переменная секунда + 1 lcd2.setCursor(2,0); lcd2.print(":"); //выводим символ ":"между часами и минутами lcd2.setCursor(5,0); lcd2.print(":"); //выводим символ ":"между минутами и секундами } else { lcd2.setCursor(2,0); lcd2.print(" "); // мигание : lcd2.setCursor(5,0); lcd2.print(" "); // мигание : } if(sek>59) //если переменная секунда больше 59 ... { sek=0; //сбрасываем ее на 0 minu++; //пишем +1 в переменную минута } if(minu>59) //если переменная минута больше 59 ... { minu=0; //сбрасываем ее на 0 chas++; //пишем +1 в переменную час } if(chas>23) //если переменная час больше 23 ... { chas=0; //сбрасываем ее на 0 } lcd2.setCursor(0,0); //выводим значение часов if (chas>=0 && chas<10) { lcd2.print("0"); lcd2.print(chas);} //количество часов else lcd2.print(chas); lcd2.setCursor(3,0); //выводим значение минут if (minu>=0 && minu<10) { lcd2.print("0"); lcd2.print(minu);} //количество минут else lcd2.print(minu); lcd2.setCursor(6,0); //выводим значение секунд if (sek>=0 && sek<10) { lcd2.print("0"); lcd2.print(sek);} //количество секунд else lcd2.print(sek); } { unsigned long currentMillis = millis(); if(currentMillis - previousMillis > interval) { previousMillis = currentMillis; if (ledState == LOW) ledState = HIGH; else ledState = LOW; digitalWrite(ledPin4, ledState); } { voltage = analogRead(0); // Указываем что данные считаные с аналогово вывода 0 заносим в переменную. u = voltage/40.92; // Математика однако, с занесением данных в переменную "u" lcd.setCursor(0, 0); // Указываем координаты/ первый 0 столбец, второй строка. lcd.print("Batery U="); // Рисуем lcd.setCursor(10, 0); // Указываем координаты lcd.print(u); // Берем данные из переменной и рисуем их на LCD lcd.setCursor(17, 0); // Указываем координаты lcd.print("V"); // Рисуем delay(del); // Ждем 30 миллисекунд } { current = analogRead(1); // Указываем что данные считаные с аналогово вывода 1 заносим в переменную. i = current/40.92; // Математика однако, с занесением данных в переменную "i" lcd.setCursor(0, 1); // Указываем координаты/ первый 0 - столбец, второй строка. lcd.print("Batery I="); // Рисуем lcd.setCursor(10, 1); // Указываем координаты lcd.print(i); // Берем данные из переменной и рисуем их на LCD lcd.setCursor(17, 1); // Указываем координаты lcd.print("A"); // Рисуем delay(del); // Ждем 30 миллисекунд } { p = u * i; // Математика из школьного курса физики. lcd.setCursor(0, 2); // Указываем координаты lcd.print("Batery P="); // Рисуем lcd.setCursor(10, 2); // Указываем координаты lcd.print(p); // Берем данные из переменной и рисуем их на LCD lcd.setCursor(17, 2); // Указываем координаты lcd.print("W "); // Рисуем delay(del); // Ждем 30 миллисекунд } var2 = analogRead(2); T=(opn*var2/10.24); // в качестве термодатчика используем аналоговый Lm35 с зависимостью 10мв/град С lcd.setCursor(0, 3); // Указываем координаты/ первый 0 столбец, второй строка. lcd.print("Batery T="); // Рисуем lcd.setCursor(10, 3); // Указываем координаты lcd.print(T); // Берем данные из переменной и рисуем их на LCD lcd.setCursor(17, 3); // Указываем координаты lcd.print("C"); // Рисуем delay(del); // Ждем 30 миллисекунд { digitalWrite(ledPin,HIGH); // Включаем светодиод } if (u <= 11) // Если напряжение на входе меньше 11 Вольт { digitalWrite(ledPin,LOW); // Светодиод гасим } { digitalWrite(ledPin3,HIGH); // Включаем светодиод } if (u >= 15) // Если напряжение на входе больше 15 Вольт { digitalWrite(ledPin3,LOW); // Светодиод гасим } { digitalWrite(ledPin1,HIGH); // Включаем светодиод } if (T >= 60) // Если температура больше 60 градусов { digitalWrite(ledPin1,LOW); // Светодиод гасим } { digitalWrite(ledPin2,HIGH); // Включаем светодиод } if (i >= 10) // Если ток больше 10 ампер { digitalWrite(ledPin2,LOW); // Светодиод гасим } } }Спасибо.
>А скетч? Хотя-бы его setup(). Как же вы эту вторую библиотеку-то добавляли?
Соори че-то глюкнуло. Счетс с первого раза не грузанулся.
выложил скетч который работает с двумя дисплеями с одинаковым подключением. а вот как сделать чтобы две однотипные библиотеки коректно работали с своим дисплеем при разных схемах незнаб.
вторую библу добавлял как обычно, в список библиотек.... но как им задать что вот одна для этого дисплея а вторая для другого незнаю....
Если "без танцев с бубном", то ответ "никак".
Это не "две разные библиотеки", а одна и та же библиотека разных версий. LiquidCrystal_I2Cv1-1 - похоже более свежая c поправками для Arduino 1.0. Возможно часть глюков объясняется "устарелостью второй". Но только часть. "Мирно сосуществовать" они не смогут по определению.
Решение, все-таки, есть. Но оно гиморойное. В любом случае нужно будет создавать третию версию библиотеки. К сожалению это C# и не Java. нейспейсов тут нет (хотя может я ошибаюсь, тогда это упростит дело).
Тут есть два пути:
1. "В лоб". Делать версию которая может "сосуществовать". Проще. Меньше думать нужно. Больше "тупой механической работы" и расход дефицитной памяти кристала (две библиотеки сразу загружать нужно).
2. Делать версию которая умеет работать с разными вариантами подключения. Что-бы у нее была еще функция типа selectSchema, которая указывает по какой схеме подключения нужно сейчас слать команды. IMHO более правильный путь. Но и "думать" на нем больше нужно будет.
Если решитесь идти по какому-то из путей - могу расписать более подробно. Но в любом случае это будет кусок работы. Начинать размышления можно с того что-бы сделать diff этих библиотек и смотреть чем они отличаются (кстати не так уж и многим, практически идентичны).
прикольно однако.....
проще спаять два одинаковых девайса и только адресацию изменить.... это пожалуй самый простой путь.... темболее по такому принципу обе библы работают без проблем....
>проще спаять два одинаковых девайса и только адресацию изменить.... это пожалуй самый простой путь....
Ну кому как. :) Тем более когда девайсы уже есть, за них деньги плачены. Меня бы жаба из принципа задушила. Да и "поковырятся" тоже не последнее дело (хотя у вам скорее интересней быстрее получить результат. сезон уже на носу :) )
действительно, кому как....
вам как програмисту проще код подправить, оптимизировать... мне спаять.... два покупных девайса с приведенным выше кодом работают. а интересно было только с иной отличительной схемой попробовать....
самих 8574 еще всеравно парочка есть....
как-бы сезон здесь вовсе непричем.... всеравно проэк проэкт долгострой... тоисть учимся, учимся.... и ваяем. конечно, ардуине уже будет гораздо меньше времени уделяться но всеравно.