Go Down

Topic: Problem med åäö på 1602 display med I2C (Read 3575 times) previous topic - next topic

poypoy

Jag vill kunna skriva åäö på en 1602 display med I2C
Jag gör en replace på åäö och ersätter dom med createchar, och det fungerar bra förutom att  jag  inte får bort det konstiga tecknet före åäö, se bild.
På displayens rad 1 visas hur det blir om jag skriver å ä ö
På displayens rad 2 visas hur det blir när jag har gjort en replace med egna tecken.
Någon som har förslag på åtgärd?

/* YourDuino.com Example Software Sketch
16 character 2 line I2C Display
Backpack Interface labelled "YwRobot Arduino LCM1602 IIC V1"
terry@yourduino.com */

/*-----( Import needed libraries )-----*/
#include <Wire.h>  // Comes with Arduino IDE
// Get the LCD I2C Library here:
// https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads
// Move any other LCD libraries to another folder or delete them
// See Library "Docs" folder for possible commands etc.
#include <LiquidCrystal_I2C.h>

/*-----( Declare Constants )-----*/
/*-----( Declare objects )-----*/
// set the LCD address to 0x27 for a 20 chars 4 line display
// Set the pins on the I2C chip used for LCD connections:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address



void setup()   /*----( SETUP: RUNS ONCE )----*/

{
 
  Serial.begin(9600);  // Used to type in characters

  lcd.begin(16,2);   // initialize the lcd for 16 chars 2 lines, turn on backlight

// ------- backlight  -------------
    {
    lcd.backlight();
  }
 

//-------- Write characters on the display ------------------

   byte AwithRing[8] = {
  B00100,
  B01010,
  B01110,
  B00001,
  B01111,
  B10001,
  B01111,
  };
   byte AwithDots[8] = {
  B01010,
  B00000,
  B01110,
  B00001,
  B01111,
  B10001,
  B01111,
  };
 
  byte OwithDots[8] = {
  B01010,
  B00000,
  B01110,
  B10001,
  B10001,
  B10001,
  B01110,
  };
 
  lcd.createChar(1, AwithRing);
  lcd.createChar(2, AwithDots);
  lcd.createChar(3, OwithDots);


// Display. (Set Serial Monitor option to "No Line Ending")
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("å ä ö");
 
  lcd.setCursor(0,1);
   
String message = "å ä ö";
message.replace('å', char(1));
message.replace('ä', byte(2));
message.replace('ö', byte(3));
lcd.print(message);

}/*--(end setup )---*/


void loop()   /*----( LOOP: RUNS CONSTANTLY )----*/
{
 
}



Msquare

#1
Mar 09, 2014, 07:53 pm Last Edit: Mar 10, 2014, 08:20 am by Msquare Reason: 1
Jeg har inte själv en LCD så jag gissar lite - men jag har mycket erfaring med I18N problemtik i andra sammenhäng.

Problemt är att någon har bestämt at talet 65 skal visas som A och 66 som B osv.  Det går fint med A-Z och dom andra engeslka bogstavarna. Men så är där både svenska, grækiska, cyrilliska hæbraiska bokstavar ... och der är bara 256 möjligheter i en byte. Så därför har din LCD valt et "character set". Här tykte nogon at kanji var vigtigere än äöå...  :(

Unicode kan rymma miljonvis af tecken, frågan är om LCDen har pixelmönstra för alla. Troligen inte. Unicode används internt i din kodefil (java använder unicode) och äöå har så stort et talvärde at det visas som två byte/tecken.

Så dit forsök med ägna tecken vil funka om du
Code: [Select]
String message = "\01 \02 \03 ";och så behöver du inte göra replace()  Det där med backstreckciffror er http://en.wikipedia.org/wiki/Escape_character

poypoy

Tack för hjälpen, du löste mitt problem.

Go Up