Weekender: Wir bauen uns eine Piepliothek!

Hallo allerseits!

Dass auf einem Arduino standardmäßig eine LED verbaut ist, die man über den Digital-Pin 13 schalten kann, ist eine prima Sache – denn damit ist wenigstens minimale Kommunikation möglich. Man kann die LED zum Beispiel kurz aufblinken lassen, wenn ein Signal empfangen wurde oder eine neue „loop()-Runde“ beginnt.

Sehr viel praktischer ist ein Piezo-Schallwandler. So ein Ding gibt es für weniger als 1 € und man kann damit deutlich mehr signalisieren als nur zwei Zustände. Zudem ist egal, ob sich der Pieper im Blickfeld befindet oder nicht – denn man hört ihn ja und kann sich auf anderes konzentrieren.

Ich finde solche Pieper dermaßen praktisch, dass ich immer mindestens einen in Reserve habe. Die meisten Basteleien beginne ich damit, dass ich einen solchen Piezo-Schallwandler anschließe – meistens an Pin D4, denn die Möglichkeiten, via D0 und D1 seriell zu kommunizieren oder über D2 und D3 externe Interrupts auslösen zu können, halte ich mir gerne offen. Damit die Handhabung des Piepers schön simpel ist, habe ich mir eine Bibliothek geschrieben.

Wie es sich für eine Bibliothek gehört, besteht sie aus drei Dateien:

Piezo.h - Hier wird die Klasse „Piezo“ mit deren Funktionen deklariert. Da ein Piezo-Schallwandler nur eine Sache machen kann, nämlich piepen, gibt es nur eine Funktion, die ich „beep“ genannt habe.

Piezo.cpp - In dieser Datei werden die Funktionen definiert. Da ich verschiedene Tonsequenzen verwenden möchte, die unterschiedliche Meldungen repräsentieren sollen, habe ich eine Aufzählungsvariable (enum) definiert, deren mögliche Werte den möglichen Meldungen entsprechen (siehe „beeptype“ in Piezo.h bzw. den „switch“-Teil in Piezo.cpp).

keywords.txt - enthält die Schlüsselworte, die im Editor hervorgehoben werden sollen.

Diese drei Dateien habe ich auf meinem Linux-System im Verzeichnis ~/sketchbook/libraries/Piezo gespeichert. Deren Inhalte:

[Piezo.h]

#ifndef PIEZO_H
#define PIEZO_H

#include <Arduino.h>
#include <stdint.h>

enum beeptype { ON, OFF, OK, YES, NO, GOOD, BAD, READY, ERROR, PANIC, ALARM };

class Piezo
{
 private:
  uint8_t pin;
 public:
  Piezo(uint8_t); // Konstruktor mit Angabe, an welchem Pin der Schallwandler
                  //  haengt
  void beep(beeptype);
};

#endif

[Piezo.cpp]

#include <Arduino.h>
#include <stdint.h>
#include "Piezo.h"


Piezo::Piezo(uint8_t pin_)
{
  pin=pin_;
}

void Piezo::beep(beeptype t_)
{
  switch (t_)
  {
    case GOOD:
    case READY:
    case YES:
      tone(pin, 440, 50);
      delay(50);
      tone(pin, 880, 50);
      delay(50);
      break;
    case ON:
    case OK:
      tone(pin, 880, 50);
      delay(50);
      break;
    case OFF:
    case NO:
      tone(pin, 880, 50);
      delay(50);
      tone(pin, 440, 50);
      delay(50);
      break;
    case BAD:
    case ERROR:
      tone(pin, 220, 500);
      delay(500);
      break;
    case ALARM:
    case PANIC:
      for(uint8_t count2=0; count2 != 3; count2++)
        {
          for(uint8_t count=0; count != 250; count++)
            {
              tone(pin, 200+10*count, 10);
              delay(1);
            }
        }
      break;
  default:
    break;   
  }
}

[keywords.txt]

Piezo   KEYWORD1
beep    KEYWORD2

Und ein Beispiel-Sketch:

#include <Piezo.h>

Piezo audio(4);

void setup()
{
  audio.beep(READY);
  delay(2000);
}

void loop()
{
  audio.beep(ON);
  delay(1000);
  audio.beep(OFF);
  delay(1000);
  audio.beep(READY);
  delay(1000);
  audio.beep(BAD);
  delay(1000);
  audio.beep(ALARM);
  delay(2000);
}

BTW: Ich weiß natürlich, dass das Wochenende für die meisten Leute erst morgen anfängt. Aber wer keinen Piezo-Schallwandler hat und einen besorgen möchte, freut sich über einen zusätzlichen Tag hierfür.

Schönes WE!

Gregor

Nachtrag:
Unter http://test.szaktilla.de/REC000.mp3 gibt es die Meldungen zum Anhören.

Und nächstes Wochenende das gleiche ohne Delay, dafür mit der Methode bool Piezo::isBeeping(); damit man 1. während des Piepens auch noch was anderes machen kann. ( Led blinken, das eklige PANIC-Piepsen abstellen ... ) 2. weiss, ob man evtl. ein bereits laufendes Piepsen abbricht/stört


unter beep(OFF); hätte ich mir übrigens was anderes vorgestellt ;)

michael_x: ... ohne Delay ...

Ich hab’s ja geahnt ...

Gruß

Gregor

hi gregor,

da hab ich auch schon drüber nachgedacht, danke für den thread.

ein paar fragen bleiben:

in einem anderen thread wurde erwähnt, daß es verschiedene piezo - äh - dinger gibt. was ist da geeignet? manche können ja nur piepsen und bei anderen kann man glaube ich die tonhöhe beeinflussen.

müssen die mit 5V laufen? kann man auch welche für zb 12V oder 15V nehmen oder bleiben die stumm?

hast Du links? wie heißen die geeigneten auf englisch (china lockt)?

gruß stefan

EDIT: das mit den delays war Dir natürlich klar...

Eisebaer: in einem anderen thread wurde erwähnt, daß es verschiedene piezo - äh - dinger gibt. was ist da geeignet? manche können ja nur piepsen und bei anderen kann man glaube ich die tonhöhe beeinflussen.

Stimmt ja. Es gibt auch Dinger, die „selbst“ piepen, sobald sie Energie haben.

Ich benutze diese hier.

Eisebaer: müssen die mit 5V laufen? kann man auch welche für zb 12V oder 15V nehmen oder bleiben die stumm? hast Du links? wie heißen die geeigneten auf englisch (china lockt)?

Die von mir benutzten Pieper können direkt zwischen den betreffenden Pin und GND geschaltet werden und zu hören bekommt man die nur mit „tone()“.

Wenn Du die Dinger im Netz suchst, suchst Du am besten nach „piezo sound transducer“.

Gruß

Gregor

gregorss: Stimmt ja. Es gibt auch Dinger, die „selbst“ piepen, sobald sie Energie haben.

Ich benutze diese hier.

Die von mir benutzten Pieper können direkt zwischen den betreffenden Pin und GND geschaltet werden und zu hören bekommt man die nur mit „tone()“.

Ja, die Dinger kannst Du entweder mit tone() ansteuern, aber es gibt für Arduino auch PCCM-Playerlibraries, so dass Du auf diesen 8kBit/s PCM-Audio spielen kannst. Entweder so viele Daten wie Du im PROGMEM unterbtringst, oer quasi unbegrenzt von SD-Karte.

Ich habe hier welche von diesen: http://www.pollin.de/shop/dt/MzQxOTUzOTk-/HiFi_Car_HiFi_Video_TV/Lautsprecher/Lautsprecher_Chassis/Kleinlautsprecher_DIGISOUND_F_DO29_100F.html