leonhard68
Anmeldungsdatum: 24. April 2018
Beiträge: 154
|
Hallo,
es mag sein, dass ich von dem Betriebssystem her falsch bin, denn ich arbeite mommentan auf einem Windows Rechner.
Aber ich habe ein anderes Problem: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155 |
#include <Keypad.h>
#include <Servo.h>
Servo servo_3;
const byte ROWS = 4; // Four rows
const byte COLS = 3; // Three columns
// Define the Keymap
char keys[ROWS][COLS] = {
{'3','2','1'},
{'6','5','4'},
{'9','8','7'},
{'#','0','*'}
};
// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte rowPins[ROWS] = { 9, 8, 7, 6 };
// Connect keypad COL0, COL1 and COL2 to these Arduino pins.
byte colPins[COLS] = { 12, 11, 10 };
//nimmt die eingabe auf
const int MAX_INPUT = 10;
char input[MAX_INPUT];
int input_index=0;
// Create the Keypad
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
#define ledpin 13
void setup()
{
servo_3.attach(3);
servo_3.write(10);
pinMode(ledpin,OUTPUT);
digitalWrite(ledpin, HIGH);
Serial.begin(9600);
}
bool b1 = false;
bool b2 = false;
bool b3 = false;
bool b4 = false;
bool b5 = false;
bool b6 = false;
bool b7 = false;
int stelle = 1;
using namespace std;
void loop()
{
char key = kpd.getKey();
if (key)
{
Serial.println("Taste:");
Serial.println(key);
Serial.println("Stelle:");
Serial.println(stelle);
switch (stelle)
{
case 1:
Serial.println("angekommen");
if (key == "1")
{
Serial.println("erfüllt");
b1 = true;
}
break;
case 2:
if (key == "2")
{
b2 = true;
}
break;
case 3:
if (key == "3")
{
b3 = true;
}
break;
case 4:
if (key == "4")
{
b4 = true;
}
break;
case 5:
if (key == "5")
{
b5 = true;
}
break;
case 6:
if (key == "6")
{
b6 = true;
}
break;
case 7:
if (key == "7")
{
b7 = true;
}
break;
case 8:
if (key == "#")
{
if (b1 && b2 && b3 && b4 && b5 && b6 && b7)
{
servo_3.write(30);
Serial.println("geklappt");
}
}
break;
case 9:
if (key = "*")
{
servo_3.write(10);
stelle = 0;
bool b1 = false;
bool b2 = false;
bool b3 = false;
bool b4 = false;
bool b5 = false;
bool b6 = false;
bool b7 = false;
}
break;
}
stelle = stelle+1;
Serial.println("bool 1:");
Serial.println(b1);
Serial.println("bool 2:");
Serial.println(b2);
Serial.println("bool 3:");
Serial.println(b3);
Serial.println("bool 4:");
Serial.println(b4);
Serial.println("bool 5:");
Serial.println(b5);
Serial.println("bool 6:");
Serial.println(b6);
Serial.println("bol 7:");
Serial.println(b7);
}
}
|
Dies ist ein Programm, das mit der Arduino IDE geschrieben wurde, die leider nur c versteht.
Das Problem ist, dass die wenn die Ziffer mit der Ausgabe des Keypads vergleiche, wird der Wert nie auf true gesetzt, auch wenn die Zahl mit der Ausgabe des Keypads übereinstimmt. Nur wenn ich nur ein = in der if Funktion verwende, wird der Wert auf true gesetzt und dann auch wenn ich die falsche Zahl verwende. Gruß Leonhard68
|
apt-ghetto
Anmeldungsdatum: 3. Juni 2014
Beiträge: 2943
|
| char key = '8';
if (key == "8") { // Du vergleichst hier ein Char mit einem String-Literal.
// besser:
if (key == '8') {
|
|
leonhard68
(Themenstarter)
Anmeldungsdatum: 24. April 2018
Beiträge: 154
|
Vielen Dank!
Es funktioniert!
Gruß leonhard68
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4563
Wohnort: Berlin
|
@leonhard68: Das ist übrigens recht umständlich geschrieben. Was ist denn das eigentliche Ziel? Brauchst Du b1 bis b7 auch tatsächlich für irgend etwas? Könntest Du nicht wenigstens ein Array daraus machen, damit man sich die ganzen Code-Wiederholungen sparen kann? Ungetestet:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 | // ...
bool bs[7];
int stelle = 0;
void loop()
{
char key = kpd.getKey();
if (key)
{
Serial.println("Taste:");
Serial.println(key);
Serial.println("Stelle:");
Serial.println(stelle);
if (stelle < 7 && key >= '1' && key <= '7')
{
bs[stelle] = (key - '1') == stelle;
}
else if (stelle == 7 && key == '#')
{
bool all_set = true;
for (int i = 0; i < 7; i++)
{
if (!bs[i])
{
all_set = false;
break
}
}
if (all_set)
{
servo_3.write(30);
Serial.println("geklappt");
}
}
else if (stelle == 8 && key == '*')
{
servo_3.write(10);
stelle = -1;
for (int i = 0; i < 7; i++) bs[i] = false;
}
stelle++;
for (int i = 0; i < 7; i++)
{
Serial.print("bool ");
Serial.print(i);
Serial.println(":")
Serial.println(b1);
}
}
}
|
|
leonhard68
(Themenstarter)
Anmeldungsdatum: 24. April 2018
Beiträge: 154
|
Ich fürchte es geht nicht anders, da das Programm für das Keypadschloss eines Safes geschrieben ist.
Gruß Leonahrd68
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4563
Wohnort: Berlin
|
@leonhard68: Was geht nicht anders? Bei meiner Änderung sollte sich doch so gut wie gar nichts gegenüber Deinem Programm am Verhalten geändert haben, ausser dass es weniger Code immer wieder kopierter und leicht veränderter Code ist. Und wozu brauchst Du die einzelnen Werte b1 bis b7 beziehungsweise dann halt die Werte im Array? Wäre es nicht einfacher die richtigen Stellen mit zu zählen statt sich für jede einzelne zu merken ob sie richtig war? Und wie änderst Du den Code für den Safe? Etwa durch ändern der Werte in den ganzen case s? Das ist umständlich.
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4563
Wohnort: Berlin
|
Hier mal ohne die Wahrheitswerte für die einzelnen Stellen und so dass man den Code sowohl in der Länge als auch vom Inhalt her einfach ändern kann (ungetestet):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 | int stelle = 0;
char pass_code = "1234567";
int correct_count = 0;
void loop()
{
char key = kpd.getKey();
if (key)
{
Serial.println("Taste:");
Serial.println(key);
Serial.println("Stelle:");
Serial.println(stelle);
int code_length = strlen(pass_code);
if (stelle < code_length && key >= '0' && key <= '9' && pass_code[stelle] == key)
{
correct_count++;
}
else if (stelle == code_length && key == '#' && correct_count == stelle)
{
servo_3.write(30);
Serial.println("geklappt");
}
else if (stelle == code_length + 1 && key == '*')
{
servo_3.write(10);
stelle = -1;
correct_count = 0;
}
stelle++;
Serial.println("Korrekt:");
Serial.println(correct_count);
}
}
|
Wobei ich da einen logischen Fehler von Deinem Code jetzt einfach mal so übernommen habe, wenn ich die Aufgabe/den Aufbau richtig verstehe. Wenn nämlich die
* -Taste die Eingabe zurück setzt und den Safe wieder schliesst, dann möchte man das nicht an den Wert von stelle koppeln, denn dann kann man nur zu dieser bestimmten Stelle eine eventuelle Falscheingabe zurücksetzen und den Safe schliessen falls er offen ist. Verpasst man diesen Punkt, dann bleibt der Safe offen oder man bekommt ihn nicht mehr auf. Je nach dem in welchem Zustand das System ist. Da müsstest Du noch mal überlegen wie sich der Safe sinnvoll(er) verhalten kann.
|
leonhard68
(Themenstarter)
Anmeldungsdatum: 24. April 2018
Beiträge: 154
|
Ich habe für alles vorgesorgt. Es kann kein Fehler unterlaufen!
Ich habe das Programm selbst geschrieben und es soll nicht von anderen Personen verändert werden!
Gruß Leonhard68
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4563
Wohnort: Berlin
|
@leonhard68: So wie es jetzt ist, kann das sehr leicht in einen Zustand kommen bei dem keine Eingabe über das Tastenfeld mehr irgendeine Reaktion hervorrufen kann. Wenn das tatsächlich so gewollt ist, dann kann kein Fehler unterlaufen. Ich bezweifle aber irgendwie dass das so gewollt ist. Aber das musst Du ja wissen. ☺
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
leonhard68 schrieb: Ich habe für alles vorgesorgt. Es kann kein Fehler unterlaufen!
😊 Das erinnert mich so ein bisschen an den verrückten Wissenschaftler, der minutiös alles für die Weltbeherrschung geplant hat, und dann kommt irgendetwas Dummes dazwischen und sein ganzer Plan fällt in sich zusammen.
Ich habe das Programm selbst geschrieben und es soll nicht von anderen Personen verändert werden!
Abgesehen davon, dass es sehr vermessen ist, anzunehmen, dass man selbst fehlerfreien Code schreibt, gibt es auch noch Fehler außerhalb des Programmcodes. Mit Verlaub, Du scheinst Marcs Anregungen nicht ganz zu verstehen - da finde ich es umso mutiger, eigene Fehler auszuschließen. Als generellen Lesetipp empfehle ich das Buch "Denkfallen und Programmierfehler" von Timm Grams (vermutlich im Moment nur gebraucht zu bekommen).
|
Dakuan
Anmeldungsdatum: 2. November 2004
Beiträge: 6339
Wohnort: Hamburg
|
Ich habe für alles vorgesorgt. Es kann kein Fehler unterlaufen!
Ich bin zwar nur ein Hobby Programmierer, und das seit etwa 1979 und meiner Erfahrung nach ist kaum ein Programm mit mehr als 10 Zeilen Quelltext fehlerfrei (zu 95%). Irgendwas ist eigentlich immer, und wenn es nur das veränderte Umfeld ist.
Ich habe das Programm selbst geschrieben und es soll nicht von anderen Personen verändert werden!
Wenn Du damit auch die Beeinflussung durch externe Programme meinst, ist das Wunschdenken. Ich war vor etlichen Jahren in der MS Flugsimulator Scene aktiv und konnte da miterleben, wie man dem Programm fremde Programmteile (DLL's) unterjubeln konnte, obwohl die Schnittstellen nie veröffentlicht wurden. Um das herauszukriegen wurden da oft Programmen wie SoftICE eingesetzt. Ob es vergleichbares in der Linuxwelt auch gibt, weiß ich nicht. Ich will damit nur sagen, wenn sich jemand findet, der eine entsprechend große Motivation hat, ist kein Programm vor Manipulation oder Veränderung sicher. Allerdings muss man nur dann, wenn das betreffende Programm über entsprechende Popularität verfügt, damit rechnen, dass sich jemand die Mühe macht, einen Crack zu finden um den damit verbundenen Ruhm zu ernten. Es sei denn, es gibt einen zahlungskräftigen Auftraggeber.
|
leonhard68
(Themenstarter)
Anmeldungsdatum: 24. April 2018
Beiträge: 154
|
Na, ja. Wenn die Hardware nicht streikt, kann keine Unregelmäßigkeit auftreten. Ich habe noch bestehende Bugs beseitigt.
Gruß Leonhard68
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4563
Wohnort: Berlin
|
Ich habe für alles vorgesorgt. Es kann kein Fehler unterlaufen!
…und etwas später dann…
Ich habe noch bestehende Bugs beseitigt.
😉 Und was ist wenn das dann doch noch nicht alle waren?
|
leonhard68
(Themenstarter)
Anmeldungsdatum: 24. April 2018
Beiträge: 154
|
Dann werd ich's schon rauskriegen. Ich habe jedenfalls alle Möglichkeiten um das Programm auszutesten genutzt.
Und weitere Bugs kann ich leicht beseitigen.
Gruß Leonhard68
|