Compare commits

...

6 Commits

Author SHA1 Message Date
c0ec93c184 Add Makefile 2021-04-21 15:34:38 +02:00
5072d09682 Update drift compensation in ino version 2021-04-21 15:34:24 +02:00
72a37df703 Update timezone in wasm version 2021-04-21 15:33:59 +02:00
bf48a7765f Rename x86 version 2021-04-21 15:33:47 +02:00
858ebac086 Move ino file to own directory, minor fixes and updates, fixed scheduling 2021-04-12 22:21:04 +02:00
cda493de2c Add arduino (led) version 2021-03-30 23:13:31 +02:00
5 changed files with 202 additions and 1 deletions

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
klock4
!klock4/
html_out/

180
Arduino/klock4/klock4.ino Normal file
View File

@ -0,0 +1,180 @@
#include <stdint.h>
#include <time.h>
#include <math.h>
#include <FastLED.h>
#define DATA_PIN 13
#define SLEEP_DELAY 100
#include <DeepSleepScheduler.h>
#define ROWS 10
#define COLS 11
typedef struct {uint8_t start; uint16_t len;} word_t;
#define _ALL ((word_t) {.start= 0, .len=110})
#define ES ((word_t) {.start= 0, .len=2})
#define IST ((word_t) {.start= 3, .len=3})
#define FUNF_PRE ((word_t) {.start= 7, .len=4})
#define ZEHN_PRE ((word_t) {.start= 11, .len=4})
#define ZWANZIG ((word_t) {.start= 15, .len=7})
#define VIERTEL ((word_t) {.start= 26, .len=7})
#define VOR ((word_t) {.start= 33, .len=3})
#define NACH ((word_t) {.start= 40, .len=4})
#define HALB ((word_t) {.start= 44, .len=4})
#define ELF ((word_t) {.start= 49, .len=3})
#define FUNF_UHR ((word_t) {.start= 51, .len=4})
#define EIN ((word_t) {.start= 55, .len=3})
#define EINS ((word_t) {.start= 55, .len=4})
#define ZWEI ((word_t) {.start= 62, .len=4})
#define DREI ((word_t) {.start= 66, .len=4})
#define VIER ((word_t) {.start= 73, .len=4})
#define SECHS ((word_t) {.start= 77, .len=5})
#define ACHT ((word_t) {.start= 84, .len=4})
#define SIEBEN ((word_t) {.start= 88, .len=6})
#define ZWOLF ((word_t) {.start= 94, .len=5})
#define ZEHN_UHR ((word_t) {.start= 99, .len=4})
#define NEUN ((word_t) {.start=102, .len=4})
#define UHR ((word_t) {.start=107, .len=3})
#define ST ((word_t) {.start= 38, .len=2})
#define EL ((word_t) {.start= 49, .len=2})
#define LE ((word_t) {.start= 60, .len=2})
word_t HOURS[] = {
ZWOLF, EIN, ZWEI, DREI, VIER, FUNF_UHR,
SECHS, SIEBEN, ACHT, NEUN, ZEHN_UHR, ELF
};
word_t PARTS[] = {
UHR, FUNF_PRE, ZEHN_PRE, VIERTEL,
ZWANZIG, FUNF_PRE, HALB
};
CRGB leds[ROWS*COLS];
void set(word_t word) {
CRGB color = CRGB(255,255,255);
int dir = 1;
// because of the snaking LED layout, we need to reverse every second row
// i.e. flip the start on the other side and then count backwards
if (word.start % 22 >= 11) {
word.start = (word.start/11)*11 + 10 - (word.start % 11);
dir = -1;
}
for (unsigned int i = 0; i < word.len; i++)
leds[word.start + dir*i] = color;
}
void reset(void) {
memset(&leds, 0, sizeof(leds));
set(ES);
set(IST);
}
void settime(time_t ts) {
unsigned int second = ts % 60;
unsigned int minute = (ts / 60) % 60;
float fminute = (float) minute + (float) second / 60;
minute = 5 * (unsigned int) roundf(fminute / 5);
unsigned int timezone = 1;
unsigned int daylight_savings = 1;
unsigned int hour = (ts / (60*60) + timezone + daylight_savings) % 12;
Serial.print(hour);
Serial.print(F(":"));
Serial.println(minute);
int before = 0;
if (minute >= 25) {
hour = (hour+1) % 12;
before = 1;
minute = 60-minute;
if (minute == 35) {
minute = 25;
before = 0;
}
}
if (minute == 25)
before = !before;
reset();
if (minute != 0 && minute != 30)
set(before ? VOR : NACH);
set(HOURS[hour]);
set(PARTS[minute/5]);
if (minute/5 == 5)
set(HALB); // '5 before half' requires additional set
// minute 0 -> "EIN Uhr"
// minute N -> "N vor/nach EINS"
if(hour == 1 && minute != 0)
set(EINS);
}
#define UPDATE_INTERVAL_S 5
time_t ts = 0L; // UTC
void clockUpdate() {
settime(ts);
FastLED.show();
ts += UPDATE_INTERVAL_S;
/* drift determined experimentally:
* ~3.5ms/cycle "calculation time"
* 60ms/cycle other drift (wakeup time?)
*/
#define DRIFT_MS 63
#define SCHEDULE_DELAY_MS ((1000 * UPDATE_INTERVAL_S) - DRIFT_MS)
scheduler.scheduleDelayed(clockUpdate, SCHEDULE_DELAY_MS);
}
void setup() {
Serial.begin(57600);
FastLED.addLeds<WS2812,DATA_PIN,GRB>(leds, ROWS*COLS);
FastLED.setBrightness(16);
scheduler.schedule(clockUpdate);
}
void loop() {
/*
set(ST);
set(EL);
set(LE);
FastLED.show();
Serial.println(F("Please enter unix time stamp:"));
while (Serial.available() == 0);
while (Serial.available() > 0) {
ts = Serial.parseInt();
if (Serial.read() == '\n')
break;
}
*/
ts = 1618651100L;
scheduler.execute();
}

18
Makefile Normal file
View File

@ -0,0 +1,18 @@
CC = clang
LIBS = -lm
x86:
$(CC) $(LIBS) klock4_x86.c -o klock4-x86
uc:
$(CC) $(LIBS) klock4_uc.c -o klock4-uc
wasm:
mkdir -p html_out
emcc klock4_wasm.c -s WASM=1 -o html_out/klock4.html --shell-file html_template/shell_minimal.html
all: x86 uc wasm
clean:
rm -rf klock4-x86 klock4-uc html_out

View File

@ -80,7 +80,9 @@ void settime(time_t ts) {
float fminute = (float) minute + (float) second / 60;
minute = 5 * (unsigned int) roundf(fminute / 5);
unsigned int hour = (ts / (60*60) + 1) % 12;
unsigned int timezone = 1;
unsigned int daylight_savings = 1;
unsigned int hour = (ts / (60*60) + timezone + daylight_savings) % 12;
//printf("%02d:%02d\n", hour, minute);