mirror of https://github.com/E-Almqvist/hsf
parent
c8ac396d29
commit
325c4ed0c8
@ -0,0 +1,106 @@ |
|||||||
|
#include <Arduino.h> |
||||||
|
#include <U8glib.h> |
||||||
|
#include <RtcDS3231.h> |
||||||
|
#include <Wire.h> |
||||||
|
#include <Adafruit_NeoPixel.h> |
||||||
|
#include <Servo.h> |
||||||
|
|
||||||
|
#define FONT_HEIGHT 12 |
||||||
|
#define FONT_PADDING 2 |
||||||
|
#define SERVO_PIN 9 |
||||||
|
#define NEO_PIN 6 |
||||||
|
#define NEO_LEDS 24 |
||||||
|
|
||||||
|
#define SECOND_HAND 255, 0, 0 |
||||||
|
#define MINUTE_HAND 0, 255, 0 |
||||||
|
#define HOUR_HAND 0, 0, 255 |
||||||
|
#define DECISECOND_HAND 255, 255, 255 |
||||||
|
|
||||||
|
byte neoBright = 100; |
||||||
|
|
||||||
|
U8GLIB_SSD1306_128X64 oled(U8G_I2C_OPT_NONE); |
||||||
|
RtcDS3231<TwoWire> rtcModule(Wire); |
||||||
|
|
||||||
|
Servo servo; |
||||||
|
uint32_t leds[NEO_LEDS] = {0}; |
||||||
|
|
||||||
|
Adafruit_NeoPixel ring = Adafruit_NeoPixel(NEO_LEDS, NEO_PIN, NEO_GRB); |
||||||
|
|
||||||
|
unsigned char hour, minute, second; |
||||||
|
uint64_t millisecond(); |
||||||
|
float temp; |
||||||
|
|
||||||
|
unsigned short xoffset = 0; |
||||||
|
|
||||||
|
unsigned int getY(unsigned int row) { |
||||||
|
return (row * (FONT_HEIGHT + FONT_PADDING)) + FONT_PADDING; |
||||||
|
} |
||||||
|
|
||||||
|
long getLightLevel() { |
||||||
|
return analogRead(A0); |
||||||
|
} |
||||||
|
|
||||||
|
char *getLightPercent() { |
||||||
|
long lightlevel = getLightLevel(); |
||||||
|
|
||||||
|
char str[4]; |
||||||
|
char *percent = itoa(100 - ((lightlevel * 100) / 1024), (char *)&str, 10); |
||||||
|
|
||||||
|
char *percentStr = strcat(percent, "%"); |
||||||
|
return percentStr; |
||||||
|
} |
||||||
|
|
||||||
|
void setup() { |
||||||
|
pinMode(A0, INPUT); |
||||||
|
servo.attach(SERVO_PIN, 500, 2500); |
||||||
|
|
||||||
|
ring.begin(); |
||||||
|
ring.setBrightness(neoBright); |
||||||
|
ring.show(); |
||||||
|
} |
||||||
|
|
||||||
|
void draw() { |
||||||
|
oled.setFont(u8g_font_helvB10); |
||||||
|
|
||||||
|
// Light percentile
|
||||||
|
char *percentStr = getLightPercent(); |
||||||
|
oled.drawStr(0, getY(1), percentStr); |
||||||
|
|
||||||
|
// Time
|
||||||
|
RtcDateTime now = rtcModule.GetDateTime(); |
||||||
|
hour = now.Hour(); |
||||||
|
minute = now.Minute(); |
||||||
|
second = now.Second(); |
||||||
|
String timeStr = String(hour) + ":" + String(minute < 10 ? "0" : "") + String(minute) + ":" + String(second < 10 ? "0" : "") + String(second); |
||||||
|
oled.drawStr(0, getY(2), timeStr.c_str()); |
||||||
|
|
||||||
|
// Temperature
|
||||||
|
temp = rtcModule.GetTemperature().AsFloatDegC(); |
||||||
|
String tempstr = String(temp) + " C"; |
||||||
|
oled.drawStr(0, getY(3), tempstr.c_str()); |
||||||
|
|
||||||
|
servo.write(map(temp, 18, 28, 0, 180)); |
||||||
|
|
||||||
|
// Clear leds
|
||||||
|
ring.clear(); |
||||||
|
for(int i = 0; i < NEO_LEDS; i++) |
||||||
|
leds[i] = 0; |
||||||
|
|
||||||
|
// Map seconds, minutes and hours
|
||||||
|
leds[map(second, 0, 60, 0, NEO_LEDS)] += ring.Color(SECOND_HAND); |
||||||
|
leds[map(minute, 0, 60, 0, NEO_LEDS)] += ring.Color(MINUTE_HAND); |
||||||
|
leds[map(hour, 0, 24, 0, NEO_LEDS)] += ring.Color(HOUR_HAND); |
||||||
|
|
||||||
|
for(int i = 0; i < NEO_LEDS; i++) |
||||||
|
ring.setPixelColor(i, leds[i]); |
||||||
|
|
||||||
|
|
||||||
|
ring.show(); |
||||||
|
} |
||||||
|
|
||||||
|
void loop() { |
||||||
|
oled.firstPage(); |
||||||
|
do { |
||||||
|
draw(); |
||||||
|
} while (oled.nextPage()); |
||||||
|
} |
Loading…
Reference in new issue