Go Down

Topic: RFID (Read 764 times) previous topic - next topic

postmaster-ino

Hi

Antwort: Ja (warum sollte Das nicht gehen?)

Solltest Du wissen wollen, wo Du diese Taster-Abfrage einbauen musst (irgendwo in der loop - ich würde ein flag setzen) und bei der Abfrage, ob das Relais JETZT gezogen sein soll (oder anziehen soll), den Taster mit in die Abfrage einbauen - also wäre mein Vorgehen.

MfG

pronicolas


Was meinst du mit Flag? Vielen Dank für die Hilfe im Voraus schon mal.

HotSystems

Was meinst du mit Flag? Vielen Dank für die Hilfe im Voraus schon mal.
Ein Flag kann eine Variable sein, die du auf HIGH oder LOW setzt und entsprechend abfragst.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

pronicolas

Hallo, laut dem Seriel-Monitor funktioniert es. Warum das Relais jetzt nicht schaltet weis ich nicht.
Code: [Select]

 
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);
int trigger = 7;
int echo = 6;
long dauer = 0;
long entfernung = 0;
const int RELAIS_PIN = 5;
int taster=4;
int tasterstatus=0;

void setup()
{
  Serial.begin (9600);
  pinMode(trigger, OUTPUT);
  pinMode(echo, INPUT);
  pinMode(RELAIS_PIN, OUTPUT);
  SPI.begin();
  mfrc522.PCD_Init();
  pinMode(taster, INPUT);
}

void loop()
{
  tasterstatus=digitalRead(taster);
if (tasterstatus == HIGH)
{
digitalWrite(taster, LOW);
delay (5000);

}
else
{
digitalWrite(RELAIS_PIN, HIGH);
}






  digitalWrite(trigger, LOW);
  delay(5);
  digitalWrite(trigger, HIGH);
  delay(10);
  digitalWrite(trigger, LOW);

  dauer = pulseIn(echo, HIGH);
  entfernung = (dauer / 2) * 0.03432;
  if (entfernung >= 500 || entfernung <= 0)
  {
    Serial.println("Kein Messwert");
  }
  else
  {
    Serial.print(entfernung);
    Serial.println(" cm");
  }

  if (entfernung <= 80)
  {
    digitalWrite(RELAIS_PIN, HIGH);
  }
  //else
  //{
  //  digitalWrite(RELAIS_PIN, LOW);
  //}
  delay(10);

  if ( ! mfrc522.PICC_IsNewCardPresent())
  {
    return;
  }
  if ( ! mfrc522.PICC_ReadCardSerial())
  {
    return;
  }
  long code = 0;
  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    code = ((code + mfrc522.uid.uidByte[i]) * 10);
  }
  Serial.print("Die Kartennummer lautet:");
  Serial.println(code);
  if (code == 1507410)
  {
    digitalWrite(RELAIS_PIN, LOW);
  }
}

postmaster-ino

Hi

Meinst Du ggf. hier
Code: [Select]
digitalWrite(taster, LOW); nicht eher den Relais_Pin?
Außer, Du wolltest den Pull-UP AUSSCHALTEN (Du nutzt den Taster in positiver Logik, also mit Pull-Down und gedrückt HIGH-Pegel).
Somit benutzt Du eh keinen Pull-UP, diese falsche Zeile macht also hier Nichts kaputt.

MfG

pronicolas

Das habe ich eben auch gefunden und bereits geändert. Das Problem ist jetzt das der Arduino Uno nicht mehr auf den Ultraschallsensor reagiert und den RFID sondern nur noch auf den Taster.

postmaster-ino

Hi

Wie hast Du Deine jetzige Aussage verifiziert?
Meiner Meinung nach hängst Du jetzt in dem (etwas sinnlosem) delay(5000); fest - in der Zeit macht der Arduino so ziemlich Nichts - auch nicht den US-Sensor abfragen.

Wenn Du zwischen Tastendrücken 10 Sekunden wartest (denke so, knapp über 5 müssten reichen), denke ich, funktioniert Dein Sketch.

Wenn nicht: Baue Ausgaben im Terminal ein, damit Du siehst, wo sich der µC gerade rumdrückt, wo Er Zeit verplempert und was abgearbeitet wird, wenn Du den Taster drückst, den RFID-Tag vor den Sensor hältst, den US-Sensor manipulierst.

MfG

PS: 'Funktioniert nicht' ist eine eher grobe Umschreibung, präzisiere bitte.

pronicolas

Was meinst du mit Terminal?. Also es ist der Taster tut was er soll.Nur der Ultraschallsensor tut nicht das was er soll d.h er schaltet nicht das Relais egal wie groß der Abstand ist. Die Aktion die ohne den Taster vorher funktioniert haben funktionieren jetzt nicht mehr.

Code: [Select]

#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);
int trigger = 7;
int echo = 6;
long dauer = 0;
long entfernung = 0;
const int RELAIS_PIN = 5;
int taster=4;
int tasterstatus=0;

void setup()
{
  Serial.begin (9600);
  pinMode(trigger, OUTPUT);
  pinMode(echo, INPUT);
  pinMode(RELAIS_PIN, OUTPUT);
  SPI.begin();
  mfrc522.PCD_Init();
  pinMode(taster, INPUT);
}

void loop()
{
  tasterstatus=digitalRead(taster);
if (tasterstatus == LOW)
{
digitalWrite(RELAIS_PIN, HIGH);


}
else
{
digitalWrite(RELAIS_PIN, LOW);
}






  digitalWrite(trigger, LOW);
  delay(5);
  digitalWrite(trigger, HIGH);
  delay(10);
  digitalWrite(trigger, LOW);

  dauer = pulseIn(echo, HIGH);
  entfernung = (dauer / 2) * 0.03432;
  if (entfernung >= 500 || entfernung <= 0)
  {
    Serial.println("Kein Messwert");
  }
  else
  {
    Serial.print(entfernung);
    Serial.println(" cm");
  }

  if (entfernung <= 80)
  {
    digitalWrite(RELAIS_PIN, HIGH);
  }
  //else
  //{
  //  digitalWrite(RELAIS_PIN, LOW);
  //}
  delay(10);

  if ( ! mfrc522.PICC_IsNewCardPresent())
  {
    return;
  }
  if ( ! mfrc522.PICC_ReadCardSerial())
  {
    return;
  }
  long code = 0;
  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    code = ((code + mfrc522.uid.uidByte[i]) * 10);
  }
  Serial.print("Die Kartennummer lautet:");
  Serial.println(code);
  if (code == 1507410)
  {
    digitalWrite(RELAIS_PIN, LOW);
  }
}

Thorsten4171

Das else am Anfang von Loop schaltet das Relais doch bei jedem Durchlauf wieder aus.

pronicolas

Was kann man stattdessen in die Spalte einfügen damit es kein Fehler gibt, weil aktuell schaltet das Relais so oft wenn der Abstand beim Ultraschallsensor zu klein ist(20cm) und der Taster gedrückt wird.

postmaster-ino

Hi

Du sprichst in Rätseln.

WAS willst Du?
WANN soll das Relais AN sein?
WANN soll das Relais AUS sein?

Wenn der Taster Priorität hat, würde ich Diesen ALS LETZTES abfragen und so den Zustand, Den das Relais bekommen soll, dort endgültig festlegen.

Ich würde in jedem Durchlauf prüfen, ob die Bedingungen für SETZEN bzw. RÜCKSETZEN gegeben sind und mir Das bei den Einzelbedingungen 'merken'.
Je nach Priorität (in meinem Fall, je später die Prüfung, desto mehr Gewicht hat Diese), werden vorherige Prüfungen übergangen.
Prüfungen gleicher Priorität dürfen sich nicht gegenseitig ausschließen können - oder man muß hier festlegen, was dann passieren soll (z.B. ein 'bleibt so' wäre auch eine Option).

UND: Ich würde das Relais nur an EINER Stelle im Sketch setzen, nicht an zweiunddreißig.
Auch hätte ich diverse Ausgaben ins Terminal (Serial.print("Punkt 1\n"); ) im Sketch verteilt, damit ICH SEHE, wo sich mein µC gerade mit beschäftigt, in welcher Reihenfolge welche Blöcke abgearbeitet werden.
SO kann ich dann im Programm nachvollziehen, wohin Er gesprungen ist und kann mir überlegen, WIESO Er Das SO gemacht hat.

MfG

pronicolas

Es funktioniert habe den Fehler eben behoben bekommen.

HotSystems

Es funktioniert habe den Fehler eben behoben bekommen.
Na toll....wäre schon fair, wenn du uns den Fehler nennst.
Immerhin haben wir versucht, dir zu helfen.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

pronicolas

Es lag daran das das Relais wie Thorsten schon beschrieben hat, ich das Relais in irgendeiner Zeile wieder angeschaltet habe. :)  :)

Go Up