Passwortabfrage

Hey Leute, in der Schule sollte ich in Arduino eine Passwortabfrage schreiben. Mit “String” Befehl funktioniert super, aber der Lehrer möchte in “char”. Wie mache ich das???

Das ist meine Code in String Befehl

String passwort = "Schule";

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.println("Geben Sie Ihre Passwort ein: ");
  while(Serial.available()<=0);   
  passwort = Serial.readString();
  if(passwort == "Schule")
   {
    Serial.println("Ihr Zugang ist erteilt!");
    delay(10000);
   }
  else(passwort != "Schule");
  {
    Serial.println("ihr Passwort ist falsch!");
  }
}

mit char arrays
Grüße Uwe

https://www.arduino.cc/reference/en/language/functions/communication/serial/readbytes/
https://www.arduino.cc/reference/en/language/functions/communication/serial/readbytesuntil/

http://www.cplusplus.com/reference/cstring/strcmp/

also wenn die Verwendung der String Klasse in deinem Sketch sein einziges Problem ist, dann möge er sich bitte hier selber anmelden...

noiasca:
also wenn die Verwendung der String Klasse in deinem Sketch sein einziges Problem ist, dann möge er sich bitte hier selber anmelden...

Es wird hier eher darum gehen etwas C/C++ zu lernen. Vielleicht dient die Aufgabe auch gerade dazu die Verwendung von C Strings zu demonstrieren. Dann ist es völlig kontraproduktiv wenn jemand die Arduino String Klasse verwendet

Serenifly:
Es wird hier eher darum gehen etwas C/C++ zu lernen. Vielleicht dient die Aufgabe auch gerade dazu die Verwendung von C Strings zu demonstrieren. Dann ist es völlig kontraproduktiv wenn jemand die Arduino String Klasse verwendet

Ich glaube noiasca geht es eher um den Teil:

else(passwort != "Schule");

Ein Anfang:

const char passwort[] = "Schule";
const byte pwlaenge = sizeof(passwort);

Bitte beachte '\0' am Ende des Feldes.

agmue:
Ein Anfang:

const char passwort[] = "Schule";

const byte pwlaenge = sizeof(passwort);



Bitte beachte '\0' am Ende des Feldes.

Tut mir leid, es hat mir nicht weiter gebracht... ich fühle mich wie in eine Sackgasse. In der Schule lernen wir kaum weil der Lehrer kaum etwas erklärt. Er ist sowas lustlos...

Er ist sowas lustlos…

Es gibt gute und nicht ganz so gute Lehrer, aber motivieren muß man sich schon selber :wink:
“Das hilft mir nicht” ist nun aber keine weiterführende Aussage ( von dir )

char* für Texte ist zwar besser, aber erstmal nicht so einfach.

Ich rate mal, du hängst am == .
Zwei Zeiger vergleichen ist was anderes als ein Textvergleich (strcmp).
Das ist keine Lösung, nur ein Hinweis :wink:

Das Array beinhaltet jeweils den Ashii Code eines Buchstabens siehe zB http://www.asciitable.com/. Also passwort[0] den Wert 83 dezimal für das große "S".
Du liest die Werte bis zum nl (nl NEW LINE als Abschluß der Eingabe) am Ende, die von der Schnittstelle kommen in ein Array und vergleichst es mit dem array in dem Du das Password gespeichert hast.
Ein Array mit
const char passwort = "Schule";
definiert hat nach dem "e" noch eine null '\0' als Abschluß am Ende. Also vergleichst Du bis zum vorletzten Arrayelement.

Grüße Uwe

uwefed:
Das Array beinhaltet jeweils den Ashii Code eines Buchstabens siehe zB http://www.asciitable.com/. Also passwort[0] den Wert 83 dezimal für das große “S”.
Du liest die Werte bis zum nl (nl NEW LINE als Abschluß der Eingabe) am Ende, die von der Schnittstelle kommen in ein Array und vergleichst es mit dem array in dem Du das Password gespeichert hast.
Ein Array mit
const char passwort = “Schule”;
definiert hat nach dem “e” noch eine null ‘\0’ als Abschluß am Ende. Also vergleichst Du bis zum vorletzten Arrayelement.

Grüße Uwe

Strcmp braucht zwei chars zum vergleichen, aber ich weiß nicht was ich schreiben soll, dass der zweiter char den eingegebener Text aufnimmt… Serial.read für char funktioniert nicht was ich brauche… oder bin in falschen weg?

void loop() {
Serial.println("Geben Sie Ihre Passwort ein: ");
while(Serial.available()<=0);
= Serial.read();

Was ich brauche:
A: Geben Sie Ihre Passwort ein
E: (Pass eingeben)
A: (Ja) Zugang ist erteilt.
A: (Nein) Password ist falsch. Geben sie nochmal.

Strcmp braucht zwei chars

Falsch. char != char

Du hast doch auch in deinem jetzigen Code einmal den eingelesenen String und einmal den Vergleichs-String. Bei strcmp() ist das genauso

Serial.read für char funktioniert nicht was ich brauche... oder bin in falschen weg?

Ich habe dir doch schon zwei fertige Funktionen verlinkt um C Strings einzulesen! Oder liest dir selbst mal die Doku zur Serial Klasse durch

readBytes() liest bis zu einem Timeout (den man besser niedriger setzt). Besser ist readBytesUntil() und das Linefeed ('\n') als Endzeichen verwenden. Den seriellen Monitor stellst du dann so ein dass am Ende automatisch ein Linefeed/Newline gesendet wird.

Du musst allerdings darauf achten dass der Null-Terminator am Ende des Strings gesetzt wird. Sonst geht es nicht! Also vor jedem Einlesen das Array mit memset() komplett auf 0 setzten.
Siehe auch das:
http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/011_c_arrays_011.htm#mja452663858fd23e86c51cfa3b9139f64

Ich könnte dir auch eine bessere handgeschriebene Funktion geben, aber dann ist klar dass das nicht von dir kommt