Making a wooden effect table clock box using 3D printer.
Adjustable digital clock structure with Arduino Pro Mini, which can show temperature and humidity.
I used 2 Arduino Pro Mini in the project. I installed the code of the humidity and temperature meter on one. I installed the code of the clock on the other arduino. Because I want to use two oled screens in my project.
Since the displays have the same I2C addresses, it was not possible to work directly on a single card. There are Oled screens that can be replaced, but my screens did not have this feature.
It is possible to use 2 screens with a single card with the I2C multiplexer module. However, this module is not cheaper and not smaller than the Arduino Pro Mini. Using two Arduino was a much more logical and easy solution for me.
3D files:
Body govde-body.stl
Back door arka-kapak-back.stl
Two schema for Different 5V regulator version….
Adjustable clock code:
// DS3231 RTC modülü ve 1.3 inc Oled Screen Table Watch
#include <Wire.h> // Include Wire library (required for I2C devices)
#include <Adafruit_GFX.h> // Include Adafruit graphics library
#include <Adafruit_SH1106.h> // Adafruit oled screen library for SH1106
#define OLED_RESET 4
Adafruit_SH1106 display(OLED_RESET);
#define button1 7 // Button 1 is connected to Arduino pin 7
#define button2 8 // Button 2 is connected to Arduino pin 8
// Kendiyap Kanal Logo (KendinYap Channel Logo)
const unsigned char KendinYap_Logo [] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0C, 0x00, 0x00,
0x00, 0x18, 0xE0, 0x03, 0x83, 0x80, 0x00, 0x00, 0x07, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0xE0, 0x01,
0xC3, 0x00, 0x00, 0x00, 0x07, 0x1C, 0x00, 0x00, 0x00, 0x18, 0xE0, 0x01, 0xC3, 0x00, 0x00, 0x00,
0x07, 0x38, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x01, 0xE7, 0x00, 0x00, 0x00, 0x07, 0x30, 0x1C, 0x09,
0x81, 0xB8, 0x82, 0x60, 0xE6, 0x1C, 0x09, 0x80, 0x0E, 0x70, 0x7E, 0x1F, 0xC3, 0xF8, 0xE6, 0xF8,
0xFE, 0x3F, 0x1F, 0xE0, 0x07, 0x70, 0x7F, 0x1F, 0xE7, 0xBC, 0xE7, 0xF8, 0x7C, 0x7F, 0x8F, 0xE0,
0x07, 0xF0, 0xE3, 0x9C, 0xE7, 0x38, 0xE7, 0x38, 0x7C, 0x63, 0x9C, 0x70, 0x07, 0xF0, 0xE3, 0x98,
0xC7, 0x1C, 0xE7, 0x38, 0x38, 0x03, 0x9C, 0x70, 0x0F, 0xF8, 0xDF, 0x9C, 0xE7, 0x18, 0xE7, 0x18,
0x38, 0x1F, 0x9C, 0x70, 0x07, 0xB8, 0xFF, 0x9C, 0xE7, 0x1C, 0xC7, 0x38, 0x38, 0x7F, 0x8C, 0x70,
0x07, 0x3C, 0xC0, 0x98, 0xE7, 0x18, 0xE6, 0x18, 0x38, 0x73, 0x9C, 0x70, 0x07, 0x1C, 0xE2, 0x1C,
0xE7, 0x3C, 0xE7, 0x38, 0x38, 0xE3, 0x9C, 0x70, 0x07, 0x1C, 0xE3, 0x98, 0xE7, 0x18, 0xE7, 0x38,
0x38, 0xE3, 0x8C, 0x70, 0x07, 0x1E, 0x7F, 0x1C, 0xE7, 0xFC, 0xC7, 0x38, 0x38, 0xFF, 0x9E, 0xE0,
0x07, 0x0E, 0x7F, 0x38, 0xE3, 0xD8, 0xE7, 0x38, 0x38, 0x7B, 0x9F, 0xE0, 0x04, 0x06, 0x1C, 0x08,
0x01, 0x90, 0x40, 0x08, 0x30, 0x29, 0x1D, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x38,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0xFE, 0x18, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0xC0, 0x00, 0x00, 0x01, 0xEF, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00,
0x00, 0x03, 0xC7, 0x38, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x03, 0x87, 0x1F,
0xC3, 0xF1, 0xDE, 0x37, 0x83, 0xE1, 0xC0, 0x00, 0x00, 0x03, 0x87, 0x3F, 0xC7, 0xF8, 0xFE, 0x3F,
0xC3, 0xF1, 0xC0, 0x00, 0x00, 0x03, 0x80, 0x1D, 0xE7, 0x39, 0xFE, 0x3F, 0xC7, 0xB9, 0xC0, 0x00,
0x00, 0x03, 0x80, 0x3C, 0xC6, 0x38, 0xC7, 0x39, 0xCE, 0x39, 0xC0, 0x00, 0x00, 0x03, 0x80, 0x18,
0xE0, 0x39, 0xCE, 0x38, 0xCE, 0x29, 0x80, 0x00, 0x00, 0x07, 0x80, 0x38, 0xC3, 0xF8, 0xC7, 0x31,
0xCF, 0xF9, 0xC0, 0x00, 0x00, 0x03, 0x87, 0x3C, 0xE7, 0xB9, 0xC6, 0x39, 0xCF, 0xF9, 0xC0, 0x00,
0x00, 0x03, 0x87, 0x19, 0xC7, 0x38, 0xE7, 0x39, 0xCE, 0x01, 0xC0, 0x00, 0x00, 0x01, 0xC7, 0x38,
0xEE, 0x39, 0xC6, 0x30, 0xCE, 0x19, 0xC0, 0x00, 0x00, 0x01, 0xFF, 0x1C, 0xCF, 0x78, 0xC7, 0x39,
0xC7, 0x31, 0x80, 0x00, 0x00, 0x00, 0xFE, 0x38, 0xE7, 0xF9, 0xE6, 0x39, 0xC7, 0xF1, 0xC0, 0x00,
0x00, 0x00, 0x7C, 0x18, 0xC7, 0x39, 0xC7, 0x38, 0xC3, 0xF1, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
const unsigned char KendinYap_Logo2 [] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x7F, 0xFF, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x0F, 0xC0,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x0F, 0x00, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x1F, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x7F, 0xFF, 0x1F, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x1F, 0x07,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x0F, 0x9F, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x3F, 0xFE, 0x3F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x3F, 0xFC,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x3F, 0x40, 0xC0, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x07, 0xF1, 0xFF, 0x80, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0xF9, 0xFF, 0xA1, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFD, 0x71,
0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0x3F, 0xE1, 0x80, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x3F, 0xF7, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0xFC, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE3, 0xF1, 0xF6, 0x3C,
0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0xEE, 0xFE, 0x78, 0x1E, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0xDD, 0xEF, 0xFB, 0xF8, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0xBE, 0x1F, 0xFF, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0xFF, 0x77, 0xF0,
0x0F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0x00, 0x78, 0x1F, 0xE0, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0x00, 0x78, 0x1F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
0xF8, 0x1F, 0xFC, 0x3C, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x0F, 0xFC, 0x7F,
0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x0F, 0xF9, 0xFF, 0xFE, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x03, 0xE0, 0x07, 0xF1, 0xFF, 0xEE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0xE0, 0x07, 0xE1, 0xC7, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x07, 0xC0, 0x07,
0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x07, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x3F, 0xF0, 0x0F, 0xC0, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F,
0xF8, 0x1F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xF0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x7F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFC, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xF0, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
// Logo sonu (END)
void setup(void) {
pinMode(button1, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);
delay(500);
display.begin(SH1106_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x64)
// KendinYap Logo Yazdırma (Logo print to display)
display.clearDisplay();
display.drawBitmap(15, 5, KendinYap_Logo, 96, 48, 1);
display.display();
delay(2000);
display.clearDisplay();
display.drawBitmap(17, 10, KendinYap_Logo2, 96, 48, 1);
display.display();
delay(2000);
// Logo print end
// Srectangle frame
display.clearDisplay();
display.display();
display.setTextColor(WHITE, BLACK);
display.drawLine(0, 39, 127, 39, WHITE);
display.drawLine(0, 63, 127, 63, WHITE);
display.drawLine(0, 39, 40, 1890, WHITE);
display.drawLine(127, 39, 40, 4100, WHITE);
// End
}
char time[] = " : : ";
char calendar[] = " / /20 ";
byte i, second, minute, hour, day, date, month, year, temperature_lsb;
void display_day(){
switch(day){
case 1: write_text(40, 2, " SUNDAY ", 1); break;
case 2: write_text(40, 2, " MONDAY", 1); break;
case 3: write_text(40, 2, " TUESDAY ", 1); break;
case 4: write_text(40, 2, "WEDNESDAY", 1); break;
case 5: write_text(40, 2, " THURSDAY", 1); break;
case 6: write_text(40, 2, " FRIDAY ", 1); break;
default: write_text(40, 2, " SATURDAY", 1);
}
}
void RTC_display(){
// Convert BCD to decimal
second = (second >> 4) * 10 + (second & 0x0F);
minute = (minute >> 4) * 10 + (minute & 0x0F);
hour = (hour >> 4) * 10 + (hour & 0x0F);
date = (date >> 4) * 10 + (date & 0x0F);
month = (month >> 4) * 10 + (month & 0x0F);
year = (year >> 4) * 10 + (year & 0x0F);
// End conversion
time[7] = second % 10 + 48;
time[6] = second / 10 + 48;
time[4] = minute % 10 + 48;
time[3] = minute / 10 + 48;
time[1] = hour % 10 + 48;
time[0] = hour / 10 + 48;
calendar[9] = year % 10 + 48;
calendar[8] = year / 10 + 48;
calendar[4] = month % 10 + 48;
calendar[3] = month / 10 + 48;
calendar[1] = date % 10 + 48;
calendar[0] = date / 10 + 48;
write_text(4, 18, calendar, 2); // Display the date (format: dd/mm/yyyy)
write_text(16, 45, time, 2); // Display the time
}
void blink_parameter(){
byte j = 0;
while(j < 10 && digitalRead(button1) && digitalRead(button2)){
j++;
delay(25);
}
}
byte edit(byte x_pos, byte y_pos, byte parameter){
char text[3];
sprintf(text,"%02u", parameter);
while(!digitalRead(button1));
while(true){
while(!digitalRead(button2)){
parameter++;
if(i == 0 && parameter > 31)
parameter = 1;
if(i == 1 && parameter > 12)
parameter = 1;
if(i == 2 && parameter > 99)
parameter = 0;
if(i == 3 && parameter > 23)
parameter = 0;
if(i == 4 && parameter > 59)
parameter = 0;
sprintf(text,"%02u", parameter);
write_text(x_pos, y_pos, text, 2);
delay(200);
}
write_text(x_pos, y_pos, " ", 2);
blink_parameter();
write_text(x_pos, y_pos, text, 2);
blink_parameter();
if(!digitalRead(button1)){
i++;
return parameter;
}
}
}
void write_text(byte x_pos, byte y_pos, char *text, byte text_size) {
display.setCursor(x_pos, y_pos);
display.setTextSize(text_size);
display.print(text);
display.display();
}
void loop() {
if(!digitalRead(button1)){
i = 0;
while(!digitalRead(button1));
while(true){
while(!digitalRead(button2)){
day++;
if(day > 7) day = 1;
display_day();
delay(200);
}
write_text(40, 2, " ", 1);
blink_parameter();
display_day();
blink_parameter();
if(!digitalRead(button1))
break;
}
date = edit(4, 18, date);
month = edit(40, 18, month);
year = edit(100, 18, year);
hour = edit(16, 45, hour);
minute = edit(52, 45, minute);
// Convert decimal
minute = ((minute / 10) << 4) + (minute % 10);
hour = ((hour / 10) << 4) + (hour % 10);
date = ((date / 10) << 4) + (date % 10);
month = ((month / 10) << 4) + (month % 10);
year = ((year / 10) << 4) + (year % 10);
//
// Write data to RTC
Wire.beginTransmission(0x68);
Wire.write(0);
Wire.write(0);
Wire.write(minute);
Wire.write(hour);
Wire.write(day);
Wire.write(date);
Wire.write(month);
Wire.write(year);
Wire.endTransmission();
delay(200);
}
Wire.beginTransmission(0x68);
Wire.write(0);
Wire.endTransmission(false);
Wire.requestFrom(0x68, 7);
second = Wire.read();
minute = Wire.read();
hour = Wire.read();
day = Wire.read();
date = Wire.read();
month = Wire.read();
year = Wire.read();
Wire.beginTransmission(0x68);
Wire.write(0x11);
Wire.endTransmission(false);
Wire.requestFrom(0x68, 2);
display_day(); // Display day
RTC_display(); // Display date & time
delay(50);
}
HT22 & 0.91 inc Display CODE: (to be installed on the second Arduino Pro Mini):
NOTE: Before installing this code, the screen resolution in the SSD1306 library must be set for the appropriate option. The .091 inc Oled is 128×32 resolution. The library code should be opened with a text editor and should be made 128×64 passive. 128×32 should be made active. Otherwise, display problems may occur.
// DHT22 & 0.91 inc Oled Screen
// KendinYap Youtube Channel
#include <DHT.h> // include DHT Sensor library
#define DHTPIN 7
DHT dht(DHTPIN, DHT22);
#include <Wire.h> // Include Wire library (required for I2C devices)
#include <Adafruit_GFX.h> // Include Adafruit graphics library
#include <Adafruit_SSD1306.h> // Iclude SSD1306 Oled library
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // I2C address 0x3C for the 128x32 oled
display.display();
display.clearDisplay();
display.setTextColor(WHITE);
dht.begin();
}
void loop() {
float t = dht.readTemperature(); // DHT22 Temperature
float h = dht.readHumidity(); // DHT22 Hummidy
display.drawRect(92, 1, 4, 6, WHITE); // Put degree symbol ( ° )
display.setCursor(100,0);
display.setTextSize(2);
display.print("C");
display.setCursor(100,19);
display.setTextSize(2);
display.print("%");
display.setCursor(19,0);
display.setTextSize(2);
display.print(t);
display.setCursor(19,19);
display.setTextSize(2);
display.print(h);
display.display();
display.clearDisplay();
delay(500);
}
Adafruit SSD1306.h
Adafruit_GFX.h
Adafruit SH1106.h
DHT22.h
Wire.h
