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?
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.
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?
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.
Florian D. schrieb:> Ja genau. Es soll quasi eine Bewegung erkannt werden!
Dann könntest du es so versuchen:
1
// Untested
2
3
voidloop()
4
{
5
staticboolfirst=false;
6
staticintx_old=0;
7
staticinty_old=0;
8
staticintz_old=0;
9
10
intx_new=analogRead(X);
11
inty_new=analogRead(Y);
12
intz_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.
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.
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.
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?
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.