Neuling braucht hilfe

Hallo ich habe ein Problem

ich bin neu in der Materie
ich habe mir dieses set Gekauft SainSmart UNO+2004 LCD+Sensor Shield V4 und wollte es für LCDSmartie nutzen aber bekomme es nicht richtig zum laufen .
Kann mir einer Helfen??
ich habe es mit diesem Code Versucht??

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

LiquidCrystal_I2C lcd(0x3F,20,4);  // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup() { 
  //Serial.begin(19200);
  Serial.begin(115200);

  lcd.init();                      // initialize the lcd 
  lcd.init();
  lcd.begin(20, 4);
  lcd.backlight();
  lcd.clear();
  lcd.print("**   LCD Smartie  **");
  lcd.setCursor(0,1);
  lcd.print("**   on Arduino   **");
  lcd.setCursor(0,2);
  lcd.print("**   by techroll  **");
  lcd.setCursor(0,3);
  lcd.print("**   techroll.de  **");
}

byte serial_getch() {
  int incoming;
  while (Serial.available()==0) {
  }
  // read the incoming byte:
  incoming = Serial.read();

  return (byte) (incoming &0xff);
}

void loop() {
  byte rxbyte;
  byte temp;
  byte col;
  byte row;
  uint8_t location;
  uint8_t charMap[7];

  rxbyte = serial_getch();

  if (rxbyte == 254) //Matrix Orbital uses 254 prefix for commands
  {
    switch (serial_getch())
    {
    case 66: //backlight on (at previously set brightness)
      // not implemented                

      break;
    case 70: //backlight off
      // not implemented                
      break;
    case 71:  //set cursor position
      col = (serial_getch() - 1);  //get column byte
      row = (serial_getch());

      /*
                                switch (serial_getch())  //get row byte
                       {
                           //line 1 is already set up
                           case 2:
                               temp += 0x40;
                               break;
                           case 3:
                               temp += 0x14;
                               break;
                           case 4:
                               temp += 0x54;
                               break;
                           default:
                               break;
                       }
       */
      //lcd.commandWrite(0b10000000 + temp);
      lcd.setCursor(col,row-1);
      break;
    case 72:  //cursor home (reset display position)
      //lcd.commandWrite(2);
      lcd.setCursor(0,0);
      break;
    case 74:  //show underline cursor
      //lcd.commandWrite(0b00001110);
      break;
    case 75:  //underline cursor off
    case 84:  //block cursor off
      //lcd.commandWrite(0b00001100);
      break;
    case 76:  //move cursor left
      //lcd.commandWrite(16);
      break;
    case 77:  //move cursor right
      //lcd.commandWrite(20);
      break;
    case 78:  //define custom char
      //location = 64+serial_getch()*8;
      location = serial_getch();
      for (temp = 0; temp < 8; temp++)
      {
        charMap[temp] = serial_getch(); //get each pattern byte
      }
      lcd.createChar(location, charMap);
      break;
    case 83:  //show blinking block cursor
      //lcd.commandWrite(0b00001111);
      break;
    case 86:  //GPO OFF
      //implement later
      break;
    case 87:  //GPO ON
      /*temp = serial_getch();
                       if (temp == 1)
                       {
                           GPO1 = GPO_ON;
                       }*/
      break;
    case 88:  //clear display, cursor home
      //lcd.commandWrite(1);
      lcd.clear();
      lcd.setCursor(0,0);
      break;
    case 152: //set and remember (doesn't save value, though)
    case 153: //set backlight brightness
      //not implemented
      break;

      //these commands ignored (no parameters)
    case 35: //read serial number
    case 36: //read version number
    case 55: //read module type
    case 59: //exit flow-control mode
    case 65: //auto transmit keypresses
    case 96: //auto-repeat mode off (keypad)
    case 67: //auto line-wrap on
    case 68: //auto line-wrap off
    case 81: //auto scroll on
    case 82: //auto scroll off
    case 104: //init horiz bar graph
    case 109: //init med size digits
    case 115: //init narrow vert bar graph
    case 118: //init wide vert bar graph
      break;
    default:
      //all other commands ignored and parameter byte discarded
      temp = serial_getch();  //dump the command code
      break;
    }
    return;
  } //END OF COMMAND HANDLER

  //change accented char to plain, detect and change descenders
  //NB descenders only work on 5x10 displays. This lookup table works
  //  with my DEM-20845 (Display Elektronik GmbH) LCD using KS0066 chip.
  switch (rxbyte)
  {
    //chars that have direct equivalent in LCD charmap
    /*        case 0x67: //g
                 rxbyte = 0xE7;
                 break;
             case 0x6A: //j
                 rxbyte = 0xEA;
                 break;
             case 0x70: //p
                 rxbyte = 0xF0;
                 break;
             case 0x71: //q
                 rxbyte = 0xF1;
                 break;
             case 0x79: //y
                 rxbyte = 0xF9;
                 break;
     */  case 0xE4: //ASCII "a" umlaut
    rxbyte = 0xE1;
    break;
  case 0xF1: //ASCII "n" tilde
    rxbyte = 0xEE;
    break;
  case 0xF6: //ASCII "o" umlaut
    rxbyte = 0xEF; //was wrong in v0.86
    break;
  case 0xFC: //ASCII "u" umlaut
    rxbyte = 0xF5;
    break;

    //accented -> plain equivalent
    //and misc symbol translation
  case 0xA3: //sterling (pounds)
    rxbyte = 0xED;
    break;
    /*        case 0xB0: //degrees symbol
                 rxbyte = 0xDF;
                 break;
     */  case 0xB5: //mu
    rxbyte = 0xE4;
    break;
  case 0xC0: //"A" variants
  case 0xC1:
  case 0xC2:
  case 0xC3:
  case 0xC4:
  case 0xC5:
    rxbyte = 0x41;
    break;
  case 0xC8: //"E" variants
  case 0xC9:
  case 0xCA:
  case 0xCB:
    rxbyte = 0x45;
    break;
  case 0xCC: //"I" variants
  case 0xCD:
  case 0xCE:
  case 0xCF:
    rxbyte = 0x49;
    break;
  case 0xD1: //"N" tilde -> plain "N"
    rxbyte = 0x43;
    break;
  case 0xD2: //"O" variants
  case 0xD3:
  case 0xD4:
  case 0xD5:
  case 0xD6:
  case 0xD8:
    rxbyte = 0x4F;
    break;
  case 0xD9: //"U" variants
  case 0xDA:
  case 0xDB:
  case 0xDC:
    rxbyte = 0x55;
    break;
  case 0xDD: //"Y" acute -> "Y"
    rxbyte = 0x59;
    break;
    /*        case 0xDF: //beta  //mucks up LCDSmartie's degree symbol??
                 rxbyte = 0xE2;
                 break;
     */  case 0xE0: //"a" variants except umlaut
  case 0xE1:
  case 0xE2:
  case 0xE3:
  case 0xE5:
    rxbyte = 0x61;
    break;
  case 0xE7: //"c" cedilla -> "c"
    rxbyte = 0x63;
    break;
  case 0xE8: //"e" variants
  case 0xE9:
  case 0xEA:
  case 0xEB:
    rxbyte = 0x65;
    break;
  case 0xEC: //"i" variants
  case 0xED:
  case 0xEE:
  case 0xEF:
    rxbyte = 0x69;
    break;
  case 0xF2: //"o" variants except umlaut
  case 0xF3:
  case 0xF4:
  case 0xF5:
  case 0xF8:
    rxbyte = 0x6F;
    break;
  case 0xF7: //division symbol
    rxbyte = 0xFD;
    break;
  case 0xF9: //"u" variants except umlaut
  case 0xFA:
  case 0xFB:
    rxbyte = 0x75;
    break;
  default:
    break;
  }

  lcd.print(rxbyte);  //otherwise a plain char so we print it to lcd
  return;
}

da es der für LCDSmartie ist .
Nur am Display ist die I2c Platiene angelötet deswegen wird der Code warscheinlich nicht richtig gehen was muss ich Ändern im Code???
wenn ich LCD smarty Starte zeigt er mir lauter zahlen an und das wars sobald ich es Schließe steht wieder der Standat text im Display.

while (Serial.available()==0) {
}
// read the incoming byte:
incoming = Serial.read();

liest nur wenn der Buffer leer ist und dann ist nichts zu lesen.
Grüße Uwe

uwefed:
liest nur wenn der Buffer leer ist und dann ist nichts zu lesen.

Nein, stimmt nicht. Der Code verbleibt solange in der while()-Schleife, bis der Empfangspuffer mit mindestens einem Zeichen gefüllt ist. Das ist die Abbruchbedingung, dann erfolgt das Serial.read().

ja aber normalerweise sollte er da nach programm start die Rechner daten anzeigen und keine Zahlen wirwar

Lade dir mal den I2C Scanner auf den Arduino, führe ihn aus und öffne den Serial Monitor. Ist die angezeigte I2C Adresse des LCDs identisch mit der, die du im Setup deines Testprogrammes vergeben hast? Friert der I2C Scanner ein? Dann haben die PullUp Widerstände auf SCL und SDA die falsche Größe. Normalerweise geht alles zwischen 2,2 und 10K. Ich hatte selber schon den Fall, das der Bus einfror, obwohl ich im Limit lag. Ist machmal etwas tricky.

Gruß Gerald

den I2C Scanner habe ich schon benutzt der gab mir ja die adresse "0x3F" aus und er friert ja nicht ein er zeigt mir beim anschließen auch den text an der einprogramiert ist nur wenn ich wie gesagt das Programm LCDSmartie starte kommen lauter zahlen und mehr nicht bis ich das Programm schließe

sth77:

uwefed:
liest nur wenn der Buffer leer ist und dann ist nichts zu lesen.

Nein, stimmt nicht. Der Code verbleibt solange in der while()-Schleife, bis der Empfangspuffer mit mindestens einem Zeichen gefüllt ist. Das ist die Abbruchbedingung, dann erfolgt das Serial.read().

Tschuldigung; mein Fehler.
Grüße Uwe

Nimm doch erst mal einen einfacheren Beispielcode ohne viel Firlefanz. Gehe in der IDE auf Datei, Beispiele, LiquidCrystal_I2C, Hello World
Dort passt du deine I2C Adresse und deine Displaygröße an und schon hast du ein Erfolgserlebnis :slight_smile:

Merke: auch Zwerge haben mal ganz klein angefangen :grin:

Gruß Gerald

das habe ich ja auch schon gemacht und das funktionert auch alles super damit habe ich ja den Code hier erweitert nur dieser code soll ja eigentlich daten vom rechner ausgeben was er nur in zahlenform macht

aha
Dein Problem ist also, daß Zeichen, die Du mit LCDSmartie vom PC verschickst, nicht als Zeichen, sondern als Zahlen dargestellt werden.
Bist Du sicher daß LCDSmartie richtig eingestellt ist?
Grüße Uwe

Habe den fehler gefunden es lag tatsächlich am code für LCDsmartie in verbindung mit dem I2C Controler

// include the library code:
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F,20,4);  // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup() { 
  Serial.begin(9600);
  lcd.init();                      // initialize the lcd 
  lcd.begin(20,4);
  lcd.backlight();
  lcd.clear();
  lcd.print("********************");
  lcd.setCursor(0,1);
  lcd.print("**   Das System   **");
  lcd.setCursor(0,2);
  lcd.print("** wird Gestartet **");
  lcd.setCursor(0,3);
  lcd.print("********************");
}

byte serial_getch(){

  int incoming;  
  while (Serial.available()==0){
  }
  // read the incoming byte:
  incoming = Serial.read();

  return (byte) (incoming &0xff);
}
void loop(){

  byte rxbyte;
  byte temp;

  rxbyte = serial_getch();

  if (rxbyte == 254) //Matrix Orbital uses 254 prefix for commands
  {
    switch (serial_getch())
    {
    case 66: //backlight on (at previously set brightness)
      // not implemented				

      break;
    case 70: //backlight off
      // not implemented				
      break;
    case 71:  //set cursor position
      temp = (serial_getch() - 1);  //get column byte
      switch (serial_getch())  //get row byte
      {
        //line 1 is already set up
      case 2:
        temp += 0x40;
        break;
      case 3:
        temp += 0x14;
        break;
      case 4:
        temp += 0x54;
        break;
      default:
        break;
      }
      lcd.command(0b10000000 + temp);
      break;
    case 72:  //cursor home (reset display position)
      lcd.command(2);
      break;
    case 74:  //show underline cursor
      lcd.command(0b00001110);
      break;
    case 75:  //underline cursor off
    case 84:  //block cursor off
      lcd.command(0b00001100);
      break;
    case 76:  //move cursor left
      lcd.command(16);
      break;
    case 77:  //move cursor right
      lcd.command(20);
      break;
    case 78:  //define custom char
      lcd.command(64 + (serial_getch() * 8));  //get+set char address
      for (temp = 7; temp != 0; temp--)
      {
        lcd.print(serial_getch()); //get each pattern byte
      }
      break;
    case 83:  //show blinking block cursor
      lcd.command(0b00001111);
      break;
    case 86:  //GPO OFF
      //implement later
      break;
    case 87:  //GPO ON
      /*temp = serial_getch();
       				if (temp == 1)
       				{
       					GPO1 = GPO_ON;
       				}*/
      break;
    case 88:  //clear display, cursor home
      lcd.command(1);
      break;
    case 152: //set and remember (doesn't save value, though)
    case 153: //set backlight brightness
      //not implemented
      break;

      //these commands ignored (no parameters)
    case 35: //read serial number
    case 36: //read version number
    case 55: //read module type
    case 59: //exit flow-control mode
    case 65: //auto transmit keypresses
    case 96: //auto-repeat mode off (keypad)
    case 67: //auto line-wrap on
    case 68: //auto line-wrap off
    case 81: //auto scroll on
    case 82: //auto scroll off
    case 104: //init horiz bar graph
    case 109: //init med size digits
    case 115: //init narrow vert bar graph
    case 118: //init wide vert bar graph
      break;
    default:
      //all other commands ignored and parameter byte discarded
      temp = serial_getch();  //dump the command code
      break;
    }
    return;
  } //END OF COMMAND HANDLER

  //change accented char to plain, detect and change descenders
  //NB descenders only work on 5x10 displays. This lookup table works
  //  with my DEM-20845 (Display Elektronik GmbH) LCD using KS0066 chip.
  switch (rxbyte)
  {
    //chars that have direct equivalent in LCD charmap
    /*		case 0x67: //g
     			rxbyte = 0xE7;
     			break;
     		case 0x6A: //j
     			rxbyte = 0xEA;
     			break;
     		case 0x70: //p
     			rxbyte = 0xF0;
     			break;
     		case 0x71: //q
     			rxbyte = 0xF1;
     			break;
     		case 0x79: //y
     			rxbyte = 0xF9;
     			break;
     */  case 0xE4: //ASCII "a" umlaut
    rxbyte = 0xE1;
    break;
  case 0xF1: //ASCII "n" tilde
    rxbyte = 0xEE;
    break;
  case 0xF6: //ASCII "o" umlaut
    rxbyte = 0xEF; //was wrong in v0.86
    break;
  case 0xFC: //ASCII "u" umlaut
    rxbyte = 0xF5;
    break;

    //accented -> plain equivalent
    //and misc symbol translation
  case 0xA3: //sterling (pounds)
    rxbyte = 0xED;
    break;
    /*		case 0xB0: //degrees symbol
     			rxbyte = 0xDF;
     			break;
     */  case 0xB5: //mu
    rxbyte = 0xE4;
    break;
  case 0xC0: //"A" variants
  case 0xC1:
  case 0xC2:
  case 0xC3:
  case 0xC4:
  case 0xC5:
    rxbyte = 0x41;
    break;
  case 0xC8: //"E" variants
  case 0xC9:
  case 0xCA:
  case 0xCB:
    rxbyte = 0x45;
    break;
  case 0xCC: //"I" variants
  case 0xCD:
  case 0xCE:
  case 0xCF:
    rxbyte = 0x49;
    break;
  case 0xD1: //"N" tilde -> plain "N"
    rxbyte = 0x43;
    break;
  case 0xD2: //"O" variants
  case 0xD3:
  case 0xD4:
  case 0xD5:
  case 0xD6:
  case 0xD8:
    rxbyte = 0x4F;
    break;
  case 0xD9: //"U" variants
  case 0xDA:
  case 0xDB:
  case 0xDC:
    rxbyte = 0x55;
    break;
  case 0xDD: //"Y" acute -> "Y"
    rxbyte = 0x59;
    break;
    /*		case 0xDF: //beta  //mucks up LCDSmartie's degree symbol??
     			rxbyte = 0xE2;
     			break;
     */  case 0xE0: //"a" variants except umlaut
  case 0xE1:
  case 0xE2:
  case 0xE3:
  case 0xE5:
    rxbyte = 0x61;
    break;
  case 0xE7: //"c" cedilla -> "c"
    rxbyte = 0x63;
    break;
  case 0xE8: //"e" variants
  case 0xE9:
  case 0xEA:
  case 0xEB:
    rxbyte = 0x65;
    break;
  case 0xEC: //"i" variants
  case 0xED:
  case 0xEE:
  case 0xEF:
    rxbyte = 0x69;
    break;
  case 0xF2: //"o" variants except umlaut
  case 0xF3:
  case 0xF4:
  case 0xF5:
  case 0xF8:
    rxbyte = 0x6F;
    break;
  case 0xF7: //division symbol
    rxbyte = 0xFD;
    break;
  case 0xF9: //"u" variants except umlaut
  case 0xFA:
  case 0xFB:
    rxbyte = 0x75;
    break;
  default:
    break;
  }

  lcd.print((char)rxbyte);  //otherwise a plain char so we print it to lcd
  return;


}

dieser code läuft soweit auser das er bei temperaturen das ° zeichen nicht wieder geben kann
da kommt nur nen balken und das wars
Aber Danke für die hilfe

Blackwulf4:
dieser code läuft soweit auser das er bei temperaturen das ° zeichen nicht wieder geben kann
da kommt nur nen balken und das wars
Aber Danke für die hilfe

Nicht alle Zeichensätze der Verschiedenen LCD-Controller enthalten das Grad Zeichen. Da bleibt Dir nichts anderes übrig als das Zeichen selbst zu definieren. Die Controller können 8 Zeichen im Ram ablegen und so kannst Du diese selbst definieren. Schau mal ob die von Dir verwendete Bibliothek eine Funktion dazu hat.
Grüße Uwe

Das 2004 ist einen HD44780 Controlller. Das Grad Zeichen ist schon im Zeichensatz. Aber es entspricht nicht dem ASCII Code.

Datenblatt:

Der Zeichensatz ist auf Seite 17. Das Grad Zeichen ist unten rechts. Code: 1101 1111 = 0xDF = 223

Mit write(0xDF) kann man es schreiben

Da ist aber in dem Code etwas auskommentiert:
break;
/* case 0xDF: //beta //mucks up LCDSmartie's degree symbol??