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.
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?