два lcd дисплея

chaytan
Offline
Зарегистрирован: 02.02.2012

 имею два девайса для работы LCD по и2С на PCF8574. каждый из девайсов работает со своей библиотекой, это вызвано разным задействованием выводов микросхемы.

вопрос- возмоли-ли организовать работу дисплеев но каждого с своей библиотекой в рамках одного скетча??? тоисть как определенному дисплею назначить именно свою библиотеку???

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

leshak
Offline
Зарегистрирован: 29.09.2011

 

chaytan пишет:

простое добавление второй библиотеки желаемого результата недает,

А покажите как вы добавляете вторую. Будет достаточно функции setup и все что выше.

И, если не трудно, дайте еще раз тут ссылочки на библиотеки. А то опять получается "вы то в теме" (я частично), а если кто-то другой будет читать эту ветку? Что он увидит?

Название чипа (без ссылок на даташит), упоминание каких-то двух библиотек (неизвестных), упоминание каких-то неизвестных экранов с неизвестным подключением, неизвестный скетч в котором вы не известно как пытались совместить библиотеки.

Не, ну вы правда думаете что с такими исходными данными вам кто-то сможет что-то подсказать?

chaytan
Offline
Зарегистрирован: 02.02.2012

схема подключения 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);     // Светодиод гасим
  }
  }
  }

 

leshak
Offline
Зарегистрирован: 29.09.2011

 Спасибо.

>А скетч? Хотя-бы его setup(). Как же вы эту вторую библиотеку-то добавляли?

Соори че-то глюкнуло. Счетс с первого раза не грузанулся.

chaytan
Offline
Зарегистрирован: 02.02.2012

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

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

leshak
Offline
Зарегистрирован: 29.09.2011

Если "без танцев с бубном", то ответ "никак".

Это не "две разные библиотеки", а одна и та же библиотека разных версий. LiquidCrystal_I2Cv1-1 - похоже более свежая c поправками для Arduino 1.0. Возможно часть глюков объясняется "устарелостью второй". Но только часть. "Мирно сосуществовать" они не смогут по определению.

Решение, все-таки, есть. Но оно гиморойное. В любом случае нужно будет создавать третию версию библиотеки. К сожалению это C# и не Java. нейспейсов тут нет (хотя может я ошибаюсь, тогда это упростит дело).

Тут есть два пути:

1. "В лоб". Делать версию которая может "сосуществовать". Проще. Меньше думать нужно. Больше "тупой механической работы" и расход дефицитной памяти кристала (две библиотеки сразу загружать нужно).

2. Делать версию которая умеет работать с разными вариантами подключения. Что-бы у нее была еще функция типа selectSchema, которая указывает по какой схеме подключения нужно сейчас слать команды. IMHO более правильный путь. Но и "думать" на нем больше нужно будет.

Если решитесь идти по какому-то из путей - могу расписать более подробно. Но в любом случае это будет кусок работы. Начинать размышления можно с того что-бы сделать diff этих библиотек и смотреть чем они отличаются (кстати не так уж и многим, практически идентичны).

chaytan
Offline
Зарегистрирован: 02.02.2012

прикольно однако.....

проще спаять два одинаковых девайса и только адресацию изменить.... это пожалуй самый простой путь.... темболее по такому принципу обе библы работают без проблем.... 

leshak
Offline
Зарегистрирован: 29.09.2011

 >проще спаять два одинаковых девайса и только адресацию изменить.... это пожалуй самый простой путь....

Ну кому как. :) Тем более когда девайсы уже есть, за них деньги плачены. Меня бы жаба из принципа задушила. Да и "поковырятся" тоже не последнее дело (хотя у вам скорее интересней быстрее получить результат. сезон уже на носу :)  )

chaytan
Offline
Зарегистрирован: 02.02.2012

 действительно, кому как....

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

самих 8574 еще всеравно парочка есть.... 

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