#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
#include <DHT22.h>
RTC_DS1307 rtc;
LiquidCrystal_I2C lcd(0x27, 16, 2);
DHT22 dht(6); // DHT22 connected to pin 6
// Pin configuration for LEDs
int latchPin = 9;
int clockPin = 10;
int dataPin = 8;
int layerPins[4] = {A0,A1,A2,A3};
// パターン配列
byte patterns[] = {
//0B0000,
0B0001,
0B0011,
0B0111,
//0B1110,
//0B1100,
//0B1001,
//0B0110,
0B1100,/*
0B0001,
0B0011,
0B0111,
0B1111,
0B1110,
0B1100,
0B1000,
0B0000,
0B1111,
0B0000,
0B1111,
0B1111,
0B0000,
0B0000,
0B1111,
0B1111,
0B1111,
0B0000,
0B0000,
0B0000,
0B0000,
0B1000,
0B1000,
0B1000,
0B1000,
0B0100,
0B0100,
0B0100,
0B0100,
0B0010,
0B0010,
0B0010,
0B0010,
0B0001,
0B0001,
0B0001,
0B0001,
0B0000,
0B0000,
0B0000,
0B0000,
0B1111,
0B1111,
0B1111,
0B1111*/
};
byte simultaneousPatterns[6][4] = {
{0b1111, 0b1111, 0b1111, 0b1111},
{0b0000, 0b0000, 0b0000, 0b0000},
{0b1111, 0b1001, 0b1110, 0b1111},
{0b1111, 0b1111, 0b0111, 0b0111},
{0b1111, 0b1001, 0b1001, 0b1111},
{0b0001, 0b0001, 0b0001, 0b0001}
};
bool displayTemperature = true; // Flag to toggle between temperature and humidity
unsigned long lastSwitchTime = 0; // To track time for switching temperature/humidity
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
lcd.backlight();
Wire.begin();
rtc.begin();
// Uncomment to set RTC to the current date & time
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
for (int i = 0; i < 4; i++) {
pinMode(layerPins[i], OUTPUT);
}
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
lcd.setCursor(0, 0);
lcd.print("Initializing...");
delay(1000);
}
void displayTime() {
DateTime now = rtc.now();
// Display date and day of the week on LCD
lcd.setCursor(0, 0);
lcd.print(now.year(), DEC);
lcd.print('/');
lcd.print(formatDigits(now.month()));
lcd.print('/');
lcd.print(formatDigits(now.day()));
lcd.print(' ');
lcd.print(dayOfWeek(now.dayOfTheWeek()));
// Display time on LCD
lcd.setCursor(0, 1);
lcd.print(formatDigits(now.hour()));
lcd.print(':');
lcd.print(formatDigits(now.minute()));
//lcd.print(':');
//lcd.print(formatDigits(now.second()));
// Print time to Serial Monitor
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(formatDigits(now.month()));
Serial.print('/');
Serial.print(formatDigits(now.day()));
Serial.print(' ');
Serial.print(formatDigits(now.hour()));
Serial.print(':');
Serial.print(formatDigits(now.minute()));
Serial.print(':');
Serial.println(formatDigits(now.second()));
}
void displaySensorData() {
float temperature = dht.getTemperature();
float humidity = dht.getHumidity();
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
if (displayTemperature) {
// Display temperature on LCD
lcd.setCursor(10, 1); // Adjust position as needed
//lcd.print(" ");
lcd.print(temperature);
lcd.print("C");
// Print temperature to Serial Monitor
Serial.print("Temperature: ");
Serial.println(temperature);
} else {
// Display humidity on LCD
lcd.setCursor(10, 1); // Adjust position as needed
//lcd.print(" ");
lcd.print(humidity);
lcd.print("%");
// Print humidity to Serial Monitor
Serial.print("Humidity: ");
Serial.println(humidity);
}
}
void displayLEDPatterns() {
// Shift through each pattern for each layer
for (int shiftCount = 0; shiftCount < sizeof(patterns)/sizeof(byte); shiftCount++) {
for (int layer = 0; layer < 4; layer++) {
digitalWrite(layerPins[layer], HIGH);
sendPattern(patterns[(layer + shiftCount) % (sizeof(patterns)/sizeof(byte))]);
delay(80); // Short delay for visual effect
digitalWrite(layerPins[layer], LOW);
}
}
// Display simultaneous patterns
for (int patternIndex = 0; patternIndex < 6; patternIndex++) {
for (int i = 0; i < 4; i++) {
digitalWrite(layerPins[i], HIGH);
sendPattern(simultaneousPatterns[patternIndex][i]);
delay(500);
}
delay(500); // Keep pattern on for two seconds
// Turn off layers
for (int i = 0; i < 4; i++) {
digitalWrite(layerPins[i], LOW);
}
//sendPattern(0b0000); // Turn off all LEDs
delay(1000); // Keep off for two seconds
}
}
void sendPattern(byte pattern) {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, pattern);
digitalWrite(latchPin, HIGH);
}
void loop() {
displayTime();
if (millis() - lastSwitchTime >= 5000) { // Switch every five seconds
displaySensorData();
displayTemperature = !displayTemperature; // Toggle flag
lastSwitchTime = millis();
}
delay(1000); // Update every second
displayLEDPatterns();
}
// Helper function to format digits with leading zeros
String formatDigits(int digits) {
if (digits < 10) {
return "0" + String(digits);
}
return String(digits);
}
// Helper function to convert day of the week number to string
String dayOfWeek(int day) {
switch (day) {
case 0: return "Sun";
case 1: return "Mon";
case 2: return "Tue";
case 3: return "Wed";
case 4: return "Thu";
case 5: return "Fri";
case 6: return "Sat";
default: return "";
}
}