LCD2004 I2C

Doc
Offline
Зарегистрирован: 01.10.2016

Собственно вопрос такой: Есть экранчик который через i2c подключен к ардуинке, в прошивке происходит инициализация по адрессу данного i2c устройства. В прошивке к примеру этот адресс захардкоден, но что если нужно будет подключить экран с другим адресом? Есть ли способ определить адресс устройства и уже после этого инициализировать экран? Есть ли какие-то примеры или решения по этому поводу?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/* I2C_Scanner.ino
Принцип кода: сканирует шину I2C и выдает адресс устройств
*/
#include <Wire.h>

void setup() {
  Serial.begin(9600);
  Serial.println ("I2C scanner. Scanning ...");
  byte count = 0;
  
  Wire.begin();
  for (byte i = 8; i < 120; i++)
  {
    Wire.beginTransmission (i);
    if (Wire.endTransmission () == 0)
      {
      Serial.print ("Found address: ");
      Serial.print (i, DEC);
      Serial.print (" (0x");
      Serial.print (i, HEX);
      Serial.println (")");
      count++;
      delay (1);  // maybe unneeded?
      } // end of good response
  } // end of for loop
  Serial.println ("Done.");
  Serial.print ("Found ");
  Serial.print (count, DEC);
  Serial.println (" device(s).");
}  // end of setup

void loop() {}

 

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Когда то для себя сделал универсальную библиотеку http://yadi.sk/d/wc1tGBUWEvmAh

там идет инициализация вида LiquidCrystal lcd(0x20); с указанием адреса

Doc
Offline
Зарегистрирован: 01.10.2016

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

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/*
  #2 I2C LCD2004        GND -> GND
                      +5V -> +5V
                      SDA -> A4(SDA)
                      SCL -> A5(SCL)

*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F, 20, 4); // Для экрана 20х4 (четырехстрочный)

void setup() {
  lcd.init(); // < ---- вот инициализация
  lcd.backlight();
  //lcd.begin(20,4);
  lcd.setCursor(0, 0); // 1 строка
  lcd. printstr("LCD I2C Test - 20x4");
  lcd.setCursor(0, 1); // 2 строка
  lcd.print("01234567899876543210");
  lcd.setCursor(0, 2); // 3 строка
  lcd.print("01234567899876543210");
  lcd.setCursor(0, 3); // 4 строка
  lcd.print("  CHINGACHGOOK.NET");
}

void loop() {

}

 

Doc
Offline
Зарегистрирован: 01.10.2016

Вопрос мы конечно не читаем. Я знаю как инициализировать Экран с заранее известным адресом, мне нужно провести инициализацию экрана когда его адрес неизвестен, т.е. мы сканируем шину получаем адрес а потом уже происходит инициализация экрана... Что бы не приходилось писать прошивки для каждого адреса отдельно... Может я спрашиваю сильно очевидные вещи? И все это давно знают и это настолько тривиально что и никто не обсуждает? Тогда прошу прощения...

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

Ну вы задали идиотский вопрос.  Есть шина I2C. На нее вешаются различные устройства. И это не только экраны. Сканер определяет только адресс и все. Если вы спрашиваете о Plug and Play ,то этого в Ардуине нет. Так что только ручками .

nik182
Offline
Зарегистрирован: 04.05.2015

Найти адрес не проблема. Проблема определить,что на этом адресе висит дисплей, а не какой нибудь епром с конфигурацией. Начнёте его дисплеем инициировать и сотрёте весь конфиг на фиг. Кому это нужно? Проще адрес на плате i2c сконфигурить под известный. 

Doc
Offline
Зарегистрирован: 01.10.2016

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

Может кому пригодиться: 

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>

LiquidCrystal_I2C lcd(0x00, 20, 4);
byte error, address;
int nDevices;
const word LCD_SOUND_ADDR = 974; //example for my sketch

void setup()
{
  Wire.begin();
  Serial.begin(115200);
  byte adress = EEPROM.read(LCD_SOUND_ADDR);
  if (adress > 10 && adress < 127) {
    Serial.println(adress);
    lcd = LiquidCrystal_I2C(adress, 20, 4);
    lcd.init();
    lcd.backlight();
    lcd.printstr("LCD Init from EEPROM");
    return;
  }

  Serial.println("Start I2C scan!");
  nDevices = 0;
  for (address = 0; address <= 127; address++ )
  {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.print(address, HEX);
      Serial.println(" !");
      lcd = LiquidCrystal_I2C(address, 20, 4);
      EEPROM.write(LCD_SOUND_ADDR, address);
      lcd.init();
      lcd.backlight();
      lcd.printstr("LCD Init from scann");
      nDevices++;
    }
    else if (error == 4)
    {
      Serial.print("Unknow error at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.println(address, HEX);
    }
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else  if (nDevices > 1)
    Serial.println("You need connected to I2C only only LCD\n");
}

void loop()
{

}

 

uncle_grin
Offline
Зарегистрирован: 26.04.2015