ESP8266 an LCD oder OLED

Hat schon mal jemand einen ESP8266 an ein I2C Display angeschlossen?

ESP-01 / -201 / nodeMCU dev.Board

Welche Lib brauch ich. Welche Anschlüsse vom ESP kann ich verwenden.

Finde im Web einige Videos dazu aber kein nachbaubares (anfängerfreundliches) Beispiel.

Welche Anschlüsse vom ESP kann ich verwenden.

Kannste dir fast frei aussuchen... https://github.com/esp8266/Arduino/blob/master/doc/libraries.md#i2c-wire-library

Ich blicke noch ganz durch:

Wozu wire.h wenn ich sie wie hier nicht mit Wire.begin... nutze?

Wie sage ich welche Anschlüsse ich benutze?

Vielleicht ist das ja die falsche Lib. Oder sie möchte von dir modifiziert werden.

Der Ersteller hat offensichtlich nicht damit gerechnet, dass du den ESP-01 nutzen willst. Auf dem ESP-201 wäre/ist das weniger problematisch, denn da sind die I2C default Pins zugänglich.

Kann am -201 auch keine SDA/SCL finden...

Ich nutze z.B. Pin 12 und 14 dafür... (zugegeben, nach den default Pins habe ich noch nie gesucht)

Also ESP Pin Nummer 12 & 14. Entspricht IO13 und IO2.

Muss ich im Sketch die Pins angeben oder ist der ESP schlauer als ich dachte und weiß das auch allein?

 Wire.begin(12,14);

Hier steht kein Wire.begin und funktioniert am UNO trotzdem!? :o

#include <Wire.h> 
#include <utility/Adafruit_MCP23017.h>
#include <Adafruit_RGBLCDShield.h>

#define WHITE 0x7

// Set the LCD address to 0x27 for a 16 chars and 2 line display
// Arduino UNO => PIN 4 = SCL, PIN 5 = SDA
// NodeMCU Dev Kit => D1 = SCL, D2 = SDA
//LiquidCrystal_I2C lcd(0x27, 20, 4);

Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();

void setup()
{
  // initialize the LCD
  lcd.begin(16, 2);
  // Turn on the blacklight and print a message.
  lcd.setBacklight(WHITE);
  lcd.print("Hello LCD Line 1");
        lcd.setCursor(0, 1);
  lcd.print("Hello LCD Line 2");
}

void loop()
{
  // Do nothing here...
}

Das Wire.begin(); versteckt sich in lcd.begin(16, 2);. So ist das halt...... (manchmal)

Schluck...!?

lcd.begin(16, 2) bedeutet: I2C an Pin 4 und 5?

Ich dachte: 16 Zeichen und 2 Zeilen... :o

stoni99:
lcd.begin(16, 2) bedeutet: I2C an Pin 4 und 5?

Nein!
Auch wenn es das tut, ist doch “bedeuten” das falsche Wort.

stoni99:
Ich dachte: 16 Zeichen und 2 Zeilen… :o

Ja!
So ist es!

lcd.begin() ist eine Methode von lcd.
Und in dieser Methode wird die Methode Wire.begin() aufgerufen.

Wenn Wire.begin() automatisch durch lcd.begin(16, 2) aufgerufen wird, wer ruft dann Wire.begin(12,14) auf? Nochmals nach lcd.begin aufrufen?

Vielleicht du? Versuchs mal... Sauber ist das nicht, aber vielleicht tuts das...

Nee, geht nix.

Hab’s am nodeMCU getestet. Mit 16x2 Arduino Shield.

#include <Wire.h> 
#include <utility/Adafruit_MCP23017.h>
#include <Adafruit_RGBLCDShield.h>

#define WHITE 0x7

// Set the LCD address to 0x27 for a 16 chars and 2 line display
// Arduino UNO => PIN 4 = SCL, PIN 5 = SDA
// NodeMCU Dev Kit => D1 = SCL, D2 = SDA
//LiquidCrystal_I2C lcd(0x27, 20, 4);

Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();

void setup()
{
  // initialize the LCD
  Wire.begin(1,2);    //SDA / SCL
  lcd.begin(16, 2);
  // Turn on the blacklight and print a message.
  lcd.setBacklight(WHITE);
  lcd.print("Hello LCD Line 1");
        lcd.setCursor(0, 1);
  lcd.print("Hello LCD Line 2");
}

void loop()
{
  // Do nothing here...
}

Egal, bleibt der ESP eben ohne Anzeige…

  Serial.print("SCL: ");  Serial.println(SCL); 
  Serial.print("SDA: ");  Serial.println(SDA);

Gibt beim Mega2560

SCL: 21
SDA: 20

und beim teensy

SCL: 19
SDA: 18

was jeweils stimmt.

Für den Mega finde ich die Definition in c:\Program Files (x86)\Arduino165\hardware\arduino\avr\variants\mega\pins_arduino.h:

static const uint8_t SDA = 20;
static const uint8_t SCL = 21;

Für den teensy finde ich die Definition in c:\Program Files (x86)\Arduino165\hardware\teensy\avr\cores\teensy3\pins_arduino.h:

const static uint8_t SDA = 18;
const static uint8_t SCL = 19;

So eine Datei sollte doch auch für ESP8266 existieren.

So eine Datei sollte doch auch für ESP8266 existieren.

Ja, natürlich und da wird 4 und 5 definiert. Der ESP kann die Pins mappen und damit kann man I2C auf (fast) beliebige Ports legen.

Ist ja auch beschrieben (Quelle siehe #1): I2C (Wire library)

Wire library currently supports master mode up to approximately 450KHz. Before using I2C, pins for SDA and SCL need to be set by calling Wire.begin(int sda, int scl), i.e. Wire.begin(0, 2) on ESP-01, else they default to pins 4(SDA) and 5(SCL).

Dann sollte es auch funktionieren. :)

Schau mal, ob das Display am ESP i2c gefunden wird:

#include <Wire.h>


void setup()
{
  Wire.begin(0, 2);
  Serial.begin(9600);
  Serial.println("\nI2C Scanner");
}


void loop()
{
byte error, address;
int nDevices;

Serial.println("Scanning...");

nDevices = 0;
for(address = 1; address < 127; address++ ) 
  {
// The i2c_scanner uses the return value of
// the Write.endTransmisstion to see if
// a device did acknowledge to the address.
  Wire.beginTransmission(address);
  error = Wire.endTransmission();

if (error == 0)
    {
    Serial.print("I2C device found at address 0x");
    if (address<16) 
    Serial.print("0");
    Serial.print(address,HEX);
    Serial.println(" !");
    nDevices++;
    }
else if (error==4) 
    {
    Serial.print("Unknow error at address 0x");
    if (address<16) 
    Serial.print("0");
    Serial.println(address,HEX);
    } 
  }
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");

delay(5000); // wait 5 seconds for next scan
}

Der Scanner findet nix...