Помогите с I2C LCD... уже голову сломала

Alina
Alina аватар
Offline
Зарегистрирован: 14.02.2013

Доброго времени суток. Купила этот дисплей 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);
}

 

Borland
Offline
Зарегистрирован: 17.05.2012

в классе 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);
 

maksim
Offline
Зарегистрирован: 12.02.2012

Alina пишет:

для вывода переменых типа char  в данной библиотеке используется printIn (не путать с ***ln,  там printin, только i заглавная), а для вывода переменных типа int - используется print, но  при int i = 51; lcd.print(i); выводится символ, соответствующий коду 51.

Не понятно с чего вы такие выводы сделали... но функция print() выводит один символ, а printIn() выводит строку (массив символов). Поэтому что бы вывести число ,вам нужно преобразовать его в строку.

maksim
Offline
Зарегистрирован: 12.02.2012

Borland пишет:

в классе print заявлен как печать integer

А в функцию сложно заглянуть?

void LCDI2C4Bit::print( int value ) {
  dataPlusMask |= 0x10; // RS
  WriteLCDByte(myAddress,(byte)value);
  dataPlusMask ^= 0x10; // RS
}

 

Borland
Offline
Зарегистрирован: 17.05.2012

Да, сморозил, хотя чего ради в классе параметр value объявлять int не понимаю

maksim
Offline
Зарегистрирован: 12.02.2012

Скачайте вот эту библиотеку. Описание здесь.

maksim
Offline
Зарегистрирован: 12.02.2012

Borland пишет:

Да, сморозил, хотя чего ради в классе параметр value объявлять int не понимаю

Кто-то корявенько подредактировал либу.

Alina
Alina аватар
Offline
Зарегистрирован: 14.02.2013

А как мне преобразовать число в строку?

Alina
Alina аватар
Offline
Зарегистрирован: 14.02.2013

Я уже скачивала ее. Она не работает с этим модулем, зато прекрасно работает вот с этим http://www.ebay.com/itm/Arduino-IIC-I2C-TWI-1602-Serial-LCD-Module-Display-/190573003243?pt=LH_DefaultDomain_0&hash=item2c5f0941eb

maksim
Offline
Зарегистрирован: 12.02.2012

То есть так не работает?

#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()
{
}

 

Alina
Alina аватар
Offline
Зарегистрирован: 14.02.2013

Только что еще раз попробовала. Удалила другую библиотеку с таким же именем. Скачала и поставила из ссылки. Не работает ((((

Так а как можно преобразовать число в строку?

maksim
Offline
Зарегистрирован: 12.02.2012

Так

void setup() {
  int chislo = 5236;
  char stroka[6];
  
  itoa(chislo, stroka, 10);
  
  Serial.begin(9600);
  Serial.println(stroka);
}

void loop() {}
 
leshak
Offline
Зарегистрирован: 29.09.2011

У вас есть два варианта.

Вариант 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, передатчиками, разными экранами... да вообще это постоянное :)

Alina
Alina аватар
Offline
Зарегистрирован: 14.02.2013

Спасибо ))) Получилось!!! Я вас люблю :-* :-* :-* :-* :-*