PCF8574 an ESP-01 in Betrieb nehmen

Guten Abend Leute, ich habe ein Problem und irgendwie komme ich nicht ganz zu einer Lösung. Ich habe ein Programm, wenn ich das auf ein Wemos D1 Mini hoch lade, läuft dieser ohne Probleme, doch lade ich den selben Code auf ein ESP-01 Modul und schließe den PCF8574 an, passiert überhaupt nichts. Also gleicher Code, gleicher Aufbau 2 Ergebnisse. Ersteinmal der Code:

#include <ESP8266WiFi.h>
#include <ArduinoOTA.h>
#include "PCF8574.h"
#include <Wire.h> 


const char* ssid = "SSID";
const char* password = "WIFI Password";
IPAddress ip(192,168,178,220);
IPAddress gateway(192,168,178,1);
IPAddress subnet(255,255,255,0);


PCF8574 m1(0x20);


void setup() {
  WiFi.begin(ssid, password);
  WiFi.config(ip, gateway, subnet);     
 
  SetupOTA();
  m1.begin();
  m1.pinMode(P1,OUTPUT);
 

}

void loop() {
  ArduinoOTA.handle();
  m1.digitalWrite(P1,LOW);
  delay(2000);
  m1.digitalWrite(P1,HIGH);
  delay(2000);

}

void SetupOTA() {
   ArduinoOTA.setHostname("OTA Name");
   ArduinoOTA.setPassword("OTA Password");
   ArduinoOTA.begin();
}

Beim Wemos Board wähle ich als Board Lolin (Wemos) D1 R2 mini und beim ESP-01 wähle ich Generic ESP8266 Modul. Vielleicht kann mir dabei jemand helfen?

Das mit WiFi und OTA habe ich nur dazu drin, um den ESP-01 nicht ständig vom Programmer ins Breadboard und zurück stecken muss, bei Veränderung im Code. Der Code, ist an sich lediglich ein verändertes Blink Beispiel.

Als SCL nutze ich GPIO2 und als SDA den GPIO0.

Gruß

Michael

Warum sehe ich das nicht?

Und ein Wire.begin fehlt auch. Dem musst du die I2C-Pins mitgeben.

Okay, aber wie gesagt beim Wemos Chip läuft das Programm. Nur beim ESP 01 nicht. Also der gleiche Code.

Dachte, das diese "Eigenschaft" schon im Chip ist, wo i2c ist.

Wie kann ich das angeben? Den wie gesagt beim Wemos musste ich nichts angeben und es lief trotzdem.

Michael

Wurde schon gesagt!

Weil dort die default Pins verwendet werden, oder?
Du willst aber andere.

Tipp:
Es gibt eine Doku zu der ESP Wire Implementierung.

Und woher soll dein Chip das alles wissen, was du von dem willst ?

Keine Ahnung :wink: War nur ein fixer Gedanke.

Okay muss ich mir morgen oder am Wochenende mal näher angucken. Vielleicht bekomme ich es noch hin.

Beim ESP8266 sind standardmäßig SDA bei GPIO4 und SCL bei GPIO5.

Ein Wire.begin(); aktiviert diese.
Wenn du andere GPIOs verwenden willst, kannst du dies beim ESP8266 mit Wire.begin(SDA,SCL); angeben. Das wäre dann bei dir Wire.begin(0,2);

Du könntest natürlich auch mit kleinen Drähtschen an den ESP8266ex Chip gehen und dir GPIO4 und GPIO5 herrausführen.

Ok, danke, Dein Bild zeigt das mit den standardmässigen SDA und SCL sehr deutlich. es sind die einzigen Pins (neben GPIO0 und GPIO2, die NICHT mit irgendeiner speziellen Funktion beschriftet sind, somit müssen diese wohl zwangsläufig SDA und SCL sein. :thinking:

Da das I2C beim ESP8266 in Software umgesetzt wird, sind die Pins relativ egal.

4 und 5 sind als Standard bei Wire.h bei Verwendung von ESP8266 hinterlegt.

Wenn du die Pins ändern willst, musst du es angeben.

Okay werde es mir später mal genauer angucken. Wäre klasse, wenn ich am ESP-01 den Chip zum laufen bekomme.

Ist manchmal irritierend, wenn der Code auf einem Chip läuft und auf dem anderen nicht. Also obwohl Wire.begin(); bei beiden nicht drin ist.

Aber man lernt ja nie aus.

Michael

viele Libs , die Wire benötigen, rufen Wire.begin(); intern auf. Dadurch wird also das 'Wire beginn' mit hoher Wahrscheinlichkeit so oder so ausgeführt, egal ob Du es in Deinen Code reinschreibst , oder nicht.

Die von Dir in Deinem Code includierte PCF8574 -Lib includiert ebenfalls die Wire-Lib und ruft bei der Initialisierung auch ein 'Wire.beginn();' auf.

Okay weiß ich Bescheid.

Danke der Hintergrundinformation.

Michael

PS: Man möchte ja auch was dazu lernen, da sind solche Infos topp.

Mahlzeit,

ich habe nun das Wire.begin(); hinzugefügt mit Pinangabe und so. Nur leider Ohne Erfolg, hier nochmal der komplette Code:

#include <ESP8266WiFi.h>
#include <ArduinoOTA.h>
#include "PCF8574.h"
#include <Wire.h> 


const char* ssid = "SSID";
const char* password = "Wifi Password";
IPAddress ip(192,168,178,200); 
IPAddress gateway(192,168,178,1);
IPAddress subnet(255,255,255,0);


PCF8574 m1(0x20);


void setup() {
  WiFi.begin(ssid, password);
  WiFi.config(ip, gateway, subnet);     
  Wire.begin(0,2);
  SetupOTA();
  m1.begin();
  m1.pinMode(P0,OUTPUT);
 

}

void loop() {
  ArduinoOTA.handle();
  m1.digitalWrite(P0,LOW);
  delay(2000);
  m1.digitalWrite(P0,HIGH);
  delay(2000);

}

void SetupOTA() {
   ArduinoOTA.setHostname("OTA Name");
   ArduinoOTA.setPassword("OTA Code");
   ArduinoOTA.begin();
}

Ich habe auch zur Sicherheit folgendes überprüft:

  • I2C Gerätecode mittels i2c Scanner geprüft
  • Aufbau mit Wemos D1 Mini erneut gemacht
  • Anderen PCF8574 getestet (gleiche Codierung)
  • Anstelle des fertigen Moduls mit dem PCF Chip, den "Nackten" Chip genutzt.
  • Code mittels OTA hochladen, um zu Prüfen ob WLAN und OTA geklappt hat.

Vielleicht fällt einem von euch noch was ein.

Michael

Das führt dazu, dass deine Parameter überschrieben werden!

Eine Möglichkeit ist:
Das Wire.begin(); aus der Lib zu entfernen

Schreibe doch mal in deinem Sketch, welche Libraries du verwendest. Als Link reinschreiben. Dann kann man auch mehr sehen.
So ist das immer ein stochern im Nebel.

Nur als Info nebenbei, bei mir funktioniert der I2C-Bus am ESP8266-01 problemlos.

Ich bin nochmal zusätzlich in mich gegangen, habe parallel selber nochmal etwas gegooglet und den Fehler gefunden. Das Problem war der Import von der Wire.h Lib.

Hier der Funktionierende Code:

#include <ESP8266WiFi.h>
#include <ArduinoOTA.h>
#include "PCF8574.h"


const char* ssid = "SSID";
const char* password = "Wifi Password";
IPAddress ip(192,168,178,200); 
IPAddress gateway(192,168,178,1);
IPAddress subnet(255,255,255,0);


PCF8574 m1(0x20,0,2);              // Hier ist die Große Änderung mit viel Wirkung

// Neben der Chip Adresse kommen hier noch die Pins für SDA und SCL, wenn ich die wie in meinem Beispiel ändere.


void setup() {
  WiFi.begin(ssid, password);
  WiFi.config(ip, gateway, subnet);     
  SetupOTA();
  m1.begin();
  m1.pinMode(P0,OUTPUT);
 

}

void loop() {
  ArduinoOTA.handle();
  m1.digitalWrite(P0,LOW);
  delay(2000);
  m1.digitalWrite(P0,HIGH);
  delay(2000);

}

void SetupOTA() {
   ArduinoOTA.setHostname("OTA Name");
   ArduinoOTA.setPassword("OTA Code");
   ArduinoOTA.begin();
}

Zusätzlich habe ich alles nochmal neu verzogen auf dem Breadboard und nun Blinkt die LED lustig vor sich hin.

Kleine Ursache Große Wirkung. Sollte ggf. mal öfter näher in die Libs bzw. die Begefügten Readmes gucken.

Michael

Gut, dass es jetzt funktioniert.
Aber gewöhne dir bitte an, die Links der verwendeten Libraries mit zu posten. Dann wird eine Hilfe einfacher und evtl. auch schneller. Schreib dieeinfach hinter die Anweisung zur Einbindung. Das hilft auch dir später.

Okay, weiß ich für die Zukunft.