嵌入式产品级-超小尺寸热成像相机(从0到1 硬件-软件-外壳)

Thermal_Imaging_Camera 
This is a small thermal imaging camera that includes everything from hardware and software.

小尺寸热成像相机-Pico-LVGL-RTOS

基于RP2040 Pico主控与RTOS,榨干双核性能实现LVGL和成图任务并行。ST7789驱动240×280屏,CST816T触摸IC,MLX90640传感器实现热成像功能。充电采用SGM4056,DC-DC使用SGM6031等等。

产品描述:树莓派RP204 Pico, 双核 LVGL RTOS,合理分配热成像呈现内容,UI画面的更新反馈。

探头既可支持长焦的BAB款,支持广角的BAA款,MCU + ST7789屏幕(240 * 280)+ CST816T 触摸IC + MLX90640热成像传感器 + 充电采用SGM4056,DC-DC使用SGM6031等等。

ui类似Apple Watch,按键1开启ui,支持卡尔曼滤波、插值切换、7种显示色彩和温度,折线图,电池电量。按键2拍照,触摸屏显示任意位置温度不限个数,支持调光。

传统热成像设备的痛点

  • 价格昂贵:大多数热成像设备由于采用高端传感器和复杂的硬件设计,导致成本高昂。
  • 体积较大:便携性较差,限制了其在移动应用或小型设备中的应用。
  • 开发门槛高:传统设备通常依赖复杂的嵌入式系统,难以快速定制化开发。

用户需求

  • 对于消费者和开发者而言,市场需要一种低成本、小尺寸、易用的热成像解决方案,同时具备良好的图像质量和功能拓展性。

产品优势

  • 低成本实现

    • 通过使用 RP2040 Pico 和 MLX90640 这类性价比高的硬件组合,实现了功能的最大化。
    • 使用开源的 LVGL 图形库,避免高额商业软件授权费用。
  • 小尺寸设计

    • 紧凑的硬件结构使设备便于携带和嵌入其他系统,例如无人机、手持设备等场景。
  • 高性能多任务

    • 基于 RTOS 实现多任务调度,充分利用 RP2040 的双核性能,在图像处理和触摸交互中保持流畅性能。
  • 高扩展性

    • 支持通过触摸屏实现用户交互(例如温度调节、热图切换)。
    • 支持电池供电,搭配 SGM4056 和 SGM6031 提供高效的电源管理。

项目包含下述内容

  • 硬件部分、PCB制板、BOM表文件等等 (Hardware)
  • 软件程序、用于RP2040软件程序以及LVGL UI等等(Software)
  • 上位机(UpperComputerQT上位机 待更新!
  • 二次开发方案
  • 技术支持、全项目内容答疑
  • 项目持续更新中(任何问题和想法 功能都可以跟我提,我会慢慢跟进解决

功能图例

下图为用户配置设置界面,你可以设置配置你想要的参数,例如是否插值,是否启用卡尔曼滤波,色彩选择等。

下图是温度折线图界面,左滑即可。

下图为电源状态管理界面,右滑即可。

下图为相机状态,也就是捕捉热源成像。

下述就是不同色彩呈现的图示了。

更多内容附在资料包中~

代码部分如下所示:展示部分。

void my_disp_flush( lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p )
{uint32_t w = ( area->x2 - area->x1 + 1 );uint32_t h = ( area->y2 - area->y1 + 1 );tft.startWrite();#if (ROTATE == 0 || ROTATE == 2)tft.setAddrWindow( area->x1, area->y1, w, h );#endif#if (ROTATE == 1 || ROTATE == 3)tft.setAddrWindow( area->x1, area->y1, w, h );#endiftft.pushColors( ( uint16_t * )&color_p->full, w * h, true );tft.endWrite();lv_disp_flush_ready( disp_drv );
}/*Read the touchpad*/
void my_touchpad_read( lv_indev_drv_t * indev_drv, lv_indev_data_t * data )
{touch.update();// Serial.print( "touch called " );// Serial.println( touch.tp.touching );bool touched = touch.tp.touching;if( !touched )// if( 0!=touch.data.points ){data->state = LV_INDEV_STATE_REL;}else{data->state = LV_INDEV_STATE_PR;#if (ROTATE == 0)/*Change to your screen resolution*/data->point.x = touch.tp.x;data->point.y = touch.tp.y;#endif#if (ROTATE == 1)/*Change to your screen resolution*/data->point.x = touch.tp.y;data->point.y = 240-touch.tp.x;#endif#if (ROTATE == 2)/*Change to your screen resolution*/data->point.x = 240-touch.tp.x;data->point.y = 280-touch.tp.y;#endif#if (ROTATE == 3)data->point.x = 280-touch.tp.y;data->point.y = touch.tp.x;#endif// data->point.x = touch.tp.x;// data->point.y = touch.tp.y;// Serial.print( "Data x " );// Serial.println( touch.tp.x );// Serial.print( "Data y " );// Serial.println( touch.tp.y );  }
}// 按键输入设备读取回调函数
void my_keypad_read(lv_indev_drv_t * drv, lv_indev_data_t * data)
{int button_state = digitalRead(24);  // 读取按键的状态,假设按键接地为 LOWif (button_state == LOW) {// 如果按键按下,记录开始按下的时间if (btn2_pushed_start_time == 0) {btn2_pushed_start_time = millis();}// 检测是否为长按if (millis() - btn2_pushed_start_time >= BTN_LONG_PUSH_T) {if (!btn2_long_pushed) {btn2_long_pushed = true;  // 标记为长按// 长按的处理,例如切换到不同屏幕}}data->state = LV_INDEV_STATE_PRESSED;  // 按键按下} else {// 按键松开,判断是否为短按if (btn2_pushed_start_time != 0) {if (!btn2_long_pushed) {btn2_pushed = true;  // 短按标记// 短按的处理,例如切换到不同屏幕if (!btn2_long_pushed){freeze = !freeze; } //切换 freeze 状态}btn2_pushed_start_time = 0;  // 重置按下时间}// 清除长按标记btn2_long_pushed = false;data->state = LV_INDEV_STATE_RELEASED;  // 按键松开}
}void my_keypad_bootsel_read(lv_indev_drv_t * drv, lv_indev_data_t * data)
{if (BOOTSEL) {// 如果按键按下,记录开始按下的时间if (btn1_pushed_start_time == 0) {btn1_pushed_start_time = millis();}// 检测是否为长按if (millis() - btn1_pushed_start_time >= BTN_LONG_PUSH_T) {if (!btn1_long_pushed) {btn1_long_pushed = true;  // 标记为长按// 长按的处理,例如切换到不同屏幕_ui_screen_change(&ui_Screen3, LV_SCR_LOAD_ANIM_FADE_ON, 500, 0, &ui_Screen3_screen_init);}}data->state = LV_INDEV_STATE_PRESSED;  // 按键按下} else {// 按键松开,判断是否为短按if (btn1_pushed_start_time != 0) {if (!btn1_long_pushed) {btn1_pushed = true;  // 短按标记// 短按的处理,例如切换到不同屏幕user_ui_flag = !user_ui_flag;if(user_ui_flag){test_points[0][0] = 0; // 重置测试点数据test_points[0][1] = 0;_ui_screen_change(&ui_Screen2, LV_SCR_LOAD_ANIM_FADE_ON, 500, 0, &ui_Screen2_screen_init);} else {_ui_screen_change(&ui_Screen1, LV_SCR_LOAD_ANIM_FADE_ON, 0, 0, &ui_Screen1_screen_init);}}btn1_pushed_start_time = 0;  // 重置按下时间}// 清除长按标记btn1_long_pushed = false;data->state = LV_INDEV_STATE_RELEASED;  // 按键松开}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/68733.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI守护煤矿安全生产:基于视频智能的煤矿管理系统架构解析

前言 本文我将介绍我和我的团队自主研发设计的一款AI产品的成果展示——“基于视频AI识别技术的煤矿安全生产管理系统”。 这款产品是目前我在创业阶段和几位矿业大学的博士共同从架构设计、开发到交付的全过程中首次在博客频道发布, 我之前一直想写但没有机会来整理这套系统的…

OCCT 之 TDF_Attribute 以及子类

一.概述 TDF_Label是OCAF中核心数据结构,与TDF_Attribute结合使用,实现对模型的各种操作。 以下摘自OCCT7.7.0官方文档 A class each application has to implement. It is used to contain the application data. This abstract class, alongwith La…

数字化时代,传统代理模式的变革之路

在数字化飞速发展的今天,线上线下融合(O2O)成了商业领域的大趋势。这股潮流,正猛烈冲击着传统代理模式,给它带来了新的改变。 咱们先看看线上线下融合现在啥情况。线上渠道那是越来越多,企业纷纷在电商平台…

Vue2+OpenLayers添加缩放、滑块缩放、拾取坐标、鹰眼、全屏控件(提供Gitee源码)

目录 一、案例截图 二、安装OpenLayers库 三、代码实现 四、Gitee源码 一、案例截图 二、安装OpenLayers库 npm install ol 三、代码实现 废话不多说&#xff0c;直接给完整代码&#xff0c;替换成自己的KEY即可运行&#xff1a; <template><div><div i…

Vulnhub-Tr0ll靶机笔记

Tr0ll靶机笔记 概述 靶机地址&#xff1a;https://www.vulnhub.com/entry/tr0ll-1,100/ 这台靶机比较简单&#xff0c;包含ftp的渗透&#xff0c;pcap流量包的分析&#xff0c;常规的web渗透和系统内核提权。让我们开始吧 Hack it&#xff01; 一、nmap扫描 1、端口扫描 …

高效建站指南:通过Portainer快速搭建自己的在线网站

文章目录 前言1. 安装Portainer1.1 访问Portainer Web界面 2. 使用Portainer创建Nginx容器3. 将Web静态站点实现公网访问4. 配置Web站点公网访问地址4.1公网访问Web站点 5. 固定Web静态站点公网地址6. 固定公网地址访问Web静态站点 前言 Portainer是一个开源的Docker轻量级可视…

Docker Compose的使用

文章首发于我的博客&#xff1a;https://blog.liuzijian.com/post/docker-compose.html 目录 Docker Compose是什么Docker Compose安装Docker Compose文件Docker Compose常用命令案例&#xff1a;部署WordPress博客系统 Docker Compose是什么 Docker Compose是Docker官方的开源…

JDK长期支持版本(LTS)

https://blogs.oracle.com/java/post/the-arrival-of-java-23 jdk长期支持版本&#xff08;LTS&#xff09;&#xff1a;JDK 8、11、17、21&#xff1a;

python(25) : 含有大模型生成的公式的文本渲染成图片并生成word文档(支持flask接口调用)

公式样例 渲染前 \[\sqrt{1904.615384} \approx 43.64\] 渲染后 安装依赖 pip install matplotlib -i https://mirrors.aliyun.com/pypi/simple/ requestspip install sympy -i https://mirrors.aliyun.com/pypi/simple/ requestspip install python-docx -i https://mirro…

SSM宠物医院信息管理系统

&#x1f345;点赞收藏关注 → 添加文档最下方联系方式咨询本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345; 项目视频 宠…

mysql查看binlog日志

mysql 配置、查看binlog日志&#xff1a; 示例为MySQL8.0 1、 检查binlog开启状态 SHOW VARIABLES LIKE ‘log_bin’; 如果未开启&#xff0c;修改配置my.ini 开启日志 安装目录配置my.ini(mysql8在data目录) log-binmysql-bin&#xff08;开启日志并指定日志前缀&#xff…

某国际大型超市电商销售数据分析和可视化

完整源码项目包获取→点击文章末尾名片&#xff01; 本作品将从人、货、场三个维度&#xff0c;即客户维度、产品维度、区域维度&#xff08;补充时间维度与其他维度&#xff09;对某国际大型超市的销售情况进行数据分析和可视化报告展示&#xff0c;从而为该超市在弄清用户消费…

PostgreSQL-01-入门篇-简介

文章目录 1. PostgreSQL是什么?2. PostgreSQL 历史 2.1. 伯克利 POSTGRES 项目2.2. Postgres952.3. PostgreSQL来了 3. PostgreSQL vs MySQL4. 安装 4.1 Windows 安装4.2 linux 安装4.3 docker安装 1. PostgreSQL是什么 PostgreSQL 是一个基于加州大学伯克利分校计算机系开…

Git原理与应用(三)【远程操作 | 理解分布式 | 推送拉取远程仓库 | 标签管理】

Git 理解分布式版本控制系统远程仓库新建远程仓库克隆远程仓库向远程仓库推送配置Git忽略特殊文件 标签管理理解标签创建标签操作标签删除标签 理解分布式版本控制系统 我们⽬前所说的所有内容&#xff08;工作区&#xff0c;暂存区&#xff0c;版本库等等&#xff09;&#x…

一文夯实垃圾收集的理论基础

如何判断一个引用是否存活 引用计数法 给对象中添加一个引用计数器&#xff0c;每当有一个地方引用它&#xff0c;计数器就加 1&#xff1b;当引用失效&#xff0c;计数器就减 1&#xff1b;任何时候计数器为 0 的对象就是不可能再被使用的。 优点&#xff1a;可即刻回收垃圾&a…

Spring Boot 配置(官网文档解读)

目录 摘要 Spring Boot 配置加载顺序 配置文件加载顺序 Spring Boot 配置加载方式 Value Value 注解简单示例 ConfigurationProperties 启动 ConfigurationProperties ConfigurationProperties 验证 ConfigurationProperties 与 Value 对比 Autowired Autowired 自…

一款功能强大的互联网资产测绘引擎-CyberEdge

声明&#xff01;本文章所有的工具分享仅仅只是供大家学习交流为主&#xff0c;切勿用于非法用途&#xff0c;如有任何触犯法律的行为&#xff0c;均与本人及团队无关&#xff01;&#xff01;&#xff01; 目录标题 CyberEdge简洁而强大的互联网资产测绘工具核心特性搭建指南快…

细说STM32F407单片机电源低功耗StopMode模式及应用示例

目录 一、停止模式基础知识 1、进入停止模式 2、停止模式的状态 3、退出停止模式 4、SysTick定时器的影响 二、停止模式应用示例 1、示例功能和CubeMX项目配置 &#xff08;1&#xff09;时钟 &#xff08;2&#xff09;RTC &#xff08;3&#xff09;ADC1 &#xf…

【三国游戏——贪心、排序】

题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; const int N 1e510; int a[N], b[N], c[N]; int w[4][N]; int main() {int n;cin >> n;for(int i 1; i < n; i)cin >> a[i];for(int i 1; i < n; i)cin >> b[i…

[Qt]事件-鼠标事件、键盘事件、定时器事件、窗口改变事件、事件分发器与事件过滤器

目录 前言&#xff1a;Qt与操作系统的关系 一、Qt事件 1.事件介绍 2.事件的表现形式 常见的Qt事件&#xff1a; 常见的事件描述: 3.事件的处理方式 处理鼠标进入和离开事件案例 控件添加到对象树底层原理 二、鼠标事件 1.鼠标按下和释放事件&#xff08;单击&#x…