2 .ino zusammenfügen. Anfänger. Bitte um Hilfe

Hallo zusammen,
arbeite seit einiger Zeit eigenständig mit Hilfe von viel lesen an einem kleinen RFID Projekt. :slight_smile:
ein RC522 sowie Relais hängen an einem Wemos D1 Mini als Steuerplatine.

Im ersten Sketch wird RFID-RC522 mit 5 verschiedenen Karten bedient und es wird an I2C OLED SSD1306 Display Name ausgegeben und PIN 16, GPIO 0 für 2sekunden LOW geschaltet. das macht die Tür auf.

Im zweiten Sketch habe ich ein HTTP Beispiel so angepasst das Aufruf vom Handy(Kurzbefehl) das Relais für 2 sek auf LOW ansteuert und somit das gleiche Ergebnis wie oben zustande kommt.

Einzeln funktionieren beide so wie ich es mir vorgestellt habe.

Jetzt versuche ich den ganzen Tag beide so zusammenzuführen das es eben komplett funktioniert.
Leider erfolglos. Bin soweit gekommen das HTTP funktioniert aber eben RFID hängt oder gar nicht abgefragt wird ?

Bin für jede Hilfe dankbar. LG an alle

OLED_RFID_Test.zip (1.47 KB)

LED_ein_aus.zip (778 Bytes)

Und warum postest du das als zip-Datei und nicht direkt im Forum in Code-Tags ?

HotSystems:
Und warum postest du das als zip-Datei und nicht direkt im Forum in Code-Tags ?

Hallo Dieter, hatte Fehlermeldung das Post auf 9000 Buchstaben begrenzt sei :-). Hier 1. Code abgekürzt auf 1 Karte :slight_smile:

#include <SPI.h>
#include <MFRC522.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Arduino.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
//
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define SS_PIN          15         // Pin: D8
#define RST_PIN         0          // Pin: D3
int PIN_SWITCH = 16;     // Pin D0/GPIO 16 als Ausgang
long chipID;


// MFRC522-Instanz erstellen
MFRC522 mfrc522(SS_PIN, RST_PIN);

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

  pinMode(16, OUTPUT);
  // SPI-Bus initialisieren
  SPI.begin();

  // MFRC522 initialisieren
  mfrc522.PCD_Init();

  //Kurze Pause nach dem Initialisieren
  delay(10);
  Serial.println("");

  // Details vom MFRC522 RFID READER / WRITER ausgeben
  mfrc522.PCD_DumpVersionToSerial();


  Serial.println("RFID-Chip auflegen, um UID anzuzeigen...");

  // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x64)
  // Clear the buffer.
  display.clearDisplay();
}

void loop() {

  // Sobald ein Chip aufgelegt wird startet diese Abfrage
  if (mfrc522.PICC_IsNewCardPresent()) {

    //CardID resetten
    chipID = 0;

    mfrc522.PICC_ReadCardSerial();

    // Hier wird die ID des Chips in die Variable chipID geladen
    for (byte i = 0; i < mfrc522.uid.size; i++) {
      chipID = ((chipID + mfrc522.uid.uidByte[i]) * 10);
    }

    //... und anschließend ausgegeben
    Serial.println(chipID);

    if (chipID == 1047810) {
      Serial.println("Hallo Papa!");
      // text display tests
      display.setTextSize(2);
      display.setTextColor(WHITE);
      display.setCursor(0, 0);
      display.println("  Familie");
      display.println("  GRACIC");
      display.println("    ");
      display.println("  Hi Papa");
      display.display();
      display.clearDisplay();
      digitalWrite(PIN_SWITCH, LOW);            // Pin D0, GPIO16 auf Low setzten
      delay(2000);                          // 2s warten
      digitalWrite(PIN_SWITCH, HIGH);           // Pin D0, GPIO16 auf High setzten
      display.setTextSize(2);
      display.setTextColor(WHITE);
      display.setCursor(0, 0);
      display.println("  Familie");
      display.println("  GRACIC");
      display.println("    ");
      display.setTextColor(BLACK);
      display.println("  Hi Papa");
      display.display();
      display.clearDisplay();
    }
    
    // Danach 1 Sekunden pausieren, um mehrfaches lesen /ausführen zu verhindern
    delay(1000);

  }



}

und das 2 Code

#include <ESP8266WiFi.h>

const char* SSID = "mein ssid";
const char* PSK = "meinpasswort";

WiFiServer server(80);

void setup() {
  pinMode(16, OUTPUT);

  initWiFi();
}

void loop() {
  WiFiClient client = server.available();
  if (!client) {
    return;
  }

  if (WiFi.status() != WL_CONNECTED) {
    initWiFi();
  }

  String request = client.readStringUntil('\r');
  client.flush();

  if (request == "") {
    client.stop();
    return;
  }

  //GPIO 0 schalten
  if (request.indexOf("mode=1") >= 0) {
    digitalWrite(16, 0);        // GPIO 0 LOW
    delay(2000);                // 2s warten
    digitalWrite(16, 1);        // GPIO 0 HIGH
  }
  else if (request.indexOf("mode=0") >= 0) {
    digitalWrite(16, 1);
  }

  //Ausgabe erzeugen
  String output;
  output += "http/1.x 200 OK\n";
  output += "Content-Type: text/html; charset=UTF-8\n\n";
  output += "<!DOCTYPE HTML>";
  output += "<html>";
  output += "<h1>LED schalten</h1>";
  output += "<form action=\"\" method=\"GET\">";
  output += "<button name=\"mode\" value=\"1\">AN</button>";
  output += "   ";
  output += "<button name=\"mode\" value=\"0\">AUS</button>";
  output += "</form>";
  output += "</html>";

  client.print(output);

  client.stop();
}

void initWiFi() {
  WiFi.begin(SSID, PSK);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }

  server.begin();
}

LG
P.S vieles könnte man wahrscheinlich weglassen und abkürzen das werde ich noch machen. Wichtig das es erstmal funktioniert.

Ok, nimm den funktionierenden Sketch mit der HTTP-Seite und baue die anderen Teile darin ein. Nutze dazu für die vorhandene loop eine eigene Funktion und rufe diese aus der loop im HTTP-Sketch auf. Kopiere die Deklarationen aus dem Setup in das neue Setup und achte darauf, dass keine doppelten Namen entstehen. Mache das auch mit den Variablen definitionen.

Und sieh dir dazu auch die Beispiele auf der Seite von Fips an.

Hallo,

eigentlich musste ja nur die Teile von setup nach setup und von loop nach loop kopieren. Aber dich werden dann die delays behindern, gerade beim WLAN. Demzufolge musst du den Umgang mit millis erlernen.

Doc_Arduino:
Hallo,

eigentlich musste ja nur die Teile von setup nach setup und von loop nach loop kopieren. Aber dich werden dann die delays behindern, gerade beim WLAN. Demzufolge musst du den Umgang mit millis erlernen.

Naja, das wäre doch ziemlich einfach.
Man sollte dabei die includes und Deklarationen nicht vergessen.

Und eine eigene Funktion ist für eine evtl. Fehlersuche und spätere Erweiterung auch besser.

Doc_Arduino:
Hallo,

eigentlich musste ja nur die Teile von setup nach setup und von loop nach loop kopieren. Aber dich werden dann die delays behindern, gerade beim WLAN. Demzufolge musst du den Umgang mit millis erlernen.

Hallo, habe genau dieses auch mal gemacht und durch Compiler durhgejagt, Ergebniss 0 Fehler aber nicht funktionierndes RFID und OLED. Durch ganze IF werde ich nicht schlau. Wlan steht auch nach 2 Stunden und kann per HTTP schalten aber RFID und OLED reagieren nicht.
Kannst du eventuell den Code zusammenfügen damit es funktioniert. LG
P.S Millis hatte ich mal gesehen aber 0 Erfahrung .-)

Aufbau sollte m.M nach so werden:
-Wlan verbinden und Http Client erstellen

  • RFID Reader Initiasisieren
    -OLED Init
  • Standby
  • Immer wieder abfragen: kommt Http Anforderung Relais 2sek schalten
  • Wird Karte erkannt die abgelegt ist Relais für 2 sek steuern + OLED dementsprechend ansteuern
    -Fertig

Und warum zeigst du nicht deinen Versuch ?
Dann können wir wenigstens erkennen, wo dein Problem liegt.

#include <SPI.h>
#include <MFRC522.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <ESP8266WiFi.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define SS_PIN          15         // Pin: D8
#define RST_PIN         0          // Pin: D3
int pinOut = 16;     // Pin D0/GPIO 16 als Ausgang
long chipID;
const char* SSID = "meinwlan";
const char* PSK = "testpasswort";
WiFiServer server(80);

// MFRC522-Instanz erstellen
MFRC522 mfrc522(SS_PIN, RST_PIN);

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

  initWiFi();
  pinMode(16, OUTPUT);
  // SPI-Bus initialisieren
  SPI.begin();

  // MFRC522 initialisieren
  mfrc522.PCD_Init();

  //Kurze Pause nach dem Initialisieren
  delay(10);
  Serial.println("");

  // Details vom MFRC522 RFID READER / WRITER ausgeben
  mfrc522.PCD_DumpVersionToSerial();


  Serial.println("RFID-Chip auflegen, um UID anzuzeigen...");

  // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x64)
  // Clear the buffer.
  display.clearDisplay();
}

void loop() {
  {
  WiFiClient client = server.available();
  if (!client) {
    return;
  }

  if (WiFi.status() != WL_CONNECTED) {
    initWiFi();
  }

  String request = client.readStringUntil('\r');
  client.flush();

  if (request == "") {
    client.stop();
    return;
  }

  //GPIOS schalten
  if (request.indexOf("mode=1") >= 0) {
    digitalWrite(16, 0);
    delay(2000);
    digitalWrite(16, 1);
  
  

  //Ausgabe erzeugen
  String output;
  output += "http/1.x 200 OK\n";
  output += "Content-Type: text/html; charset=UTF-8\n\n";
  output += "<!DOCTYPE HTML>";
  output += "<html>";
  output += "<h1>LED schalten</h1>";
  output += "<form action=\"\" method=\"GET\">";
  output += "<button name=\"mode\" value=\"1\">AN</button>";
  output += " ";
  output += "<button name=\"mode\" value=\"0\">AUS</button>";
  output += "</form>";
  output += "</html>";

  client.print(output);

  client.stop();
}
   //                       HIER GEHT'S NICHT WEITER WAHRSCHEINLICH !!!
  // Sobald ein Chip aufgelegt wird startet diese Abfrage
  if (mfrc522.PICC_IsNewCardPresent()) {

    //CardID resetten
    chipID = 0;

    mfrc522.PICC_ReadCardSerial();

    // Hier wird die ID des Chips in die Variable chipID geladen
    for (byte i = 0; i < mfrc522.uid.size; i++) {
      chipID = ((chipID + mfrc522.uid.uidByte[i]) * 10);
    }

    //... und anschließend ausgegeben
    Serial.println(chipID);

    if (chipID == 1047810) {
      Serial.println("Hallo Papa!");
      // text display tests
      display.setTextSize(2);
      display.setTextColor(WHITE);
      display.setCursor(0, 0);
      display.println("  Familie");
      display.println("  GRACIC");
      display.println("    ");
      display.println("  Hi Papa");
      display.display();
      display.clearDisplay();
      digitalWrite(pinOut, LOW);            // Pin D0, GPIO16 auf Low setzten
      delay(2000);                          // 2s warten
      digitalWrite(pinOut, HIGH);           // Pin D0, GPIO16 auf High setzten
      display.setTextSize(2);
      display.setTextColor(WHITE);
      display.setCursor(0, 0);
      display.println("  Familie");
      display.println("  GRACIC");
      display.println("    ");
      display.setTextColor(BLACK);
      display.println("  Hi Papa");
      display.display();
      display.clearDisplay();

    }

    if (chipID == 901540) {
      Serial.println("Hallo Tialda!");
      // text display tests
      display.setTextSize(2);
      display.setTextColor(WHITE);
      display.setCursor(0, 0);
      display.println("  Familie");
      display.println("  GRACIC");
      display.println("    ");
      display.println(" Hi Tialda");
      display.display();
      display.clearDisplay();
      digitalWrite(pinOut, LOW);            // Pin D0, GPIO16 auf Low setzten
      delay(2000);                          // 2s warten
      digitalWrite(pinOut, HIGH);           // Pin D0, GPIO16 auf High setzten
      display.setTextSize(2);
      display.setTextColor(WHITE);
      display.setCursor(0, 0);
      display.println("  Familie");
      display.println("  GRACIC");
      display.println("    ");
      display.setTextColor(BLACK);
      display.println(" Hi Tialda");
      display.display();
      display.clearDisplay();
    }

    if (chipID == 2013960) {
      Serial.println("Hallo Alma!");
      // text display tests
      display.setTextSize(2);
      display.setTextColor(WHITE);
      display.setCursor(0, 0);
      display.println("  Familie");
      display.println("  GRACIC");
      display.println("    ");
      display.println("  Hi Alma");
      display.display();
      display.clearDisplay();
      digitalWrite(pinOut, LOW);            // Pin D0, GPIO16 auf Low setzten
      delay(2000);                          // 2s warten
      digitalWrite(pinOut, HIGH);           // Pin D0, GPIO16 auf High setzten
      display.setTextSize(2);
      display.setTextColor(WHITE);
      display.setCursor(0, 0);
      display.println("  Familie");
      display.println("  GRACIC");
      display.println("    ");
      display.setTextColor(BLACK);
      display.println("  Hi Alma");
      display.display();
      display.clearDisplay();
    }
    if (chipID == 2187100) {
      Serial.println("Hallo Nana!");
      // text display tests
      display.setTextSize(2);
      display.setTextColor(WHITE);
      display.setCursor(0, 0);
      display.println("  Familie");
      display.println("  GRACIC");
      display.println("    ");
      display.println("  Hi Nano");
      display.display();
      display.clearDisplay();
      digitalWrite(pinOut, LOW);            // Pin D0, GPIO16 auf Low setzten
      delay(2000);                          // 2s warten
      digitalWrite(pinOut, HIGH);           // Pin D0, GPIO16 auf High setzten
      display.setTextSize(2);
      display.setTextColor(WHITE);
      display.setCursor(0, 0);
      display.println("  Familie");
      display.println("  GRACIC");
      display.println("    ");
      display.setTextColor(BLACK);
      display.println("  Hi Nano");
      display.display();
      display.clearDisplay();
    }
    if (chipID == 370320) {
      Serial.println("Hallo Mama!");
      // text display tests
      display.setTextSize(2);
      display.setTextColor(WHITE);
      display.setCursor(0, 0);
      display.println("  Familie");
      display.println("  GRACIC");
      display.println("    ");
      display.println("  Hi Mama");
      display.display();
      display.clearDisplay();
      digitalWrite(pinOut, LOW);            // Pin D0, GPIO16 auf Low setzten
      delay(2000);                          // 2s warten
      digitalWrite(pinOut, HIGH);           // Pin D0, GPIO16 auf High setzten
      display.setTextSize(2);
      display.setTextColor(WHITE);
      display.setCursor(0, 0);
      display.println("  Familie");
      display.println("  GRACIC");
      display.println("    ");
      display.setTextColor(BLACK);
      display.println("  Hi Mama");
      display.display();
      display.clearDisplay();
    }

    // Danach 1 Sekunden pausieren, um mehrfaches lesen /ausführen zu verhindern
    delay(1000);

  }
  

}

}
void initWiFi() {
  WiFi.begin(SSID, PSK);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }

  server.begin();
}

RFID RC522 wird offensichtlich Initialisiert aber das wars aber auch. Siehe Screenshot

Und keiner eine Idee? Hab versucht mit "if else " zu arbeiten aber leider ohne Erfolg. Http geht nach wie vor.
Musste einmal http befehl senden damit d1 aus deep sleep aufwacht dann ging es wieder.

Warum hast du die Webseite auseinander gerissen ?
Die solltest du besser wie im Ursprungssketch zusammen lassen.
Darauf aufbauend, den weiteren Sketch als Funktion hinzufügen.
Evtl. erst mit einfachen Dinge wie Led ein bzw. ausschalten testen.

Solch komplexe Dinge lassen sich sicher nicht von Anfängern übers Knie brechen.

Also Stück für Stück aufbauen. Hast du dir die Beispiele von Fips mal angeschaut ?
Die sollten dir helfen.

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