Als mein erstes Arduino Projekt möchte ich „Ardudoro“ vorstellen.
Der Name „Ardudoro“ setzt sich aus Arduino und Pomodoro zusammen.
Was Pomodoro ist, wird in diesem Wikipediaartikel sehr gut beschrieben.
Inhaltsverzeichnis
- Der Grund für Ardudoro
- Die Komponenten
- Der Experimentelle Aufbau
- Die Arduino Anwendung
- Die Java Anwendung LEDFrame
- Absenden eines Strings aus der Anwendung
- UML Diagramm
- Das Video
- Das fertige Programm zum Download inkl. Sourcen
Der Grund für Ardudoro
Wie jedes Projekt hat dieses auch einen Grund, auf Arbeit setzen wir Pomodoro häufig ein und es wird von jedem Entwickler angenommen und auch ausgerichtet, jedoch ist der Zustand nicht immer für jeden ersichtlich so kommt es des Öfteren vor das der Projektleiter oder andere Kollegen oder Fremdmitarbeiter diese Pomodorosession stört.
Durch dieses einfache Gerät wird es nun möglich sein deutlich kenntlich zu machen, wenn eine Pomodorosession läuft.
Die Komponenten
Es wurden folgende Komponenten verwendet:
- Sodial Nano (nachbau des Arduino Nano) – 4,85€
- Sodial 3 Farb RGB – 2,25€
- Lochrasterplatine – 2,50€
- Lötzinn, Lötkolben (15Watt)
- Schrauben (M3), ein Sperrholzbrett (4mm stark)
- eine Dose
Der Experimentelle Aufbau
Da das Hauptaugenmerk auf die Entwicklung einer Java Anwendung bestand ist der Aufbau so simple gehalten wie möglich.
Die Arduino Anwendung
Auch wenn das Gerät kein Original Arduino ist lässt sich mit der Arduino IDE für dieses Gerät entwickeln, man muss nur unter Tools->Board->Arduino Nano w/ ATmega328 einstellen und das Gerät über einen freien USB-Anschluss mit dem PC verbinden.
(Nicht über einen USB Hub.)
Der Quellcode für den Nano
Wenn man das Programm auf den Nano hochlädt und in der Arduino IDE den seriellen Monitor öffnet, wird eine kurze Hilfe angezeigt was für ein String erwartet wird.
Dieser String setzt sich aus folgenden Werten zusammen:
- s – signalisiert den Start
- r – der Wert für die Farbe Rot als dreistellige ganzzahl (zbsp. 000 oder 154)
- g – der Wert für die Farbe Grün als dreistellige ganzzahl (zbsp. 000 oder 154)
- b – der Wert für die Farbe Balu als dreistellige ganzzahl (zbsp. 000 oder 154)
- t – die Zeit wie lange die LED aufleuchten soll, in Millisekunden
- e- signalisiert das Ende
/* * Dateiname: Projekt_Ardudoro.ino * Thema: Pomodoro mit Unterstuetzung von Arduino (NANO) */ #define BLUE_LED 6 /* PIN fuer die blaue LED */ #define RED_LED 2 /* PIN fuer die rote LED */ #define GREEN_LED 4 /* PIN fuer die gruene LED */ void setup() { Serial.begin(9600); pinMode(BLUE_LED, OUTPUT); /* Setzt den PIN fuer die blaue LED als Ausgang. */ pinMode(RED_LED, OUTPUT); /* Setzt den PIN fuer die rote LED als Ausgang. */ pinMode(GREEN_LED, OUTPUT); /* Setzt den PIN fuer die gruene LED als Ausgang. */ /* Beschreibung der Funktion */ Serial.println("Projekt Ardudoro"); Serial.println("----------------"); Serial.println(""); Serial.println("Input:"); Serial.println(" [s] Start of transmission"); Serial.println(" [r] RED Value 0 - 255"); Serial.println(" [g] GREEN Value 0 - 255"); Serial.println(" [b] BLUE Value 0 - 255"); Serial.println(" [t] Time in milliseconds (-1 for no timer)"); Serial.println(" [e] End of transmission"); Serial.println(""); Serial.println("Example:"); Serial.println("sr255g033b150t1000e"); } void loop() { /* prüfen ob es eine Eingabe auf dem Seriellen Port gibt.*/ if (Serial.available() > 0) { /* Den Text lesen. */ String input = Serial.readString(); /* Leerzeichen entfernen.*/ input.trim(); /* Wenn der String nicht leer ist und mit den Zeichen s beginnt und mit dem Zeichen e endet.*/ if(input.length()>0 && input.startsWith("s")&&input.endsWith("e")){ analogWrite(RED_LED, input.substring(2,5).toInt()); analogWrite(GREEN_LED, input.substring(6,9).toInt()); analogWrite(BLUE_LED, input.substring(10,13).toInt()); int delayTime = input.substring(14,input.length()-1).toInt(); if(delayTime){ delay(delayTime); analogWrite(RED_LED, 000); analogWrite(GREEN_LED, 000); analogWrite(BLUE_LED, 000); } } else { /* Wenn der String nicht mit s beginnt und mit e endet, oder der String leer ist dann gebe die Fehlermeldung aus. */ Serial.println("SyntaxError ["+input+"]"); } } }
Wie im Quellcode ersichtlich ist, wird genau ein fest definierter Aufbau eines Strings erwartet.
Folgende Fehler könnten sich bisher einschleichen:
- es werden die Parameter für die Farben (rot,grün,blau) vertauscht
- es wird mehr als ein Parameter für eine Farbe eingegeben
- es wird der Wert für die Farbe nicht 3-stellig eingegeben
- es werden nicht nur nummerische Zeichen für den Wert der Farbe eingegeben
- es wird ein Parameter vergessen
- usw.
Diese Liste lässt sich sicherlich beliebig erweitern, jedoch ist dieser Aufbau für ein kleines Tutorial völlig ausreichend.
Die Java Anwendung LEDFrame
Absenden eines Strings aus der Anwendung
Die Anwendung stellt mit der Oberfläche die Einstellungen für den Aufbau der Verbindung sowie die Wahl der Farbe und die Leuchtdauer bereit.
Nachdem der Benutzer alle Daten gewählt hat, wird über den Button folgende Aktion ausgeführt:
SerialCommunication serialCommunication = new SerialCommunication.SerialCommunicationBuilder(model.getPortname()).setSerialPortParameter(model.getBaudrate(), model.getDatabits(), model.getStopbits(), model.getParity()).setSleepForClosePortEvent(model.getSleep()).build(); Map<String, Integer> colorMap = model.getColorMap(); int redValue = colorMap.get(RED); int greenValue = colorMap.get(GREEN); int blueValue = colorMap.get(BLUE); DecimalFormat decimalFormat = new DecimalFormat("000"); String value = String.format("sr%sg%sb%st%se", decimalFormat.format(redValue), decimalFormat.format(greenValue), decimalFormat.format(blueValue), model.getSleep()); serialCommunication.openPort(); serialCommunication.writeString(value); serialCommunication.closePort();
Wie hier zusehen ist, wird der erwartete String über die Methode String.format (Zeile 8) in das im Arduino Programm definierte Format gebracht wird, somit ist sichergestellt, das hier wenig schiefgehen kann.
Es wird nun der Port geöffnet, der String wird geschrieben und danach wird der Port wieder geschlossen.
Da die Klasse SerialCommunication die Klasse jssc.SerialPort „nur“ Wrappt sind die dahinterliegenden Methoden nicht sichtbar dies ist von mir so gewollt da das konstukt in jssc simple jedoch etwas fehleranfällig ist. Fraglich ist, warum ich ein SerialPortEvent auslösen muss damit ich etwas auf den Seriellen Port schreiben kann. Dies bedeutet ich blähe meinen Code unnütz auf, dieses habe ich gelöst, indem die Klasse SerialCommunication dieses für mich erledigt und ich mich mit weniger Methoden und Klassen beschäftigen muss.
Die gesamte Java Klasse.
Was an der Klasse SerialCommunication fehlt, ist die Möglichkeit zu lesen. Diese Funktionalität wird mit dem nächsten Projekt implementiert.
UML Diagramm
Zur Verdeutlichung wie das Programm LEDFrame aufgebaut ist soll folgendes UML Klassendiagramm dienen.
Die Kommunikation zwischen der Anwendung LEDFrame und dem Arduino erfolgt über die Klasse SerialCommunication diese leitet sich aus der Klasse jssc.SerialPort ab.
Das Package JSSC kann über Maven oder als externe JAR Datei >>hier<< bezogen werden.