Ampel mit dem Beschleu­ni­gungs­sen­sor ADXL335 schalten

Lese­zeit: 5 Minu­ten
Navi­ga­ti­on

Der ADXL335 ist ein 3-Achsen Beschleu­ni­gungs­sen­sor. Er hat neben der Span­nungs­ver­sor­gung und dem GND-Anschluss drei ana­lo­ge Aus­gän­ge für die Erfas­sung der Beschleu­ni­gung in der x-, y- und z-Richtung.

Der Beschleu­ni­gungs­sen­sor wur­de auf auf einem Holz­stück befes­tigt und die Ach­sen ent­spre­chend beschriftet.

Benö­tig­te Bauteile:

  • 3 LEDs (rot, gelb, grün)
  • 3 Wider­stän­de > 100 Ω
  • Lei­tungs­dräh­te
  • Beschleu­ni­gungs­sen­sor ADXL335

Die ermit­tel­ten Wer­te der jewei­li­gen Ach­sen sol­len im Seri­el­len Moni­tor und im Seri­el­len Plot­ter dar­ge­stellt wer­den. Eine Sei­te liegt dann oben, wenn der Wert des ana­lo­gen Ein­gangs über 400 liegt.

Das zum Seri­el­len Plot­ter gehö­ri­ge Programm:

void setup() 
{
  Serial.begin(9600);
  String Legende = "x-Achse y-Achse z-Achse";
  Serial.println(Legende); 
}
 
void loop() 
{
  int xAchse = analogRead(A0);
  int yAchse = analogRead(A1);
  int zAchse = analogRead(A2);
  String Werte = String(xAchse) + " " + String(yAchse) + " " + String(zAchse) + " ";
  Serial.println(Werte);
  delay(200);
}

Eine Ampel soll „per Hand“ geschal­tet werden:

Der Sen­sor zeigt auf die ...

  • x-Achse Ampel ist rot
  • y-Achse Ampel zeigt gelb oder rot-gelb
  • z-Achse die grü­ne LED leuchtet

Natür­lich ist noch das Pro­blem zu lösen, dass nach rot rot-gelb folgt und nach grün nur die gel­be LED leuch­tet. Der Sta­tus einer bool­schen Varia­ble ent­schei­det dar­über, wel­cher Fall eintritt.

Die LEDs wer­den mit enum definiert:

enum Ampel
{  
  // Startwert festlegen
  ROT = 5,
  GELB,
  GRUEN
};

/*   wenn der Sensor zur y-Achse zeigt  
  letztes Signal rot  -> ROTGELB = true  
  -> Ampel zeigt rot und gelb  letztes Signal grün -> ROTGELB = false
  -> Ampel zeigt nur gelb 
*/
bool ROTGELB = true;

Der setup-Teil:

void setup()
{
  for (int i = ROT; i <= GRUEN; i ++)
  {
    pinMode(i, OUTPUT);
  }
  Serial.begin(9600);
}

Der loop-Teil. Beach­te die Kommentare.

void loop()
{
  // analoge Eingänge lesen
  int xAchse = analogRead(A0);
  int yAchse = analogRead(A1);
  int zAchse = analogRead(A2);

  // Sensor zeigt auf die x-Achse -> Ampel rot, ROTGELB = true
  if (xAchse > 400)
  {
    digitalWrite(GELB, LOW);
    digitalWrite(GRUEN, LOW);
    digitalWrite(ROT, HIGH);
    ROTGELB = true;
  }

  // Sensor zeigt auf die y-Achse
  // wenn ROTGELB = false -> nur die gelbe LED leuchtet
  if (yAchse > 400 & !ROTGELB)
  {
    digitalWrite(GRUEN, LOW);
    digitalWrite(ROT, LOW);
    digitalWrite(GELB, HIGH);
  }

  // wenn ROTGELB = true -> die rote und die gelbe LED leuchten
  if (yAchse > 400 & ROTGELB)
  {
    digitalWrite(GRUEN, LOW);
    digitalWrite(ROT, HIGH);
    digitalWrite(GELB, HIGH);
  }

  /* 
    Sensor zeigt auf die z-Achse
    ROTGELB muss auf false gesetzt werden, 
    damit bei Aktivierung des y-Achse nur die gelbe LED leuchtet
  */
  if (zAchse > 400 )
  {
    digitalWrite(ROT, LOW);
    digitalWrite(GELB, LOW);
    digitalWrite(GRUEN, HIGH);
    ROTGELB = false; 
  }

  delay(20);
}


Ver­wand­te Aufgaben:


Letzte Aktualisierung: 26. Nov 2020 @ 21:26