#include <LiquidCrystal.h>
// Custom characters
byte degreeSymbol[8] = {
B01100,
B10010,
B01100,
B00000,
B00000,
B00000,
B00000,
B00000
};
byte clockSymbol[8] = {
B00000,
B01110,
B10101,
B10001,
B10101,
B01110,
B00000,
B00000
};
#include <OneWire.h>
#include <DallasTemperature.h>
OneWire oneWire(10);
DallasTemperature sensor(&oneWire);
// DS1307 I2C address
#define DS1307_ADDRESS 0x68
// Pins for DS1307 (I2C)
#define SDA_PIN A4
#define SCL_PIN A5
// Pins for RGB LED
int RED_PIN= 11;
int GREEN_PIN= 10;
int BLUE_PIN = 9;
// Pins for LCD 1602
#define RS 8
#define E 13
#define D4 12
#define D5 2
#define D6 4
#define D7 7
LiquidCrystal lcd(RS, E, D4, D5, D6, D7);
void setup() {
pinMode(SDA_PIN, INPUT_PULLUP);
pinMode(SCL_PIN, OUTPUT);
sensor.begin();
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Weather Station");
// Create custom characters
lcd.createChar(0, degreeSymbol);
lcd.createChar(1, clockSymbol);
}
byte bcdToDec(byte bcd) {
return (bcd >> 4) * 10 + (bcd & 0x0F);
}
byte decToBcd(byte dec) {
return (dec / 10 << 4) + dec % 10;
}
void i2cStart() {
pinMode(SDA_PIN, OUTPUT);
digitalWrite(SDA_PIN, HIGH);
digitalWrite(SCL_PIN, HIGH);
digitalWrite(SDA_PIN, LOW);
digitalWrite(SCL_PIN, LOW);
}
void i2cStop() {
pinMode(SDA_PIN, OUTPUT);
digitalWrite(SDA_PIN, LOW);
digitalWrite(SCL_PIN, HIGH);
digitalWrite(SDA_PIN, HIGH);
}
void i2cWriteByte(byte data) {
pinMode(SDA_PIN, OUTPUT);
for (byte i = 0; i < 8; i++) {
digitalWrite(SDA_PIN, data & 0x80);
data <<= 1;
digitalWrite(SCL_PIN, HIGH);
digitalWrite(SCL_PIN, LOW);
}
pinMode(SDA_PIN, INPUT);
digitalWrite(SCL_PIN, HIGH);
digitalWrite(SCL_PIN, LOW);
}
byte i2cReadByte(bool ack) {
pinMode(SDA_PIN, INPUT);
byte data = 0;
for (byte i = 0; i < 8; i++) {
data <<= 1;
digitalWrite(SCL_PIN, HIGH);
if (digitalRead(SDA_PIN)) {
data |= 1;
}
digitalWrite(SCL_PIN, LOW);
}
pinMode(SDA_PIN, OUTPUT);
digitalWrite(SDA_PIN, !ack);
digitalWrite(SCL_PIN, HIGH);
digitalWrite(SCL_PIN, LOW);
return data;
}
void readDS1307Time(byte *hour, byte *minute, byte *second) {
i2cStart();
i2cWriteByte((DS1307_ADDRESS << 1) | 0); // Write address
i2cWriteByte(0); // Register address (0x00 for seconds)
i2cStop();
i2cStart();
i2cWriteByte((DS1307_ADDRESS << 1) | 1); // Read address
*second = bcdToDec(i2cReadByte(true));
*minute = bcdToDec(i2cReadByte(true));
*hour = bcdToDec(i2cReadByte(true)); // Change this line, set true instead of false
i2cReadByte(false); // Add this line, read and discard the "day of week" byte
i2cStop();
}
void loop() {
byte hour, minute, second;
readDS1307Time(&hour, &minute, &second);
sensor.requestTemperatures();
float temperature = sensor.getTempCByIndex(0);
// Adjust the time to GMT+8 timezone
int adjustedHour = hour + 8;
if (adjustedHour >= 24) {
adjustedHour -= 24;
}
// Display the temperature on the LCD
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(temperature, 1); // Add 1 to display temperature with one decimal place
lcd.write(byte(0)); // Degree symbol
lcd.print("C ");
// Display the adjusted time on the LCD
lcd.setCursor(9, 1); // Change this line to set the cursor position to 9
lcd.write(byte(1)); // Clock symbol
lcd.print(" ");
if (adjustedHour < 10) {
lcd.print("0");
}
lcd.print(adjustedHour, DEC);
lcd.print(':');
if (minute < 10) {
lcd.print("0");
}
lcd.print(minute, DEC);
lcd.print(':');
if (second < 10) {
lcd.print("0");
}
lcd.print(second, DEC);
analogWrite(GREEN_PIN, 0);
analogWrite(BLUE_PIN, 0);
analogWrite(RED_PIN,0);
if (temperature > 40) {
analogWrite(RED_PIN, 255);
// Red
} else if (temperature < 20) {
analogWrite(BLUE_PIN, 255); // Blue
} else {
analogWrite(GREEN_PIN, 255);
}
delay(1000);
}