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);
}

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.

2 thoughts on “Arduino Projekt: 4-stelliges serielles 7-Segment Display am Arduino betreiben – Teil 2

  • Pingback: Arduino Projekt: 4-stelliges serielles 7-Segment Display am Arduino betreiben – Teil 1 | Makerblog.at

  • 27. Mai 2016 um 19:52
    Permalink

    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

    Antworten

Schreibe einen Kommentar

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

Time limit is exhausted. Please reload the CAPTCHA.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.