|
|
本帖最后由 wuyaozi 于 2026-3-4 11:10 编辑
由于最近逛论坛的时候坛友说有一款温湿度计很小巧便宜(如下图),才1块多钱,第一次买的话才几毛钱。于是乎撸了三个
原机拆机,简单得令人发指,难怪可以做到1块多钱,内脏先不管,我们要的是外壳。外壳像一个小电视,内部空间也足够大,放板子和电池问题不大,就想到用来做一个桌面天气时钟。
说干就干,首先是产品功能规划:
1、1.54寸TFT LCD显示屏240x240驱动ST7789 TFT液晶屏IPS
[color=rgba(9, 9, 10, 0.92)]
大小和壳子差不多,用镜片当一下就差不多了,手上也有现成的。
2、ESP32C3,功能不用多介绍,手头上也有。
3.扬声器,tyoe-c,电池充电电路,不能破坏外壳的完整性,所以不用设计按键 只需要一个开关机按键,可以使用触摸按键(vdk233dr单按键触摸芯片),开关机电路
以上是硬件选型,功能规划如下:
1,长按触摸按键开关机,开关机扬声器播放开关机音乐。
2, 开机后连接WIFI,如果是首次使用,会进入智能配网界面,手机连接ESP32C3的AP后会自动弹出配网网页,填写WIFI_SSID和WIFI密码,显示天气的城市全拼。点击保存后ESP32C3自动重启
3.连接WIFI成功后,等待80S界面就会更新时间和显示天气
产品功能规划完成后,就开始画原理图了。
手工贴片,铁板烧真蛋疼
硬件完成了,测试充电正常,开始码程序,esp32开发还是喜欢用vscode+platform,该项目程序使用的是x-track的程序架构(大神的代码常用常新)。
这是获取时间
- #include "HAL.h"
- #include <WiFi.h>
- #include <ESP8266_Seniverse.h>
- #include <Preferences.h>
- #include "SetWiFi.h"
- Preferences prefs;
- String PrefSSID, PrefPassword;
- String cityCode = "";
- using namespace HAL;
- /*********************************NTP Service******************************************/
- //时间服务器地址
- #define NTP1 "ntp1.aliyun.com"
- #define NTP2 "ntp2.aliyun.com"
- #define NTP3 "ntp3.aliyun.com"
- //初始化时钟服务器参数
- static void Clock_Init()
- {
- configTime(8 * 3600, 0, NTP1, NTP2,NTP3);
- }
- //获取网络时间
- void HAL::Ntp_GetTime(Clock_Info_t *clock)
- {
- static tm timeinfo;
- if(getLocalTime(&timeinfo))
- {
- clock->minute = timeinfo.tm_min;
- clock->hour = timeinfo.tm_hour;
- clock->day = timeinfo.tm_mday;
- clock->month = timeinfo.tm_mon + 1;
- clock->week = timeinfo.tm_wday;
- }
- }
- /*********************************NTP Service End******************************************/
- String reqUserKey = "Sw6cfCC8Mud98gQpD"; // 私钥
- String reqUnit = "c"; // 摄氏/华氏
- WeatherNow weatherNow; // 建立Forecast对象用于获取心知天气信息
- //获取天气
- void HAL::Weather_GetInfo(Weather_Info_t* info)
- {
- if(weatherNow.update()){ // 更新天气信息
- info->WeatherStr = weatherNow.getWeatherText();
- info->WeatherIco = weatherNow.getWeatherCode();
- info->Temperature = weatherNow.getDegree();
- }
- }
- //强制门户Web配网
- bool setWiFi_Flag = false;
- void WiFi_Set() {
- initSoftAP();
- initWebServer();
- initDNS();
- while(setWiFi_Flag == false) {
- server.handleClient();
- dnsServer.processNextRequest();
- if(WiFi.status() == WL_CONNECTED) {
- server.stop();
- setWiFi_Flag = true;
- }
- }
- }
- bool AutoConfig()
- {
- //首次使用自动进入配网模式,读取NVS存储空间内的ssid、password和citycode
- prefs.begin("wifi", false);
- PrefSSID = prefs.getString("ssid", "none");
- PrefPassword = prefs.getString("password", "none");
- cityCode = prefs.getString("citycode", "dongguan");
- prefs.end();
- WiFi.begin(PrefSSID.c_str(), PrefPassword.c_str());
- WiFi.setTxPower(WIFI_POWER_15dBm);
- //如果觉得时间太长可改
- for (int i = 0; i < 10; i++)
- {
- int wstatus = WiFi.status();
- if (wstatus == WL_CONNECTED)
- {
- return true;
- }
- else
- {
- delay(1000);
- }
- }
- return false;
- }
- //连接wifi
- void HAL::Wifi_Init()
- {
- if (!AutoConfig())
- {
- WiFi_Set();
- }
- //初始化系统时间
- Clock_Init();
- weatherNow.config(reqUserKey, cityCode, reqUnit);
-
- //初始化完成后关闭WiFi以节省功耗
- WiFi.disconnect(true);
- WiFi.mode(WIFI_OFF);
- }
- //启用WiFi
- void HAL::Wifi_Enable()
- {
- if (WiFi.status() != WL_CONNECTED)
- {
- WiFi.mode(WIFI_STA);
- WiFi.begin(PrefSSID.c_str(), PrefPassword.c_str());
- for (int i = 0; i < 10; i++)
- {
- if (WiFi.status() == WL_CONNECTED)
- {
- break;
- }
- delay(500);
- }
- }
- }
- //禁用WiFi
- void HAL::Wifi_Disable()
- {
- WiFi.disconnect(true);
- WiFi.mode(WIFI_OFF);
- }
- //获取天气
- void HAL::Weather_GetInfo(Weather_Info_t* info)
- {
- //启用WiFi
- Wifi_Enable();
-
- if(weatherNow.update()){ // 更新天气信息
- info->WeatherStr = weatherNow.getWeatherText();
- info->WeatherIco = weatherNow.getWeatherCode();
- info->Temperature = weatherNow.getDegree();
- }
-
- //获取完成后关闭WiFi
- Wifi_Disable();
- }
复制代码 下面是MQTT的代码,为了省电 注释掉了。可以自己添加一些命令来使用通过MQTT控制天气时钟
- #include "HAL.h"
- #include <WiFi.h>
- /********************************* MQTT ******************************************/
- // #include <PubSubClient.h>
- // const char *mqtt_broker = "broker-cn.emqx.io"; //公共服务器
- // const char *topic = "qinxl/weather";
- // const char *mqtt_username = "";
- // const char *mqtt_password = "";
- // const int mqtt_port = 1883;
- // WiFiClient espClient;
- // PubSubClient client(espClient);
- // void SetDateTime(uint8_t *indata)
- // {
- // }
- // void QueryVersion(uint8_t *indata)
- // {
- // }
- // void SetBacklight(uint8_t *indata)
- // {
- // HAL::Backlight_SetGradual(indata[1]*100,1000);
- // }
- // void GetBacklight(uint8_t *indata)
- // {
- // char sendtext[30] = {0};
- // uint32_t value = HAL::Backlight_GetValue();
- // sprintf(sendtext,"Backlight value :%d",value);
- // HAL::Mqtt_SendTest(sendtext);
- // }
- // void SetPowerOff(uint8_t *indata)
- // {
- // ESP.restart(); //重启ESP32
- // }
- // void GetVoltage(uint8_t *indata)
- // {
- // HAL::Power_Info_t info;
- // HAL::Power_GetInfo(&info);
- // char sendtext[30] = {0};
- // sprintf(sendtext,"usage:%d\nvoltage:%d",info.usage,info.voltage);
- // HAL::Mqtt_SendTest(sendtext);
- // }
- // void CommandErr(uint8_t *indatan)
- // {
- // }
- // //收到下发的消息(订阅主题的消息)后的回调函数
- // void callback(char *topic, byte *payload, unsigned int length)
- // {
- // uint8_t dataLength = length/2;
- // uint8_t data[dataLength] = {0};
- // for (unsigned int i = 0; i < dataLength; i++) {
- // char hexByte[3] = {(char)payload[i*2], (char)payload[i*2+1], '\0'};
- // data[i] = strtoul(hexByte, NULL, 16);
- // }
- // switch(data[0])
- // {
- // case 1:
- // SetPowerOff(data);
- // break;
- // case 2:
- // SetBacklight(data);
- // break;
- // case 3:
- // GetVoltage(data);
- // break;
- // case 4:
- // GetBacklight(data);
- // break;
- // }
- // }
- // //执行一次的初始化参数函数
- // void HAL::Mqtt_Init()
- // {
- // client.setServer(mqtt_broker, mqtt_port);
- // client.setCallback(callback);
- // if(!client.connected()) //如果没有连接上
- // {
- // client.connect("esp32c3_1987", mqtt_username, mqtt_password);
- // }
- // client.subscribe("qinxl/weatherset"); //订阅"send" Topic
- // }
- // //MQTT消息发送
- // void HAL::Mqtt_SendTest(const char* str)
- // {
- // client.publish("qinxl/weatherup", str); //发布到"update"
- // }
- // // 重连MQTT
- // void reconnectMQTT()
- // {
- // for(int i=0;i<10;i++)
- // {
- // if (client.connect("esp32c3_1987", mqtt_username, mqtt_password))
- // {
- // HAL::Mqtt_SendTest("ESP32C3 MQTT connect success!");
- // return;
- // }
- // else
- // {delay(100);}
- // }
- // }
- // void HAL::MQtt_Update()
- // {
- // if (!client.connected()) {
- // reconnectMQTT();
- // }
- // client.loop(); // 必须调用,处理MQTT消息接收
- // }
- /********************************* MQTT END ******************************************/
复制代码 最终效果如图:
固件源码和原理图PCB
附网盘
通过百度网盘分享的文件:桌面天气.rar
链接:https://pan.baidu.com/s/1V1ayky0vu3Pjd9msdkq3ag?pwd=x8ea
提取码:x8ea
通过百度网盘分享的文件:WeatherDesktop1.rar
链接:https://pan.baidu.com/s/1ZIcymakeOjLz5No4QpHcBw?pwd=5fpr
提取码:5fpr
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|