Im ersten Teil des Tutorials habe ich die serielle 7-Segment-Anzeige von Sparkfun an den Arduino angeschlossen und getestet.
Jetzt integrieren wir ein Potentiometer und ein Piezo-Element in das Projekt. Mit dem Potentiometer können wir eine Frequenz bis 1023 Hertz einstellen und den eingestellten Wert am Display anzeigen. Damit die Frequenz aber nicht nur sichtbar, sondern auch hörbar wird, erzeugen wir mit dem Befehl tone() des Arduino über das Piezo-Element den dazu passenden Ton.
Der Aufbau der Schaltung und der Programmcode werden im Video erklärt:
Den Programmcode könnt ihr hier über die Zwischenablage in ein neues Arduino-Fenster kopieren:
// SoftwareSerial Library einbinden
#include <SoftwareSerial.h>
// Das Lesepin wird nicht verwendet, wir schreiben nur an das Display
const int readPin = 3;
// Schreibpin RX des Display an Pin 2 des Arduino
const int writePin = 2;
// Das Potentiometer kommt an das Analogpin 0
const int potiPin = 0;
// Den Poti-Wert nicht direkt ausgeben, sondern einen Durchschnitt über die
// letzten 10 Messungen ermitteln. Macht die Ausgabe weniger sprunghaft.
// numCells = Größe des Arrays für die letzten Messwerte
const int numCells = 20;
// Array für die Messwerte definieren
int potiValues[numCells];
// Zeiger auf die nächste Zelle im Array
int index = 0;
// Gesamtsumme aller Array-Einträge
int total = 0;
// Berechneter Mittelwert der Array-Einträge
int average = 0;
// Objekt namens ssd erzeugen, Pins übergeben
SoftwareSerial ssd(readPin, writePin);
// In diesen String kommt der Inhalt für das Display
char displayString[8];
// Variable für Counter
int displayValue = 0;
// setup() wird einmalig zu Programmbeginn ausgeführt
void setup()
{
// Serielle Kommunikation mit 9600bps starten
ssd.begin(9600);
// Display löschen, siehe Funktion weiter unten
clearDisplay();
// 8888 an Display schicken, damit leuchten alle Ziffernsegmente
ssd.print("8888");
// Punkte & Doppelpunkte einschalten, siehe Funktion weiter unten
setDecimals(0b00111111);
// Helligkeit auf Maximum
setBrightness(255);
// 2 Sekunden warten
delay(2000);
// 1234 an Display schicken
ssd.print("1234");
// Alle Punkte etc. ausschalten
setDecimals(0b00000000);
// 2 Sekunden warten
delay(2000);
// Testsequenz beim Boot vorbei, Display löschen
clearDisplay();
// Array für die Messwerte initialisieren
for (int thisCell = 0; thisCell < numCells; thisCell++) {
potiValues[thisCell] = 0;
}
}
// loop wird immer wieder ausgeführt, solange der Arduino läuft
void loop()
{
// Hier wird der Durchschnitt der letzten 10 Messungen des Poti berechnet
// index zeigt auf den "ältesten" Wert, der bei der nächsten
// Messung ersetzt wird.
// Zuerst den ältesten Wert von der Gesamtsumme abziehen
total = total - potiValues[index];
// Dann neuen Messwert in das Array schreiben
potiValues[index] = analogRead(potiPin);
// Neuen Messwert zur Gesamtsumme addieren
total = total + potiValues[index];
// Zeiger auf nächstes Feld erhöhen
index ++;
// Wenn der Zeiger index größer 9, dann auf 0 setzen
if (index >= numCells) {
index = 0;
}
// Durchschnitt berechnen aus Summe / Anzahl
average = total / numCells;
// Wenn Durchschnitt > 40 dann als Ton ausgeben
if (average > 40) {
tone(10, average);
}
// sonst mit noTone für Ruhe sorgen
else {
noTone(10);
}
// Durchschnitt berechnen
displayValue = average;
// sprintf() gibt Eingabewerte formatiert als String zurück
// %d04 bedeutet: Eingabewert 4-stellig zurückgeben, mit führenden Nullen
sprintf(displayString, "%04d", displayValue);
// Wert ans Display schicken
ssd.print(displayString);
// 10ms warten
delay(10);
}
// Die folgenden Funktionen sind aus einem Demo-Programm auf arduino.cc
// Send the clear display command (0x76)
// This will clear the display and reset the cursor
void clearDisplay()
{
ssd.write(0x76); // Clear display command
}
// Set the displays brightness. Should receive byte with the value
// to set the brightness to
// dimmest------------->brightest
// 0--------127--------255
void setBrightness(byte value)
{
ssd.write(0x7A); // Set brightness command byte
ssd.write(value); // brightness data byte
}
// Turn on any, none, or all of the decimals.
// The six lowest bits in the decimals parameter sets a decimal
// (or colon, or apostrophe) on or off. A 1 indicates on, 0 off.
// [MSB] (X)(X)(Apos)(Colon)(Digit 4)(Digit 3)(Digit2)(Digit1)
void setDecimals(byte decimals)
{
ssd.write(0x77);
ssd.write(decimals);
}
Code-Sprache: Arduino (arduino)
Mit diesem Skript sollte der eingestellte Wert des Potentiometers am Display angezeigt und am Piezo ausgegeben werden. Werte unter 40 sorgen für Ruhe.
Fragen, Anregungen und Korrekturen bitte einfach in die Kommentare schreiben – hier oder auf Youtube.
Pingback: Arduino Projekt: 4-stelliges serielles 7-Segment Display am Arduino betreiben – Teil 1 | Makerblog.at
Hallo Herr Dax,
habe mir ihre Videos mit großem Interesse angesehen. Finde Ihre Erklärungen richtig gut. Ich bin ein absoluter Neuling auf dem Gebiet obwohl mein Sohn schon lange damit arbeitet und ich Elektromonteur bin, habe ich nie begriffen wie die Programmzeilen erstellt werden. Glaube das ich das auch schaffe da ihre Erklärungen richtig nachvollziehbar erstellt sind.
Ich habe drei Garagentore wobei ich manchmal vergesse eins nachts zu schließen. Will nun mit Bizo eine Warnung ausgeben wenn abends noch nach 21:00 länger als 5 Minuten offen. das dann auf den Alarm ins Haus funkmäßig übertragen. Hoffe es klappt. Wolfgang
Hallo,
wie nennt man die Platine wo die 7 Segmentanzeige aufgelötet ist?