欢迎光临散文网 会员登陆 & 注册

非过热

2023-06-06 10:00 作者:芜湖男神建勋  | 我要投稿

#include <Rtc_Pcf8563.h>

#include <LiquidCrystal.h>

#include "dht11.h"


Rtc_Pcf8563 rtc; // Define an RTC object

dht11 DHT11;

#define DHT11PIN 2 // Define DHT11 module pin


// LCD1602 pins

const int rs = 8, en = 9, d4 = 4, d5 = 5, d6 = 6, d7 = 7;

LiquidCrystal lcd(rs, en, d4, d5, d6, d7);


byte day, weekday, month, century, year; // Date variables

byte hr, minute, sec; // Time variables

char time_str[16]; // Time string

char date_str[16]; // Date string

char strout[8];

char time_out[16];

int key_in = A0; // Analog button pin

int key_v[4] = {0x2D, 0x13, 0x8, 0x00}; // Predefined key values

int flag = 0; // Clock display state

int flag1 = 0xFF; // Initial button state

int key = 0; // Pressed button

int key1 = 0; // Previous button press

String week[7] = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};

byte Centigrade[8] = { // Custom character for "C" symbol

  B10000,

  B00110,

  B01001,

  B01000,

  B01000,

  B01001,

  B00110,

  B00000

};


void setup() {

  lcd.begin(16, 2); // Initialize the LCD

  lcd.createChar(0, Centigrade); // Create custom character for "C"

  getClock(); // Read the current time from RTC

}


void loop() {

  readKey();

  if (key != 0) {

    switch (key) {

      case 1: Select(); break; // Select key

      case 2: Reduce(); break; // Reduce key

      case 3: Increase(); break; // Increase key

      case 4: Return(); break; // Confirm key

    }

    key = 0;

  }


  if (flag == 0)

    timeDisplay();

  else if (flag == 1)

    tempDisplay();

  else if (flag == 2)

    setDisplay();

}


void getClock() {

  rtc.getDateTime();

  sec = rtc.getSecond();

  minute = rtc.getMinute();

  hr = rtc.getHour();

  day = rtc.getDay();

  month = rtc.getMonth();

  year = rtc.getYear();

  weekday = rtc.getWeekday();

}


void setDisplay() {

  lcd.cursor();

  lcd.blink();

  if (flag1 != 0xFF) {

    switch (flag1) {

      case 0:

        lcd.setCursor(10, 0);

        lcd.print(sec / 10);

        lcd.print(sec % 10);

        lcd.setCursor(11, 0);

        break;

      case 1:

        lcd.setCursor(7, 0);

        lcd.print(minute / 10);

        lcd.print(minute % 10);

        lcd.setCursor(8, 0);

        break;

      case 2:

        lcd.setCursor(4, 0);

        lcd.print(hr / 10);

        lcd.print(hr % 10);

        lcd.setCursor(5, 0);

        break;

      case 3:

        lcd.setCursor(12, 1);

        lcd.print(week[weekday - 1]);

        lcd.setCursor(15, 1);

        break;

      case 4:

        lcd.setCursor(8, 1);

        lcd.print(day / 10);

        lcd.print(day % 10);

        lcd.setCursor(9, 1);

        break;

      case 5:

        lcd.setCursor(5, 1);

        lcd.print(month / 10);

        lcd.print(month % 10);

        lcd.setCursor(6, 1);

        break;

      case 6:

        lcd.setCursor(0, 1);

        lcd.print("20");

        lcd.print(year / 10);

        lcd.print(year % 10);

        lcd.setCursor(3, 1);

        break;

    }

  }

}


void timeDisplay() {

  lcd.noCursor();

  lcd.noBlink();

  lcd.setCursor(4, 0);

  lcd.print(rtc.formatTime());

  lcd.setCursor(0, 1);

  lcd.print(rtc.formatDate());

  lcd.setCursor(12, 1);

  lcd.print(week[rtc.getWeekday() - 1]);

}


void tempDisplay() {

  DHT11.read(DHT11PIN);

  int temperature = DHT11.temperature;

  int humidity = DHT11.humidity;

  lcd.setCursor(4, 0);

  lcd.print("T=");

  lcd.print(temperature);

  lcd.write(byte(0));

  lcd.print("C");

  lcd.setCursor(4, 1);

  lcd.print("H=");

  lcd.print(humidity);

  lcd.print("%");

}


void readKey() {

  int key_Value = analogRead(key_in) >> 4; // Read the analog button value (high 8 bits)

  if (key_Value != 0x3F) { // No button pressed condition

    delay(120);

    key_Value = analogRead(key_in) >> 4; // Read again to confirm button press

    if (key_Value != 0x3F) {

      for (int i = 0; i < 4; i++) {

        if (key_Value >= key_v[i] - 1 && key_Value <= key_v[i] + 1) {

          key = i + 1; // Button value starts from 1

        }

      }

    }

    if (key1 != key) // Prevent multiple button presses

      key1 = key;

    else

      key = 0;

  }

}


void Select() {

  getClock();

  rtc.setDateTime(day, weekday, month, 0, year, hr, minute, sec);

  if (flag == 1) {

    flag = 0;

  } else {

    flag = 2;

    if (flag1 == 0xFF)

      flag1 = 0;

    else if (flag1 < 6) {

      flag1 += 1;

      rtc.setDateTime(day, weekday, month, 0, year, hr, minute, sec);

    } else {

      flag1 = 0;

    }

  }

}


void Reduce() {

  if (flag1 != 0xFF) {

    switch (flag1) {

      case 0:

        if (sec == 0)

          sec = 59;

        else

          sec -= 1;

        break;

      case 1:

        if (minute == 0)

          minute = 59;

        else

          minute -= 1;

        break;

      case 2:

        if (hr == 0)

          hr = 23;

        else

          hr -= 1;

        break;

      case 3:

        if (weekday == 1)

          weekday = 7;

        else

          weekday -= 1;

        break;

      case 4:

        if (day == 1)

          day = 31;

        else

          day -= 1;

        break;

      case 5:

        if (month == 1)

          month = 12;

        else

          month -= 1;

        break;

      case 6:

        if (year == 0)

          year = 99;

        else

          year -= 1;

        break;

    }

    rtc.setDateTime(day, weekday, month, 0, year, hr, minute, sec);

  }

}


void Increase() {

  if (flag1 != 0xFF) {

    switch (flag1) {

      case 0:

        if (sec == 59)

          sec = 0;

        else

          sec += 1;

        break;

      case 1:

        if (minute == 59)

          minute = 0;

        else

          minute += 1;

        break;

      case 2:

        if (hr == 23)

          hr = 0;

        else

          hr += 1;

        break;

      case 3:

        if (weekday == 7)

          weekday = 1;

        else

          weekday += 1;

        break;

      case 4:

        if (day == 31)

          day = 1;

        else

          day += 1;

        break;

      case 5:

        if (month == 12)

          month = 1;

        else

          month += 1;

        break;

      case 6:

        if (year == 99)

          year = 0;

        else

          year += 1;

        break;

    }

    rtc.setDateTime(day, weekday, month, 0, year, hr, minute, sec);

  }

}


void Return() {

  if (flag1 != 0xFF) {

    rtc.setDateTime(day, weekday, month, 0, year, hr, minute, sec);

    flag1 = 0xFF;

    flag = 0;

  } else {

    flag = !flag;

    lcd.clear();

    flag1 = 0xFF;

  }

}


非过热的评论 (共 条)

分享到微博请遵守国家法律