-         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 17 von 17

Thema: LCD 16x2 I2C adresse 0x27 und 0x3F

  1. #11
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.986
    Anzeige

    ich habe es natürlich an zwei verschiedenen adaptern (0x27 und 0x3F) und das nacheinander bzw. getrennt getestet
    das hättest du aber schreiben müssen!

    eine idee zu "0x"?
    wieso? du hast es doch oben schon selber so gemacht - nimm einfach die richtige:

    LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

    Hex-und Dezimal-Schreibweise (0x3F oder 63) sind aber nur formatierte Textstring-Schreibweisen ein-und derselben Zahl, du kannst sie schreiben wie du willst, dem Programm ist es egal.
    Damit er weiß, wenn du eine Hex-Schreibweise verwendest, musst du eben 0x davor schreiben, machst du es nicht, weiß er dass eine Dezimalschreibweise gemeint ist. Die Zahl an sich wäre in einer Variablen aber immer identisch (binär) kodiert.

    Eine Variable kannst du in der globalen Instantiierung allerdings nicht einsetzen, daher musst du immer beide LCD-Instanzen definieren und alle lcd-print etc. doppelt schreiben (wobei dann ein LCD von beiden unbenutzt ist und dessen Lese/Schreibvorgänge jeweils im Nirwana enden)


    LiquidCrystal_I2C lcd1(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

    LiquidCrystal_I2C lcd2(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
    Geändert von HaWe (14.03.2018 um 16:52 Uhr)
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  2. #12
    Erfahrener Benutzer Roboter Genie Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    70
    Beiträge
    1.379
    Zitat Zitat von HaWe Beitrag anzeigen

    Eine Variable kannst du in der Instantiierung allerdings nicht einsetzen, daher musst du immer beide LCD-Instanzen definieren und alle lcd-print etc. doppelt schreiben (wobei dann eine von beiden unbenutzt ist und deren Lese/Schreibvorgänge jeweils im Nirwana enden)


    LiquidCrystal_I2C lcd1(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

    LiquidCrystal_I2C lcd2(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
    Das nützt mir aber kaum etwas, ich muss dann trotzdem immer wieder schreibzugriffe auf beide lcd's (lcd1 und lcd2) angeben...

    Eigentlich dachte ich durch die Suche der jeweils verbauten I2C adresse dass ich die teile einfach beliebig einsetzen kann ohne mich groß um die tatsächliche adresse kümmern zu müssen...

    gibt es evtl. noch andere möglichkeiten? Z.b. wie hier von RoboHolIC ausgeführt:

    #ifndef ist eine Anweisung an den Preprozessor. Damit kannst du bei der Compilierung steuern, ob die Variante ... lcd(0x27... oder ...lcd(0x3F... in das Programmfile eingebaut wird. Dann hast du eben immer genau die eine ODER die andere Display-Adresse im Code.
    gruß inka

  3. #13
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.986
    Zitat Zitat von inka Beitrag anzeigen
    Das nützt mir aber kaum etwas, ich muss dann trotzdem immer wieder schreibzugriffe auf beide lcd's (lcd1 und lcd2) angeben...

    Eigentlich dachte ich durch die Suche der jeweils verbauten I2C adresse dass ich die teile einfach beliebig einsetzen kann ohne mich groß um die tatsächliche adresse kümmern zu müssen...

    gibt es evtl. noch andere möglichkeiten? Z.b. wie hier von RoboHolIC ausgeführt:
    per #ifdef legst du es VOR der Kompilierung fest, NACH der Kompilierung ist es wieder nur eine unveränderliche Konstante, so, als ob du sie von vornherein als diese Konstante reingeschrieben hättest.
    Da deine globale Instantiierung aber auch zwingend eine Konstante benötigt für die Adresse, und keine Variable, sehe ich mit dieser Lib keine andere Möglichkeit, ohne die komplette Lib umzuschreiben.
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  4. #14
    Erfahrener Benutzer Roboter Genie Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    70
    Beiträge
    1.379
    ok, danke, verstanden...
    gruß inka

  5. #15
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.986
    Falls deine lcd Lib aber grundsätzlich eine Variable als i2c-Adresse für die Instantiierung erlaubt und nicht immer zwingend eine Konstante fordert, dann ginge es allerdings lokal:


    - eine globale Adressen-Variable lcdaddr definieren und mit 0x27 oder 0x3F vor-initialisieren
    - in setup() die korrekte lcdaddr Adresse suchen und global in lcdaddr speichern (überschreiben)
    - in loop() im Kopf eine Instanz mit lcdaddr erzeugen
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  6. #16
    Erfahrener Benutzer Roboter Genie Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    70
    Beiträge
    1.379
    ich hab jetzt alles mögliche versucht, habe die initialisierung wie auch die I2C-suche xmal hin und her verschoben, muss mich wohl damit abfinden, dass es wirklich nicht geht...

    Code:
    #include <Wire.h>
    #include <LCD.h>
    #include <LiquidCrystal_I2C.h>
    
    
    byte I2CAdd;
    byte LCDadr = 0x27; //phantom_adresse
    byte fehler;
    boolean done = false;
    
    
    //0x3F = 63
    //0x27 = 39
    
    
    //vorinitialisierung mit phantom_adresse
    LiquidCrystal_I2C lcd(LCDadr, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
    
    
    void setup()
    {
      Serial.begin(115200);
      Wire.begin();
      lcd.begin(16, 2);
      lcd.clear();
    
    
    //  I2c_suche();
    }
    
    
    void loop()
    {
      if (!done)
      {
        I2c_suche();
        Serial.print(I2CAdd);
        Serial.print("  ");
        Serial.println(LCDadr, HEX);
        //initialisierung mit echter I2C adresse überschreiben
        LiquidCrystal_I2C lcd(LCDadr, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
    
        LCD_meldung();
      }
    
      //weiterer code
    }
    
    
    void I2c_suche()
    {
      Wire.setClock(100000L);
      for (I2CAdd = 39; I2CAdd < 63; I2CAdd++)
      {
        Wire.beginTransmission(I2CAdd);
        fehler = Wire.endTransmission();
    
        if (fehler == 0)
        {
          LCDadr = I2CAdd;
          Serial.print("Baustein mit Adresse 0x");
          Serial.print(I2CAdd, HEX);
          Serial.println(" gefunden!");
          //      I2CAdd_hex = (I2CAdd);
          //      Serial.println(I2CAdd_hex, HEX);
          Serial.print(I2CAdd);
          Serial.print("  ");
          Serial.println(LCDadr, HEX);
    
          done = true;
        }
      }
    }
    
    
    void LCD_meldung ()
    {
      lcd.setCursor(0, 0);
      lcd.setBacklight(HIGH);
      lcd.print("I2C scanner");
      lcd.setCursor(0, 1);
      lcd.print("LCD lokal");
      delay(2000);
      lcd.clear();
      done = true;
    }
    gruß inka

  7. #17
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.986
    bei der I2C Suche in setup() musst du nur auf 0x3F testen, falls du mit 0x27 vorinitialisiert hast (oder umgekehrt), um ggf auf die andere Adresse umzuschalten, ansonsten muss es bleiben wie es war.

    hingegen die Instantiierung
    LiquidCrystal_I2C lcd(LCDadr, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
    gehört lokal in die loop() ganz nach oben, NICHT global, habe ich doch geschrieben!

    - - - Aktualisiert - - -

    PS,
    ggf darf dann auch
    lcd.begin(16, 2);
    nicht in setup() sondern auch nur in loop, da ja dort erst instantiiert wird.
    Wiederholtes lcd.begin in jeder loop muss aber evtl über eine Variable nach dem ersten Mal verhindert werden.

    Code:
    void loop()
    {
       static bool initok=false;
       LiquidCrystal_I2C lcd(LCDadr, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
     
       if(!initok) {     // nur beim 1. Durchlauf
          lcd.begin(16, 2);             // kenne deine lib nicht, ggf anpassen
          lcd.setCursor(0, 0);          // kenne deine lib nicht, ggf anpassen
          lcd.setBacklight(HIGH);       // kenne deine lib nicht, ggf anpassen
          lcd.print("LCD init done.");  // kenne deine lib nicht, ggf anpassen
          initok=true;
          Serial.println("LCD init done.");
       }
    
       // Rest der loop()-Befehle
    
    }
    Geändert von HaWe (16.03.2018 um 13:49 Uhr) Grund: static bool ....
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. Atmega 16x2 LCD Ansteuerung über TWI
    Von D3nni5 im Forum C - Programmierung (GCC u.a.)
    Antworten: 15
    Letzter Beitrag: 06.08.2015, 22:00
  2. 16x2 LCD mit Bascom
    Von Dunuin im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 20.09.2010, 15:11
  3. 16x2 LCD anschließen
    Von .:Robin:. im Forum Robby RP6
    Antworten: 9
    Letzter Beitrag: 27.03.2009, 22:27
  4. Problem mit EA DOG 16x2
    Von m_herr im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 10
    Letzter Beitrag: 25.07.2007, 21:31
  5. Probleme bei LCD 16x2 und Ausgabe...
    Von CapSob im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 01.12.2006, 14:12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •