8Pin_Erweiterung_über_ I2C

Antworten
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

8Pin_Erweiterung_über_ I2C

Beitrag von Admin »

Gestern hatte ich Besuch aus der Arduino Runde des Deutschen Arduino Forums. Er hat mit was dagelassen, was er für seine Controllino Duschen Steuerung benutzt hat. Da hatte es was übrig :)
WaveShare_PCF8574_I2C_8Pin.jpg
WaveShare_PCF8574_I2C_8Pin.jpg (76.34 KiB) 678 mal betrachtet
Diese PCF8574 Baugruppe kann 8 Pin´s über I2C zur Verfügung stellen. Ich weiß noch nicht wie man die anspricht, aber das wird schon noch werden. Ist jedenfalls ganz interessant.

Franz

PS: Hier habe ich mir mal im Netz was rausgesucht. Muß ich erst mal testen.

Code: Alles auswählen

//Programmbeispiel für Portexpander PCF8574-Library
//Code fuer Arduino und Attiny45/85
//Author Retian
//Version 1.2
//Mehr Infos: https://arduino-projekte.webnode.at/meine-libraries/portexpander-pcf8574/

#include <MyPCF8574.h>
MyPCF8574 MyPCF;

#define keyPin 1 //Taste auf PCF8574 - Pin 1
#define ledPin 2 //LED auf PCF8574 - Pin 2


void setup() {
  MyPCF.init(0x20); //oder 0x38 - I2C-Adresse des PCF8574
  if (MyPCF.isReady()) //Wenn PCF8574 bereit, dann blinke 3x
  {
    MyPCF.writeBitLow(ledPin);
    for (byte i = 0; i < 5; i++)
    {
      delay(300);
      MyPCF.toggleBit(ledPin);
    }
  }
  else while (1); //Im Fehlerfall geht's nicht weiter!
}
void loop() {
  //Wenn Taster gedrückt (aktiv LOW), dann LED ein
  if (MyPCF.readBit(keyPin) == 0) MyPCF.writeBit(ledPin, 0);
  //Wenn Taster nicht gedrück, LED aus
  else MyPCF.writeBit(ledPin, 1);
  delay(100);
}
Benutzeravatar
e69-fan
Beiträge: 282
Registriert: Mi 20. Jan 2021, 10:32
Wohnort: Murnau am Staffelsee

Re: 8Pin_Erweiterung_über_ I2C

Beitrag von e69-fan »

:(V): Hallo Franz,

sehr interessant. Halte mich Bitte auf dem Laufenden, Du weißt ja - mein MoBa ist ein gutes Testfeld.

Schönes Wochenende
Wolfgang
Grüße aus der Heimat der E69
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: 8Pin_Erweiterung_über_ I2C

Beitrag von Admin »

Das Programm habe ich wieder zur Seite gelegt. Und ich habe ein anderes ausgegraben. Die Lib von dem gefällt mir besser, weil die offenbar auch gepflegt wird. Jedenfalls soweit ich das sehe. Das ist jetzt das Testprogramm:

Code: Alles auswählen

/**
 *  @Datei
 * @Autor Septillion (https://github.com/sseptillion)
 * @Datum 20.05.2016
 * @brief Beispiel für die Verwendung von buttonRead()
 *
 * Aufgrund des quasi-bidirektionalen Ports am PCF8574 ist es
 * möglich, denselben Pin gleichzeitig als Ein- und Ausgang zu verwenden.
 *
 * Verbinden Sie dazu die LED (oder ein anderes Gerät) zwischen Vcc und dem Pin und
 * eine Taste zwischen GND und dem Pin.
 *
 * Um den Pin zu lesen, ist der Ausgang kurz (460us @ normale I2C-Geschwindigkeit)
 * während des Lesens hoch eingestellt. Also nur Geräte verwenden, die die kleine Pause verkraften
 * im Zustand. Es ist für das menschliche Auge mit einer LED nicht sichtbar.
 *
 * buttonRead() kann auch für Pins verwendet werden, die nur eingegeben werden.
 *
 * In diesem Beispiel wird Pin 0 des PCF8574 (Adresse 0x20) verwendet um a). zu blinken,
 * kann aber gleichzeitig verwendet werden, um die Onboard-LED umzuschalten.
 *
 * HINWEIS: Die Taste beeinflusst die LED am selben Pin. Die LED leuchtet auf
 * unabhängig vom eingestellten Ausgangszustand, wenn Sie die Taste drücken.
 * Weil Minus über die Taste und weiter über die LED nach Plus.
 */

#include <PCF8574.h>
#include <Wire.h>

PCF8574 pcf20(0x20);

const byte onboardLed = 13;
const byte PcfButtonLedPin = 0;

unsigned int blinkMillis;
unsigned int buttonMillis;

void setup() {
  Serial.begin(115200);
  pcf20.begin();
  
  pinMode(onboardLed, OUTPUT);
}

void loop() {
  static bool state;
  unsigned int currentMillis = millis();
  
  // Beschränken Sie das Lesen der Taste auf 20 Mal pro Sekunde
   // Schnell genug für die meisten Tasten
   // aber auf diese Weise haben Sie keinen Dimmer-Ausgang, da er während des Lesens der Schaltfläche ausgeblendet wird
   // Ein Lesen dauert 460us t 16Mhz Arduino und normale I2C-Geschwindigkeit. 
  if(currentMillis - buttonMillis >= 50){
    buttonMillis = currentMillis;
    
    if(state != pcf20.readButton(PcfButtonLedPin)){
      if(state){
        //toggle der LED
        digitalWrite(onboardLed, !digitalRead(onboardLed));
      }
      state = !state;
    }
  }
  
  //Lässt die gleiche Ausgabe blinken 
  if(currentMillis - blinkMillis >= 500){
    //Update time
    blinkMillis = currentMillis;
    
    pcf20.toggle(PcfButtonLedPin);
    Serial.println(pcf20.read8(), BIN);
  }
}
Es funktioniert bereits, aber ich weiß noch nicht in allen Punkten wie und warum es funtioniert. Muss ich noch ein bischen testen.
Franz :(V):
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: 8Pin_Erweiterung_über_ I2C

Beitrag von Admin »

Ich habe mal noch ein paar Erklärungen dazu geschrieben, dass man sieht was - wo passiert.
Übrigens kann diese Erweiterung an dem Pin einen Tastendruck oder Lichtschranke erkennen wenn er wenigstens 50ms lang ist und kann gleichzeitig eine LED am selben Pin schalten.

Code: Alles auswählen

/**
    @Datei
   @Autor Septillion (https://github.com/sseptillion)
   @Datum 20.05.2016
   @brief Beispiel für die Verwendung von buttonRead()

   Aufgrund des quasi-bidirektionalen Ports am PCF8574 ist es
   möglich, denselben Pin gleichzeitig als Ein- und Ausgang zu verwenden.

   Verbinden Sie dazu die LED (oder ein anderes Gerät) zwischen Vcc und dem Pin und
   eine Taste zwischen GND und dem Pin.

   Um den Pin zu lesen, ist der Ausgang kurz (460us @ normale I2C-Geschwindigkeit)
   während des Lesens hoch eingestellt. Also nur Geräte verwenden, die die kleine Pause verkraften
   im Zustand. Es ist für das menschliche Auge mit einer LED nicht sichtbar.

   buttonRead() kann auch für Pins verwendet werden, die nur eingegeben werden.

   In diesem Beispiel wird Pin 0 des PCF8574 (Adresse 0x20) verwendet um a). zu blinken,
   kann aber gleichzeitig verwendet werden, um die Onboard-LED umzuschalten.

   HINWEIS: Die Taste beeinflusst die LED am selben Pin. Die LED leuchtet auf
   unabhängig vom eingestellten Ausgangszustand, wenn Sie die Taste drücken.
   Weil Minus über die Taste und weiter über die LED nach Plus.
*/

#include <PCF8574.h>
#include <Wire.h>

PCF8574 pcf20(0x20);

const byte onboardLed = 13;
const byte PcfButtonLedPin = 0; // Pin.0 an der I2C Expansion
static bool state;
unsigned int currentMillis;
unsigned int blinkMillis;
unsigned int buttonMillis;

void setup() {
  Serial.begin(115200);
  pcf20.begin();

  pinMode(onboardLed, OUTPUT);
}

void loop() {

  currentMillis = millis();

  // Beschränken Sie das Lesen der Taste auf 20 Mal pro Sekunde
  // Schnell genug für die meisten Tasten
  // aber auf diese Weise haben Sie keinen Dimmer-Ausgang, da er während des Lesens der Schaltfläche ausgeblendet wird
  // Ein Lesen dauert 460us t 16Mhz Arduino und normale I2C-Geschwindigkeit.

  if (currentMillis - buttonMillis >= 50) { // Alle 50ms durchlaufen
    buttonMillis = currentMillis;
    if (state != pcf20.readButton(PcfButtonLedPin)) { // Button Abfrage alle 50ms
      if (state) { // Ist Taste gedrückt also "true" gleich "HIGH" oder "1"
        //toggle der LED
        digitalWrite(onboardLed, !digitalRead(onboardLed));
      }
      state = !state;
    }
  }
  //Lässt die gleiche Ausgabe blinken
  if (currentMillis - blinkMillis >= 500) {
    //Update time
    blinkMillis = currentMillis;
    pcf20.toggle(PcfButtonLedPin); // Pin0 umschalten 0->1 oder 1->0
    Serial.println(pcf20.read8(), BIN); // Alle 8 Pin´s binär darstellen
  }
}
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: 8Pin_Erweiterung_über_ I2C

Beitrag von Admin »

Man kann damit auch ein paar Meter weg vom Arduino Tasten abfragen, Dinge, LED´s ein/aus schalten. Infrarotschranken kontrollieren. Also viele schöne Sachen. Ich werde mal über ein paar Meter langes Kat.6 Kabel vom Arduino zu dem I2C Baustein gehen. Und kontrollieren, ob es zuverlässig läuft.

Franz
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: 8Pin_Erweiterung_über_ I2C

Beitrag von Admin »

Ich habe mal ein Foto gemacht, wo man den LED Tackt 500ms sieht, und den Tastenabfrage Tackt 50ms. Die Tastenabfrage ist natürlich nicht nur im LOW Durchgang sondern auch im HIGH Durchgang. Aber im LOW Durchgang sieht man die kurzen Positionen alle 50ms, in denen auf LOW vom Taster geprüft wird. Dass die LED´s dabei keinen Minus bekommen, ist fürs Auge unsichtbar, weil das nur ein paar ms im Abstand von 50ms sind, in denen auf Tastendruck getestet wird. Die Striche Richtung HIGH entstehen, weil die LED´s fest mit HIGH verbunden sind und der GND da für ein paar ms nicht an den LED´s ansteht. In diesen kurzen Zeiten kann auf LOW über die Taste getestet werden.
I2C_Externe_Pins.jpg
I2C_Externe_Pins.jpg (211.92 KiB) 658 mal betrachtet
Antworten

Zurück zu „Hardware / Schaltungstechnik“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste