Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Digitaluhr auf Arduino mit einer Finite-State-Maschine

Komponenten und Verbrauchsmaterialien

Arduino UNO
Sie können jeden Arduino verwenden, der mit dem LCD Shield kompatibel ist. Ich habe das Arduino Mega verwendet.
× 1
LCD-Tastaturschild
× 1

Apps und Onlinedienste

YAKINDU Statechart Tools
Kostenlos für nicht-kommerzielle Nutzung.
Eclipse C++ IDE für Arduino

Über dieses Projekt

Hallo,

Ich werde Ihnen zeigen, wie eine Digitaluhr mit YAKINDU Statechart Tools erstellt und auf einem Arduino ausgeführt werden kann, der ein LCD-Keypad-Shield verwendet.

Das Originalmodell der Digitaluhr stammt von David Harel. Er hat einen Artikel über die "breite Erweiterung des konventionellen Formalismus von Zustandsautomaten und Zustandsdiagrammen" veröffentlicht.

In dieser Arbeit nutzte er das Beispiel der Digitaluhr für seine Forschungen. Ich habe es als Inspiration verwendet und die Uhr mit YAKINDU Statechart Tools (einem Tool zum Erstellen grafischer Modelle von Zustandsautomaten und zum Generieren von C/C++-Code damit) umgebaut und auf einem Arduino wieder zum Leben erweckt.

So funktioniert die Digitaluhr

Beginnen wir damit, zu definieren, wie die Digitaluhr funktionieren soll. Erinnerst du dich an diese... sagen wir... "ultra coole" Digitaluhren, die jeder in den 90ern hatte? Eine integrierte Stoppuhr, verschiedene Alarme und sein nerviger Piepton zu jeder vollen Stunde. Wenn nicht, schau mal:Digitaluhr aus den 90ern.

Im Grunde ist es also eine konfigurierbare Uhr mit verschiedenen Modi. Hauptsächlich wird die aktuelle Uhrzeit angezeigt, aber es gibt noch einige andere Funktionen. Als Eingabe hast du ein Ein/Aus , ein Modus und ein Set Taste. Außerdem kannst du das Licht ein- und ausschalten.

Mit dem Modus Taste können Sie zwischen den Modi unterscheiden und die Uhrfunktionen aktivieren/deaktivieren:

  • Anzeige der Uhrzeit (Uhr)
  • Datum anzeigen (Datum)
  • Stellen Sie den Wecker ein (Wecker 1, Wecker 2)
  • Gong aktivieren/deaktivieren (Gong einstellen)
  • Benutze die Stoppuhr (Stoppuhr)

Innerhalb der Menüs können Sie die Ein/Aus Taste, um den Modus zu konfigurieren. Das Set Mit der Taste können Sie die Uhrzeit einstellen - z.B. für die Uhr oder den Wecker. Die Stoppuhr kann über die Licht-Ein- und Licht-Aus-Taste gesteuert - gestartet und gestoppt werden. Sie können auch einen integrierten Rundenzähler verwenden.

Desweiteren ist ein Glockenspiel, das jeden voll klingelt, und eine steuerbare Hintergrundbeleuchtung integriert. Im ersten Schritt habe ich sie nicht mit dem Arduino verkabelt.

Die Zustandsmaschine

Ich möchte nicht zu sehr ins Detail gehen, um dieses Beispiel zu erklären. Das liegt nicht daran, dass es zu komplex ist, es ist nur ein bisschen zu groß. Ich werde versuchen, die Grundidee zu erklären, wie es funktioniert. Die Ausführung sollte selbsterklärend sein, indem man sich das Modell anschaut oder herunterlädt und simuliert. Einige Teile des Zustandsautomaten werden in Unterregionen zusammengefasst, wie die festgelegte Zeit Region. Damit soll die Lesbarkeit des Zustandsautomaten gewährleistet sein.

Das Modell gliedert sich in zwei Teile - einen grafischen und einen textuellen. Im Textteil werden die Ereignisse, Variablen etc. definiert. Im grafischen Teil – dem Zustandsdiagramm – wird die logische Ausführung des Modells spezifiziert. Um einen Zustandsautomaten zu erstellen, der das angegebene Verhalten erfüllt, sind einige Eingabeereignisse erforderlich, die im Modell verwendet werden können:onoff , set , Modus , Licht , und light_r. Im Definitionsbereich wird ein internes Ereignis verwendet, das den Zeitwert alle 100 ms inkrementiert:

alle 100 ms / Zeit +=1 

Basierend auf den 100 ms Schritten wird die aktuelle Zeit im HH:MM:SS berechnet Format:

display.first =(Zeit / 36000) % 24;
display.second =(Zeit / 600) % 60;
display.dritte =(Zeit / 10) % 60;

Die Werte werden mit der Operation updateLCD . mit dem LCD-Display verbunden jedes Mal, wenn die Zustandsmaschine aufgerufen wird:

display.updateLCD(display.first, display.second, display.third, display.text) 

Die grundlegende Ausführung des Zustandsautomaten ist bereits im Abschnitt Funktionsweise der Digitaluhr defined definiert . Innerhalb des Tools habe ich einige "spezielle" Modellierungselemente wie CompositeState . verwendet , Geschichte , Unterdiagramme , ExitNodes, etc.. Eine detaillierte Beschreibung finden Sie im Benutzerhandbuch.

LCD-Tastaturschild

Das LCD Keypad Shield ist ziemlich cool für einfache Projekte, die einen Bildschirm zur Visualisierung und einige Tasten als Eingabe benötigen - ein typisches, einfaches HMI (Human Machine Interface). Das LCD-Tastaturschild enthält fünf Benutzertasten und eine weitere zum Zurücksetzen. Die fünf Tasten sind alle zusammen mit dem A0-Pin des Arduino verbunden. Jeder von ihnen ist mit einem Spannungsteiler verbunden, der es ermöglicht, zwischen den Tasten zu unterscheiden.

Mit analogRead(0) können Sie die spezifischen Werte ermitteln, die natürlich je nach Hersteller abweichen können. Dieses einfache Projekt zeigt den aktuellen Wert auf dem LCD an:

#include 
#include

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup() {
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.write("Messwert");
}

void loop() {
lcd.setCursor(0,1);
lcd.print(" ");
lcd. setCursor(0,1);
lcd.print(analogRead(0));
delay(200);
}

Das sind meine gemessenen Ergebnisse:

  • Keine:1023
  • Auswählen:640
  • Links:411
  • Unten:257
  • Up:100
  • Recht:0

Mit diesen Schwellenwerten ist es möglich, die Schaltflächen zu lesen:

#define NONE 0
#define SELECT 1
#define LINKS 2
#define DOWN 3
#define UP 4
#define RIGHT 5

static int readButton() {
int result =0;
result =analogRead(0);
if (result <50) {
return RIGHT;
}
if (Ergebnis <150) {
Return UP;
}
if (Ergebnis <300) {
Return DOWN;
}
if (Ergebnis <550) {
return LEFT;
}
if (Ergebnis <850) {
return SELECT;
}
NONE zurückgeben;
}

Anbindung der State Machine

Der generierte C++-Code der Zustandsmaschine stellt Schnittstellen bereit, die zur Steuerung der Zustandsmaschine implementiert werden müssen. Der erste Schritt besteht darin, die In-Ereignisse mit den Tasten des Keypad Shield zu verbinden. Ich habe bereits gezeigt, wie man die Schaltflächen liest, aber um sie mit der Zustandsmaschine zu verbinden, ist eine Entprellung der Schaltflächen erforderlich - sonst würden die Ereignisse mehrmals ausgelöst, was zu unvorhersehbarem Verhalten führt. Das Konzept der Software-Entprellung ist nicht neu. Sie können sich die Arduino-Dokumentation ansehen.

In meiner Implementierung erkenne ich eine fallende Flanke (Loslassen der Schaltfläche). Ich lese den Wert des Buttons aus, warte 80 ms (bekomme mit 80 bessere Ergebnisse als 50), speichere das Ergebnis und lese den neuen Wert aus. Wenn das oldResult war nicht KEINE (nicht gedrückt) und das neue Ergebnis ist NONE , ich weiß, dass die Taste schon einmal gedrückt wurde und jetzt wieder losgelassen wurde. Dann löse ich das entsprechende Eingabeereignis des Zustandsautomaten aus.

int oldState =NONE;
static void raiseEvents() {
int buttonPressed =readButton();
delay(80);
oldState =buttonPressed;
if (oldState !=NONE &&readButton() ==NONE) {
switch (oldState) {
case SELECT:{
stateMachine->getSCI_Button()->raise_mode();
break;
}
case LEFT:{
stateMachine->getSCI_Button()->raise_set();
break;
}
case DOWN:{
stateMachine->getSCI_Button()->raise_light();
break;
}
case UP:{
stateMachine->getSCI_Button() ->raise_light_r();
break;
}
case RIGHT:{
stateMachine->getSCI_Button()->raise_onoff();
break;
}
Standard:{
Pause;
}
}
}
}

Dinge zusammen verkabeln

Das Hauptprogramm verwendet drei Teile:

  • Die Staatsmaschine
  • Ein Timer
  • Ein Display-Handler (typisch lcd.print(...))
DigitalWatch* stateMachine =new DigitalWatch();
CPPTimerInterface* timer_sct =new CPPTimerInterface();
DisplayHandler* displayHandler =new DisplayHandler();

Die Zustandsmaschine verwendet einen Display-Handler und hat einen Timer, der aktualisiert wird, um die zeitgesteuerten Ereignisse zu steuern. Danach wird die Zustandsmaschine initialisiert und eingegeben.

void setup() {
stateMachine->setSCI_Display_OCB(displayHandler);
stateMachine->setTimer(timer_sct);
stateMachine->init();
stateMachine->enter();
}

Die Schleife macht drei Dinge:

  • Eingabeereignisse auslösen
  • Berechnen Sie die verstrichene Zeit und aktualisieren Sie den Timer
  • Rufen Sie den Zustandsautomaten an
long current_time =0;
long last_cycle_time =0;
void loop() {
raiseEvents();
last_cycle_time =current_time;
current_time =millis();
timer_sct->updateActiveTimer(stateMachine,
current_time - last_cycle_time);
stateMachine->runCycle();
}

Holen Sie sich das Beispiel

Das ist es. Wahrscheinlich habe ich nicht jedes Detail der Implementierung erwähnt, aber Sie können sich das Beispiel ansehen oder einen Kommentar hinterlassen.

Fügen Sie das Beispiel zu einer laufenden IDE hinzu mit:

Datei -> Neu -> Beispiel -> YAKINDU Statechart Beispiele -> Weiter -> Arduino - Digital Watch (C++)

>> Sie können die IDE hier herunterladen <<

Sie können mit einer 30-tägigen Testversion beginnen. Danach müssen Sie eine Lizenz erwerben, die für den nicht-kommerziellen Gebrauch kostenlos ist !


Herstellungsprozess

  1. Finite State Machines
  2. Erstellen von Monitor-Ambilight mit Arduino
  3. Arduino Digital Dice
  4. ULTRASCHALLLEVITATION-Maschine mit ARDUINO
  5. DIY-Voltmeter mit Arduino und Smartphone
  6. Herzfrequenzmesser mit IoT
  7. WebServerBlink mit Arduino Uno WiFi
  8. Arduino Tamagotchi Klon - Digitales Haustier
  9. Arduino Apple Watch
  10. Automatisiertes Dino-Spiel mit Arduino