Skip to content

Instantly share code, notes, and snippets.

@khthana
Created October 7, 2019 11:58
Show Gist options
  • Save khthana/d161a2e3fafb84e3268a6fe78e76faac to your computer and use it in GitHub Desktop.
Save khthana/d161a2e3fafb84e3268a6fe78e76faac to your computer and use it in GitHub Desktop.
#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