Das Funktionsprinzip der vorgeschlagenen Anzeige, die von Instructables unter dem Spitznamen alstroemeria erstellt und erstellt wurde, lautet wie folgt: Von Servos vorgerückte Segmente werfen einen Schatten, der sie sichtbar macht. Die verbleibenden Segmente, die sich in derselben Ebene wie der Hintergrund befinden, werden mit diesem zusammengeführt.
Es ist klar, dass
hausgemacht Es stellt sich als teuer heraus, weil der Meister für sie bis zu 28 solcher Servos erwirbt:
Und ein Verwaltungsmodul, mit dem eine Verbindung hergestellt wird
Arduino so:
Das Echtzeituhrmodul (RTC) vor diesem Hintergrund scheint ein sehr geringer Aufwand zu sein.
Nachdem der Master alle erforderlichen Komponenten erworben hat, legt er sie beiseite, um Vorlagen für den mechanischen Teil der Anzeige zu erstellen. Er bekommt vier Dateien:
1,
2,
3,
4. Der Assistent zeigt die Dateien 1 und 3 zweimal auf einem Schneideplotter und 2 und 4 nacheinander im Maßstab 1: 1 an und erhält sechs Teile, von denen einige in gewisser Weise alten Lochkarten ähneln. Sie können auch drucken, auch im Maßstab 1: 1 und in den gleichen Mengen, und manuell schneiden.
Dremel schneidet hohle Metallstifte mit einer Länge von 20 mm und Rohre mit einem Außendurchmesser, der etwas größer ist als der Außendurchmesser des Stifts mit einer Länge von 10 mm:
Klebt Schichten mit dickem doppelseitigem Klebeband, fügt Röhren hinzu:
Es fügt bewegliche Segmente hinzu, die an die durch die Rohre geführten Stifte geklebt sind, und klebt auf der Rückseite Stahldrahtschieber an dieselben Stifte, und hier sind die Stifte hohl:
Es biegt Drücker, klebt Servos und verbindet sich mit ihnen:
Schließt die Servos mit dem verbleibenden Lochblech:
Das Servosteuerungsmodul wird gemäß dem am Anfang des Artikels angegebenen Schema angeschlossen. Die Antriebe selbst werden in der Reihenfolge, die den Standardsegmentbezeichnungen entspricht, mit dem Modul verbunden:
Das RTC-Modul wird wie folgt angeschlossen: SDA - Pin 4 des Arduino, SCL - Pin 5 plus Stromversorgung und gemeinsamer Draht - parallel zu den entsprechenden Arduino-Leitungen. Hier ist das Ergebnis:
Der Assistent legt die Zeit im RTC-Modul mit dieser Skizze fest (Sie benötigen die RTClib-Bibliothek):
#include
#include "RTClib.h"
RTC_DS1307 RTC;
void setup () {
Serial.begin (57600);
Wire.begin ();
RTC.begin ();
if (! RTC.isrunning ()) {
Serial.println ("RTC läuft NICHT!");
RTC.adjust (DateTime (__ DATE__, __TIME__));
}}
}}
Dann füllt es die Hauptskizze aus, für die dieselbe Bibliothek erforderlich ist:
#include
#include "RTClib.h"
RTC_DS1307 RTC;
kurzes segA = 0; // Pin 14 anzeigen
kurzes segB = 1; // Pin 16 anzeigen
kurzes segC = 2; // Pin 13 anzeigen
kurzes segD = 3; // Pin 3 anzeigen
kurzes segE = 4; // Pin 5 anzeigen
kurzes segF = 5; // Pin 11 anzeigen
kurzes segG = 6; // Pin 15 anzeigen
kurz segA_OUT = 110;
kurz segB_OUT = 110;
kurz segC_OUT = 110;
kurz segD_OUT = 110;
kurz segE_OUT = 110;
kurz segF_OUT = 110;
kurz segG_OUT = 110;
kurz segA_IN = 90;
kurz segB_IN = 90;
kurz segC_IN = 90;
kurz segD_IN = 90;
kurz segE_IN = 90;
kurz segF_IN = 90;
kurz segG_IN = 90;
int TIME = 2000;
DateTime datePast;
DateTime dateNow;
// Haushalt
void setup () {
Serial.begin (9600);
Wire.begin ();
RTC.begin ();
RTC.adjust (DateTime (__ DATE__, __TIME__));
datePast = RTC.now ();
}}
// Hauptschleife
void loop () {
dateNow = RTC.now ();
if (! (datePast.hour () == dateNow.hour () && datePast.minute () == dateNow.hour ()))
{
displayNumber (dateNow.hour () * 100 + dateNow.minute ());
datePast = dateNow;
}}
}}
// Bei gegebener Zahl zeigen wir 10:22 an
// Nach dem Durchlaufen der 4 Zahlen bleibt die Anzeige ausgeschaltet
void displayNumber (int toDisplay) {
für (int digit = 4; digit> 0; digit--) {
lightNumber (toDisplay% 10, Ziffer);
toDisplay / = 10;
}}
// Bewegung starten
Serial.print ("T"); Serial.println (TIME);
}}
void move (int servo, int position) {
Serial.print ("#");
Serial.print (Servo);
Serial.print ("P");
Serial.print (Position);
}}
// Wenn eine Zahl angegeben ist, werden diese Segmente aktiviert
// Wenn number == 10, dann schalte number aus
void lightNumber (int numberToDisplay, int segment) {
int offset = (segment - 1) * 7;
switch (numberToDisplay) {
Fall 0:
move (segA + offset, segA_OUT);
move (segB + offset, segB_OUT);
move (segC + offset, segC_OUT);
move (segD + offset, segD_OUT);
move (segE + offset, segE_OUT);
move (segF + offset, segF_OUT);
move (segG + offset, segG_IN);
Pause;
Fall 1:
move (segA + offset, segA_IN);
move (segB + offset, segB_OUT);
move (segC + offset, segC_OUT);
move (segD + offset, segD_IN);
move (segE + offset, segE_IN);
move (segF + offset, segF_IN);
move (segG + offset, segG_IN);
Pause;
Fall 2:
move (segA + offset, segA_OUT);
move (segB + offset, segB_OUT);
move (segC + offset, segC_IN);
move (segD + offset, segD_OUT);
move (segE + offset, segE_OUT);
move (segF + offset, segF_IN);
move (segG + offset, segG_OUT);
Pause;
Fall 3:
move (segA + offset, segA_OUT);
move (segB + offset, segB_OUT);
move (segC + offset, segC_OUT);
move (segD + offset, segD_OUT);
move (segE + offset, segE_IN);
move (segF + offset, segF_IN);
move (segG + offset, segG_OUT);
Pause;
Fall 4:
move (segA + offset, segA_IN);
move (segB + offset, segB_OUT);
move (segC + offset, segC_OUT);
move (segD + offset, segD_IN);
move (segE + offset, segE_IN);
move (segF + offset, segF_OUT);
move (segG + offset, segG_OUT);
Pause;
Fall 5:
move (segA + offset, segA_OUT);
move (segB + offset, segB_IN);
move (segC + offset, segC_OUT);
move (segD + offset, segD_OUT);
move (segE + offset, segE_IN);
move (segF + offset, segF_OUT);
move (segG + offset, segG_OUT);
Pause;
Fall 6:
move (segA + offset, segA_OUT);
move (segB + offset, segB_IN);
move (segC + offset, segC_OUT);
move (segD + offset, segD_OUT);
move (segE + offset, segE_OUT);
move (segF + offset, segF_OUT);
move (segG + offset, segG_OUT);
Pause;
Fall 7:
move (segA + offset, segA_OUT);
move (segB + offset, segB_OUT);
move (segC + offset, segC_OUT);
move (segD + offset, segD_IN);
move (segE + offset, segE_IN);
move (segF + offset, segF_IN);
move (segG + offset, segG_IN);
Pause;
Fall 8:
move (segA + offset, segA_OUT);
move (segB + offset, segB_OUT);
move (segC + offset, segC_OUT);
move (segD + offset, segD_OUT);
move (segE + offset, segE_OUT);
move (segF + offset, segF_OUT);
move (segG + offset, segG_OUT);
Pause;
Fall 9:
move (segA + offset, segA_OUT);
move (segB + offset, segB_OUT);
move (segC + offset, segC_OUT);
move (segD + offset, segD_OUT);
move (segE + offset, segE_IN);
move (segF + offset, segF_OUT);
move (segG + offset, segG_OUT);
Pause;
Fall 10:
move (segA + offset, segA_IN);
move (segB + offset, segB_IN);
move (segC + offset, segC_IN);
move (segD + offset, segD_IN);
move (segE + offset, segE_IN);
move (segF + offset, segF_IN);
move (segG + offset, segG_IN);
Pause;
}}
}}
Alles arbeitet:
Die mechanische Anzeige eines nicht trivialen Designs ist fertig.