0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

用小安派 DSL做一个天气站

AIoT行业洞察 来源:AIoT行业洞察 作者:AIoT行业洞察 2025-01-06 16:44 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前言

小安派-DSL(AiPi-DSL) 是安信可开源团队专门为Ai-M61-32S设计的一款屏幕驱动开发板,支持2.8/3.5寸等30Pin SPI显示屏、2.4寸及1.28寸等18Pin SPI显示屏。

小安派-DSL目前已测试通过的有3.5寸电容触摸屏(GC9307)、2.4寸电容触摸屏(GC9307)、1.28寸圆形电容触摸屏(GC9A01)。

这次采用小安派 dsl 板子,屏幕为 2.4 寸 320 *240 分辨率屏幕,外接 sht30 温湿度传感器,做一个天气站。

wKgZO2d7l-KAIy_KAADgnkgKEGg555.jpg

01、主要功能

时间显示(已完成)

天气显示(已完成)

温湿度显示(已完成)

wifi 密码保存(已完成)

b 站粉丝数显示(已完成)

U 盘模拟设置(已完成)

电脑性能显示(已完成)

web server(已完成)

自动息屏(放弃)

微信小程序接入(放弃)

温湿度 mqtt 上报(放弃)

02、方案进度

由于笔者接触小安派时间较短,可能只能实现部分功能,目前完成logo界面设计,ttf 矢量字体显示及U盘模拟功能。电脑性能上位机开发 80%(wpf 实在太占用资源类,先凑合用),基本功能已完善:

✔初步完成界面布局及 wifi 扫描和连接

✔完成时间获取更新

✔获取心知天气完成

✔完成 https 获取 b 站粉丝数

✔sht30 温湿度传感器调试完成

✔添加 pwm 亮度调节

✔完善多界面管理

✔性能监控调试完成

03、功能说明

软件说明

所有信息保存在 sys_info 的结构体中,该结构体为全局变量,下图所示。

typedef struct
{
union {
uint32_t state;
struct{
uint32_t state_wifi : 2; // 0:未连接 ;1:连接;2:断开连接
uint32_t state_upan : 2; // 0:未开启 ;1:连接;
};
};
lv_obj_t *last_src;
struct tm* timeinfo_t;
uint8_t backlight;
blbl_follow_t blbl_info_t;
weather_t weather[3];
char * city;
char * weather_key;
wifi_info_t wifi;
uint8_t brightness;
sht30_t sht;
pc_info_t pc;
monitor_info_t *monitor;
} blbl_sys_t;

主要为四个任务:

(1)用于刷新 lvgl 界面

(2)用于管理 Wi-Fi

(3)为定时器任务,定时更新 sys_info 中的信息内容

(4)用于接收电脑发送的监控信息并进行处理

时间更新

连接到 Wi-Fi 获取并 ip 地址时,采用 http 从网易 api 接口获取时间戳,保存时间戳信息,开启 rtc 计时,这里有一个小 bug,官方提供的设置 rtc 函数不能设置计数值,只能从 0 开始计数。当前时间戳即为 rtc 时间 +http 获取的时间戳。然后通过 localtime 将时间戳转换为年月日。

struct bflb_device_s *rtc;
static uint64_t base_time;
void rtc_init(uint64_t timetemp)
{
rtc = bflb_device_get_by_name("rtc");
//此函数,只能开启⏲
bflb_rtc_set_time(rtc, BFLB_RTC_SEC2TIME(1));
base_time = timetemp;
}
uint64_t rtc_get_time()
{
return (BFLB_RTC_TIME2SEC(bflb_rtc_get_time(rtc)) + base_time);
}
void time_update()
{
time_t time = rtc_get_time();
localtime(&time);
}

天气显示

使用心知天气 api,使用 tcp 模拟 http 请求,返回最近三日天气状态的 json 字符串,使用 cjson 对字符串进行解析,存储到系统变量 sys_info 中。

温湿度时间显示

采用 sht30 温湿度传感器模块,i2c 接口,bl618 一共两组 i2c,一组提供给屏幕的触摸 ic,并且没有引出该 io,故只能选用另一组 i2c,根据芯片手册,貌似每个 gpio 均支持 i2c 复用,只不过只能复用 scl 或者其中一个 sda 。然后初始化 gpio,复用 i2c1,通过 i2c 初始化 sht30,如下所示。

struct bflb_i2c_msg_s msgs;
uint8_t subaddr[2] = { CMD_FETCH_DATA_H, CMD_FETCH_DATA_L};
board_i2c1_gpio_init();
i2c1 = bflb_device_get_by_name("i2c1");
bflb_i2c_init(i2c1, 400000);
msgs.addr = SHT30_WRITE_ADDR;
msgs.flags = 0;
msgs.buffer = subaddr;
msgs.length = 2;
bflb_i2c_transfer(i2c1, &msgs, 1);

然后便可以读出原始数据,经过处理,可以获得温湿度信息。

int sht30_get_value()
{
unsigned char sht30_buf[6]={0};
uint32_t date;
int ret;
struct bflb_i2c_msg_s msgs;
//配置SHT30的寄存器
msgs.addr = SHT30_WRITE_ADDR;
msgs.flags = I2C_M_READ;
msgs.buffer = sht30_buf;
msgs.length = 6;
bflb_i2c_transfer(i2c1, &msgs, 1);
//校验读出来的数据,算法参考sht30 datasheet
if( (!SHT3X_CheckCrc(sht30_buf,2,sht30_buf[2])) && (!SHT3X_CheckCrc(sht30_buf+3,2,sht30_buf[5])) )
{
ret = 0;//成功
date=(sht30_buf[0]<<8|sht30_buf[1]);
sys_info_t.sht.temp =(uint8_t) ( ((float)date *175)/65535 -50 );
sys_info_t.sht.humi =(uint8_t)( ( (sht30_buf[3]*256) + (sht30_buf[4]) )*100/65535.0) ;
}
return ret;
}

b 站粉丝数显示

之前b 站提供粉丝数获取的 http 接口,最近由于安全考虑,b 站的 http 均不能使用,需要使用 https 发起请求。为了方便,这里只使用单向验证,不对服务器返回信息进行验证。

U盘模拟

官方提供了USB存储设备模拟的代码,但是是基于RAM模拟的,一旦掉电,数据将会丢失,可以选用将数据存储到片上Flash 内,Flash 大小一共有 8M,选用后4M作为文件管理系统。只需要实现读写Flash 的操作即可,即以下接口。需要注意的是经过测试,Flash最小读写单位为4K,小于4K会出现问题。

void usbd_msc_get_cap(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
{
*block_num = BLOCK_COUNT; //Pretend having so many buffer,not has actually.
*block_size = BLOCK_SIZE;
}
int usbd_msc_sector_read(uint32_t sector, uint8_t *buffer, uint32_t length)
{
if (sector < BLOCK_COUNT){
bflb_flash_read(CONFIG_FLASH_USB_ADDRESS + sector*BLOCK_SIZE, buffer, length);
}
return 0;
}
int usbd_msc_sector_write(uint32_t sector, uint8_t *buffer, uint32_t length)
{
if (sector < BLOCK_COUNT){
bflb_flash_erase(CONFIG_FLASH_USB_ADDRESS + sector*BLOCK_SIZE,length);
bflb_flash_write(CONFIG_FLASH_USB_ADDRESS + sector*BLOCK_SIZE, buffer, length);
}
return 0;
}

之后调用USB初始化,电脑便会识别到该设备,但是由于没有文件系统,系统会建议格式化U盘,建议不要使用 Window 自带的格式化,将会格式化为 fat16 文件系统,在之后的 gif 显示中发现 fat16 文件系统读取 gif 文件并显示会卡住,而 fat32 文件系统则没有该问题。故使用第三方工具 diskgenius 格式化为 fat32.

到此已经完成USB存储设备模拟,个功能有什么用?当然是方便传输文件给程序使用,所有程序也要可以识别该文件系统,官方已经做了 FatFS 文件系统的移植,但是是基于SD卡的,将其改为基于 Flash 的,同样也是只需要实现 Flash 读写接口。

int fs_flash_read(BYTE *buff, LBA_t sector, UINT count)
{
if(!count)
return RES_PARERR;
if(bflb_flash_read(FS_ADDR + sector*BLOCK_SIZE, buff, count * BLOCK_SIZE)){
return RES_PARERR;
}
return 0;
}
int fs_flash_write(const BYTE *buff, LBA_t sector, UINT count)
{
bflb_flash_erase(FS_ADDR + sector*BLOCK_SIZE,count);
bflb_flash_write(FS_ADDR + sector*BLOCK_SIZE, (uint8_t *)buff, count * BLOCK_SIZE);
return 0;
}
int fs_flash_ioctl(BYTE cmd, void *buff)
{
switch (cmd) {
// Get R/W sector size (WORD)
case GET_SECTOR_SIZE:
*(WORD *)buff = BLOCK_SIZE;
break;
// Get erase block size in unit of sector (DWORD)
case GET_BLOCK_SIZE:
*(DWORD *)buff = 1;
break;
case GET_SECTOR_COUNT:
*(DWORD *)buff = 1024;
break;
case CTRL_SYNC:
break;
default:
break;
}
return 0;
}

从USB模拟可知,我们将文件系统放到后4M的位置,如果我们将FatFS的地址也设置为4M的位置,将会发现,程序检测不到Fat32文件系统,这是因为在用电脑格式化的时候,会在Fat32文件系统前添加一段额外的表头信息,这段表头位于 4M的位置,真正的Fat32文件系统位于0x3f000处。具体为什么会这样,笔者还没有深入研究。

FS_ADDR (CONFIG_FLASH_USB_ADDRESS + 0x3F000)

至此,程序便可以直接访问 Fat32 文件系统的文件。

电脑性能监控

电脑性能监控需要使用上位机不断的给小安派发送电脑相关信息,关于上位机的选择,首先先到的是使用 ada64,但是发现,这个软件居然要几百块钱,于是便打算使用开源项目,这里使用的是 OpenHardwareMonitor,一个电脑性能检测的开源项目,基于 c#开发,提供 dll 动态链接库文件。

然后是界面的设计,首先选择的是和 OpenHardwareMonitor 一样的框架 Winform,但受限于本人技术较菜,一些复杂功能无法实现,便选择使用wpf 框架,wpf 框架功能更加强大,但是问题在于使用 wpf 开发的程序占用资源过于庞大,本人又不太了解 wpf 的程序优化,所以暂时只能将就使用。

接着是下位机,小安派连接 Wi-Fi 后开启 tcp_server,然后监听 8124 端口,上位机连接成功后,会首先发送 pc 信息,包括CPU型号,GPU型号,采用 json 字符串的格式发送。然后上位机定时向小安派发送内存、CPU、GPU、网速相关信息,小安派将其解析并更新UI。

尚未解决的问题

哔哩哔哩账户ID及天气地址代码固化在代码中,需要更改源码,之后将会使用 web server 功能,通过 post 修改上述参数,将相应参数保存至文件。

04、视频演示

wKgZO2d7l-yAW3owAADeobgUCuo525.jpg

桌面助手_哔哩哔哩_bilibili​www.bilibili.com/video/BV1cw411K7mn/?spm_id_from=888.80997.embed_other.whitelist&t=85.12471&bvid=BV1cw411K7mn&vd_source=54c5db21948db2378659b7e8e42bafbf

05、软件代码

代码放在 gitlab :https://link.zhihu.com/?target=https%3A//gitee.com/wangpeng25/desktop-ornaments

op-ornaments

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • DSL
    DSL
    +关注

    关注

    2

    文章

    61

    浏览量

    39186
  • 开发板
    +关注

    关注

    26

    文章

    6419

    浏览量

    120849
  • 电容触摸屏
    +关注

    关注

    1

    文章

    82

    浏览量

    23379
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    小安立式桌摆外壳设计制作

    小安-Eyes-R2,但是直没什么时间好好的研究下。近期学习了下相关例程,感觉的很难
    的头像 发表于 09-09 17:20 1010次阅读
    <b class='flag-5'>小安</b><b class='flag-5'>派</b>立式桌摆外壳设计制作

    零成本钢铁侠手套!树莓+OpenCV 秒变手势遥控器!

    大家好,这是树莓和OpenCV的连载专题。使用树莓与OpenCV实现姿态估计和面部特征点追踪使用树莓与OpenCV实现面部和运动追
    的头像 发表于 08-16 16:16 1562次阅读
    零成本钢铁侠手套!树莓<b class='flag-5'>派</b>+OpenCV 秒变手势遥控器!

    如何使用树莓与OpenCV实现面部和运动追踪的云台系统?

    大家好,这是树莓和OpenCV的连载专题。使用树莓与OpenCV实现姿态估计和面部特征点追踪使用树莓与OpenCV实现面部和运动追
    的头像 发表于 08-14 17:45 2401次阅读
    如何使用树莓<b class='flag-5'>派</b>与OpenCV实现面部和运动追踪的云台系统?

    【开源硬件】小安AiPi-Eyes-R2详细测评+DIY天气时钟

    接口-130W像素 1 显示器-4.0寸-RGB接口40寸-像素480x480 1 咪头-2pin-1.25mm间距-交叉绞线100mm 2 具体开箱流程照片如下: 环境搭建 因为之前笔者已经用过Windows开发小安-Eyes-S1了,
    的头像 发表于 08-12 16:23 920次阅读
    【开源硬件】<b class='flag-5'>小安</b><b class='flag-5'>派</b>AiPi-Eyes-R2详细测评+DIY<b class='flag-5'>天气</b>时钟

    树莓做一个指纹识别方案,难不难?

    让我们在树莓单板计算机上解锁生物识别控制功能吧!生物识别技术利用每个人独有的、不易复制的生理或行为特征进行身份验证。地球上每个人的指纹都是独无二的,让我们起来探索指纹的奇妙用途吧!本文将介绍
    的头像 发表于 08-09 13:14 1058次阅读
    <b class='flag-5'>用</b>树莓<b class='flag-5'>派</b><b class='flag-5'>做一个</b>指纹识别方案,难不难?

    树莓操作系统:版本、特性及设置完整指南!

    桌面环境的版本和轻量级、仅用于命令行的最小安装版本。该操作系统设计高效且资源友好,是树莓设备的理想选择。树莓操作系统的优势√轻量高效该操作系统设计精简,占用资源
    的头像 发表于 07-28 18:26 1807次阅读
    树莓<b class='flag-5'>派</b>操作系统:版本、特性及设置完整指南!

    树莓打造无人机,你需注意的事项!

    对于像我这样的普通爱好者而言,能接触到无人机是令人兴奋的。尽管我可以直接购买现成的无人机,但身为DIY爱好者,我更感兴趣的是编写独特的例程序,或对自建的无人机进行升级。因此,我的第一个问题是:我
    的头像 发表于 07-14 17:49 2313次阅读
    <b class='flag-5'>用</b>树莓<b class='flag-5'>派</b>打造无人机,你需注意的事项!

    20任何人都能完成的树莓酷炫项目!

    不知道如何利用你买的树莓?这个小设备真的能当台式电脑吗?能当服务器吗?能当广播电台吗?当然可以!为了帮助你入门,我们精心挑选了这份树莓应用指南,每个项目都在MakeUseOf上有详细
    的头像 发表于 07-03 17:10 4750次阅读
    20<b class='flag-5'>个</b>任何人都能完成的树莓<b class='flag-5'>派</b>酷炫项目!

    搭载代码的树莓进入国际空间

    前言通过欧洲宇航挑战赛(EuropeanAstroPiChallenge),年轻人通过在国际空间(ISS)上的树莓(RaspberryPi)计算机上运行代码的独特体验,参与计算编程。欧洲宇航
    的头像 发表于 06-19 17:11 1187次阅读
    搭载代码的树莓<b class='flag-5'>派</b>进入国际空间<b class='flag-5'>站</b>!

    树莓复古游戏,你会选哪一个

    复古游戏与树莓单板计算机的组合十分常见。在树莓项目列表中,几乎都会包含至少复古游戏项目。复古游戏发行版让在树莓派上开启复古游戏之旅变得轻而易举,其中Batocera和Retro
    的头像 发表于 06-16 16:56 1364次阅读
    树莓<b class='flag-5'>派</b>复古游戏,你会选哪<b class='flag-5'>一个</b>?

    树莓分类器:树莓识别不同型号的树莓

    在本教程系列的第部分中,您将学习如何使用树莓AI摄像头来检测不同的树莓型号。本系列由DavidPlowman创建,他是树莓工程师,专注于图像处理硬件、摄像头软件和算法研究。您可
    的头像 发表于 06-13 16:39 1546次阅读
    树莓<b class='flag-5'>派</b>分类器:<b class='flag-5'>用</b>树莓<b class='flag-5'>派</b>识别不同型号的树莓<b class='flag-5'>派</b>!

    树莓“揪出”家里的耗电怪兽!

    在本应用中,我们将使用树莓设置CE电流监测器,并通过网页界面显示电路的电流读数。本项目使用的组件硬件组件树莓2ModelBx112通道20安培电流监测控制器x1项目背景介绍在本
    的头像 发表于 06-04 15:33 2052次阅读
    <b class='flag-5'>用</b>树莓<b class='flag-5'>派</b>“揪出”家里的耗电怪兽!

    HIPERFACE DSL编码器通信协议介绍

    在工业自动化和智能制造快速发展的今天,编码器在各类设备中扮演着关键角色,精准的位置和速度反馈是确保系统高效、稳定运行的基础。HIPERFACE DSL作为种先进的编码器通信协议,正逐渐成为众多工业
    的头像 发表于 05-23 14:16 2504次阅读
    HIPERFACE <b class='flag-5'>DSL</b>编码器通信协议介绍

    树莓“吉尼斯世界记录”:将树莓的性能发挥到极致的项目!

    树莓款功能强大、体积小巧且高度可定制的设备,多年来,我们见证了它被应用于众多领域。无论是将其装入3D打印的经典游戏机外壳,还是简单地将它隐藏起来作为家庭文件服务器,我们都报道过在社区里树莓
    的头像 发表于 05-22 16:53 1719次阅读
    树莓<b class='flag-5'>派</b>“吉尼斯世界记录”:将树莓<b class='flag-5'>派</b>的性能发挥到极致的项目!

    树莓 Zero 打造的智能漫游车!

    使用PXFMini和树莓Zero打造您自己的自主漫游车。本项目所用组件硬件组件ErleRoboticsPXFmini×1树莓Zero×1树莓2ModelB×1树莓3ModelB
    的头像 发表于 05-13 16:39 1308次阅读
    <b class='flag-5'>用</b> 树莓<b class='flag-5'>派</b> Zero 打造的智能漫游车!