···
www.simsso.de

Software

Auf dieser Seite finden Sie einen Überblick über einige Software, die ich programmiert habe.


Online-Tools

Die Website tools.timodenk.com ist eine Sammlung von Online-Tools. Die Programmierung begann im Dezember 2015.


Abfrage3 Web

Abfrage3 ist ein online Vokabeltrainer mit Funktionen zum Erstellen, Teilen und Organisieren von Vokabellisten. Die Ambition ist es, das Lernen von Vokabeln einer fremden Sprache effizienter zu gestalten.

Die Screenshots zeigen die Startseite, eine Vokabelliste und den Abfrage-Bildschirm.


Kreuzzüge (Strategiespiel)

Kreuzzüge ist ein rundenbasiertes 2D Multiplayer-Strategiespiel. Ziel ist die Neutralisierung des feindlichen Hauptquartiers. Dafür muss der Spieler Einheiten ausbilden, Städte, Dörfer und Ausbildungsstätten (Kaserne, Stallungen, Fabrik, Hafen, Tempel) einnehmen. Die beiden Konfliktparteien sind Kreuzritter und Sarazenen. Das Spiel spielt zur Zeit der Kreuzzüge.

Da Kreuzzüge im Rahmen eines Schulprojekts entstanden ist, wurde eine Dokumentation angefertigt. Entwickelt wurde das Spiel von Februar bis April 2015 in den Programmiersprachen C# und PHP. Die Screenshots zeigen das Hauptmenü (Abb. 1) und zwei laufende Spiele (Abb. 2 und 3).

Taktisches Spielen ist bei Kreuzzüge erfordert, da es auf der Spielkarte verschiedenen Untergründe, wie z. B. Wälder, Berge, Wege, etc. gibt. Diese bieten einer Einheit Vor- und Nachteile: In Bergen können sich Einheiten beispielsweise besser verteidigen, auf Wegen können sie weiter laufen. Da die meisten Einheiten einen begrenzten Proviant und manche auch begrenzte Munition haben, ist es erforderlich eine Einheit immer wieder in einer Stadt zu stationieren, da sich dort die Leben, Munition und Proviant der Einheit pro Runde um 1 erhöhen.

Die Idee von Kreuzzüge ist nicht neu: Vor über 10 Jahren veröffentlichte die media Verlagsgesellschaft mbH ein Spiel gleichen Namens, produziert wurde es von TASK four. Das Originalspiel hat keinen funktionsfähigen Multiplayer und ermöglicht keine lokalen Spiele zwischen zwei Personen. Ein weiterer Nachteil ist, dass immer 10x10 Spielfelder angezeigt werden und man bei größeren Karten (z. B. 30x10) scrollen muss. Die Idee bei diesem Projekt war es, das Spiel so originalgetreu wie möglich nachzuprogrammieren und die Schwachstellen zu verbessern.


Arduino RAM-Viewer


Direct download link: RAM-Viewer


SimssoFileExplorer

Der SimssoFileExplorer ist ein Datei-Explorer für Windows (Abb. 1), der in C# am 02. Januar 2015 programmiert wurde.
Er hat einen kleinen Funktionumfang - aber den wichtigen Vorteil gegenüber dem Standard Windows Explorer (Abb. 2), dass die Größe von Ordnern in Hintergrund asynchron ausgerechnet und dann angezeigt wird. Damit lassen sich Speicherplatzfresser leichter lokalisieren. Das Programm kann hier heruntergeladen werden.


Simsso.de

Die Website www.simsso.de betreibe ich seit 10. Mai 2010. Ich habe mit ihr die Programmierung in HTML, CSS, JavaScript und PHP gelernt. Im Laufe der Zeit hat die Website verschiedene, rückblickend teils amüsante Designs gehabt, von denen Sie nachfolgend einige Screenshots sehen können.

Eine Auflistung aller Unterseiten von www.simsso.de finden Sie auf der Sitemap.


Abfrage3

Abfrage3 ist ein Vokabeltrainer, der eingegebene Vokabeln abfragt. Es gibt diverse weitere Features, wie zum Beispiel eine Übersetzen-Funktion oder einen online Cloud-Speicher in dem man seine Vokabellisten speichern kann.

Die verwendete Programmiersprache ist C#, das Programm läuft ab Windows 7. Abfrage3 steht als .exe Datei zum Download bereit.


Shift Register 74HC595 Arduino Library

Die Shift Register 74HC595 Library ist eine Arduino Bibliothek, also eine Sammlung von Funktionen, die im November 2014 in C++ entwickelt wurde. Sie dient dazu, die Verwendung von Schieberegistern in Kombination mit dem Arduino zu vereinfachen. Mit Schieberegistern ist es möglich, die Anzahl an digitalen Ausgängen zu erhöhen.

Eine ausführliche Dokumentation und Erklärung der Bibliothek (Abb. 1) findet sich auf der Website shiftregister.simsso.de. Dort sind auch Schaltpläne (Abb. 2), die zeigen, wie ein oder mehrere Schieberegister (vom Typ 74HC595) an einen Microcontroller angeschlossen werden.


Shapemodgen

Shapemodgen ist die Abkürzung für Shape Model Generator und ein in C geschriebenes Windows Programm. Programmiert wurde es während einem Praktikum beim DLR Berlin in zwei Augustwochen des Jahres 2014. Teile des Programms stammen von Dr. Stefano Mottola (DLR). Bevor Sie den Text über das Programm Shapemodgen lesen, sollten Sie sich mit den Begriffen lightcurve, shape und mesh vertraut machen.

Das Programm generiert aus einer zuvor erzeugten geosphere (Abb. 4 links) ein basic-mesh (Abb. 4 mitte). Dieses wird entlang verschiedener Achsen skaliert und verschoben, um verschiedene Formen zu erzeugen (Abb. 4 rechts). Von jeder generierten Form wird die lightcurve berechnet, interpoliert und mit einer eingeladenen reference lightcurve verglichen. In einer Ausgabedatei wird gespeichert, wie groß der Unterschied der lightcurve des jeweiligen mesh zur reference lightcurve ist. Der beste Fit könnte der Form des reference objects nahe kommen. Feinanpassungen der shape können in meinem Programm Lightcurve Generator vorgenommen werden.

Die Routinen geosphere generieren, lightcurve aus shape berechnen und reference lightcurve laden wurden von Dr. Mottola programmiert und für Shapemodgen zur Verfügung gestellt.

Die Auflösung der errechneten lightcurve und damit auch die Genauigkeit des Vergleichs mit der reference lightcurve hängt wesentlich von den subdivisions des basic-mesh ab. Abb. 2 zeigt die errechneten lightcurves bei verschiedenen subdivisions. Die Interpolation ermöglicht eine Phasenverschiebung vor dem Vergleich der lightcurves und erhöht die Rechengeschwindigkeit (Abb. 3).

Die unter Windows ausführbare .exe Datei kann heruntergeladen werden (shapemodgen.exe), ebenso wie eine reference lightcurve (shapemodgen-kiviuq-single.kas) vom Saturnmond Kiviuq.


Typing Speed Game

Das Typing Speed Game ist ein Spiel, bei dem man, aus knapp 1000 verschiedenen englischen Wörtern zufällig ausgewählte, herabfallende Wörter so schnell wie möglich abtippen muss. In der unteren rechten Ecke steht, wie viele korrekte Zeichen man durchschnittlich pro Sekunde eingegeben hat.

Das Spiel wurde in der Nacht des 2. Januar 2015 programmiert und findet sich unter der URL http://simsso.de/typing-game/.


HobbyScout24

HobbyScout24 soll dabei helfen, Personen mit ähnlichen Interessen und Hobbies in der Nähe zu finden. Dazu gibt es eine Übersichtskarte, auf der alle registrierten Nutzer und deren Hobbies angezeigt werden (Abb. 1). Nachdem man sich eingeloggt hat (Abb. 2) kann man seine eigenen Hobbies und den Wohnort definieren (Abb. 3). Außerdem kann man eingeloggt mit anderen Personen auf der Karte Kontakt aufnehmen (Abb. 4).

HobbyScout24 wurde bei Jugend hackt im September 2014 von Timo Denk, Leander Berg, Björn Ternes und Nicolas Müller entwickelt.

Die App läuft über einen Node-Server mit Mongo Datenbank. Clientseitig wird Angular.js eingesetzt. Der Quellcode ist bei Bitbucket einsehbar.


debate-it

debate-it ist ein Projekt, das während dem Festival of Code im August 2014 in Plymouth enstanden ist. Ich habe das Backend programmiert, ein Node-Server, der mit Socket.io einen Chat bereitstellt. Die Website ist nicht mehr online, der Code ist bei Bitbucket einsehbar.

Bei debate-it beantwortet man auf der Startseite (Abb. 1) verschiedene politische Fragen und kommt dann in einen Chat mit einer Person (Abb. 2 und 3), die alle Fragen bis auf eine gleich beantwortet hat. Über das Thema, das hinter dieser Frage steht, kann man dann in einem Chat diskutieren.


SippenChat

Der SippenChat ist ein soziales Netzwerk. Man kann mit anderen registrierten Nutzern schreiben (Abb. 2) und Gruppen (Sippen) gründen (Abb. 3). Derzeit ist der SippenChat nicht mehr in Verwendung, unter anderem, da die Chattechnik (Ajax Anfragen) zu langsam ist.

Die Domain des SippenChat ist www.sippenchat.de.


Lightcurve Generator

Der Lightcurve Generator ("Lichtkurven Generator") ist ein noch nicht fertiggestelltes Web-Tool, das es ermöglicht, synthetische Lichtkurven von einem oder zwei benutzerdefinierten Objekten zu erzeugen. Derzeit fehlen noch einige wichtige Funktionen. Die Objekte werden dabei über die drei Achsen eines Ellipsoiden sowie einer Abstandsangabe definiert oder können als OBJ-Datei eingelesen werden. Programmiert wurde der Lightcurve Generator im zweiten Halbjahr des Jahres 2014.

Das Tool gibt dem Benutzer die Möglichkeit, mit Teleskopen oder Raumsonden gemessene Lichtkurven (die importiert werden können - Abb. 2) von Licht reflektierenden astronomischen Objekten (insbesondere Asteroiden oder Planetenmonde) mit den durch den Lightcurve Generator berechneten Kurven zu vergleichen, um Rückschlüsse auf die mögliche Form und Polachsenrichtung des astronomischen Objekts ziehen zu können, und um zu erforschen, ob es sich gegebenenfalls um ein binäres Objekt (Asteroid oder Mond "mit Mond") handeln könnte. Damit können grundlegende physikalische Informationen von Objekten gewonnen werden, die im Teleskop nicht als Scheibchen, sondern nur punktförmig erscheinen.

Der Link zur Website: lightcurvegenerator.simsso.de


ATtiny85 Serial To 4x7-Segement

Der nachfolgende erste Sketch emöglicht es, eine 4x7-Segment-Anzeige mit einem ATtiny 85 über zwei Schieberegister (z. B. 74HC595) anzusteuern. Zwei Kabel werden dabei für die serielle Datenübertragung zum ATtiny85 genutzt. Der zweite Sketch sendet ebendiese Daten. Beide sind in C++ programmiert.

// converts a serial input signal to a 4 x 7 segment serial output for two 8-bit shift registers

const byte latchPin = 0, clockPin = 1, dataPin = 2, inputClockPin = 3, inputDataPin = 4; 

byte mask1, mask2, data1, data2;
String value = "0000"; 

void setup() 
{
  pinMode(latchPin, OUTPUT); 
  pinMode(clockPin, OUTPUT); 
  pinMode(dataPin, OUTPUT); 
  pinMode(inputClockPin, INPUT); 
  pinMode(inputDataPin, INPUT); 
  delay(5000); 
}

void loop()
{
  if (digitalRead(inputClockPin) == LOW)
    showString(value);
  else {
    while (digitalRead(inputClockPin) == HIGH) {
      ;
    }
    delayMicroseconds(100); // removeable
    value = String(customShiftIn(inputDataPin, inputClockPin));
  }
}

void showString(String string)
{
  showChar(String(string.charAt(0)), 1); 
  showChar(String(string.charAt(1)), 2); 
  showChar(String(string.charAt(2)), 3); 
  showChar(String(string.charAt(3)), 4); 
}

void showChar(String character, byte segment)
{
  // select one of the segments 1, 2, 3 or 4
  if (segment == 1) {
    //           12345678
    mask1 = B11111010;
    //           9ABC----
    mask2 = B01111111; 
  }
  else if (segment == 2) {
    //           12345678
    mask1 = B11111010; 
    //           9ABC----
    mask2 = B11101111;  
  }
  else if (segment == 3) {
    //           12345678
    mask1 = B11111011; 
    //           9ABC----
    mask2 = B01101111;   
  }
  else {
    //           12345678
    mask1 = B11111110; 
    //           9ABC----
    mask2 = B01101111;
  }


  // data
  // numbers
  if (character == "0") {
    //       EDPCG1B1
    data1 = B00101101;
    //       1FA1XXXX
    data2 = B10010000;
  }
  else if (character == "1") {
    //       EDPCG1B1
    data1 = B11101101;
    //       1FA1XXXX
    data2 = B11110000;
  }
  else if (character == "2") {
    //       EDPCG1B1
    data1 = B00110101;
    //       1FA1XXXX
    data2 = B11010000;
  }
  else if (character == "3") {
    //       EDPCG1B1
    data1 = B10100101;
    //       1FA1XXXX
    data2 = B11010000;
  }
  else if (character == "4") {
    //       EDPCG1B1
    data1 = B11100101;
    //       1FA1XXXX
    data2 = B10110000;
  }
  else if (character == "5") {
    //       EDPCG1B1
    data1 = B10100111;
    //       1FA1XXXX
    data2 = B10010000;
  }
  else if (character == "6") {
    //       EDPCG1B1
    data1 = B00100111;
    //       1FA1XXXX
    data2 = B10010000;
  }
  else if (character == "7") {
    //       EDPCG1B1
    data1 = B11101101;
    //       1FA1XXXX
    data2 = B11010000;
  }
  else if (character == "8") {
    //       EDPCG1B1
    data1 = B00100101;
    //       1FA1XXXX
    data2 = B10010000;
  }
  else if (character == "9") {
    //       EDPCG1B1
    data1 = B10100101;
    //       1FA1XXXX
    data2 = B10010000;
  }
  // blank
  else {
    //       EDPCG1B1
    data1 = B11111111;
    //       1FA1XXXX
    data2 = B11110000;
  }

  /*
   //       EDPCG1B1
   data1 = B11111111;
   //       1FA1XXXX
   data2 = B11110000;
   */

  shiftOut(dataPin, clockPin, LSBFIRST, data2 & mask2); 
  shiftOut(dataPin, clockPin, LSBFIRST, data1 & mask1); 
  digitalWrite(latchPin, LOW); 
  digitalWrite(latchPin, HIGH); 
}

byte customShiftIn(byte dataPin, byte clockPin) {
  byte data;
  for (byte i = 0; i < 8; i++) {
    while (digitalRead(clockPin) == LOW);
    if (digitalRead(dataPin) == HIGH)
      bitWrite(data, i, 1);
    else 
      bitWrite(data, i, 0); 
    while (digitalRead(clockPin) == HIGH);
  }
  return data; 
}

// sends serial signal to ATtiny85

const byte clockPin = 0, dataPin = 1;

void setup() {
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  digitalWrite(clockPin, LOW); 
  delay(10000); 
}

void loop() {
  for (byte i = 0; true; i++) {
    serialPrintToATtiny85(i); 
    delay(500); 
  }
}

void serialPrintToATtiny85 (byte data) {
  digitalWrite(clockPin, HIGH); 
  delay(50);
  digitalWrite(clockPin, LOW); 
  delayMicroseconds(200); 
  customShiftOut(dataPin, clockPin, data); 
  digitalWrite(clockPin, LOW); 
}

void customShiftOut(byte dataPin, byte clockPin, byte data) {
  int delayTimeMicroseconds = 25; 
  digitalWrite(clockPin, LOW); 
  for (byte i = 0; i < 8; i++) {
    delayMicroseconds(delayTimeMicroseconds); 
    if (bitRead(data, i) == 0) 
      digitalWrite(dataPin, LOW);
    else 
      digitalWrite(dataPin, HIGH);

    digitalWrite(clockPin, HIGH); 
    delayMicroseconds(delayTimeMicroseconds); 
    digitalWrite(clockPin, LOW); 
  }
}

Der ATtiny der an die 4x7-Segment-Anzeige (Abb. 2) angeschlossen ist muss mit 8 MHz getaktet werden, damit die Anzeige nicht flackert.

Abb. 1 zeigt die aufgebaute Schaltung. Markiert sind die 4x7-Segment-Anzeige (oben links) und die zwei ATtinys. Der untere sendet die anzuzeigenden Daten an den oberen. Dieser zeigt die Daten auf der Anzeige an. Da ein ATtiny aber nur 5 verwendbare I/O Pins hat, und zwei für die Datenübertragung zwischen beiden ATtinys verwendet werden, befinden sich zwischen Anzeige und empfangendem ATtiny noch zwei 74HC595 Schieberegister, die die seriell empfangenen Daten parallel an die Anzeige weiterleiten. Die Anzeige wird wie in Abb. 3 dargestellt angesteuert.


LEO Translator

Das Google Chrome Browser Plugin LEO Translator (Icon - Abb. 1) erlaubt es dem Anwender, auf ausgewählte Wörter auf einer Website einen Rechtsklick zu machen (Abb. 2), um diese in einem neuen Tab von LEO (Abb. 3) übersetzen zu lassen. Dadurch ist es nichtmehr nötig, das Wort zu kopieren, einen neuen Tab von Hand zu öffnen, LEO aufzurufen und das Wort einzufügen.

Das Plugin und der Quellcode können hier heruntergeladen und bei Google Chrome nach dem Entpacken der .zip-Datei und Aktivieren des Entwicklermodus unter Menü > Einstellungen > Erweiterungen > Entpackte Erweiterung laden... hinzugefügt werden. Programmiert wurde das Plugin am 18. November 2014.


BetterAmazon

Das Google Chrome Browser Plugin BetterAmazon (Icon - Abb. 1) erhöht den Komfort beim Shoppen auf der Website www.amazon.de erheblich, indem es auf der Startseite den Cursor automatisch in das Suchfeld setzt (Abb. 2). Dadurch ist kein Griff zur Maus notwendig.

Das Plugin und der Quellcode können hier heruntergeladen und bei Google Chrome nach dem Entpacken der .zip-Datei und Aktivieren des Entwicklermodus unter Menü > Einstellungen > Erweiterungen > Entpackte Erweiterung laden... hinzugefügt werden. Programmiert wurde das Plugin am 3. August 2014.


ATmega328 Timer Interrupt Calculator

Der ATmega328 Timer Interrupt Calculator berechnet mögliche Konfigurationen der Vergleichsspeicher und Prescaler des ATmega328 Mikrocontrollers in Abhängigkeit der Interruptfrequenz bzw. der Zeit zwischen zwei Interrupts.

Das Tool findet sich unter http://timer-interrupt-calculator.simsso.de/ und ein detailliertes Videotutorial hier.


GSWN Pause

Die GSWN Pause Android App zeigt an, wann die nächste Unterrichtsstunde oder Pause der Gewerblichen Schule Waiblingen anfängt. Man muss sich dadurch nicht die mysteriös gelegten Pausen- und Unterrichtsbeginn-Zeiten merken. Im Schulalltag eine echte Hilfe ;-).

Die apk Datei (GSWNPause.apk) sowie der Quellcode (GSWNPause.zip) stehen zum Download bereit.


Weitere Projekte

Die obige Auflistung an Software ist eine Auswahl, viele kleine oder alte Projekte sind nicht enthalten.

Videos von diversen Arduino Projekten, die alle einen Software-Teil haben, finden Sie auf meiner Arduino Seite.

Weitere Websites von mir sind sport.simsso.de - eine Bildergalerie die mich bei verschiedenen Sportarten zeigt, rasg.simsso.de - die Website eines Radrennens und rennradtourenplaner.simsso.de - eine Karte auf der Landstraßen hervorgehoben sind (ideal zur Planung von Rennrad Touren).



Loading... © Timo Denk 2017
Feedback

Feedback