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
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?
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
Vielleicht liest du das hier mal:
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.
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.
Okay dann muss ich mich da Mal einlesen, Dankeschön
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.