Arduino Beschleunigungssensor + LED + Taster

OP #4179272
Lesenswert?

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
#4179279
Lesenswert?

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?
OP #4179284
Lesenswert?

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
}
#4179315
Lesenswert?

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.
OP #4179337
Lesenswert?

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.
#4179342
Lesenswert?

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
}
OP #4179344
Lesenswert?

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?
#4179353
Lesenswert?

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.
#4179369
Lesenswert?

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.
OP #4179380
Lesenswert?

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?
#4179392
Lesenswert?

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?
OP #4179410
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren