Помогите с I2C LCD... уже голову сломала
- Войдите на сайт для отправки комментариев
Доброго времени суток. Купила этот дисплей http://www.ebay.com/itm/IIC-I2C-TWI-1602-serial-LCD-Module-Arduino-HD44780-Light-Green-Color-/160923532659?pt=LH_DefaultDomain_0&hash=item2577ca3d73.
После того, как поправила бибилиотеку, он заработал.
Проблема в том, что я не могу вывести на него переменную. При этом текст выводится запросто.
Библиотека вот http://www.wide.hk/download/I2C_1602LCD.rar
в LCDI2C4Bit.cpp сделала следующие изменения: заменила wconstants.h на arduino.h и в void SetMCPReg заменила send на write.
для вывода переменых типа char в данной библиотеке используется printIn (не путать с ***ln, там printin, только i заглавная), а для вывода переменных типа int - используется print, но при int i = 51; lcd.print(i); выводится символ, соответствующий коду 51. Вывести же значение 51 у меня не удается (((
Подскажите, пожалуйста ))
#include <Wire.h>
#include <LCDI2C4Bit.h>
//int ADDR = 0xA7;
int ADDR = 0xA7;
byte x = 0;
byte data = 1;
byte c;
LCDI2C4Bit lcd = LCDI2C4Bit(ADDR,4,20);
void setup()
{
Serial.begin(9600);
Wire.begin(); // join i2c bus (address optional for master)
lcd.init();
lcd.clear();
lcd.cursorTo(0,0);
lcd.printIn("WWW.WIDE.HK");
lcd.cursorTo(2,0);
lcd.printIn("I2C 1602 LCD");
}
void loop()
{
lcd.backLight(true);
delay(1000);
lcd.backLight(false);
delay(1000);
}
в классе print заявлен как печать integer
не работает?
class LCDI2C4Bit {
public:
LCDI2C4Bit(int devI2CAddress, int num_lines, int lcdwidth);
void commandWrite(int command);
void init();
void print(int value);
void printIn(char value[]);
void clear();
void backLight( bool turnOn );
//non-core---------------
void cursorTo(int line_num, int x);
для вывода переменых типа char в данной библиотеке используется printIn (не путать с ***ln, там printin, только i заглавная), а для вывода переменных типа int - используется print, но при int i = 51; lcd.print(i); выводится символ, соответствующий коду 51.
в классе print заявлен как печать integer
void LCDI2C4Bit::print( int value ) { dataPlusMask |= 0x10; // RS WriteLCDByte(myAddress,(byte)value); dataPlusMask ^= 0x10; // RS }Да, сморозил, хотя чего ради в классе параметр value объявлять int не понимаю
Скачайте вот эту библиотеку. Описание здесь.
Да, сморозил, хотя чего ради в классе параметр value объявлять int не понимаю
А как мне преобразовать число в строку?
Я уже скачивала ее. Она не работает с этим модулем, зато прекрасно работает вот с этим http://www.ebay.com/itm/Arduino-IIC-I2C-TWI-1602-Serial-LCD-Module-Display-/190573003243?pt=LH_DefaultDomain_0&hash=item2c5f0941eb
То есть так не работает?
#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0xA7,16,2); // set the LCD address to 0x20 for a 16 chars and 2 line display void setup() { lcd.init(); // initialize the lcd // Print a message to the LCD. lcd.backlight(); lcd.print("Hello, world!"); } void loop() { }Только что еще раз попробовала. Удалила другую библиотеку с таким же именем. Скачала и поставила из ссылки. Не работает ((((
Так а как можно преобразовать число в строку?
Так
void setup() { int chislo = 5236; char stroka[6]; itoa(chislo, stroka, 10); Serial.begin(9600); Serial.println(stroka); } void loop() {}У вас есть два варианта.
Вариант 1: Выводим кодами
Раз у вас "lcd.print(i); выводится символ, соответствующий коду 51", то значит вам нужно выводить коды.
То есть, цикле, число, скажем 253 должно быть разбито на три числа 2,5,3 в этом вам поможет операторы целочисленного деления и остатка от деления (делите на 100, что осталось на 10 и т.д.)
Потом эти 2,5,3 - вам нужно перевести в "коды символов". Это будут 50,53,51 (код символа ноля - это 48. Следоватльено цифру в код перевести можно просто добавив 48-мь).
Ну и... все выводите эти коды. Функция у вас есть. Вот примерно так.
void setup(){ Serial.begin(57600); int value=253; int base=100; while(base>0){ byte n=value/base; // получаем цифру 2,5 или 3 byte code=n+48; // или можно написать n+'0' если код нуля не помните Serial.write(code); // аналог вашей lcd.print, тоже "код" воспринимает value=value % base; // что осталось - на следующий проход base=base/10; // и уменшаем нажу "базу деления } } void loop(){ }Вариант 2: Преобразовавать в строку
Ну или как выше Максим показал. Или воспользоваться, к пример функцией sprintf если хотим сразу несколько чисел или еще и текст поясняющимй одним махом.
А вообщем вопрос " как можно преобразовать число в строку" - замечательно гуглится. Даже на этом форуме - поднимался уже 10-тки раз. При работе с Serial, передатчиками, разными экранами... да вообще это постоянное :)
Спасибо ))) Получилось!!! Я вас люблю :-* :-* :-* :-* :-*