3 Commits

Author SHA1 Message Date
telegnom 472ae25cb9 test pattern added and words fixed 2019-02-23 20:29:52 +01:00
friesenkiwi 64e3a5eb05 Fix pin number 2019-02-23 19:30:44 +01:00
friesenkiwi 043742dccf Added documentation for parts, hardware setup, flashing, resetting etc. 2019-02-23 18:34:22 +01:00
2 changed files with 94 additions and 48 deletions
+43 -3
View File
@@ -1,16 +1,56 @@
# Wordclock
Firmware für die WordClock vom c3e.
Firmware für die WordClock (in der Art von https://www.amazon.de/dp/B01N5TKXP3/) vom c3e. Als Rahmen bietet sich ["RIBBA" von IKEA](https://www.ikea.com/de/de/catalog/products/40378401/) an.
Außerdem wird benötigt:
* Ein ESP8266 (z.B. [WeMos D1 Mini](https://www.amazon.de/dp/B076F53B6S/))
* Ein LED-Strip WS8212 mit 60 LED/m, 1m reicht (also 60 LED) z.B. von eBay
* Kabel in 3 Farben, am besten Draht, Litze 3-adrig flach geht notfalls auch
* Ein USB-Netzteil mit genügend Leistung z.B. https://www.amazon.de/dp/B00WLI5E3M
* Ein USB-Kabel
* Etwa 2.5 m² MDF (Mitteldichte Faserplatte) 2,5mm die gelasert wird
* Karton zum Lasern der Worte
* Viel Geduld beim Löten
## Anleitung
## Hardware
Die MDF-Platte zuschneiden und mit den CAD-Dateien lasern (Makerspace in der Umgebung ansteuern, z.B. [Chaosdorf Düsseldorf](https://wiki.chaosdorf.de/Lasercutter), [Das Labor in Bochum](https://wiki.das-labor.org/w/LABOR_Wiki)). Die einzelnen LEDs vom Strip schneiden und auf die Trägerplatte an den vorgezeichneten Stellen aufkleben (z.B. mit UHU Flüssigkleber). Dabei darauf achten, dass die LEDs innerhalb einer Zeile immer die gleiche Ausrichtung (+5V, Din/DO, GND) haben und die Ausrichtungen von Zeile zu Zeile entgegengesetzt sind.
Die LEDs mit Drahtstücken verlöten, dabei darauf achten, dass alle Leitungen jeweils durchgängig verbunden sind (also alle +5V miteinander, alle GND, alle D) und nicht untereinander.
Am Anfang den ESP anlöten:
* 5V->+5V
* G->GND
* D1->Din (Pin-Benennung im Quelltext ist etwas anders)
## Flashen
1. Dieses Repo clonen (`git clone https://github.com/c3e/wordclock.git`)
2. Die Arduino IDE installieren (https://www.arduino.cc/en/Main/Software)
3. Die Datei `wordclock/wordclock.ino` in der Arduino IDE öffnen
4. In der IDE unter Datei->Voreinstellungen->Zusätzliche Boardverwalter-URLs http://arduino.esp8266.com/stable/package_esp8266com_index.json hinzufügen
5. Unter Werkzeuge->Boards->Boardverwalter nach "esp" suchen, esp8266 installieren
6. Das richtige Board unter Werkzeuge->Boards aus wählen (z.B. WeMos D1 R1)
7. Sketcch->Bibliothek einbinden->Bibliotheken verwalten
8. Folgende installieren:
* FastLED
* WiFiManager
9. Folgende Zip-Dateien herunterladen:
* https://github.com/PaulStoffregen/Time/archive/master.zip
* https://github.com/JChristensen/Timezone/archive/master.zip
10. In der Arduino IDE unter Sketch->Bibliothek einbinden->.ZIP-Bibliothek hinzufügen die beiden heruntergeladenen .zip-Dateien auswählen
11. Den "Kompilieren"-Haken oben links anklicken (die Warnungen bzgl. Architektur und bitbanging können ignoriert werden)
12. Den ESP per USB anschließen
13. Den "Hochladen"-Pfeil klicken, darauf warten, dass der Upload vollständig ist (wird in Konsole und Statuszeile ausgegeben)
## Inbetriebnahme
1. Strom anschließen, 5V, USB-Netzeil
2. Ins WLAN `WordClock` verbinden
2. Ins WLAN `WordClock` verbinden (Der Name kann im Quelltext verändert werden)
3. Im Browser die IP `192.168.4.1` aufrufen
4. WLAN auswählen und ggf. Passwort eingeben
5. Nach dem Speichern der Einstellungen verschwindet das WLAN
6. Uhr zeigt die Uhrzeit an
Wenn das WLAN (wird für den Empfang der Uhrzeit benötigt) nicht mehr auffindbar ist, wird das Konfigurations-WLAN unter `192.168.4.1` automatisch wieder aufgebaut. Um die Einstellungen von Hand zurückzusetzen:
In der Arduino-IDE: Werkzeuge->Erase Flash->All Flash contents auswählen, dann den Programmcode erneut hochladen
## Design
Die Idee für das Design wurden vom FabLab Nürnberg übernommen. Die Firmware ist eine Eigenentwicklung.
+51 -45
View File
@@ -23,7 +23,7 @@
#include <WiFiManager.h>
#define NUM_LEDS 42
#define NUM_LEDS 43
#define DATA_PIN 5
CRGB leds[NUM_LEDS];
@@ -37,51 +37,52 @@ static const char ntpServerName[] = "pool.ntp.org";
#define M_IST 1
#define M_FUENF 2
#define M_ZEHN 3
#define M_VIERTEL 4
#define M_VOR 5
#define M_NACH 6
#define M_ZWANZIG 4
#define M_VIERTEL 5
#define M_VOR 6
#define M_NACH 8
#define M_HALB 7
#define M_UHR 8
#define H_EINS 9
#define H_EIN 9
#define H_ZWEI 10
#define H_DREI 11
#define H_VIER 12
#define H_FUENF 13
#define H_SECHS 14
#define H_SIEBEN 15
#define M_UHR 21
#define H_EINS 11
#define H_ZWEI 12
#define H_DREI 13
#define H_VIER 14
#define H_FUENF 10
#define H_SECHS 15
#define H_SIEBEN 17
#define H_ACHT 16
#define H_NEUN 17
#define H_ZEHN 18
#define H_ELF 19
#define H_ZWOELF 20
#define H_NEUN 9
#define H_ZEHN 19
#define H_ELF 20
#define H_ZWOELF 18
TimeChangeRule myDST = {"CEST", Last, Sun, Mar, 2, 120}; //Daylight time = UTC - 4 hours
TimeChangeRule mySTD = {"CET", Last, Sun, Oct, 2, 60}; //Standard time = UTC - 5 hours
Timezone myTZ(myDST, mySTD);
int clockWords[21][10] = {
{3,-1,-1,-1,-1,-1,-1,-1,-1,-1}, // es 0
{2,-1,-1,-1,-1,-1,-1,-1,-1,-1}, // ist 1
{0,1,-1,-1,-1,-1,-1,-1,-1,-1}, // fuenf 2
int clockWords[22][10] = {
{0,-1,-1,-1,-1,-1,-1,-1,-1,-1}, // es 0
{1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, // ist 1
{2,3,-1,-1,-1,-1,-1,-1,-1,-1}, // fuenf 2
{4,5,-1,-1,-1,-1,-1,-1,-1,-1}, // zehn 3
{8,9,10,-1,-1,-1,-1,-1,-1,-1}, // viertel 4
{11,12,-1,-1,-1,-1,-1,-1,-1,-1}, // vor 5
{6,7,-1,-1,-1,-1,-1,-1,-1,-1}, // nach 6
{13,14,-1,-1,-1,-1,-1,-1,-1,-1}, // halb 7
{40,41,-1,-1,-1,-1,-1,-1,-1,-1}, // uhr 8
{19,20,-1,-1,-1,-1,-1,-1,-1,-1}, // ein 9
{21,22,-1,-1,-1,-1,-1,-1,-1,-1}, // zwei 10
{25,26,-1,-1,-1,-1,-1,-1,-1,-1}, // drei 11
{23,24,-1,-1,-1,-1,-1,-1,-1,-1}, // vier 12
{15,16,-1,-1,-1,-1,-1,-1,-1,-1}, // fuenf 13
{27,28,-1,-1,-1,-1,-1,-1,-1,-1}, // sechs 14
{33,34,35,-1,-1,-1,-1,-1,-1,-1}, // sieben 15
{29,30,-1,-1,-1,-1,-1,-1,-1,-1}, // acht 16
{17,18,-1,-1,-1,-1,-1,-1,-1,-1}, // neun 17
{36,37,-1,-1,-1,-1,-1,-1,-1,-1}, // zehn 18
{38,39,-1,-1,-1,-1,-1,-1,-1,-1}, // elf 19
{31,32,-1,-1,-1,-1,-1,-1,-1,-1}, // zwölf 20
{6,7,8,-1,-1,-1,-1,-1,-1,-1}, // zwanzig 4
{9,10,11,-1,-1,-1,-1,-1,-1,-1}, // viertel 5
{12,-1,-1,-1,-1,-1,-1,-1,-1,-1}, // vor 6
{13,14,-1,-1,-1,-1,-1,-1,-1,-1}, // nach 8
{15,16,-1,-1,-1,-1,-1,-1,-1,-1}, // halb 7
{17,18,-1,-1,-1,-1,-1,-1,-1,-1}, // neun 9
{19,20,-1,-1,-1,-1,-1,-1,-1,-1}, // fuenf 10
{21,22,-1,-1,-1,-1,-1,-1,-1,-1}, // ein 11
{23,24,-1,-1,-1,-1,-1,-1,-1,-1}, // zwei 12
{25,26,-1,-1,-1,-1,-1,-1,-1,-1}, // drei 13
{27,28,-1,-1,-1,-1,-1,-1,-1,-1}, // vier 14
{29,30,-1,-1,-1,-1,-1,-1,-1,-1}, // sechs 15
{31,32,-1,-1,-1,-1,-1,-1,-1,-1}, // acht 16
{33,34,35,-1,-1,-1,-1,-1,-1,-1}, // sieben 17
{36,37,38,-1,-1,-1,-1,-1,-1,-1}, // zwölf 18
{39,40,-1,-1,-1,-1,-1,-1,-1,-1}, // zehn 19
{41,-1,-1,-1,-1,-1,-1,-1,-1,-1}, // elf 20
{42,-1,-1,-1,-1,-1,-1,-1,-1}, // uhr 21
};
WiFiUDP Udp;
@@ -143,6 +144,13 @@ void setup()
{
FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
clear();
for (int initcount=0; initcount <= NUM_LEDS; initcount++) {
clear();
leds[initcount] = CHSV((255/NUM_LEDS)*initcount, 255, 128);
FastLED.show();
delay(100);
}
clear();
Serial.begin(115200);
WiFiManager wifiManager;
while (!Serial) ; // Needed for Leonardo only
@@ -264,7 +272,7 @@ void getHourWord()
// special case to get sigular @ "ein uhr"
if (int(minute(loctime)) < 5)
{
set_word(H_EIN);
set_word(H_EINS);
Serial.println("ein");
} else
{
@@ -372,9 +380,8 @@ void getMinuteWord()
case 22:
case 23:
case 24:
set_word(M_ZEHN);
set_word(M_VOR);
set_word(M_HALB);
set_word(M_ZWANZIG);
set_word(M_NACH);
Serial.println("zehn vor halb");
break;
case 25:
@@ -410,9 +417,8 @@ void getMinuteWord()
case 42:
case 43:
case 44:
set_word(M_ZEHN);
set_word(M_NACH);
set_word(M_HALB);
set_word(M_ZWANZIG);
set_word(M_VOR);
Serial.println("zehn nach halb");
break;
case 45: