#include <Wire.h> // I2C通信协议库
#include <Adafruit_GFX.h> // 用于在屏幕上绘制图形元素,是一个通用显示库
#include <Adafruit_SSD1306.h> // 基于GFX库,用于控制SSD1306系列OLED显示屏
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire); // 创建一个Adafruit_SSD1306对象,命名为display,该对象可以控制SSD1306 OLED显示屏(128x32像素)
struct DateTime {
int year;
int month;
int day;
int hour;
int minute;
int second;
};
DateTime currentTime;
String Weather;
int Temperature;
const int Button_Pin1 = 2;
const int Button_Pin2 = 3;
const int Button_Pin3 = 4;
#define Debounce_Delay 50 // 稳定前需要等待的毫秒数,硬件按钮弹性越强,则需要的时间越长
#define LOW_OR_HIGH 0 // 如果是上拉电阻模式,则输入0,低电平有效
void setup() {
// put your setup code here, to run once:
/******************************启动串口通讯******************************/
Serial.begin(9600); // 初始化串口通信,并设置波特率为115200
/*************************初始化SSD1306 OLED显示屏***********************/
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // OLED初始化
display.clearDisplay();
display.setTextSize(1);// 字号
display.setTextColor(SSD1306_WHITE);// 字体颜色
display.display();
pinMode(Button_Pin1, INPUT_PULLUP);
pinMode(Button_Pin2, INPUT_PULLUP);
pinMode(Button_Pin3, INPUT_PULLUP);
currentTime.year = 2023;
currentTime.month= 12;
currentTime.day= 26;
currentTime.hour= 14;
currentTime.minute= 30;
currentTime.second= 25;
Weather = "sunny";
Temperature = 3;
}
void loop() {
display.clearDisplay();
if(debounce(Button_Pin2)){
alarm_Display();
}else if(debounce(Button_Pin3)){
while(1){
music_Display();
}
}else{
home_Display();
}
display.display();
}
void home_Display() {
display.setTextSize(1);
display.setCursor(0, 0);
display.print(Weather);
display.setCursor(0, 10);
display.print(Temperature);
display.print(" ^C");
display.setCursor(65, 0); // 游标移动到左上角第一位
display.print(currentTime.year);
display.print('-');
display.print(currentTime.month);
display.print('-');
display.print(currentTime.day);
display.setTextSize(2);// 字号
display.setCursor(16, 25);
display.print(currentTime.hour);
display.print(':');
display.print(currentTime.minute);
display.print(':');
display.print(currentTime.second);
}
void alarm_Display() {
display.setTextSize(1);
display.setCursor(0, 0);
display.print(Weather);
display.setCursor(0, 10);
display.print(Temperature);
display.print("^C");
display.setCursor(65, 0); // 游标移动到左上角第一位
display.print(currentTime.year);
display.print('-');
display.print(currentTime.month);
display.print('-');
display.print(currentTime.day);
display.setTextSize(2);// 字号
display.setCursor(16, 25);
display.print(currentTime.hour);
display.print(':');
display.print(currentTime.minute);
display.print(':');
display.print(currentTime.second);
}
void music_Display() {
display.setTextSize(1);
display.setCursor(0, 0);
display.print(Weather);
display.setCursor(0, 10);
display.print(Temperature);
display.print("^C");
display.setCursor(65, 0); // 游标移动到左上角第一位
display.print(currentTime.year);
display.print('-');
display.print(currentTime.month);
display.print('-');
display.print(currentTime.day);
display.setTextSize(2);// 字号
display.setCursor(16, 25);
display.print(currentTime.hour);
display.print(':');
display.print(currentTime.minute);
display.print(':');
display.print(currentTime.second);
}
/*
按键防抖函数
参数pin:按键引脚
*/
boolean debounce(int pin) {
bool state;
bool previousState = digitalRead(pin);
for (int counter = 0; counter < Debounce_Delay; counter++)
//如果在10ms内状态不变,则确定状态
{
delay(1);
state = digitalRead(pin);
if (state != previousState) //如果前后不一致
{
counter = 0; //for循环重新开始
previousState = state;
}
}
if (LOW_OR_HIGH) //按下是1,不按是0。
return state;
else
return !state;
}