Mit ESP8266 AIN0 am PCF8591 auslesen

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo zusammen,

    vor kurzem bin ich auf den Geschmack der MicroController und Elektrotechnik gekommen. Zum lernen habe ich mir das Sensorpaket von Sunfounder für Raspberry Pi gegönnt, der einzigste Unterschied ist das ich die Sensoren mit einem ESP8266 NodeMCU und dem SDK RTOS welches der Hersteller anbietet nutze.

    Nun habe ich die Situation das ich gerne den Wert eines Analogen Potentiometer Moduls welches am AD/DA Wandler PCF8591 angeschlossen ist über den ESP8266 auslesen möchte. Leider erhalte ich bei der Kommunikation über das I2C Protokoll immer nur den Wert 255.

    Der Aufbau ist gleich wie auf dem SunFounder Projekt (https://www.sunfounder.com/learn/sensor-k…for-b-plus.html). Bei dem ESP8266 kamen dann die Pins D2 und D4 zum Einsatz.

    Vielleicht hat ja jemand nen Tipp für mich wie das doch noch was wird?!

    Anbei noch der Code für das ganze:

  • Moin guenni81,

    erstmal: Herzlich Willkommen im Forum!

    Der ESP8266 hat von hause her keine I2C hardware. Woher weißt du das D2 und D4 die richtigen Pin's sind?

    Ich denke du musst erstmal in der Beschreibung von i2c_master.h nachlesen welche Pin's genutzt werden.

    Gruss Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • bombom:

    Der ESP kann zwar analog verarbeiten. Aber nichts über 1V, wenn ich mich richtig erinnere.

    guenni81:

    Es ist schon eine Weile her. Daher musste ich etwas suchen. Schau mal hier:

    ESP8266 Erweiterungsboard (mehr digitale I/O und analoge Eingänge)

    In Beitrag #5 steht ein Code, dort findest Du in Zeile 9 und 10 vielleicht einen Lösungsansatz für Dein Problem.

  • Moin!

    Der ESP8266 kann zwar analoge Spannungen messen, aber falsch.

    Durch einen Designfehler wird nicht korrekt gemessen.

    Gruss Bernd

    /EDIT Siehe LINK

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

    Einmal editiert, zuletzt von Bernd666 (23. September 2019 um 13:47)

  • Warum so kompliziert? Du kannst mit dem ESP8266 direkt analoge Werte messen.

    Ausserdem empfehle ich dir mit der Arduino IDE zu arbeiten.

    Die Arduino IDE ist nicht so mein Fall, ich bevorzuge eher vscode da mir dies einige Vorteile bietet.

    Es geht auch eher um den Lerneffekt bei der ganzen Sache, deswegen läuft dies über den PCF8591.


    Moin guenni81,

    erstmal: Herzlich Willkommen im Forum!

    Der ESP8266 hat von hause her keine I2C hardware. Woher weißt du das D2 und D4 die richtigen Pin's sind?

    Ich denke du musst erstmal in der Beschreibung von i2c_master.h nachlesen welche Pin's genutzt werden.

    Gruss Bernd

    Danke für das Willkommen!

    Laut Dokumentation des ESP8266 kann man mit diesem im Master Modus arbeiten. Die anzusprechende Hardware ist ja der PCF8591 welchen man über I2C addressieren kann. Die Pins habe ich mir wie du schon vorgeschlagen hast in der Datei i2c_master.h angeschaut und gegengeprüft. Dort sind diese dann als

    Code
    #define I2C_MASTER_SDA_GPIO 2
    #define I2C_MASTER_SCL_GPIO 4

    Definiert, wobei GPIO2 dem D4 und GPIO 4 dem D2 entspricht. Eine Verbindung kommt ja hier zu Stande, zumindest bekomme ich ein positives Acknowledge zurück.

    Danke schön, das mit dem durchscannen könnte ich tatsächlich mal versuchen, vielleicht bringt mich dieses weiter.


    Gruß Günni

  • Moin Günni,

    gut, dann wurde das ja geklärt.

    habe ich es richtig verstanden. Du hast nicht am Poti gedreht, während das Programm lief?

    Gruss Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • In der Beschreibung des "AD/DA Wandler PCF8591" vielleicht. Ist das ein fertiges Modul? Gibt es eventuell irgendwelche Aufschriften, die man einer Suchmaschine Füttern kann. War es bei einem Set dabei - wenn ja bei welchem?

    ...wenn Software nicht so hard-ware ;) ...

    Freue mich über jeden like :thumbup:

  • Ok, also im Schaltplan sieht man jeweils einen 10K PullUp Widerstand an SDA und SCL (R2 und R3) - das ist also nicht das Problem...

    Dein Quellcode scheint mir etwas eigenartig. Es wird zwar #define PCF8591 0x48 definiert - aber nirgends verwendet.

    PCF8591 müsste ja irgenwo übergeben werden, damit die Routinen wissen mit welcher Adresse sie sprechen sollen!?

    Woher ist dieser Code???

    ...wenn Software nicht so hard-ware ;) ...

    Freue mich über jeden like :thumbup:

  • Der Code ist von mir, so wie die #define Anweisung. Hab den mittlerweile nur zig mal geändert beim probieren und die Hex Anweisungen irgendwann direkt so ohne #define rein geschrieben. Da werden aktuell 0x92 und 0x93 direkt im Code genutzt. Damit wollte ich beim Addressing A0 aktivieren, einmal schreibend und dann lesend.

  • Moin!

    Ich bin auch gerade am Lesen.

    Aber ich komme nicht dahinter, wie sich defaultmässig die 0x48 ergeben soll.

    0x48 = 0b0100 1000

    Es geht nur wenn um 1 nach Links shiftet, wegen R/W. Dann wäre es 0b1001 000x = 0x90/91.

    Dann muss noch ein 2tes Bayt geschickt werden.

    Siehe hier:

    Gruss Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

    Einmal editiert, zuletzt von Bernd666 (24. September 2019 um 21:20)

  • Moin!

    Dann muss aber doch noch eine Read-Befehl kommen, sprich 0x91.

    Gruss Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Korrekt, allerdings ist das ein 0x93, da ich hier ja die A0 Addresse mit angebe. Hab es mal als Kommentar hinter die Zeile geschrieben und ein wenig gekürzt.

  • Moin Günni,

    laut Schaltplan ist das aber egal mit dem 0x92 0x93, weil A0, A1 und A2 fest auf 0 gedrahtet sind.

    Meiner Meinung muss das so aussehen:

    INIT = send(0x90) send(0x00)

    READ = send(0x91)

    Byte empfangen

    Gruss Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!