Seeeduino #5: aktiver Piezo Buzzer mit Grove Connector

In diesem Beitrag möchte ich dir das aktive Piezo Buzzer Shield mit Grove Connector vorstellen. 

Einen aktiven Piezo Buzzer habe ich bereits im Beitrag Raspberry PI Tutorial #3: Piezo Buzzer für den Raspberry PI vorgestellt. Dieses kleine Modul für den Arduino funktioniert ähnlich nur das dieses zusätzlich über einen Grove Connector verfügt und somit super einfach an den Seeduino Nano angeschlossen werden kann.

Der Seeduino Nano in Verbindung mit dem Grove Shield bietet eine sehr einfache und vor allem verpolungssicherere Möglichkeit Shields und Module anzuschließen.

Grove Shield Board für Seeeduino Nano
Grove Shield Board für Seeeduino Nano

Bezug

Dieses kleine Modul habe ich über aliexpress.com für knapp 4€ inkl. Versandkosten erstanden. Die Preise auf ebay.de liegen derzeit bei ca. 7€ (inkl. kostenlosen Versand). 

Lieferumgang

Zum Lieferumfang des Modules gehört neben dem Modul selber noch ein ca. 20cm langes Anschlusskabel.

Tüte "aktives Piezo Buzzer Shield"
Tüte „aktives Piezo Buzzer Shield“

Geliefert wurde mir dieses einfache Shield in einer normalen Tüte (also keine antistatische Verpackung).

Technische Daten des aktiven Piezo Buzzer Shields

  • Anschluss – Grove Connector (einmal digitaler PWM Pin)
  • Spannung – 3.3V
  • Abmaße – 21mm x 21mm x 10mm

Aufbau und Schaltung

Das aktive Piezo Buzzer Modul verfügt wie bereits erwähnt über einen Grove Connector und wird über das beigefügte Kabel an zbsp. einem Seeduino Nano über das Grove Shield an einen digitalen PWM Pin angeschlossen.

aktives Piezo Buzzer Shield am Seeduino Nano
aktives Piezo Buzzer Shield am Seeduino Nano

Durch die kompakte Bauweise des Grove Shields sind leider nur 3 digitale Pins verfügbar, jedoch sind alle diese Pins PWM Pins. Ich habe das Modul an den digitalen Pin D6 angeschlossen.

Beispiel Projekt – Temperaturwarner mit Licht und Sound

Wie man Töne auf einem Piezo Buzzer wiedergibt habe ich in diversen Beiträgen bereits gezeigt, hier möchte ich gerne mit den zwei bereits vorgestellten 

Shields eine Schaltung aufbauen. Diese Schaltung soll dazu dienen bei einem erreichen einer Temperatur eine optische sowie akustische Warnung ausgegeben wird.

Aufbau der Schaltung

Für den Aufbau der Schaltung verwende ich neben der 3 Shields noch zusätzlich den Seeduino Nano sowie eine passendes Grove Shield und die Anschlusskabel.

Seeduino Nano mit LED, NTC und aktiver Piezo Buzzer
Seeduino Nano mit LED, NTC und aktiver Piezo Buzzer

Das NTC Widerstand Shield wird über einen analogen Anschluss mit dem Board verbunden (in meinem Fall A0) das LED Shield habe ich am digitalen Pin D4 und den aktiven Piezo Buzzer am digitalen Pin D6 angeschlossen.

Quellcode

Den Aufbau des Quellcodes möchte ich in drei Schritten aufteilen, dieses hat den Vorteil das man jeweils ein kleines Programm hat welches bereits eine Funktion hat. Des Weiteren ist es somit einfacher die einzelnen Funktionen zu erläutern.

Schritt 1 – Werte des NTC Widerstandes auslesen

Wie bereits erwähnt habe ich dem NTC Widerstand Shield bereits ein eigenen Beitrag gewidmet und dort auch gezeigt wie man den Wert ausließt.

NTC - Heißleiter - Thermistor mit Grove Schnittstelle
NTC – Heißleiter – Thermistor mit Grove Schnittstelle

Damit der Quellcode nicht so lang wird und sich auf das wesentliche beschränkt, lagere ich die Funktionen zum lesen der Temperatur in eine eigene Datei „ntc_resistor.ino“ aus. Eine Einbindung mit dem Befehl „include“ entfällt hierbei!

#include <math.h>

const int B = 4275; // B value of the thermistor
const int ntcWiderstand = 100000; // NTC-Widerstand mit 100 kOhm
const float MAX_ANALOG_VALUE = 1023.0; //maximaler Wert welcher am analogen Eingang erreicht werden kann

//An welchem analogen Pin der NTC-Widerstand angeschlossen ist
#define PIN A0

/**
 * Liest den Wert des NTC Widerstandes und berechnet den Widerstandswert
 */
double readResistorValue(){
  float analogValue = analogRead(PIN);
  float resistorValue = MAX_ANALOG_VALUE / analogValue - 1.0; 
  return ntcWiderstand * resistorValue;
}

/**
 * Liefert die aktuelle Temperatur in Grad Kelvin
 */
double getTempKelvin(){
  return convert2TempKelvin(readResistorValue());  
}

/**
 * Liefert die aktuelle Temperatur in Grad Celsius
 */
double getTempCelsius(){
  return convertKelvin2TempCelsius(getTempKelvin()); 
}

double convert2TempKelvin(float value){
  double temp = 1.0/(log(value/ntcWiderstand)/B+1/298.15);
  return temp;
}

double convertKelvin2TempCelsius(double kelvin){
 return kelvin - 273.15;
}

Schritt 2 – LED steuern

Nachdem wir nun die Temperatur auslesen können werden wir die LED abhängig von der Temperatur schalten. Hierbei gibt es nun zwei Wege , zum einen über ein Fade Effekt d.h. die LED wird mit steigender Temperatur heller und zum anderen durch einen fest eingestellten Schwellwert welcher bei überschreiten die LED aktiviert oder deaktiviert.

NTC Widerstand & LED mit Fade Effekt 
//LED am digitalen Pin D6 angeschlossen
#define LED 6

void setup() {
  //beginn der seriellen Kommunikation mit 9600 baud
  Serial.begin(9600);  
}

void loop() {
  //auslesen der Temperatur
  double temp = getTempCelsius();

  //mappen des Temperaturbereiches 0°C bis 45°C auf die
  //möglichen PWM Signalwerte von 0..255
  int ledValue = map(temp, 0,45,0,255);
  //setzen des LED Fade Effekts
  analogWrite(LED, ledValue);
}

Da das Grove Shield des Seeduino Nano nur über einen PWM Anschluss verfügt ist die Lösung leider nicht möglich (da wir diesen Pin für den Piezo Buzzer benötigen), aber ich wollte diese gerne gezeigt haben.

NTC Widerstand & LED mit AN / AUS bei erreichtem Wert

Schreiben wir nun das Programm so um das wir bei erreichen der Temperatur von größer als 23°C die LED aktivieren.

//LED am digitalen Pin D4 angeschlossen
#define LED 4

void setup() {
  //beginn der seriellen Kommunikation mit 9600 baud
  Serial.begin(9600);  
}

void loop() {
  //auslesen der Temperatur
  double temp = getTempCelsius();
  //initial die LED deaktivieren
  boolean ledStatus = LOW;
  //Wenn die Temperatur größer als 23°C ist dann...
  if(temp > 23) {
    //Variable ledStatus auf HIGH setzten
    //die LED wird dann aktiviert
    ledStatus = HIGH;
  }
  //setzen des aktuellen Wertes für die LED
  digitalWrite(LED, ledStatus);
}

 

Schritt 3 – aktiver Piezo Buzzer steuern

Den Buzzer steuert man mit der Funktion „tone“ diese Funktion gibt es zum einen mit den Parametern Pin und Frequenz, sowie mit Pin, Frequenz und Dauer. Im ersteren Fall muss man jedoch mit der Funktion „noTone(<<PIN>>)“ den Buzzer wieder deaktivieren.

tone(BUZZER, 1400);
delay(500);
noTone(BUZZER);
//oder
tone(BUZZER, 1400, 500);

Ich verwende zusätzlich die Funktion map um den Temperaturwert von 0°C bis 45°C einen bestimmten Ton „zuzuweisen“.

tone(BUZZER, map(temp, 0,45,500,2500), 500);

fertiges Sketch / Programm

Datei: grove_activePiezoBuzzer.ino

//LED am digitalen Pin D4 angeschlossen
#define LED 4

//aktiver Piezo Buzzer am digitalen Pin D6 angeschlossen
#define BUZZER 6

void setup() {
  //beginn der seriellen Kommunikation mit 9600 baud
  Serial.begin(9600);  
  pinMode(LED, OUTPUT);
  pinMode(BUZZER, OUTPUT);
}

void loop() {
  //auslesen der Temperatur
  double temp = getTempCelsius();
  //initial die LED deaktivieren
  boolean ledStatus = LOW;
  Serial.println(temp);
  //Wenn die Temperatur größer als 23°C ist dann...
  if(temp > 23) {
    //Variable ledStatus auf HIGH setzten
    //die LED wird dann aktiviert
    ledStatus = HIGH;
    tone(BUZZER, map(temp, 0,45,500,2500), 500);
  } 
  //setzen des aktuellen Wertes für die LED
  digitalWrite(LED, ledStatus);
  delay(500);  
}

Datei: ntc_resistor.ino

#include <math.h>

const int B = 4275; // B value of the thermistor
const int ntcWiderstand = 100000; // NTC-Widerstand mit 100 kOhm
const float MAX_ANALOG_VALUE = 1023.0; //maximaler Wert welcher am analogen Eingang erreicht werden kann

//An welchem analogen Pin der NTC-Widerstand angeschlossen ist
#define PIN A0

/**
 * Liest den Wert des NTC Widerstandes und berechnet den Widerstandswert
 */
double readResistorValue(){
  float analogValue = analogRead(PIN);
  float resistorValue = MAX_ANALOG_VALUE / analogValue - 1.0; 
  return ntcWiderstand * resistorValue;
}

/**
 * Liefert die aktuelle Temperatur in Grad Kelvin
 */
double getTempKelvin(){
  return convert2TempKelvin(readResistorValue());  
}

/**
 * Liefert die aktuelle Temperatur in Grad Celsius
 */
double getTempCelsius(){
  return convertKelvin2TempCelsius(getTempKelvin()); 
}

double convert2TempKelvin(float value){
  double temp = 1.0/(log(value/ntcWiderstand)/B+1/298.15);
  return temp;
}

double convertKelvin2TempCelsius(double kelvin){
 return kelvin - 273.15;
}

Download

Hier nun das Beispiel zum bequemen Download:

 

Video

 

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.