Created
October 7, 2019 11:58
-
-
Save khthana/d161a2e3fafb84e3268a6fe78e76faac to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <SPI.h> | |
#include <Wire.h> | |
#include <Adafruit_GFX.h> | |
#include <Adafruit_SSD1306.h> | |
#include <ChainableLED.h> | |
#include "ds3231.h" | |
#include <ADXL345.h> | |
#include <M2M_LM75A.h> | |
//Definitions for Joystick | |
#define KEY_UP A1 | |
#define KEY_DOWN A5 | |
#define KEY_LEFT A3 | |
#define KEY_RIGHT A2 | |
#define KEY_ENTER A4 | |
//Clock Stuffs | |
#define CLOCK_CENTER_X 24 | |
#define CLOCK_CENTER_Y 40 | |
#define H_LENGTH 10 | |
#define M_LENGTH 14 | |
#define S_LENGTH 18 | |
#define rad_per_degree 0.0174556 | |
#define buzzer 11 | |
#define rgb_pwr 1 | |
#define NUM_LEDS 1 | |
ChainableLED RGB_LED(6, 5, NUM_LEDS);//defines the pin used on arduino. | |
boolean tgl = false; | |
boolean settings = false; | |
signed char parameter = 0; | |
#define OLED_RESET 7 | |
#define OLED_SA0 8 | |
Adafruit_SSD1306 display(OLED_RESET, OLED_SA0); | |
M2M_LM75A lm75a; | |
ADXL345 adxl; | |
#if (SSD1306_LCDHEIGHT != 64) | |
#error("Height incorrect, please fix Adafruit_SSD1306.h!"); | |
#endif | |
unsigned char max_b = 127; | |
float t_p = 0.0; | |
float t_o = -255.0; | |
struct ts T; | |
float get_T_avg() | |
{ | |
unsigned char samples = 20; | |
float avg = 0.0; | |
while (samples > 0) | |
{ | |
avg += lm75a.getTemperature(); | |
delayMicroseconds(100); | |
samples--; | |
} | |
avg /= 20.0; | |
return avg; | |
} | |
void show_temperature() | |
{ | |
unsigned char bar_length = 0; | |
t_p = get_T_avg(); | |
if (t_p != t_o) | |
{ | |
display.fillRect(98, 8, 29, 8, BLACK); | |
display.setTextColor(WHITE); | |
display.setCursor(98, 9); | |
display.println(t_p); | |
t_p = constrain(t_p, 0, 40.0); | |
bar_length = map(t_p, 0.0, 40.0, 0, 36); | |
display.drawLine(106, 53, 106, 18, BLACK); | |
display.drawLine(106, 53, 106, (53 - bar_length), WHITE); | |
t_o = t_p; | |
} | |
display.display(); | |
} | |
void set_RGB_LED_max_brightness() | |
{ | |
unsigned int avg = 0; | |
unsigned char samples = 16; | |
while (samples > 0) | |
{ | |
avg += analogRead(A0); | |
delayMicroseconds(10); | |
samples--; | |
}; | |
max_b = (avg >> 6); | |
} | |
void draw_background() | |
{ | |
unsigned char i = 0; | |
display.drawRect(2, 18, 44, 44, WHITE); | |
display.drawLine(24, 19, 24, 20, WHITE); | |
display.drawLine(24, 60, 24, 61, WHITE); | |
display.drawLine(3, 40, 4, 40, WHITE); | |
display.drawLine(44, 40, 45, 40, WHITE); | |
display.fillCircle(106, 58, 4, WHITE); | |
display.drawFastVLine(104, 18, 37, WHITE); | |
display.drawFastVLine(108, 18, 37, WHITE); | |
display.drawFastHLine(105, 17, 3, WHITE); | |
for (i = 18; i <= 53; i += 5) | |
{ | |
display.drawFastHLine(111, i, 3, WHITE); | |
} | |
display.setTextSize(1); | |
display.setTextColor(WHITE); | |
for (i = 0; i < 40; i += 10) | |
{ | |
display.setCursor(116, (48 - i)); | |
display.println(i + 10); | |
} | |
display.setCursor(12, 0); | |
display.println("Time"); | |
display.setCursor(59, 0); | |
display.println("Date"); | |
display.setCursor(96, 0); | |
display.println("Temp."); | |
display.display(); | |
} | |
void display_analog_clock(signed int h, signed int m, signed int s) | |
{ | |
float midHours = 0; | |
static signed char hx; | |
static signed char hy; | |
static signed char mx; | |
static signed char my; | |
static signed char sx; | |
static signed char sy; | |
h -= 3; | |
m -= 15; | |
s -= 15; | |
if (h <= 0) | |
{ | |
h += 12; | |
} | |
if (m < 0) | |
{ | |
m += 60; | |
} | |
if (s < 0) | |
{ | |
s += 60; | |
} | |
display.drawLine(CLOCK_CENTER_X, CLOCK_CENTER_Y, (CLOCK_CENTER_X + sx), (CLOCK_CENTER_Y + sy), BLACK); | |
display.drawLine(CLOCK_CENTER_X, CLOCK_CENTER_Y, (CLOCK_CENTER_X + mx), (CLOCK_CENTER_Y + my), BLACK); | |
display.drawLine(CLOCK_CENTER_X, CLOCK_CENTER_Y, (CLOCK_CENTER_X + hx), (CLOCK_CENTER_Y + hy), BLACK); | |
s *= 6; | |
sx = (S_LENGTH * cos(s * rad_per_degree)); | |
sy = (S_LENGTH * sin(s * rad_per_degree)); | |
display.drawLine(CLOCK_CENTER_X, CLOCK_CENTER_Y, (CLOCK_CENTER_X + sx), (CLOCK_CENTER_Y + sy), WHITE); | |
m *= 6; | |
mx = (M_LENGTH * cos(m * rad_per_degree)); | |
my = (M_LENGTH * sin(m * rad_per_degree)); | |
display.drawLine(CLOCK_CENTER_X, CLOCK_CENTER_Y, (CLOCK_CENTER_X + mx), (CLOCK_CENTER_Y + my), WHITE); | |
midHours = (T.min / 12); | |
h *= 5; | |
h += midHours; | |
h *= 6; | |
hx = (H_LENGTH * cos(h * rad_per_degree)); | |
hy = (H_LENGTH * sin(h * rad_per_degree)); | |
display.drawLine(CLOCK_CENTER_X, CLOCK_CENTER_Y, (CLOCK_CENTER_X + hx), (CLOCK_CENTER_Y + hy), WHITE); | |
} | |
void show_time() | |
{ | |
static unsigned long previous_time; | |
static unsigned long present_time; | |
display.fillRect(0, 8, 50, 8, BLACK); | |
if (T.hour < 10) | |
{ | |
display.setCursor(0, 9); | |
display.println("0"); | |
display.setCursor(6, 9); | |
display.println(T.hour); | |
} | |
else | |
{ | |
display.setCursor(0, 9); | |
display.println(T.hour); | |
} | |
if (T.min < 10) | |
{ | |
display.setCursor(18, 9); | |
display.println("0"); | |
display.setCursor(24, 9); | |
display.println(T.min); | |
} | |
else | |
{ | |
display.setCursor(18, 9); | |
display.println(T.min); | |
} | |
if (T.sec < 10) | |
{ | |
display.setCursor(36, 9); | |
display.println("0"); | |
display.setCursor(42, 9); | |
display.println(T.sec); | |
} | |
else | |
{ | |
display.setCursor(36, 9); | |
display.println(T.sec); | |
} | |
present_time = millis(); | |
if ((present_time - previous_time) > 999) | |
{ | |
tgl ^= 1; | |
previous_time = present_time; | |
} | |
if (tgl) | |
{ | |
display.setCursor(12, 9); | |
display.println(":"); | |
display.setCursor(30, 9); | |
display.println(":"); | |
} | |
else | |
{ | |
display.setCursor(12, 9); | |
display.println(" "); | |
display.setCursor(30, 9); | |
display.println(" "); | |
} | |
display_analog_clock(T.hour, T.min, T.sec); | |
} | |
void show_date() | |
{ | |
display.fillRect(48, 16, 54, 37, BLACK); | |
if (T.mday < 10) | |
{ | |
display.setCursor(60, 18); | |
display.println("0"); | |
display.setCursor(66, 18); | |
display.println(T.mday); | |
} | |
else | |
{ | |
display.setCursor(60, 18); | |
display.println(T.mday); | |
} | |
display.setCursor(72, 18); | |
display.println("/"); | |
if (T.mon < 10) | |
{ | |
display.setCursor(78, 18); | |
display.println("0"); | |
display.setCursor(84, 18); | |
display.println(T.mon); | |
} | |
else | |
{ | |
display.setCursor(78, 18); | |
display.println(T.mon); | |
} | |
display.setCursor(62, 32); | |
display.println(T.year); | |
display.setCursor(49, 46); | |
switch (T.wday) | |
{ | |
case 1: | |
{ | |
display.println(" Monday "); | |
break; | |
} | |
case 2: | |
{ | |
display.println(" Tuesday "); | |
break; | |
} | |
case 3: | |
{ | |
display.println("Wednesday"); | |
break; | |
} | |
case 4: | |
{ | |
display.println("Thursday "); | |
break; | |
} | |
case 5: | |
{ | |
display.println(" Friday "); | |
break; | |
} | |
case 6: | |
{ | |
display.println("Saturday "); | |
break; | |
} | |
default: | |
{ | |
display.println(" Sunday "); | |
break; | |
} | |
} | |
} | |
void clock_stuffs() | |
{ | |
if (settings == false) | |
{ | |
DS3231_get(&T); | |
} | |
show_time(); | |
show_date(); | |
} | |
void accelerometer_and_RGB_LED() | |
{ | |
int x, y, z; | |
unsigned char r = 0x00; | |
unsigned char g = 0x00; | |
unsigned char b = 0x00; | |
adxl.readXYZ(&x, &y, &z); | |
r = map(x, -11, 11, 0, 127); | |
g = map(y, -11, 11, 0, 127); | |
b = map(z, -11, 11, 0, 127); | |
if (settings == false) | |
{ | |
RGB_LED.setColorRGB(0, r, g, b); | |
} | |
} | |
void setup() { | |
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64) | |
display.clearDisplay(); | |
//RGB_LED.pwr_set(PWR_ENABLE); | |
pinMode(buzzer, OUTPUT); | |
digitalWrite(buzzer, LOW); | |
DS3231_init(DS3231_INTCN); | |
for (int i = A1; i <= A5; i++) | |
{ | |
pinMode(i, INPUT_PULLUP); | |
} | |
draw_background(); | |
Serial.begin(9600); | |
T.sec = 00; T.min = 50; T.hour = 18; | |
T.mday = 7; T.mon = 10; T.year = 2019; | |
DS3231_set(T); | |
} | |
void loop() { | |
set_RGB_LED_max_brightness(); | |
RGB_LED.setColorHSB(0, 0, 0, 0); | |
show_temperature(); | |
clock_stuffs(); | |
//accelerometer_and_RGB_LED(); | |
display.display(); | |
delay(200); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment