智能仓储物料管理系统
针对传统仓储物料人工盘点效率低、多终端并发操作易引发库存数据异常、仓储环境管控难等痛点基于i.MX6ULL嵌入式Linux平台独立开发分布式智能物料管理系统。构建“终端采集-边缘网关-后台管理平台”三层架构实现温湿度/光照采集、人员入侵检测、外设远程控制、历史数据查询与异常报警等核心功能。终端采集代码#include mainwindow.h#include ui_mainwindow.h#include fcntl.h#include unistd.hint Temp_data[51] {0}; // 温度数组int Humi_data[51] {0}; // 湿度数组bool curtain_autoCtl false; //窗帘自动控制标志位void init_all(void){led_init();dht11_init();sr04_init();sg90_init();}// DHT11Thread实现DHT11Thread::DHT11Thread(QObject *parent) : QThread(parent) {}void DHT11Thread::run() {while (!isInterruptionRequested()) {THData data;// DHT11数据读取dht11_read(data);// 发送数据更新信号emit DHT11_dataUpdated(data);msleep(1000); // 1秒采样一次}}DHT11Thread::~DHT11Thread() {requestInterruption(); // 请求中断线程wait(); // 等待线程退出}// SR04Thread实现SR04Thread::SR04Thread(QObject *parent) : QThread(parent) {}void SR04Thread::run() {while (!isInterruptionRequested()) {int distance -1;if (sr04_read(distance) 0) {emit distanceUpdated(distance);// 发送数据到服务端emit sendDistanceData(distance); // 发送信号到主线程} else {qDebug() Failed to read distance from SR04 sensor;}msleep(1000);}}// 析构函数无需手动管理标志位SR04Thread::~SR04Thread() {requestInterruption(); // 请求中断线程wait(); // 等待线程退出}// LightCurtainThread实现LightCurtainThread::LightCurtainThread(QObject *parent) : QThread(parent) {}void LightCurtainThread::run() {while (!isInterruptionRequested()) {// 读取光敏电阻值ADC范围0-4095int lightValue readLightSensor();emit lightValueUpdated(lightValue);// 发送光线值更新信号emit sendLightValue(lightValue); // 发送光线强度到服务端if(curtain_autoCtl true) //只有开启窗帘自动控制才会根据光线强度计算窗帘角度和控制舵机{// 根据光线强度计算窗帘角度int angle calculateCurtainAngle(lightValue);// 控制舵机转动sg90_control(angle);emit curtainAngleChanged(angle);// 发送窗帘角度更新信号emit sendCurtainAngle(angle); // 发送舵机角度到服务端}msleep(1000); // 采样周期1000ms}}LightCurtainThread::~LightCurtainThread() {requestInterruption();wait();}int LightCurtainThread::readLightSensor() {// 通过/sys文件系统读取ADC值int fd open(/sys/bus/iio/devices/iio:device0/in_voltage3_raw, O_RDONLY);if (fd 0) {qDebug() Failed to open ADC device!;return -1;}char buf[20] {0};int bytes read(fd, buf, sizeof(buf));close(fd);if (bytes 0) {bool ok;int rawValue QString(buf).trimmed().toInt(ok);if (ok) {// 假设ADC满量程为409512位ADC进行反向计算// 光线越亮返回值越大int brightness 4095 - rawValue;return brightness;}}return -1;}int LightCurtainThread::calculateCurtainAngle(int light) {// 光线越强窗帘关闭越多角度越小const int minAngle 0; // 窗帘完全打开0度const int maxAngle 180; // 窗帘完全关闭180度// 线性映射ADC值(0-4095) → 角度(0-180)int angle maxAngle - qBound(minAngle, (light * maxAngle) / 4095, maxAngle);// 添加防抖逻辑避免微小波动导致频繁动作static int lastAngle angle;if (qAbs(angle - lastAngle) 5) {return lastAngle;}lastAngle angle;return angle;}void MainWindow::updateChart(const THData data) {static int timeCounter 0;// 更新温度数据tempSeries-append(timeCounter, data.temperature);// 更新湿度数据humiSeries-append(timeCounter, data.humidity);// 更新数值显示ui-lb_Temp-setText(QString(%1°C).arg(data.temperature, 0, f, 1));ui-lb_Humi-setText(QString(%1%).arg(data.humidity, 0, f, 1));// 更新时间轴范围if (timeCounter 30) {axisX-setRange(timeCounter - 30, timeCounter);}// 更新时间戳QString timeStr QDateTime::currentDateTime().toString(yyyy-MM-dd HH:mm:ss);ui-lb_time-setText(QString(最后更新: %1).arg(timeStr));timeCounter;chart-update();}void MainWindow::updateDistance(int distance) {if (distance 0) {ui-lb_dis-setText(QString(距离 %1 cm).arg(distance));ui-lb_status-setText(传感器状态: 正常);if(distance 10)ui-lb_humandetect-setText(有人);elseui-lb_humandetect-setText(没人);} else {ui-lb_dis-setText(距离读取失败);ui-lb_status-setText(传感器状态: 错误);}}void MainWindow::updateLightValue(int value) {ui-lb_lightValue-setText(QString(光线强度: %1/4095).arg(value));}void MainWindow::updateCurtainAngle(int angle) {ui-lb_curtainAngle-setText(QString(窗帘角度: %1°).arg(angle));// 线性映射将0~180°映射到0~100int progress static_castint((angle * 100.0) / 180.0);// 确保进度值在0~100范围内避免计算误差导致超界progress qBound(0, progress, 100);// 更新进度条ui-curtainProgressBar-setValue(progress);// 发送新的窗帘角度数据给服务端sendCurtainAngleToServer(angle);}void MainWindow::sendCurtainAngleToServer(int angle) {if (socket socket-state() QAbstractSocket::ConnectedState) {socket-write(QString(CURTAIN_ANGLE:%1\n).arg(angle).toUtf8());}}MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow){ui-setupUi(this);/* 初始化所有外设 */init_all();// 创建图表chart new QChart();chart-setTitle(DHT11温湿度实时监控);// 创建温度曲线tempSeries new QLineSeries();tempSeries-setName(温度 (°C));tempSeries-setColor(QColor(255, 107, 107)); // 红色// 创建湿度曲线humiSeries new QLineSeries();humiSeries-setName(湿度 (%));humiSeries-setColor(QColor(78, 205, 196)); // 蓝色// 添加曲线到图表chart-addSeries(tempSeries);chart-addSeries(humiSeries);// 创建坐标轴axisX new QValueAxis();axisX-setLabelFormat(%d);axisX-setTitleText(时间 (秒));axisX-setRange(0, 30); // 显示最近30秒的数据axisYTemp new QValueAxis();axisYTemp-setTitleText(温度 (°C));axisYTemp-setRange(10, 40);axisYTemp-setLinePenColor(tempSeries-color());axisYHumi new QValueAxis();axisYHumi-setTitleText(湿度 (%));axisYHumi-setRange(20, 100);axisYHumi-setLinePenColor(humiSeries-color());// 设置坐标轴chart-addAxis(axisX, Qt::AlignBottom);chart-addAxis(axisYTemp, Qt::AlignLeft);chart-addAxis(axisYHumi, Qt::AlignRight);tempSeries-attachAxis(axisX);tempSeries-attachAxis(axisYTemp);humiSeries-attachAxis(axisX);humiSeries-attachAxis(axisYHumi);// 设置图表样式chart-legend()-setVisible(true);chart-legend()-setAlignment(Qt::AlignTop);// 将图表设置到UI中已存在的QChartViewui-chartView-setChart(chart);ui-chartView-setRenderHint(QPainter::Antialiasing);// 创建并启动DHT11线程dht11Thread new DHT11Thread(this);connect(dht11Thread, DHT11Thread::DHT11_dataUpdated,this, MainWindow::updateChart);dht11Thread-start();// 创建并启动SR04线程sr04Thread new SR04Thread(this);connect(sr04Thread, SR04Thread::distanceUpdated,this, MainWindow::updateDistance);sr04Thread-start();// 创建并启动窗帘控制线程curtainThread new LightCurtainThread(this);connect(curtainThread, LightCurtainThread::lightValueUpdated,this, MainWindow::updateLightValue);connect(curtainThread, LightCurtainThread::curtainAngleChanged,this, MainWindow::updateCurtainAngle);curtainThread-start();connectToServer();}MainWindow::~MainWindow(){if (socket) {socket-close();socket-deleteLater();}delete dht11Thread;delete sr04Thread;delete curtainThread;delete ui;// led_close();sr04_close();dht11_close();sg90_close();}void MainWindow::connectToServer() {socket new QTcpSocket(this);socket-connectToHost(192.168.5.10, 8888);if (socket-waitForConnected(3000)) {qDebug() Connected to server!;// //led数据处理// connect(socket, SIGNAL(readyRead()), this, SLOT(readyRead()));// sendLedStatus();//超声波数据处理connect(sr04Thread, SR04Thread::sendDistanceData, this, [this](int distance) {if (socket socket-state() QAbstractSocket::ConnectedState) {socket-write(QString(DISTANCE:%1\n).arg(distance).toUtf8());}});// 光线强度数据处理connect(curtainThread, LightCurtainThread::sendLightValue, this, [this](int value) {if (socket socket-state() QAbstractSocket::ConnectedState) {socket-write(QString(LIGHT:%1\n).arg(value).toUtf8());}});// 舵机角度数据处理connect(curtainThread, LightCurtainThread::sendCurtainAngle, this, [this](int angle) {if (socket socket-state() QAbstractSocket::ConnectedState) {socket-write(QString(CURTAIN_ANGLE:%1\n).arg(angle).toUtf8());}});// 发送窗帘当前自动控制状态给服务端sendCurtainAutoCtlStatus();//发送温湿度数据给服务端connect(dht11Thread, DHT11Thread::DHT11_dataUpdated, this, [this](const THData data) {if (socket socket-state() QAbstractSocket::ConnectedState) {socket-write(QString(TEMPERATURE:%1;HUMIDITY:%2;TIME:%3\n).arg(data.temperature).arg(data.humidity).arg(QDateTime::currentDateTime().toString(yyyy-MM-dd HH:mm:ss)).toUtf8());}});} else {qDebug() Connection failed!;}}// 发送窗帘自动控制状态给服务端void MainWindow::sendCurtainAutoCtlStatus() {if (socket socket-state() QAbstractSocket::ConnectedState) {if (curtain_autoCtl) {socket-write(AUTO_CURTAIN_ON\n);} else {socket-write(AUTO_CURTAIN_OFF\n);}socket-flush();}}//处理服务端传回的void MainWindow::handleServerControl(const QByteArray data) {QString strData QString::fromUtf8(data);if (strData.startsWith(SET_CURTAIN_ANGLE:)) {bool ok;int angle strData.mid(18).toInt(ok);if (ok) {sg90_control(angle);updateCurtainAngle(angle);} else {qDebug() Invalid curtain angle format: strData;}} else if (strData AUTO_CURTAIN_ON) {curtain_autoCtl true;ui-cb_curAutoCtl-setChecked(true);ui-btn_cur_add-setEnabled(false);ui-btn_cur_sub-setEnabled(false);qDebug() 开启窗帘自动控制;} else if (strData AUTO_CURTAIN_OFF) {curtain_autoCtl false;ui-cb_curAutoCtl-setChecked(false);ui-btn_cur_add-setEnabled(true);ui-btn_cur_sub-setEnabled(true);qDebug() 关闭窗帘自动控制;} else {qDebug() Unknown control message: strData;}}void MainWindow::sendLedStatus() {if (socket) {if (LEDSwitch) {socket-write(LED_ON\n);} else {socket-write(LED_OFF\n);}socket-flush();}}void MainWindow::on_btn_led_clicked(){LEDSwitch !LEDSwitch;led_control(LEDSwitch);if(LEDSwitch)ui-btn_led-setIcon(QIcon(:/png/light_on.png));elseui-btn_led-setIcon(QIcon(:/png/light_off.png));sendLedStatus();}void MainWindow::readyRead() {QByteArray data socket-readAll();if (data TOGGLE_LED) {on_btn_led_clicked();}else {handleServerControl(data); // 处理服务端控制指令}}void MainWindow::on_btn_cur_sub_clicked(){QString text ui-lb_curtainAngle-text();// QString cleanText text.remove(QRegExp([^0-9]));QString cleanText;for (QChar ch : text) {if (ch.isDigit()) {cleanText.append(ch);}}int cur_angle cleanText.toInt();int ctl_angle cur_angle - 20;if(ctl_angle 0)ctl_angle 0;sg90_control(ctl_angle);updateCurtainAngle(ctl_angle);}void MainWindow::on_btn_cur_add_clicked(){QString text ui-lb_curtainAngle-text();// QString cleanText text.remove(QRegExp([^0-9]));QString cleanText;for (QChar ch : text) {if (ch.isDigit()) {cleanText.append(ch);}}int cur_angle cleanText.toInt();int ctl_angle cur_angle 20;if(ctl_angle 180)ctl_angle 180;sg90_control(ctl_angle);updateCurtainAngle(ctl_angle);}void MainWindow::on_cb_curAutoCtl_stateChanged(int state){if(state Qt::Checked){curtain_autoCtl true;ui-btn_cur_add-setEnabled(false);ui-btn_cur_sub-setEnabled(false);qDebug()开启窗帘自动控制;}else{curtain_autoCtl false;ui-btn_cur_add-setEnabled(true);ui-btn_cur_sub-setEnabled(true);qDebug()关闭窗帘自动控制;}sendCurtainAutoCtlStatus();}dht11.cpp#include sys/types.h#include sys/stat.h#include fcntl.h#include stdio.h#include errno.h#include string.h#include unistd.h#include QDebug#include dht11.hstatic int fd1;/* dht11初始化函数 */void dht11_init(void){fd1 open(/dev/querydht11, O_RDWR);if (fd1 0){qDebug()open /dev/querydht11 ;}qDebug()open /dev/querydht11 successfully ;}/* dht11读函数 */int dht11_read(THData *data){unsigned char buf[5] {0};int ret ;ret read(fd1, buf, sizeof(buf));if (ret ! sizeof(buf)){qDebug() read failed, got ret bytes, expected 5;return -1;}// 校验和验证// unsigned char checksum buf[0] buf[1] buf[2] buf[3];// if (checksum ! buf[4]) {// qDebug() DHT11 checksum error!;// return -1;// }/>

相关新闻

HALCON图像预处理全解析:灰度变换、滤波与背景校正实战指南

HALCON图像预处理全解析:灰度变换、滤波与背景校正实战指南

最近在啃《HALCON机器视觉与算法原理编程实践》这本书,第5章图像预处理让我有点上头。之前做视觉项目,我习惯拿到图就开阈值,结果检测率忽高忽低,后来花了很长时间才发现问题不在分割算法,而在预处理阶段——噪声、光照…

2026/10/15 12:09:25 阅读更多 →
深入解析依赖注入与控制反转原理及实践

深入解析依赖注入与控制反转原理及实践

1. 依赖注入与控制反转的本质解析在软件开发领域,依赖注入(DI)和控制反转(IoC)这两个概念经常被同时提及,但很多开发者对它们的理解仍停留在表面。我第一次接触这两个概念是在重构一个遗留系统时&#xff0…

2026/10/15 12:09:25 阅读更多 →
教育场景下AI辅助工具选择与优化实践

教育场景下AI辅助工具选择与优化实践

1. 项目概述:教育场景下的AI辅助工具选择困境去年我在指导一个继续教育项目时,发现超过60%的学员提交的作业存在明显的AI生成痕迹。这促使我开始系统性地测试各类号称能"降低AI率"的工具,并在三个学期内持续追踪了200多名学员的使用…

2026/10/15 12:09:25 阅读更多 →

最新新闻

人脸特征提取三路线:HoG、Dlib与CNN原理及选型指南

人脸特征提取三路线:HoG、Dlib与CNN原理及选型指南

人脸识别这几年从实验室走向了门禁、考勤、相册聚类、甚至手机解锁,几乎成了计算机视觉里最"接地气"的方向之一。但真到动手做项目的时候,很多人会卡在同一个地方:特征到底怎么提?我见过不少朋友一上来就堆深度学习模型…

2026/10/15 13:00:25 阅读更多 →
校园失物招领系统

校园失物招领系统

文章目录前言项目简介项目背景技术栈系统架构核心功能截图后台管理公告管理认证授权认领管理评论收藏失物招领信息消息用户管理首页失物列表发布信息我的发布个人中心核心技术实现项目亮点项目总结项目下载:前言 项目简介 面向高校校园场景的前后端分离 Web 应用&a…

2026/10/15 13:00:25 阅读更多 →
基于4D关联图的多相机实时多人动作捕捉技术解析

基于4D关联图的多相机实时多人动作捕捉技术解析

1. 从"多相机多人动捕"这个硬骨头说起第一次看到"4D Association Graph"这个名词的时候,我正蹲在一个临时搭建的动作捕捉棚里,面对八台同步相机拍出来的画面发愁。画面里三个人在互相传球,手臂交叠、身体遮挡、快速移动&…

2026/10/15 13:00:25 阅读更多 →
SSM在线作业管理系统:从选题到答辩的全链路解析

SSM在线作业管理系统:从选题到答辩的全链路解析

又到了一年毕业设计选题季,后台私信里反复被同一个关键词轰炸:SSM在线作业管理系统。实话说,这个题在计算机毕业设计里属于"经典中的经典",每年都有大量学生选它,但真正能讲清楚"为什么这么设计、每一步…

2026/10/15 13:00:25 阅读更多 →
Network Kit HTTP:三方库版本清单ETag重验证与离线快照保底【鸿蒙心迹】

Network Kit HTTP:三方库版本清单ETag重验证与离线快照保底【鸿蒙心迹】

场景说明: 本文 ManifestHarbor 的 MH-1421、v17、8 个依赖项、ETag "ohpm-v17"、304 响应与 HiLog 均为受控演示数据。示意图不是 DevEco Studio、真机或真实服务器的测试结果;代码依据公开 Network Kit API 设计,尚未在实际 Harm…

2026/10/15 13:00:25 阅读更多 →
Hyper-Frames:无标签视频+里程计自监督预训练,实现低成本运动预测

Hyper-Frames:无标签视频+里程计自监督预训练,实现低成本运动预测

做自动驾驶、移动机器人、无人机导航的同行,应该都有一段被数据集标注反复折磨的经历。最近 Waymo Research 放出的 Hyper-Frames 框架,让我终于看到一条不太一样的路:不用一开始就堆人天去标框、标轨迹、标地图,用无标签视频加里…

2026/10/15 12:59:25 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →