I'm making a Christmas Countdown Ornament, but I'm having issues. I don't know how to explain this in smart-people terms, so bear with me please.
I have run the basic Adafruit 0.96" 128x64 display code (with all the shapes and animations) and it works perfectly fine. I run my code, and it freezes the screen. If I unplug my board and plug it back in, the display doesn't even turn on.
Here is my code. Again, I know it's messy, but I just want to know what the issue is.
/*
Parts included: 128x64 OLED Graphic Screen
DS3231 RTC Clock Module
Arduino Uno
Prototype Sheild
Remote IR Sensor
Various Wires
*/
int receiverpin = 8;
#include "Wire.h"
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <IRremote.h>
#define DS3231_I2C_ADDRESS 0x68
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
IRrecv irrecv(receiverpin);
decode_results results;
int days, hours, minutes, seconds, totalHours, totalMinutes, totalSeconds = 0;
bool irRecieved = false;
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
byte decToBcd(byte val) {
return( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val) {
return( (val/16*10) + (val%16) );
}
void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year) {
// sets time and date data to DS3231
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // set next input to start at the seconds register
Wire.write(decToBcd(second)); // set seconds
Wire.write(decToBcd(minute)); // set minutes
Wire.write(decToBcd(hour)); // set hours
Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
Wire.write(decToBcd(month)); // set month
Wire.write(decToBcd(year)); // set year (0 to 99)
Wire.endTransmission();
}
void readDS3231time(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) {
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // set DS3231 register pointer to 00h
Wire.endTransmission();
Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
// request seven bytes of data from DS3231 starting from register 00h
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f);
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}
void translateIR() {
switch (results.value) {
case 0x10:
irRecieved = false;
daysHoursMinutes();
break;
case 0x810:
irRecieved = false;
daysHoursMinutesSeconds();
case 0x410:
irRecieved = false;
totalHoursMinutesSeconds();
break;
case 0xC10:
irRecieved = false;
totalHoursTotalMinutesTotalSeconds();
break;
case 0x210:
irRecieved = false;
totalDays();
break;
case 0xA10:
irRecieved = false;
totalHour();
break;
case 0x610:
irRecieved = false;
totalMinute();
break;
case 0xE10:
irRecieved = false;
totalSecond();
break;
}
}
void createCountdownVariables() {
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
if (month == 11) {
int days = (29-dayOfMonth) + 25;
} else if (month == 12) {
int days = 24-dayOfMonth;
} else {
int days = 0;
}
int hours = 23-hour;
int minutes = 59-minute;
int seconds = 59-second;
int totalHours = (days*24) + hours;
int totalMinutes = (totalHours*60) + minutes;
int totalSeconds = (totalMinutes*60) + seconds;
}
void daysHoursMinutes() {
for (int timer = 0; timer++; timer < 3600 || irRecieved == true) {
createCountdownVariables();
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(7, 7);
display.println("Days: ");
display.println(days);
display.setCursor(7, 26);
display.println("Hours: ");
display.println(hours);
display.setCursor(7, 50);
display.println("Minutes: ");
display.println(minutes);
delay(50);
irRecieve();
}
display.clearDisplay();
}
void daysHoursMinutesSeconds() {
for (int timer = 0; timer++; timer < 3600 || irRecieved == true) {
createCountdownVariables();
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(7, 5);
display.println("Days: ");
display.println(days);
display.setCursor(7, 20);
display.println("Hours: ");
display.println(hours);
display.setCursor(7, 35);
display.println("Minutes: ");
display.println(minutes);
display.setCursor(7, 50);
display.println("Seconds: ");
display.println(seconds);
delay(50);
irRecieve();
}
display.clearDisplay();
}
void totalHoursMinutesSeconds() {
for (int timer = 0; timer++; timer < 3600 || irRecieved == true) {
createCountdownVariables();
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(7, 7);
display.println("Total Hours: ");
display.println(totalHours);
display.setCursor(7, 26);
display.println("Minutes: ");
display.println(minutes);
display.setCursor(7, 50);
display.println("Seconds: ");
display.println(seconds);
delay(50);
irRecieve();
}
display.clearDisplay();
}
void totalHoursTotalMinutesTotalSeconds() {
for (int timer = 0; timer++; timer < 3600 || irRecieved == true) {
createCountdownVariables();
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(7, 7);
display.println("Total Hours: ");
display.println(totalHours);
display.setCursor(7, 26);
display.println("Total Minutes: ");
display.println(totalMinutes);
display.setCursor(7, 50);
display.println("Total Seconds: ");
display.println(totalSeconds);
delay(50);
irRecieve();
}
display.clearDisplay();
}
void totalDays() {
for (int timer = 0; timer++; timer < 3600 || irRecieved == true) {
createCountdownVariables();
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(7, 50);
display.println("Days: ");
display.println(days);
delay(50);
irRecieve();
}
display.clearDisplay();
}
void totalHour() {
for (int timer = 0; timer++; timer < 3600 || irRecieved == true) {
createCountdownVariables();
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(7, 50);
display.println("Total Hours: ");
display.println(totalHours);
delay(50);
irRecieve();
}
display.clearDisplay();
}
void totalMinute() {
for (int timer = 0; timer++; timer < 3600 || irRecieved == true) {
createCountdownVariables();
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(7, 50);
display.println("Total Minutes: ");
display.println(totalMinutes);
delay(50);
irRecieve();
}
display.clearDisplay();
}
void totalSecond() {
for (int timer = 0; timer++; timer < 3600 || irRecieved == true) {
createCountdownVariables();
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(7, 50);
display.println("Total Seconds: ");
display.println(totalSeconds);
delay(50);
irRecieve();
}
display.clearDisplay();
}
void irRecieve() {
if (irrecv.decode(&results)) {
irRecieved= true;
translateIR();
for (int z = 0; z < 2; z++) {
irrecv.resume();
}
}
}
void setup() {
irrecv.enableIRIn();
Serial.begin(115200);
setDS3231time(00, 00, 10, 6, 1, 12, 2023);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
delay(2000);
display.clearDisplay();
daysHoursMinutesSeconds();
}
void loop() {
irRecieve();
}
I appreciate any and all help. This is really bothering me and I would like to get it working by tonight. Thanks in advance.
