LCD2004 I2C
- Войдите на сайт для отправки комментариев
Сб, 21/01/2017 - 13:46
Собственно вопрос такой: Есть экранчик который через i2c подключен к ардуинке, в прошивке происходит инициализация по адрессу данного i2c устройства. В прошивке к примеру этот адресс захардкоден, но что если нужно будет подключить экран с другим адресом? Есть ли способ определить адресс устройства и уже после этого инициализировать экран? Есть ли какие-то примеры или решения по этому поводу?
/* 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() {}Когда то для себя сделал универсальную библиотеку http://yadi.sk/d/wc1tGBUWEvmAh
там идет инициализация вида LiquidCrystal lcd(0x20); с указанием адреса
Все это замечательно, но может кто-нибудь смог бы привести кусочек примере где мы инициализируем экран после того как нашли его адресс?
/* #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() { }Вопрос мы конечно не читаем. Я знаю как инициализировать Экран с заранее известным адресом, мне нужно провести инициализацию экрана когда его адрес неизвестен, т.е. мы сканируем шину получаем адрес а потом уже происходит инициализация экрана... Что бы не приходилось писать прошивки для каждого адреса отдельно... Может я спрашиваю сильно очевидные вещи? И все это давно знают и это настолько тривиально что и никто не обсуждает? Тогда прошу прощения...
Ну вы задали идиотский вопрос. Есть шина I2C. На нее вешаются различные устройства. И это не только экраны. Сканер определяет только адресс и все. Если вы спрашиваете о Plug and Play ,то этого в Ардуине нет. Так что только ручками .
Найти адрес не проблема. Проблема определить,что на этом адресе висит дисплей, а не какой нибудь епром с конфигурацией. Начнёте его дисплеем инициировать и сотрёте весь конфиг на фиг. Кому это нужно? Проще адрес на плате i2c сконфигурить под известный.
Конечно проще же держать кучу прошивок под разные экраны, чем инициализировать прошивку с включенным только одним устроиством на шине, а затем уже подключать остальные что бы не было колизий как вы описали. Вообщем сам спросил сам решил...
Может кому пригодиться:
#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() { }Скетч из 4 сообщения работает с этим дисплеем отлично: https://hz.ru.aliexpress.com/item/LCD-module-Yellow-green-screen-IIC-I2C-2004-5V-LCD-for-ard-uino-provides-library-files/32364532659.html?spm=2114.13010608.0.0.tNhChK