- DS3231高精度时钟模块,断电后持续计时
- wifi联网后,每隔15min自动从淘宝服务器校准时间,如果DS3231误差超过5秒,同时校准DS3231模块
- wifi联网后,每隔30min自动从qweather获取当天以及未来三天的天气预报
- 随机播放相册以及对应语句
- 每隔1min切换下一张
- 以分钟为单位进行倒计时
- 已联网,显示后台管理页面
- 未联网,自动开启wifi并显示后台管理页面
- 与天猫精灵联动
#define TFT_MISO 19
#define TFT_MOSI 23
#define TFT_SCLK 18
#define TFT_CS 5 // Not connected
#define TFT_DC 26
#define TFT_RST 33 // Connect reset to ensure display initialises
// 镜像屏幕
case 4:
writedata(TFT_MAD_MX | TFT_MAD_COLOR_ORDER);
_width = _init_height;
_height = _init_width;
break;
tft.begin();
tft.setRotation(4); /* mirror */
tft.fillScreen(TFT_BLACK);
uint8_t RTC_DS3231::enable_battery(void)
{
uint8_t status = read_i2c_register(DS3231_ADDRESS, DS3231_CONTROL, RTCWireBus);
status &= 0x0F; // clear bit7
write_i2c_register(DS3231_ADDRESS, DS3231_STATUSREG, status, RTCWireBus);
return status;
}
uint8_t RTC_DS3231::get_control_status(void)
{
uint8_t status = read_i2c_register(DS3231_ADDRESS, DS3231_CONTROL, RTCWireBus);
return status;
}
uint8_t enable_battery();
uint8_t get_control_status();
cfg->wifi_ssid // wifi名称
cfg->wifi_key // wifi密码
cfg->city_name // 和风天气的城市或地区
cfg->qweather_key // 和风天气的密钥,up主的密钥仅供验证,如果访问太多,UP主自己就没法访问了....所以请自行去 qweather.com 申请(完全免费)并替换成自己的
#define LOCATION_NANSHAN "101280604" // 深圳市南山区,地区对应的ID,请在 qweather.com 查询
组件的定义,可以理解为手机上的一个app
typedef struct widget_desc_t
{
widget_desc_t *prev; // prev 上一个组件
widget_desc_t *next; // next 下一个组件
uint8_t id; // 组件的ID
String name; // 名称
const lv_img_dsc_t *icon; // icon图标
widget_fun_t init; // 初始化函数,启动时会执行一次这个初始化函数,可以对UI界面进行初始化
widget_fun_t process; // 运行中函数,每隔 peroid 会调用一次,可以用来刷新界面,或处理自身的任务
widget_fun_t exit; // 退出函数,组件退出时会调用一次,可以用来释放资源
widget_contrl_t control; // 控制函数,可以通过这个接口,给组件发送事件消息或参数,例如 按键消息
uint32_t peroid; // 运行周期,定义组件的调用周期,决定上面的 process 函数多久调用1次
uint32_t args; // 附带参数
} widget_t;
gt_err_t add(widget_t *widget); // 添加组件
gt_err_t remove(widget_id_t id); // 移除组件
gt_err_t launch(widget_id_t id); // 启动对应ID的组件(通过ID)
gt_err_t launch(widget_t *widget); // 启动对应的组件(通过指针)
gt_err_t exit(widget_id_t id); // 退出对应的组件(通过ID)
gt_err_t exit(widget_t *widget); // 退出对应的组件(通过指针)
gt_err_t control(uint32_t cmd, void* args); // 向运行中的组件发送cmd消息 及 args参数
int get_current_widget_id(void); // 获取当前运行的组件ID
void launcher_init(void); // 启动器,你可以理解为主界面,一个特殊的组件
void launcher_control(uint32_t cmd, void *args);// 向启动器发送cmd消息 及 args参数,比如切换app,退出app等
// main.cpp 定义启动器任务, 每100ms调用一次,用于处理事件消息
TASK_DECLARE(task_widget, NULL, 100);
// app.cpp, 向启动器注册app组件,如时钟,天气...
clock_init();
weather_init();
photo_init();
inspire_init();
setting_init();
// 启动主界面,显示第一个app,并等待按键消息
widget.launcher_init();
widget.launcher_control(LAUNCHER_INIT, GT_NULL);
// 传感器检测位置,并将上、下、左、右的消息发送给组件,由组件进行处理
void APP::sensor_monitor(void)
// 如:发送切换上一个app给启动器,启动器会把图标切换到上一个app
widget.launcher_control(LAUNCHER_PREV, GT_NULL);
// 如:发送向左按键消息给当前运行的app,app收到后可以进行界面切换之类的操作
widget.control(KEY_LEFT, GT_NULL);