Pn532 + RTC gleichzeitig an i2c anschließen (TCA9548A)

Um Probleme für Dich zu generieren, damit Du nicht damit zuviel beschäftigi bist?

Es tut mir leid, ich habe einen Fehler gemacht und nicht den aktuellen code eingefügt:

#include <PN532_I2C.h>
#include <PN532.h>
#include <NfcAdapter.h>
#include <Wire.h>
#include <RTClib.h> // RTC-Bibliothek, z.B. für DS3231 RTC-Modul
#include <SD.h>


PN532_I2C pn532_i2c(Wire);
NfcAdapter nfc = NfcAdapter(pn532_i2c);

RTC_DS3231 rtc; // RTC-Objekt erstellen

const int muxAddress = 0x70; // I2C-Adresse des TCA9548A
const byte muxChannel0 = 0x01; // Kanal 0 des Multiplexers
const byte muxChannel1 = 0x02; // Kanal 1 des Multiplexers

const int ledPin = 2; // Pin für die LED
const int chipSelect = 10; // CS-Pin des SD-Kartenmoduls

void setup() {
  Serial.begin(9600);
  Serial.println("System initialized");
  
  // Initialisiere SD-Karte
  if (!SD.begin(chipSelect)) {
    Serial.println("SD-Karte konnte nicht initialisiert werden.");
    return;
  }
  Serial.println("SD-Karte initialisiert.");
  
  nfc.begin();
  pinMode(ledPin, OUTPUT); // Den Pin als Ausgang für die LED konfigurieren
  
  // Initialisiere die RTC
  if (!rtc.begin()) {
    Serial.println("RTC konnte nicht gefunden werden!");
    while (1);
  }

  // Initialisiere den TCA9548A
  Wire.begin();
}

void loop() {
  readNFC();
}

void selectBus(byte channel) {
  Wire.beginTransmission(muxAddress);
  Wire.write(1 << channel);
  Wire.endTransmission();
  delay(10); // Kurze Pause für Stabilität
}

void readNFC() {
  // Aktiviere Bus 0 (wo PN532 angeschlossen ist)
  selectBus(muxChannel0);
  
  if (nfc.tagPresent()) {
    // Aktiviere Bus 1 (wo RTC angeschlossen ist)
    selectBus(muxChannel1);

    NfcTag tag = nfc.read();
    Serial.println("NFC Tag detected");
    
    NdefMessage message = tag.getNdefMessage();
    NdefRecord firstRecord = message.getRecord(0);
    
    byte payload[11]; // Maximale Länge der Nutzlast ist 11 Bytes
    firstRecord.getPayload(payload);
    
    String payloadText = "";
    for (int i = 0; i < 11; i++) {
      payloadText += (char)payload[i];
    }
    
    String numberPayload = "";
    for (int i = 0; i < payloadText.length(); i++) {
      if (isdigit(payloadText.charAt(i))) {
        numberPayload += payloadText.charAt(i);
      }
    }
    
    // Die Zahl in einen Integer konvertieren
    int number = numberPayload.toInt();
    
    Serial.print("Number from NFC Tag: ");
    Serial.println(number);
    
    // Speichern der Zahl in einer Datei auf der SD-Karte
    String filename = String(number) + ".txt";
    File dataFile = SD.open(filename, FILE_WRITE);
    if (dataFile) {
      // Uhrzeit lesen
      DateTime now = rtc.now();
      // Uhrzeit in die Datei schreiben
      dataFile.print("Uhrzeit: ");
      dataFile.print(now.hour());
      dataFile.print(":");
      dataFile.print(now.minute());
      dataFile.print(":");
      dataFile.print(now.second());
      dataFile.close();
      
      String delayStr = dataFile.readStringUntil('\n');
      int delayValue = delayStr.toInt();
      
      Serial.print("Delay from file: ");
      Serial.println(delayValue);
      
      // Verarbeitung der Zahl, z.B. für das Delay
      digitalWrite(ledPin, HIGH); // Die LED einschalten
      delay(delayValue); // Hier wird das Delay verwendet
      digitalWrite(ledPin, LOW); // Die LED ausschalten
    } else {
      Serial.println("Fehler beim Öffnen der Datei: " + filename);
    }

    // Deaktiviere Bus 1
    selectBus(muxChannel0);
  }
  delay(2000);
}

v2

#include <Wire.h>
#include <RTClib.h>
#include <PN532_I2C.h>
#include <PN532.h>
#include <NfcAdapter.h>
#include <SD.h>

PN532_I2C pn532_i2c(Wire);
NfcAdapter nfc = NfcAdapter(pn532_i2c);

RTC_DS3231 rtc;
const int muxAddress = 0x70;  // I2C Adresse des TCA9548A

const int ledPin = 2; // Pin für die LED
const int chipSelect = 10; // CS-Pin des SD-Kartenmoduls

void setup() {
  Serial.begin(9600);
  Serial.println("System initialized");

  // Initialisiere SD-Karte
  if (!SD.begin(chipSelect)) {
    Serial.println("SD-Karte konnte nicht initialisiert werden.");
    return;
  }
  Serial.println("SD-Karte initialisiert.");

  // Initialisiere die RTC
  if (!rtc.begin()) {
    Serial.println("RTC konnte nicht gefunden werden!");
    while (1);
  }

  pinMode(ledPin, OUTPUT); // Den Pin als Ausgang für die LED konfigurieren
  Wire.begin();
}

void loop() {
  TCA9548A(0); // Aktiviere Bus 0 (PN532)
  delay(100); // Kurze Verzögerung für Stabilität

  readNFC();
}

void TCA9548A(uint8_t bus) {
  Wire.beginTransmission(muxAddress);
  Wire.write(1 << bus);  // sende Byte zur Auswahl des Busses
  Wire.endTransmission();
}

void readNFC() {
  if (nfc.tagPresent()) {
    // Deaktiviere Bus 0 (PN532) und aktiviere Bus 1 (RTC)
    TCA9548A(1);
    delay(100); // Kurze Verzögerung für Stabilität

    NfcTag tag = nfc.read();
    Serial.println("NFC Tag detected");

    // Lese NFC-Daten und führe weitere Aktionen aus

    // Aktiviere Bus 0 (PN532) und deaktiviere Bus 1 (RTC)
    TCA9548A(0);
  }
  delay(2000);
}

Besser ist es, wenn du die Anweisung "Wire.begin()" an den Anfang des setup() setzt.
Und wozu verwendest du den "TCA9548A" ?
Dir wurde doch schon geschrieben, den brauchst du nicht.

Okay danke für den tipp :smiley:
Ich habe keine andere Lösung gefunden, beides per i2c anzuschließen hat ja nicht funktioniert. Eigentlich klang der TCA nach der Lösung

Vermutlich weil dein Sketch fehlerhaft war.
Einen I2C Multiplexer brauchst du def. nicht. Wie du siehst, werden die Probleme nicht weniger.

Alles klar, das war ein code: der pn532 hat nicht funktioniert.

#include <Wire.h>
#include <RTClib.h>
#include <PN532_I2C.h>
#include <PN532.h>
#include <NfcAdapter.h>
#include <SD.h>

PN532_I2C pn532_i2c(Wire);
NfcAdapter nfc = NfcAdapter(pn532_i2c);

RTC_DS3231 rtc;

const int ledPin = 2; // Pin für die LED
const int chipSelect = 10; // CS-Pin des SD-Kartenmoduls

void setup() {
  Serial.begin(9600);
  Serial.println("System initialized");

  // Initialisiere SD-Karte
  if (!SD.begin(chipSelect)) {
    Serial.println("SD-Karte konnte nicht initialisiert werden.");
    return;
  }
  Serial.println("SD-Karte initialisiert.");

  // Initialisiere die RTC
  if (!rtc.begin()) {
    Serial.println("RTC konnte nicht gefunden werden!");
    while (1);
  }

  // Initialisiere den PN532
  nfc.begin();

  pinMode(ledPin, OUTPUT); // Den Pin als Ausgang für die LED konfigurieren
}

void loop() {
  readNFC();
}

void readNFC() {
  if (nfc.tagPresent()) {
    NfcTag tag = nfc.read();
    Serial.println("NFC Tag detected");

    // Lese NFC-Daten
    // Lese NFC-Daten
NdefMessage message = tag.getNdefMessage();
NdefRecord firstRecord = message.getRecord(0);

int payloadLength = firstRecord.getPayloadLength();
byte payload[payloadLength];
firstRecord.getPayload(payload);
String payloadText = "";
for (int i = 0; i < payloadLength; i++) {
  payloadText += (char)payload[i];
}

    Serial.print("Payload from NFC Tag: ");
    Serial.println(payloadText);

    // Öffne oder erstelle die Datei auf der SD-Karte
    String filename = payloadText + ".txt";
    File dataFile = SD.open(filename, FILE_WRITE);
    if (dataFile) {
      // Prüfe, ob die Datei bereits existiert
      if (dataFile.size() == 0) {
        // Schreibe den Wert 500 in die Datei, wenn sie noch leer ist
        dataFile.println("500");
      }

      // Schreibe die aktuelle Zeit in die Datei
      DateTime now = rtc.now();
      dataFile.print("Last scan time: ");
      dataFile.println(now.timestamp(DateTime::TIMESTAMP_FULL));
      dataFile.close();
      Serial.println("Zeit erfolgreich in die Datei geschrieben.");

      // Aktiviere die LED mit dem in der Datei geschriebenen Delay
      File delayFile = SD.open(payloadText + ".txt");
      if (delayFile) {
        String delayStr = delayFile.readStringUntil('\n');
        int delayValue = delayStr.toInt();
        delayFile.close();
        digitalWrite(ledPin, HIGH); // Die LED einschalten
        delay(delayValue); // Hier wird das Delay verwendet
        digitalWrite(ledPin, LOW); // Die LED ausschalten
      } else {
        Serial.println("Fehler beim Öffnen der Datei für das Delay.");
      }
    } else {
      Serial.println("Fehler beim Öffnen oder Erstellen der Datei: " + filename);
    }
  }
  delay(2000);
}

Hallo,

du bekommst einen Sketch zum Laufen mit Pn532 und du bekommst einen Sketch zum Laufen mit RTC? Einzeln ist alles i.O.? Nur zusammen funktioniert es nicht wegen einer Blockierung? Wenn dem so ist, dann stört sicherlich das delay von 2s. Kann das sein?

1 Like

Genau und ich habe gedacht es liegt daran, dass man nicht 2 gleichzeitig an i2c anschließen kann. Das mit dem delay werde ich bald testen, danke :slight_smile:

Vielleicht liest du das hier mal:

1 Like

Hallo,

dann musst du dich mit millis() befassen um damit 2 unabhängige Vergleichsuhren zu bauen. Ob die Differenzzeit schon um ist. Diese 3 Quellen sollten dir auf die Sprünge helfen.

Theseus erklärt millis()

GuntherB - BlinkwithoutDelay - Die Nachtwächtererklärung

Beruht alles auf dem IDE Bsp.: 02.Digital -> BlinkwithoutDelay

Für die RTC auslesen solltest du 1s Abfrageintervall wählen. Sodass du laut deinem Eingangspost je eine Uhr bzw. Timer mit 2s und 1s hast. Dann arbeitet die loop ohne Blockierung und du könntest noch viel mehr gefühlt quasi parallel abarbeiten lassen. In echt wird alles ohne künstliche Pause hintereinander abgearbeitet.

1 Like

Okay dann muss ich mich da Mal einlesen, Dankeschön :blush:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.