Hallo, ich habe etwas als Test mit dem Arduino was vor. Ein Beschleunigungssensor gibt den X-, Y- und Z-Wert aus. Diese sollen vom Pi ausgelesen werden und wenn der X-/Y-/Z-Wert + oder - 10 unter dem ausgelesenen Wert ist soll eine LED kurz leuchten. Das mit dem +-10 habe ich nicht hinbekommen. Ich habe erst mal feste Werte angegeben aber dadurch das diese sich ab und zu ändern leider suboptimal. Außerdem soll dann wenn die LED leuchtet, einen Taster betätigen können. Dieser soll allerdings nur eine LED bzw. später ein GSM-Modul ansprechen wenn der Taster WÄHREND der Leuchtzeit der LED gedrückt wurde. Kann mir da irgendjemand helfen? Wäre sehr nett Viele Grüße Florian
Florian D. schrieb: > ich habe etwas als Test mit dem Arduino was vor. Ein > Beschleunigungssensor gibt den X-, Y- und Z-Wert aus. Diese sollen vom > Pi ausgelesen werden Was jetzt? Arduino oder Pi? > wenn der X-/Y-/Z-Wert + oder - 10 unter dem > ausgelesenen Wert ist soll eine LED kurz leuchten. Das verstehe ich jetzt nich so ganz. > Das mit dem +-10 habe > ich nicht hinbekommen. Ich habe erst mal feste Werte angegeben aber > dadurch das diese sich ab und zu ändern leider suboptimal. Wie sieht dein Code aus?
:
Bearbeitet durch User
Hallo, zur ersten Frage. Tut mir leid da war die Autokorrektur Schuld. Geht alleine um den Arduino. Wenn du den Code siehst ist dir das glaube ich ein bisschen klarer.
1 | int X = A0; |
2 | int Y = A1; |
3 | int Z = A2; |
4 | |
5 | void setup() |
6 | { |
7 | Serial.begin(9600); |
8 | pinMode(2, OUTPUT); |
9 | pinMode(5, INPUT); //Oder INPUT_PULLUP |
10 | } |
11 | void loop() |
12 | { |
13 | |
14 | //Serielle Ausgaben der Werte für Testzwecke |
15 | |
16 | Serial.print(" X: "); |
17 | Serial.print(analogRead(X)); |
18 | Serial.print(" Y: "); |
19 | Serial.print(analogRead(Y)); |
20 | Serial.print(" Z: "); |
21 | Serial.print(analogRead(Z)); |
22 | Serial.println(); |
23 | delay(500); |
24 | |
25 | int xWert = analogRead(X); |
26 | int yWert = analogRead(Y); |
27 | int zWert = analogRead(Z); |
28 | |
29 | //if-Abfragen für xWert |
30 | |
31 | if (xWert >= 363) |
32 | { |
33 | digitalWrite(2, HIGH); |
34 | delay(3000); |
35 | digitalWrite(2, LOW); |
36 | } |
37 | |
38 | if (xWert <= 353) |
39 | { |
40 | digitalWrite(2, HIGH); |
41 | delay(3000); |
42 | digitalWrite(2, LOW); |
43 | } |
44 | |
45 | //if-Abfragen für yWert |
46 | |
47 | if (yWert >= 363) |
48 | { |
49 | digitalWrite(2, HIGH); |
50 | delay(3000); |
51 | digitalWrite(2, LOW); |
52 | } |
53 | |
54 | if (yWert <= 350) |
55 | { |
56 | digitalWrite(2, HIGH); |
57 | delay(3000); |
58 | digitalWrite(2, LOW); |
59 | } |
60 | |
61 | //if-Abfragen für zWert |
62 | |
63 | if (zWert >= 307) |
64 | { |
65 | digitalWrite(2, HIGH); |
66 | delay(3000); |
67 | digitalWrite(2, LOW); |
68 | } |
69 | |
70 | if (zWert <= 298) |
71 | { |
72 | digitalWrite(2, HIGH); |
73 | delay(3000); |
74 | digitalWrite(2, LOW); |
75 | } |
76 | } |
Florian D. schrieb: > Ein > Beschleunigungssensor gibt den X-, Y- und Z-Wert aus. Diese sollen vom > Pi ausgelesen werden und wenn der X-/Y-/Z-Wert + oder - 10 unter dem > ausgelesenen Wert ist soll eine LED kurz leuchten. Das verstehe ich immer noch nicht so ganz. Willst du den neunen mit dem vorherigen wert vergleichen?
Florian D. schrieb: > Außerdem soll dann wenn die LED leuchtet, einen Taster betätigen können. Wie willst du in deinem Programm von der Betätigung des Tasters erfahren, wenn du den Prozessor zwischen Einschalten der LED und Ausschalten vollzeit mit Warten beschäftigst?
Bis jetzt bin ich nicht weiter gekommen. Deshalb habe ich hier gefragt weil ich nicht weiter wusste...
Wie genau? Mein Button ist angeschlossen über VCC an der einen Seite und an der anderen über nen Widerstand an GND und an einen Digital Pin zum auslesen.
Ja genau. Es soll quasi eine Bewegung erkannt werden! Und wenn eine Bewegung bzw. Beschleunigung ja eigentlich mehr in dem Fall soll die LED leuchten.
Florian D. schrieb: > Ja genau. Es soll quasi eine Bewegung erkannt werden! Dann könntest du es so versuchen:
1 | // Untested
|
2 | |
3 | void loop() |
4 | {
|
5 | static bool first = false; |
6 | static int x_old = 0; |
7 | static int y_old = 0; |
8 | static int z_old = 0; |
9 | |
10 | int x_new = analogRead(X); |
11 | int y_new = analogRead(Y); |
12 | int z_new = analogRead(Z); |
13 | |
14 | if((abs(x_new - x_old) > 10 || abs(y_new - y_old) > 10 || |
15 | abs(z_new - z_old) > 10) && first) |
16 | {
|
17 | first = true; |
18 | digitalWrite(2, HIGH); |
19 | delay(3000); |
20 | digitalWrite(2, LOW); |
21 | }
|
22 | |
23 | x_old = x_new; |
24 | y_old = y_new; |
25 | z_old = z_new; |
26 | }
|
Florian D. schrieb: > Wie genau? Mein Button ist angeschlossen über VCC an der einen Seite und > an der anderen über nen Widerstand an GND und an einen Digital Pin zum > auslesen. Dann brauchst du keinen internen Pullup.
:
Bearbeitet durch User
Ich versuche es direkt aus. Danke schon mal. Gebe gleich Bescheid! Viele Grüße Florian
Ich hab jetzt nur die loop() überarbeitet, der Rest beliebt wie in deinem Code.
Hallo, ich habe die Deklaration noch eingefügt von mir. Das ganze sieht dann so aus
1 | int X = A0; |
2 | int Y = A1; |
3 | int Z = A2; |
4 | |
5 | void setup() |
6 | { |
7 | Serial.begin(9600); |
8 | pinMode(2, OUTPUT); |
9 | pinMode(5, INPUT); |
10 | } |
11 | |
12 | void loop() |
13 | { |
14 | static bool first = false; |
15 | static int x_old = 0; |
16 | static int y_old = 0; |
17 | static int z_old = 0; |
18 | |
19 | int x_new = analogRead(X); |
20 | int y_new = analogRead(Y); |
21 | int z_new = analogRead(Z); |
22 | |
23 | if((abs(x_new - x_old) > 10 || abs(y_new - y_old) > 10 || |
24 | abs(z_new - z_old) > 10) && first) |
25 | { |
26 | first = true; |
27 | digitalWrite(2, HIGH); |
28 | delay(3000); |
29 | digitalWrite(2, LOW); |
30 | } |
31 | |
32 | x_old = x_new; |
33 | y_old = y_new; |
34 | z_old = z_new; |
35 | } |
Allerdings passiert leider nichts und die LED leuchtet auch nicht. Habe gerade auch nachgeschaut, LED funktioniert so einwandfrei.
Sry, mein Fehler, so sollte es funktionieren:
1 | // Untested
|
2 | void loop() |
3 | {
|
4 | static bool first = true; |
5 | static int x_old = 0; |
6 | static int y_old = 0; |
7 | static int z_old = 0; |
8 | |
9 | int x_new = analogRead(X); |
10 | int y_new = analogRead(Y); |
11 | int z_new = analogRead(Z); |
12 | |
13 | if((abs(x_new - x_old) > 10 || abs(y_new - y_old) > 10 || |
14 | abs(z_new - z_old) > 10) && !first) |
15 | {
|
16 | digitalWrite(2, HIGH); |
17 | delay(3000); |
18 | digitalWrite(2, LOW); |
19 | }
|
20 | |
21 | first = false; |
22 | x_old = x_new; |
23 | y_old = y_new; |
24 | z_old = z_new; |
25 | }
|
:
Bearbeitet durch User
Meinst du etwas so?
1 | int X = A0; |
2 | int Y = A1; |
3 | int Z = A2; |
4 | |
5 | void setup() |
6 | { |
7 | Serial.begin(9600); |
8 | pinMode(2, OUTPUT); |
9 | pinMode(5, INPUT); |
10 | } |
11 | |
12 | void loop() |
13 | { |
14 | static bool first = false; |
15 | static int x_old = 0; |
16 | static int y_old = 0; |
17 | static int z_old = 0; |
18 | |
19 | int x_new = analogRead(X); |
20 | int y_new = analogRead(Y); |
21 | int z_new = analogRead(Z); |
22 | |
23 | if((abs(x_new - x_old) > 10 || abs(y_new - y_old) > 10 || |
24 | abs(z_new - z_old) > 10) && first) |
25 | first = true; |
26 | { |
27 | //first = true; |
28 | digitalWrite(2, HIGH); |
29 | delay(3000); |
30 | digitalWrite(2, LOW); |
31 | } |
32 | |
33 | x_old = x_new; |
34 | y_old = y_new; |
35 | z_old = z_new; |
36 | } |
Weil so leuchtet jetzt dauerhaft die LED?
Florian D. schrieb: > Meinst du etwas so? > .. > Weil so leuchtet jetzt dauerhaft die LED? Dass das so nicht funktioniert sollte eigentlich klar sein.
Tut mir leid. Aber mir ist das wirklich gerade nicht klar.
Florian D. schrieb: > Jetzt funktioniert es so halb. Manchmal geht es. Manchmal blinkt die LED > wie sie will. Ist die Schwelle von 10 vllt. ein bisschen zu niedrig? Du könntest x_new, y_new und z_new per UART ausgeben um zu sehen ob das Programm wirklich reagieren sollte oder ob es ein Bug ist. Florian D. schrieb: > Tut mir leid. Aber mir ist das wirklich gerade nicht klar. Dann solltest du in deinem C(++)-Buch mal nachschlagen wie die Syntax von if-Abfragen aussieht, z.B. welche Anweisungen nur bedingt ausgeführt werden wenn der if-Abfragen kein {folgt.
:
Bearbeitet durch User
Funktionieren tut es jetzt. Ich weiß nicht woran es lag auf jeden Fall hab ich es jetzt neu drauf und jetzt blinkt die LED genau immer im 3 Sekunden Takt wie angegeben. Allerdings ohne Unterbrechung. Nochmal zurück: Wieso sollte es klar sein das es so nicht funktioniert?
Florian D. schrieb: > Allerdings ohne Unterbrechung. Das schalten der LED hab ich aus deinem Code übernommen. > Nochmal zurück: Wieso sollte es klar sein das es so nicht funktioniert? Florian D. schrieb:
1 | > if((abs(x_new - x_old) > 10 || abs(y_new - y_old) > 10 || |
2 | > abs(z_new - z_old) > 10) && first) |
3 | > first = true; //[1] |
4 | > { |
5 | > //first = true; |
6 | > digitalWrite(2, HIGH); |
7 | > delay(3000); |
8 | > digitalWrite(2, LOW); |
9 | > } |
Hier wird nur die mit [1] markierte Zeile Bedingt ausgeführt. Der Teil in den {}-Klammern immer, bei jedem durchlauf. Ein bisschen nachdenken sollte man beim Programmieren schon, und ja auch beim Arduino.
:
Bearbeitet durch User
Danke. Also ich habe es jetzt komplett hinter die if-Anweisung. Allerdings funktioniert es immer noch nicht bei jeder Beschleunigung. Sondern leider nur ab und zu. Kann das an diesem x_old, y_old und z_old liegen? Weil die immer aktualisiert werden? Und es deshalb nicht jedes mal funktioniert?
Florian D. schrieb: > Allerdings funktioniert es immer noch nicht bei jeder Beschleunigung. > Sondern leider nur ab und zu. Hast du das mit dem Ausgeben der x_new, y_new und z_new per UART mal versucht? > Kann das an diesem x_old, y_old und z_old > liegen? Weil die immer aktualisiert werden? Sollen sie das nicht. So wie ich es verstanden habe, soll die LED angehen, wenn sich eine Beschleunigung zwischen 2 Messungen betragsmäßig um mehr als 10 ändert?
:
Bearbeitet durch User
Ich erkläre das vielleicht nochmal anders: Das ganze steht ruhig da. Gibt allerdings trotzdem Werte aus. Diese Werte verändern sich trotzdem +-1. Sobald ich das Ganze dann in eine Richtung schiebe, hebe, beschleunigt es sich ja. Und genau bei dieser Beschleunigung soll die LED angehen. Ich habe es wie gesagt schon mit einer if-Abfrage eines festen Wertes versucht, allerdings kam dann ein komplett anderer Wert nach dem neu aufspielen und dann blinkte die LED ohne längere Zeit aufzuhören. Dies soll aber nicht passieren.
Also es sollte quasi immer nur während einer Beschleunigung und das ganze zuverlässig auslösen. Das war immer das Problem.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.