• [基础介绍] 两万字解析AIoT智能物联网工程师学习路线,最全路线谁赞成谁反对?【转载】
    大家好,我是老白。今天给大家带来AIoT智能物联网工程师学习路线规划以及详细解析。AIoT介绍广泛的定义来看,AIoT 就是人工智能技术与物联网在实际应用中的落地融合。它并不是新技术,而是一种新的 IoT 应用形态,从而与传统 IoT 应用区分开来。如果物联网是将所有可以行使独立功能的普通物体实现互联互通,用网络连接万物,那 AIoT则是在此基础上赋予其更智能化的特性,做到真正意义上的万物互联。既掌握 AI 开发技术,又掌握物联网技术,两者完美结合,大放异彩培养目标学习路线培养目标熟练掌握 C/C++编程语言,掌握面向对象程序设计方法。熟练掌握常用数据结构和算法。熟练掌握 MySQL、sqlite3 基础语法及 C/C++编程接口。熟练掌握 Linux 应用软件编程方法,熟练使用多线程、多进程编程、socket 编程等进行应用软件开发。熟练掌握嵌入式 Linux 高级编程技术,如传感器编程、串口编程、V4L2 编程、音视频处理、opencv、科大讯飞语音识别等。熟练掌握 QT 编程方法。熟练掌握 ARM 体系结构。掌握 STM32 开发工具及设计流程。掌握 STM32 的外围接口使用,如:GPIO、中断、定时器、ADC、UART、看门狗等。掌握现场总线设计与应用,如:I2C 总线、SPI 总线、CAN 总线、RS485 总线等。掌握 ZigBee 应用软件开发。掌握蓝牙 Mesh 组网及应用软件开发。掌握 NB-IoT 应用软件开发方法,掌握 CoAP、MQTT 协议。熟悉嵌入式 Linux 内核移植、uboot 移植及 rootfs 制作。深刻理解嵌入式 Linux 设备驱动开发。对嵌入式 Linux 系统在视频监控、网络通信、多媒体处理及智能控制领域有深入理解。熟悉嵌入式人工智能项目的部署与移植开发应用职业规划目标C/C++软件开发工程师Qt 开发工程师桌面应用软件开发工程师Linux 后台开发工程师网游后端开发工程师嵌入式 Linux 应用开发工程师音视频开发工程师物联网应用开发工程师嵌入式 Linux 驱动开发工程师嵌入式 Linux 系统移植与裁剪工程师嵌入式 Linux 多媒体研发工程师ARM 开发工程师STM32 应用软件开发工程师嵌入式 FreeRTOS 开发工程师嵌入式 ucOS 开发工程师现场总线控制、现场总线通信应用开发工程师Python 开发工程师人工智能开发工程师一、Python 基础与科学计算阶段概述:本阶段讲解,Python 基础语法,NumPy 科学计算模块,Pandas 数据分析模块,Matplotlib 和 Seaborn 数据可视化模块达成目标:通过本阶段学习,让学生快速掌握 Python 语言的特性和语法,并着重对算法这块所涉及的NumPy 科学计算模块和 Pandas 数据分析模块进行讲解。实战教学项目:泰坦尼克号数据分析案例可视化剖析逻辑回归损失函数案例Python 基础语法Python 基础语法循环控制生成器装饰器继承类与对象函数式编程常用内建函数集合操作数据类型切片操作科学计算模块 NumpyNumpy ndarray 对象Numpy 数据类型Numpy 数组属性Numpy 创建数组Numpy 切片和索引Numpy 高级索引Numpy 广 播Numpy 数组操作Numpy 数学和统计函数Numpy 排序、条件过滤函数Numpy 线性代数数据处理分析模块 PandasPandas IO 文件操作Pandas 索引和数据选择器Pandas 合并、连接Pandas 缺失值数据处理Pandas 数据离散Pandas 统计计算数据可视化模块二、 算法数学基础阶段概述:本阶段讲解,微积分基础,线性代数基础,多元函数微分学,线性代数高级,概率论,最优化。达成目标:通过本阶段学习,掌握后面机器学习算法、深度学习算法涉及的数学知识,使得后面在理解算法推导的过程中游刃有余。如果学员大学数学知识还未忘记或者研究生毕业,这一部分可以先跳过学习后面的知识。微积分基础导数的定义一元函数泰勒展开导数与函数凹凸性极值定理导数与函数单调性高阶导数神经网络激活函数的导函数求解复合函数求导法则四则运算法则基本函数求导公式导数几何意义、物理意义左导数、右导数、可导函数线性代数基础向量与其运算特殊向量向量范数向量加减、数乘、内积、转置行向量和列向量矩阵与其运算行列式逆矩阵矩阵加减、数乘、矩阵乘法、转置方阵、对称阵、单位阵、对角阵多元函数微分学1) 偏导数2) 高阶偏导数3) 梯度4) 雅可比矩阵5) Hessian 矩阵6) 极值判别法则线性代数高级1) 二次型2) 特征值和特征向量3) 特征值分解4) 多元函数的泰勒展开5) 矩阵和向量的求导公式6) 奇异值分解7) 奇异值分解计算方式8) 奇异值分解性质9) SVD 用于数据压缩10) SVD 用于 PCA 降维11) SVD 用于协同过滤12) SVD 用于矩阵求逆概率论1) 随机事件和随机事件概率2) 条件概率和贝叶斯公式3) 随机事件的独立性4) 随机变量5) 数学期望和方差6) 常用随机变量服从的分布7) 随机向量8) 随机变量独立性9) 协方差与协方差矩阵10) 随机向量的常见分布11) 最大似然估计最优化1) 局部最小和全局最小2) 迭代法求解3) 梯度下降法推导4) 牛顿法推导5) 坐标下降法6) 数值优化算法的问题7) 凸集8) 凸函数9) 凸优化问题10) 拉格朗日乘数法11) 拉格朗日对偶12) KKT 条件三、线性回归算法阶段概述 :本阶段讲解,多元线性回归,梯度下降法,归一化,正则化,Lasso 回归,Ridge 回归,多项式回归。达成目标 :通过本阶段学习,从推导出多元线性回归算法的损失函数,到实现开发和应用算法,再到对算法从数据预处理上,以及损失函数上的优化都将整体彻底掌握。对后面学习更多算法,甚至深度学习都将起到举一反三的效果。多元线性回归1) 简单线性回归2) 最优解与最小二乘法3) 多元线性回归判别式4) 多元线性回归的数学假设5) 利用 MLE 推导出目标函数6) 对数似然推导出 MSE 损失函数7) MSE 求偏导得到参数解析解8) 多元线性回归的 python 代码实现9) 多元线性回归的 sklearn 代码实战梯度下降法1) 梯度下降法原理与公式2) 学习率设置的学问3) GD 应用于多元线性回归的流程4) 全量梯度下降的原理与代码实现5) 随机梯度下降的原理与代码实现6) Mini-Batch 梯度下降的原理与代码实现7) 代码实现增加 MBGD 数据的随机性8) 代码实现动态调整学习率归一化1) 归一化目的与量纲2) 归一化提高模型精度3) 最大值最小值归一化与缺点4) 方差归一化与好处5) 均值归一化与好处6) 标准归一化的代码实战与技巧正则化1) 提高泛化能力与防止过拟合2) 正则化用于损失函数3) L1 与L2 正则项与范数的关系4) 结合 GD 讲解 L1L2 的几何意义5) 透过导函数讲解 L1 的稀疏性6) 透过导函数讲解 L2 的平滑性Lasso 回归、Ridge 回归、多项式回归1) Lasso 回归原理与代码实战2) Ridge 回归原理与代码实战3) ElasticNet 回归原理与代码实战4) 升维的意义5) 多项式回归进行升维原理6) 多项式升维代码实战四、 线性回归分类算法阶段概述 :本阶段讲解,逻辑回归算法,Softmax 回归算法,SVM 支持向量机算法,SMO 优化算法。达成目标 :通过本阶段学习,推导逻辑回归算法、SVM 算法的判别式和损失函数,算法的优化、实现算法和应用开发实战。将会对分类算法有深入认知,对于理解后续神经网络算法和深度学习至关重要。逻辑回归1) Sigmoid 函数特点2) 广义线性回归与逻辑回归的数学假设3) 证明伯努利二项分布属于指数族分布4) 推导出逻辑回归判别式5) 推导出逻辑回归损失函数 log loss6) 推导出损失函数导函数用于最优化7) 逻辑回归解决多分类问题 OVR8) 逻辑回归代码实战--鸢尾花数据集分类Softmax 回归1) Softmax 函数特点2) 广义线性回归与 Softmax 回归的数学假设3) 证明多项式分布属于指数族分布4) 推导出 Softmax 回归判别式5) 推导出 Softmax 回归损失函数 cross-entropy6) 证明逻辑回归是 Softmax 的特例7) 剖析逻辑回归多分类和 Softmax 多分类的本质区别8) Softmax 回归代码实战--音乐曲风分类SVM 支持向量机1) SVM 与感知机关系2) 几何距离和函数距离3) SVM 支持向量机算法原理4) SVM 的损失函数5) 硬间隔 SVM 的优化步骤6) 软间隔 SVM7) 非线性 SVM 与核函数8) SVM 在 sklearn 模块中参数详解9) SVM 人脸识别案例10) SVM 的概率化输出11) SVM 的OVO 多分类12) SVM 的 hinge lossSMO 优化算法1) SMO 优化算法的子二次规划问题思路2) SMO 把目标函数从二元函数变一元函数3) SMO 推导出新的α和旧的α关系4) SMO 对α进行剪裁5) SMO 优化 SVM 算法代码实现决策树算法1) 决策树的算法原理与数学表达2) 分裂指标 Gini 系数、信息增益、信息增益率3) 前剪枝与后剪枝4) 决策树 ID3、C4.5 和 CART5) 决策树算法优略比较6) 决策树之鸢尾花数据集分类案例7) 通过 graphvis 绘制决策树模型随机森林算法1) 集成学习算法思想 Bagging、Boosting、Stacking2) 用户画像集成学习方法案例3) OOB 数据集验证随机森林算法4) 随机森林副产品之特征选择Adaboost 算法1) Adaboost 算法原理2) 数据的权重与权重错误率3) 权重错误率调整到 0.5 训练下一个弱分类器4) 计算每个样本的权重 Un5) 应用 Adaboost 算法做人脸识别GBDT 算法1) 函数空间的梯度下降与负梯度2) 推导 GBDT 回归是拟合残差3) Shrinkage 衰减系数的作用4) 推导 GBDT 分类亦是拟合残差5) GBDT 二分类模型训练和使用6) GBDT 多分类模型训练和使用7) GBDT 副产品之特征组合用于降维8) 实现 GBDT+LR 架构代码实战XGBoost 算法1) XGBoost 算法与决策树集成学习关系2) XGBoost 目标函数与正则项3) XGBoost 目标函数用二阶泰勒展开4) 推导简化 XGBoost 目标函数引入 g h5) XGBoost 目标函数加入树的复杂度6) 推导出 XGBoost 目标函数最终形式和叶子节点表达式7) 详解 XGBoost 算法参数与交叉验证8) XGBoost 算法调用 GPU 显卡资源加速五、无监督学习算法阶段概述 :本阶段讲解,K-means 聚类算法,K-means 聚类算法的变形,密度聚类,层次聚类、谱聚类、PCA 降维算法、EM 期望最大化、GMM 高斯混合模型。达成目标 :通过本阶段学习,掌握无监督机器学习算法的作用和原理,透彻理解聚类和降维的本质区别,今后可以正确选择无监督学习算法,并实战开发。聚类系列算法1) 相似度测量方法2) K-means 算法原理3) K-means 图像应用案例4) K-medoids 算法5) K-means++算法6) Mini-batch K-means 算法7) Canopy 聚类算法8) Agnes 层次聚类算法9) Diana 层次聚类算法10) DBSCAN 密度聚类算法11) Spectral 谱聚类12) 微博用户聚类分析案例PCA 降维算法1) 特征选择与特征映射2) 最大投影方差原理与推导3) 最小投影距离原理与推导4) PCA 过程的中心化5) Kernelized PCA6) SVD 奇异值分解用于 PCAEM 算法1) Jensen 不等式2) EM 算法的 E-step3) EM 算法的M-step4) EM 在 GMM 公式推导中应用GMM 算法1) 单一高斯分布的参数估计2) 混合高斯分布的似然函数3) GMM 的计算流程4) GMM 之图片前景背景分离代码实战5) GMM 之根据声音判别性别代码实战6) GMM 之根据声音判别用户代码实战六、决策树系列算法阶段概述 :本阶段讲解,决策树算法、随机森林算法、Adaboost 算法、GBDT 算法、XGBoost 算法。达成目标 :通过本阶段学习,掌握非线性决策树系列算法,重点掌握 Kaggle 神奇 XGBoost 算法,理解 GBDT 和 XGBoost 涉及的公式推导,本阶段的掌握将大大提升学员数据挖掘的能力,对于后续理解 Kaggle 实战阶段内容会起到很大的帮助。实战教学项目: 通过 graphvis 绘制决策树模型 用户画像集成学习方法案例 Adaboost 算法做人脸识别 GBDT+LR 架构代码实现决策树算法1) 决策树的算法原理与数学表达2) 分裂指标 Gini 系数、信息增益、信息增益率3) 前剪枝与后剪枝4) 决策树 ID3、C4.5 和 CART5) 决策树算法优略比较6) 决策树之鸢尾花数据集分类案例7) 通过 graphvis 绘制决策树模型随机森林算法1) 集成学习算法思想 Bagging、Boosting、Stacking2) 用户画像集成学习方法案例3) OOB 数据集验证随机森林算法4) 随机森林副产品之特征选择Adaboost 算法1) Adaboost 算法原理2) 数据的权重与权重错误率3) 权重错误率调整到 0.5 训练下一个弱分类器4) 计算每个样本的权重 Un5) 应用 Adaboost 算法做人脸识别GBDT 算法1) 函数空间的梯度下降与负梯度2) 推导 GBDT 回归是拟合残差3) Shrinkage 衰减系数的作用4) 推导 GBDT 分类亦是拟合残差5) GBDT 二分类模型训练和使用6) GBDT 多分类模型训练和使用7) GBDT 副产品之特征组合用于降维8) 实现 GBDT+LR 架构代码实战XGBoost 算法1) XGBoost 算法与决策树集成学习关系2) XGBoost 目标函数与正则项3) XGBoost 目标函数用二阶泰勒展开4) 推导简化 XGBoost 目标函数引入 g h5) XGBoost 目标函数加入树的复杂度6) 推导出 XGBoost 目标函数最终形式和叶子节点表达式7) 详解 XGBoost 算法参数与交叉验证8) XGBoost 算法调用 GPU 显卡资源加速七、Kaggle实战阶段概述 :本阶段讲解,CTR 广告预估项目、药店销量预测案例、活动推荐预测案例、银行贷款风控案例。达成目标 :通过本阶段学习,实战代码深刻理解前面学过的算法和工具,Kaggle 竞赛数据集全部来自于公司,并且需求直接是企业里面的需求,并且此阶段讲解的代码均是大牛级开源的代码。要知道 Kaggle 上的大牛会比一般企业的算法工程师水平高,所有同学学习 Kaggle 实战将会受益匪浅。CTR 广告预估项目药店销量预测案例活动推荐预测案例银行贷款风控案例八、概率图模型算法阶段概述 :本阶段讲解,贝叶斯分类算法、隐含马尔可夫模型、最大熵模型、条件随机场达成目标 :通过本阶段学习,掌握 NLP 自然语言处理的一些基本算法,本阶段的理解对于后续完成 NLP 大项目很重要。贝叶斯分类1) 朴素贝叶斯分类器2) 拉普拉斯估计3) 代码实战垃圾邮件分类HMM 算法1) 马尔可夫过程2) 初始概率、转移概率、发射概率3) 隐含马尔可夫模型原理4) 维特比算法最大熵模型1) 熵、条件熵、相对熵、互信息2) 最大熵模型算法原理3) 有约束条件的函数最优化问题4) 最大熵和最大似然估计关系5) IIS 算法CRF 算法1) 条件随机场的性质2) 条件随机场的判别函数3) 条件随机场的学习4) 条件随机场的推断5) CRF 与HMM 关系九、Linux基础定位:Linux是一种免费使用和自由传播的类UNIX操作系统,Linux凭借其免费开源、模块化程度高、安全稳定性强及其良好的可移植性备受广大开发者和企业的青睐。目前绝大部分的嵌入式设备上都搭载了Linux操作系统,随着互联网产业的迅猛发展,促使云计算、大数据产业的形成并快速发展,云计算、大数据作为一个基于开源软件的平台,Linux 占据了核心优势;据Linux基金会的研究,90%的企业已经使用Linux操作系统进行云计算、大数据平台的构建。本阶段几乎是零门槛,只要有基本的动手能力即可掌握。学员将通过自己动手跟随老师从Linux操作系统的安装到Linux操作系统的使用、Linux操作系统的维护循序渐进的掌握本阶段的内容。通过本阶段的学习,学员将重点掌握Linux 的目录结构、启动流程、shell 命令、vim编辑器的使用、用户和组管理、权限管理、磁盘管理、系统进程管理、网络管理等知识点。内容 :2)Linux 的介绍,Linux 的安装a) VMware Workstation 虚拟软件安装过程、Ubuntu虚拟机安装过程3)Linux系统启动过程介绍a) 内核引导b) init进程c) 系统初始化d) 建立终端e) 用户登录系统4)Linux系统目录结构a) Linux文件系统的层次结构b) Linux文件系统的作用c) Linux绝对路径和相对路径d) Linux文件/目录的命名规则e) Linux命令如何识别文件类型5)Linux常用shell命令a) 文件管理命令b) 文档编辑命令c) 文件传输命令d) 磁盘管理命令e) 网络通讯命令f) 系统管理命令g) 系统设置命令h) 备份压缩命令i) 设备管理命令6)Linux系统密码管理a) Linux系统密码配置文件b) Linux系统修改密码方式7)Vim文本编辑器8)Linux远程登录a) telnet登录b) ssh登录c) xshell软件的使用9)Linux用户和组管理a) Linux系统用户账号的管理b) Linux系统用户组的管理c) 用户账号相关的配置文件10)Linux权限管理a) Linux权限管理的重要性b) Linux权限位c) Linux umask详解11)Linux文件系统管理a) 磁盘结构b) Linux常用文件系统介绍c) 硬盘设备和磁盘分区的识别d) df命令e) du命令f) mount命令g) fdisk命令h) mkfs命令i) mke2fs命令j) Linux 交换分区的作用12)Linux常用服务搭建a) ftp服务搭建b) samba服务搭建c) ssh搭建d) telnet搭建e) Nginx服务搭建13)Linux系统服务管理a) Linux系统服务及其分类b) Linux端口及查询方法详解c) Linux基于xinetd服务的管理方法详解d) 影响Linux系统性能因素分析e) 系统性能分析:sar命令f) cpu运行状态查看g) 内存使用状态查看14)Linux系统日志管理a) Linux rsyslogd服务及启动方法 (详解版)b) Linux 日志文件 (常见)及其功能c) Linux 日志文件格式分析d) rsyslogd配置文件格式及其内容详解e) Linux 日志服务器设置过程f) Linux 日志轮替 (日志转储)及logrotate配置文件分析g) Linux logrotate命令用法详解:进行日志转储 (轮替)h) Linux 日志分析工具 (logwatch)安装及使用15)Linux软件包管理16)Linux备份与恢复a) Linux备份的重要性b) Linux 中的哪些数据需要备份?c) Linux数据备份介质的选择d) Linux备份策略 (完全备份、增量备份和差异备份)详解e) Linux tar命令备份数据f) Linux dump命令用法详解:备份分区、文件或目录g) Linux restore命令:还原dump操作备份下的文件、目录或分区h) Linux dd命令详解:数据备份,并在备份过程中进行格式转换i) Linux rsync命令用法详解17)SELinux管理a) SELinux是什么b) SELinux 的主要作用c) SELinux 的工作模式 (Disabled、Permissive和Enforcing)d) SELinux配置文件 (/etc/selinux/config)e) SELinux工作模式设置 (getenforce、setenforce和sestatus命令)f) SELinux安全上下文查看方法 (超详细)g) SELinux安全上下文的修改和设置 (chcon和restorecon命令)h) SELinux默认安全上下文的查询和修改(semanage命令)i) SELinux auditd 日志系统的安装与启动j) SELinux auditd 日志使用方法详解k) SELinux Targeted、MLS和Minimum策略l) SELinux策略规则查看方法 (seinfo和sesearch)详解m) SELinux策略规则的开启和关闭 (详解版)练习:Linux系统监控实战:系统一旦上线跑起来,自然希望它一直相安无事,不要宕机,不要无响应,不要慢腾腾的,这就需要我们要监视系统的运行状况,发现问题及时处理。通过本课程可以学习有关系统监控的命令使用:如vmstat,top,iostat。以及监控脚本的编写。十、C语言高级编程定位:C语言是当今世界上最流行的计算机语言之一,C语言是所有编程语言之母。通过学习C语言,学生们不仅能够掌握一种实用的计算机编程语言,锻炼抽象思维能力,掌握编程的技巧,同时也为今后学习C++打下了良好的基础。本阶段适用于零基础的学员,在学习C语言编程时,我们将完全摆脱大学的理论课+实践课的教学方式,我们将全程跟随老师一边学习理论基础,一边敲代码,通过代码验证理论,这样不仅可以快速掌握C语言的基础语法,同时也能够快速提高编程能力。C 语言开篇1)C语言发展历史及特点2)C语言应用及就业场景3)手把手教你搭建C语言开发环境4)第一个C语言程序5)程序的编译及运行6)单行注释和多行注释7)文档注释数据类型10)标识符11)关键字12)变量的定义、声明、赋值和使用13)整型及整型数据的表示 (进制问题)14)浮点型15)字符型常量16)数据在内存中的存储17) 由printf(“%d\n”,10/3);所引发的思考18)那些年我们遇到的变态笔试题19)局部变量和全局变量20)揭开sizeof的神秘面纱21)ASCII表C 语言输入输出1)printf的高级用法2)scanf读取冲键盘输入的数据3)走进缓冲区的世界 (理解且掌握)4)输入输出疑难杂症运算符和表达式1)赋值运算符2)算术运算符3)关系运算符4)逻辑运算符5)位运算符6)你会用位运算控制灯光的开和关吗7)常见笔试题分析8)逗号运算符9)条件运算符10)其他运算符11)预算符的优先级关系流程控制1)分支结构a) if分支b) if分支的嵌套c) switch分支d) if分支和switch分支综合应用e) 作业:员工奖金计算2)循环结构a) while循环b) do~while循环c) for循环d) 练习:求1+2!+3!+4!+5!的和e) 练习:求斐波那契数列的第30项f) 练习:篮子中鸡蛋个数计算g) 经典程序讲解:求正整数的质因数h) 作业:求10000 以内的自守数i) 作业:Sn = a + aa + aaa + .... + n个a 表达式结果计算j) 作业:百元买白鸡k) 作业:求100 以内的所有质数数组1)数组的基本概念2)一维数组a) 一维数组的使用b) 一维数组的内存空间布局c) 一维数组元素的逆置d) 如何删除数组中重复的元素e) 练习:从键盘上输入年月日,计算这一天是这一年的第几天f) 经典程序讲解:奇偶数的互换g) 实际应用举例:不使用排序算法,求数组中第二大的值h) 作业:有n个人围成一圈,顺序排号,从第一个人开始报数 (从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号3)二维数组a) 二维数组的使用b) 二维数组和一维数组的关系c) 二维数组的内存空间布局d) 练习:二维数组的对角线之和e) 经典程序讲解:二维数组操作之行列互换f) 作业:假设有有序数组a和无序数组b,请编写程序将数组b合并到数组a 中,并且最后保持数组a依然是有序的4)字符串i. 字符串的概念ii.字符串和字符数组iii. 练习:将字符数组中的所有的非字母和数字的字符删除iv.实际应用举例:将字符串转换为整数v. 作业:将字符串转换为浮点数函数1)函数的基本使用a) 函数的定义b) 函数的形参和实参c) 函数的调用d) 函数的返回值e) 程序运行的秘密f) 再论全局变量和局部变量g) 函数的栈空间h) 练习:封装函数交换两个整数的值i) 练习:封装函数实现求斐波那契数列中指定项的值2)递归函数a) 递归函数的定义b) 递归函数的运行原理c) 递归求阶乘d) 中间递归函数e) 多层递归函数f) 递归时间和内存开销探索g) 递归的优化h) 练习:递归函数求n 的阶乘i) 练习:递归函数求斐波那契数列的第n项j) 经典程序讲解:汉诺塔游戏k) 作业:递归函数实现求斐波那契数列的前n项的和C 语言预处理1)什么是预处理命令2)#include 头文件的包含3)#include “” 和#include <>的区别4)头文件的搜索规则5)C语言条件编译6)C语言宏定义7)宏定义的基本使用8)带参数的宏定义9)宏定义和函数的区别10)宏参数的字符串化和宏参数的连接指针1)指针的基本使用a) 指针的概念b) 指针变量的定义和使用c) 指针变量的运算d) 指针所占用的内存空间e) 练习:通过指针交换两个整型变量的值f) 不同类型的指针之间的区别g) 空指针NULL和void指针2)指针和一维数组a) 数组指针b) 练习:通过指针删除数组中重复的元素c) 字符串指针d) 思考:为什么将一串字符串赋值给指针,却不能通过指针修改字符串的内容e) 指针变量作为函数形参f) 指针作为函数返回值g) malloc和freeh) 再论指针的本质i) 堆和栈的区别j) 指针带来的内存泄漏问题k) 野指针和悬空指针3)指针数组a) 指针数组和字符串数组b) 指针数组的灵活应用c) main函数的命令行参数4)函数指针a) 函数指针的基本使用b) 回调函数c) 练习:通过不同函数指针调用不同类型的函数d) 经典程序讲解:多个函数的随机调用5)二级指针和多级指针a) 二级指针的定义及使用b) 一级指针、二级指针和函数的恩怨情仇c) 多级指针的定义及使用6)指针和二维数组7)字符串专题a) 常用字符串处理函数的使用i. strlenii.strcpy strncpyiii. strcmp strncmpiv.strcat strncatv. strstrvi.strtok strtok_rb) 实际应用举例:统计某个班级中姓 “李”的同学的个数c) 实际应用举例:将 “流浪地球”演员表按照字母表先后顺序显示d) 实际应用举例:http协议解析e) 字符串处理函数的实现f) 常见笔试题分析结构体1)结构体定义a) typedef的使用b) 结构体的初始化c) 结构体数组d) 指针和结构体e) 练习:封装一个结构体保存学生的相关信息,并且计算多个学生中年龄最大值、最小值和平均值2)共用体/联合体a) 共用体的定义和使用b) 共用体的内存空间布局c) 共用体和结构体的区别d) 大端模式和小端模式e) 共用体的妙用:判断大小端模式f) 经典习题讲解:通过共用体分解一个int类型的数据g) 经典习题讲解:通过共用体将四个字符组合成整型数据3)枚举a) 枚举的定义和使用b) 通过枚举提升代码可读性实例代码c) 练习:通过枚举获取某天是星期几d) 实际应用举例:英雄联盟 “多杀”音效输出C 语言编程高阶1)C程序的组成a) C程序项目目录结构b) static关键字的使用c) const关键字的使用d) Makefile文件的编写e) C程序的编译步骤f) 动态库的使用g) 静态库的使用h) 练习:将实现交换两个整数的函数编译成动态库和静态库2)C语言调试方法及技巧a) GDB 的下载和安装b) gdb run(r)命令:启动程序c) GDB break (b):设置断点d) GDB watch命令:监控变量值的变化e) GDB watch命令:监控变量值的变化f) GDB catch命令:建立捕捉断点g) GDB条件断点 (condition命令)详解h) GDB单步调试程序i) 如何使用GDB进行断点调试?j) GDB print和display命令:查看变量的值k) GDB print命令更高级的用法3)走进C语言内存管理世界a) 程序在计算机中到底是如何运行的b) 我们在程序中看到的地址为什么是假的?c) 虚拟地址和物理地址d) 虚拟地址空间及编译模式e) 结构体的字节对齐f) 什么是栈溢出g) 函数在栈上到底是怎样的?h) 函数进栈和出栈的过程i) 栈溢出攻击的原理j) 实际应用举例:网站密码破解十一、数据结构及算法课程定位:“程序设计=数据结构+算法”,数据结构和算法是程序的灵魂。在进行应用软件开发时一个程序能否选择合适的数据结构和算法将直接导致程序的运行是否高效。通过本阶段的学习,学员不仅可以掌握日常应用软件开发中常用的数据结构和算法,例如链表、栈和队列、二叉树、平衡二叉树、二分查找法、冒泡法排序、快排法等,同时也将学习到更多进阶的内容,例如B树、B+树、红黑树、哈希表、哈希查找、堆排序、动态规划等,学习完这部分知识将大大提高学员大厂笔试和面试的通过率。数据结构基础1)线性结构a) 数组b) 链表i. 单向链表ii.单向链表的逆置iii. 单向链表的环iv.单向循环链表v. 双向链表vi.双向循环链表c) 栈i. 数组实现的栈ii.链表实现的栈iii. 实际应用举例:函数形参的入栈和出栈顺序d) 队列i. 实际应用举例:银行取号机功能实现2)非线性结构a) 二叉树b) 完全二叉树c) 满二叉树d) 二分查找树e) 平衡二叉树f) 图数据结构进阶1)二叉树的遍历i. 通过栈实现二叉树的按深度遍历ii.通过队列实现二叉树的按层次遍历iii. 判断两棵二叉树是否相同2)哈希表a) 哈希表的实现b) 哈希冲突及解决方案c) 实际应用举例:统计一篇文章中单词的个数3)B树a) B树的概念及实现原理b) B树的实际应用:磁盘搜索原理4)B+树a) B+树的概念及实现原理b) B+树的实际应用:数据库索引的实现c) B树和B+树的区别5)哈弗曼树a) 哈弗曼树的特点b) 通过C语言实现哈弗曼树c) 实际应用举例:通过哈夫曼编码实现数据的加密传输6)红黑树a) 红黑树的概念及使用b) 红黑树的旋转c) 红黑树和普通平衡二叉树的比较算法基础1)排序算法a) 冒泡排序b) 插入排序c) 快速排序2)查找算法a) 顺序查找b) 二分查找c) 插值查找算法进阶1)时间复杂度计算2)空间复杂度的计算3)排序算法a) 快排法的 “Bug”及解决办法b) 堆排序c) 希尔排序d) 归并排序e) 桶排序f) 排序算法的稳定性4)查找算法a) Top K 问题b) 大数据中查找前n大数的解决办法5)回溯法a) 八皇后问题6)动态规划7)贪心算法8)背包问题十二、Linux高级程序设计课程定位:当前主流的嵌入式设备中均运行架构复杂的操作系统,操作系统提供了多任务的实现机 制,为了能让嵌入式设备实现更高效的运作,必须掌握嵌入式操作系统中最核心的系统编程 技巧,包括:文件操作、多进程编程、进程管理、进程间通信机制、多线程编程、线程间同 步互斥机制、线程池机制等。shell 编程1)shell变量2)shell位置参数 (命令行参数)3)shell特殊变量a) $#b) $*c) $@d) $?e) $$Linux 文件I/O1)标准IOa) 什么是标准IO?b) 为什么需要标准IO?c) 文件的基本操作i. fopen函数ii.fread函数iii. fwrite函数iv.fclose函数v. fseek函数vi.fstat函数d) 练习:使用标准IO拷贝文件e) 标准IO 的缓冲区i. 行缓冲ii.全缓冲iii. 无缓冲f) sprintf的使用i. sprintf语法ii.实际应用举例:学生信息远程传输数据包封装2)系统IOa) 什么是系统IO?b) 为什么需要系统IOc) Linux系统中文件的描述d) 文件的基本操作i. open函数ii.read函数iii. write函数iv.close函数v. lseek函数vi.stat函数e) Linux 目录的操作方法f) 标准IO和系统IO 比较i. 从实现原理上理解标准IO 的作用和系统IO 的作用ii.分析标准IO和系统IO 的使用场景iii. 标准IO系统IO性能分析iv.时间和日期编程实例1. 当前时间年月日时分秒获取2. 练习:你知道你活了多少天,活了多少秒了吗?3. 实际应用举例:计算你的 “英雄联盟”游戏的 “L龄”Linux 并发编程1)并发和并行的概念2)进程a) 进程的基本概念b) 进程的状态i. 进程在Linux操作系统中的描述ii.进程在Linux下的相关系统文件iii. 进程的三态/五态iv.进程之间的切换v. 进程的上下文c) 多进程编程i. 父进程、子进程ii.进程控制函数fork、getpid、getppid、wait、waipid、killiii. 子进程的 “前世今生”iv.关于fork函数的经典笔试题讲解v. 僵尸进程vi.孤儿进程d) 进程间通信 (IPC)i. 管道1. 有名管道2. 无名管道ii.信号iii. System IPC和Posix IPC1. 消息队列2. 共享内存3. 信号量e) system 函数f) exec函数簇g) system 函数和exec函数簇的区别h) 练习:程序创建子进程并令其挂起100s,令父进程每秒监测子进程状态,若子进程死亡则打印 “子进程死亡”,否则打印 “Hello World!”i) Linux守护进程的设计2)多线程a) 线程的基本概念b) 线程和进程的关系c) 多线程编程i. 线程控制函数 pthread_createpthread_joinpthread_selfpthread_cancelpthread_detachii.PV操作iii. 线程的同步1. 互斥锁2. 读写锁3. 条件变量4. 信号量5. 线程安全i. 生产者消费者模型ii.银行家算法iii. 哲学家就餐问题iv.线程池v. 作业:多线程目录拷贝十三、Linux网络编程课程定位:网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的。中间最主要的就是数据包的组装,数据包的过滤,数据包的捕获,数据包的分析。在本阶段中我们将一起学习一些基础网络尝试,掌握OSI、TCP/IP模型,掌握TCP协议实现原理,同时我们还将学习TCP、UDP编程基础,掌握Linux下的高并发网络编程。Linux 网络编程预备知识1)OSI网络模型2)TCP/IP模型a) TCP/IP 四层模型介绍i. 应用层介绍ii.传输层介绍1. TCP传输协议头部2. UDP传输协议头部iii. 端口号iv.子网掩码v. 网络层介绍1. IP地址2. 子网掩码3. ICMP协议4. ARP协议、ARP攻击5. 路由器工作原理vi.数据链路层介绍1. 交换机的工作原理2. 路由器和交换机的比较b) TCP三次握手i. TCP三次握手流程ii.SYN洪泛攻击c) TCP 四次挥手d) TCP可靠稳定实现原理e) 流量控制和滑动窗口f) UDP传输协议分析3)网络工具wireshark用法4)上网流程分析a) DNS服务器b) HTTP协议和HTTPS协议c) Nginxd) 负载均衡5)NAT 网络地址转换协议socket 编程1)网络字节序和主机字节序2)TCP 编程a) TCP服务端编程流程b) TCP客户端编程流程3)UDP 编程a) UDP服务端编程流程b) UDP客户端编程流程c) 广播和组播4)IO模型分析) 复用5 IOa) selectb) pollc) Epoll练习:网络日志服务器开发练习: 语言实现 网络嗅探器:通过原生套接字的方式,监听所有本地主机收发的C Linux数据链路层帧结构,然后解析数据包的类型,并记录到日志文件。实现一个轻量级的网络嗅探器6)TCP 带外数据编程7)TCP粘包处理8)Unix domain 编程9)作业:基于TCP 的日志服务器的实现10)作业:FTP文件服务器实现十四、Linux数据库编程MySQL1)MySQL数据库的安装a) windows下MySQL 的安装b) ubuntu下MySQL 的安装c) sqlyog的安装2)MySQL数据库的基本操作a) sql语句书写规则b) MySQL查看数据库c) MySQL创建数据库d) MySQL修改数据库e) MySQL删除数据库f) MySQL选择数据库g) MySQL注释h) MySQL 中SQL语句的大小写规则3)MySQL数据类型和存储引擎a) MySQL 数据类型简介b) MySQL 整数类型c) MySQL 小数类型d) MySQL 日期和时间类型e) MySQL 字符串类型f) MySQL 二进制类型g) MySQL 数据类型的选择h) MySQL 转义字符的使用i) MySQL 系统变量j) MySQL 存储引擎:InnoDB、MyISAM4) MySQL数据表的基本操作a) MySQL创建数据表b) MySQL修改数据表c) MySQL修改/删除字段d) MySQL删除数据表e) MySQL删除被其它表关联的主表f) MySQL查看表结构g) MySQL数据表添加字段5)MySQL 约束、函数和运算符a) MySQL 约束概述b) MySQL 主键c) MySQL 主键自增长d) MySQL 外键约束e) MySQL 唯一约束f) MySQL 检查约束g) MySQL 默认值h) MySQL 非空约束i) MySQL 常用运算符j) MySQL 算术运算符k) MySQL 逻辑运算符l) MySQL 比较运算符m) MySQL 位运算符n) MySQL 运算符优先级o) MySQL IN 和NOT INp) MySQL 函数6)MySQL 操作表中数据a) MySQL插入数据b) MySQL去重c) MySQL设置别名d) MySQL限制查询结果的条数e) MySQL对查询结果排序f) MySQL条件查询g) MySQL使用LIKE模糊查询h) MySQL范围查询i) MySQL空值查询j) MySQL分组查询k) MySQL过滤分组l) MySQL交叉连接m) MySQL 内连接n) MySQL外连接o) MySQL子查询p) MySQL更新数据q) MySQL删除数据练习:学生信息管理系统数据库设计7)MySQL视图、索引a) MySQL视图是什么?b) MySQL创建视图c) MySQL查看视图d) MySQL修改视图e) MySQL删除视图f) MySQL索引g) MySQL索引可以分为哪些类型?h) MySQL创建索引i) MySQL查看索引j) MySQL修改和删除索引k) 索引在什么情况下不会被使用?l) 怎么提升索引的使用效率,设计出更高效的索引8)数据库的设计a) ER模型b) 数据库三范式c) 作业:校园网数据库设计9)MySQL事务a) 事务的概念和特性b) MySQL执行事务的语法和流程MySQL设置事务自动提交 (开启和关闭)c) 从实例出发,搞懂高并发下的数据库事务隔离级别d) MySQL查看和修改事务隔离级别e) MySQL表锁、行锁和页锁f) MySQL InnoDB 的3种行锁定方式g) Mysql并发时常见的死锁及解决方法10)MySQL性能优化11)MySQL C语言编程接口Sqlite31)ubuntu sqlite3的安装2)sqlitestudio的使用3)Sqlite3数据库结构4)Sqlite3库的操作5)Sqlite3 C语言编程接口原文地址:两万字解析AIoT智能物联网工程师学习路线,最全路线谁赞成谁反对? - Python从入门到大神 - 博客园 (cnblogs.com)
  • [基础介绍] 医疗物联网真的能改善医疗保健吗?【转载】
    我们如何改善医疗保健、医疗和健康体验,以追求更健康的社会呢? 答案可能在于利用物联网 (IoT) 和互联健康设备(也称为医疗物联网 (IoMT))的力量。今天,我们比以往任何时候都拥有更多有关人体和健康的信息。 人工智能/机器学习的发展正在改善医疗专业人员每天可用的研究方法、诊断工具和治疗方法。 更具包容性的研究为更广泛的人群带来了更有效的治疗形式。 COVID-19 大流行还导致人们更加关注公共和心理健康的重要性。尽管信息、意识和进步不断涌入,但医疗保健体验对许多人来说可能是负面的。 我们今天所知道的医疗保健系统面临着诸多挑战,包括难以及时预约、等待时间延长、检测结果和见解延迟交付、缺乏易于获取和理解的个人健康信息以及负担 成本异常高。那么,我们如何改善医疗保健、医疗和健康体验,以追求更健康的社会呢? 答案可能在于利用物联网 (IoT) 和互联健康设备(也称为医疗物联网 (IoMT))的力量。什么是互联健康设备?联网健康设备是小型、无线、通常可穿戴的电子产品,配备传感器,允许用户根据生理健康指标监测自己的身体和精神状况。这些指标可以像心率或体温一样简单,但也可以很复杂; 一些联网健康设备使用嵌入式医疗测试功能来收集有关用户汗水、唾液和血液化学成分的数据。这些设备收集的数据通常会传送到随附的应用程序,并使用人工智能和机器学习 (AI/ML) 自动分析数据。 这些分析提供的健康见解可以帮助用户跟踪特定健康或健身目标的进展、监测慢性健康状况,甚至自动化药物输送。虽然此类设备听起来很未来主义,但许多设备目前已经存在并正在使用。 糖尿病患者经常使用可穿戴设备进行连续血糖监测 (CGM) 来管理血糖水平,而无需依赖手指刺破或最后一刻的身体提示。 “智能胰岛素笔”可以使用 CGM 数据来计算所需胰岛素的准确剂量以及何时服用。当然,糖尿病并不是唯一使用联网医疗设备的医学领域。 还有监测睡眠和跟踪身体节律的健康设备。 牙齿传感器有望提供另一种基于从唾液中收集的信息的持续健康监测。 有消化问题的人可以吞下模拟胃收缩的振动胶囊以加速消化。 嵌入物联网的各种类型的智能贴片可以粘附在患者的皮肤上并监测生理体征,甚至输送药物。 互联健康设备的应用是无穷无尽的。互联健康设备的好处如上所述,物联网和互联健康设备的广泛使用可以让患者在做出健康相关决策时拥有更多自主权。 易于访问的数据和信息(自动解释可立即产生可操作的见解)可以使患者轻松管理健康问题,例如慢性病、灾难性健康事件后的恢复期以及随着衰老而增加的维护。由于联网健康设备收集的数据是实时分析的,患者还可以识别突发健康事件的紧急预警信号并及时寻求帮助。 最后,使用联网健康设备时自动剂量计算和药物输送的可能性可以让必须定期自我给药的患者安心。最终,互联健康设备可以让患者更好地照顾自己,从而减少健康焦虑并提高整体生活质量。互联健康设备和物联网也有可能成为护理提供者极其有价值的工具。 在我们当前的医疗保健系统下,患者通常只会在出现问题时才与医疗保健提供者互动; 因此,现代医学大多是反应性的,而不是预防性的。当患者确实有健康投诉时,大多数用于诊断的数据要么由患者自行报告,要么是离散的(意味着在很长一段时间内间隔的情况下)和侵入性收集的。 利用互联健康技术将使医生能够进行先发制人的、非侵入性的、持续的数据收集,这可以改善患者的健康生活体验,增强诊断过程,并提供更多的预防性护理。此外,如果更多的患者使用联网医疗设备,医生和研究人员将能够获得人口层面的见解,这可能会对公共卫生产生严重影响。更一般地说,联网健康设备在医疗环境中的巨大潜力很大程度上归功于其便利性和相对较低的成本。 IoMT 可以让患者和医生更有效地协作,同时最大限度地减少面对面的互动和成本,这最终可能会提高合规性,减轻财务压力,并减少护理提供者消耗的资源。互联健康设备的挑战尽管互联健康设备可以为患者和提供者带来诸多好处,但如今它们很少在正式的医疗机构中使用。 这是因为大规模实施面临着三个重大挑战:安全和隐私开发能够可靠地加密数据和检测漏洞,同时保持与不断扩展的物联网兼容的 SoC 是提供商的首要任务。 由于所收集的数据的敏感性以及被黑客攻击的联网健康设备无法正常工作可能造成的严重后果,这一努力对于联网健康设备尤其重要。监管要求与联网健康设备相关的硬件经过严格测试,以确保其安全可靠。 对于大多数电子设备来说,在将其推向市场之前所需要的就是测试过程。 然而,任何声称可以帮助诊断、治疗或控制疾病或与用户健康相关的任何其他内容的设备也必须获得 FDA 的批准。尽管 FDA 的要求是通过确保在风险较高时仅使用可信工具来保护消费者和医疗保健提供者,但获得批准的过程漫长、繁琐且昂贵,这可能会大大延迟新联网健康设备的推出。可扩展性在推出该技术之前,必须解决围绕如何以实用、道德、公平和安全的方式大规模使用互联健康设备的问题。 医院需要哪些硬件和软件更新来支持互联健康设备的使用? 患者需要了解有关互联健康设备的哪些信息才能提供知情同意? 公共医疗机构将从哪里获得互联医疗设备基础设施的资金? 联网健康设备作为诊断和治疗工具有哪些局限性? 由于这些问题仍未得到解答,医疗保健提供者常常犹豫是否向患者推荐联网健康设备。展望未来虽然目前在医疗保健环境中正式使用联网健康设备主要是一种愿望,但这绝不是一个白日梦。 这项技术已经存在,并且每天都在变得更好。 许多与 IoMT 兼容的产品已经寻求并获得 FDA 批准,还有许多其他产品正在申请过程中。尽管仍在发展中,但安全问题暂时已基本解决。 唯一真正剩下的障碍是设计一个支持大规模使用联网健康设备的系统并将其付诸实施。互联健康设备可以作为改善患者体验的工具,利用持续数据收集的力量来改进诊断和治疗,并大幅降低与医疗保健相关的成本和不便。 在未来的几年里,我们将继续见证互联健康设备如何从根本上改变我们的医疗保健系统,使其变得更好。原文地址:cid:link_0
  • [技术干货] 智能甲醛检测【转】
    一、 介绍本项目是基于BearPi套件开发的智能甲醛检测系统Demo,该设备硬件部分主要由小熊派单板套件和和甲醛检测传感器组成。智能甲醛检测系统可以通过云和手机建立连接,可以在手机上设置甲醛浓度阈值,传感器感知到的甲醛浓度超过阈值之后,将会通过云传给手机,并报警。交互流程智能甲醛检测-开源基础软件社区 实物简介智能甲醛检测-开源基础软件社区我们使用小熊派bearpi_hm_nano开发底板+ SGP30传感器拓展板来模拟智能甲醛检测设备。RESET按键控制设备重启;RESET按键组合控制按键可以清除已保存的配网信息,具体操作:先按下控制按键F2,然后按下RESET按键;通过NFC模块实现设备碰一碰快速配网;实物操作体验智能甲醛检测-开源基础软件社区二、快速上手1. 硬件准备小熊派nano 通用底板与SGP30传感器连接如实物图所示,具体细节如下:电源线:分别连接SGP30传感器vcc pin和bearpi开发板V3.3 pin;GND:分别连接SGP30传感器vcc pin和bearpi开发板GND pin;I2C sda:分别连接SGP30传感器sda pin和bearpi开发板GPIO_0 pin;I2C scl:分别连接SGP30传感器scl pin和bearpi开发板GPIO_1 pin。2. Linux编译服务器基础环境准备本次搭建的开发基础环境由windows 工作台和Linux 编译服务器组成。windows 工作台可以通过samba 服务或ssh 方式访问Linux编译服务器。其中windows 工作台用来烧录和代码编辑,Linux编译服务器用来编译OpenHarmony代码,为了简化步骤,Linux编译服务器推荐安装Ubuntu20.04。安装和配置Python打开Linux终端。如果使用ubuntu20.04,python版本无需切换。输入如下命令,查看python版本号,需要使用python3.7以上版本,否则参考 系统基础环境搭建。python3 --version 安装并升级Python包管理工具(pip3)。sudo apt-get install python3-setuptools python3-pip -y sudo pip3 install --upgrade pip 安装hb运行如下命令安装hbpy python3 -m pip install --user ohos-build设置环境变量vim /.bashrc将以下命令拷贝到.bashrc文件的最后一行,保存并退出。export PATH=/.local/bin:$PATH执行如下命令更新环境变量。source /.bashrc执行"hb -h",有打印以下信息即表示安装成功.usage: hb OHOS build system positional arguments: {build,set,env,clean} build Build source code set OHOS build settings env Show OHOS build env clean Clean output optional arguments: -h, --help show this help message and exit3. Hi3861开发环境准备在Linux编译服务器上搭建好基础开发环境后,需要安装OpenHarmony 编译Hi3861 平台特有的开发环境。安装编译依赖基础软件sudo apt-get install -y build-essential gcc g++ make zlib* libffi-dev安装Scons打开Linux 终端。运行如下命令,安装Scons安装包。python3 -m pip install scons运行如下命令,查看是否安装成功。如果安装成功,查询结果下图所示。scons -v安装gcc_riscv32(WLAN模组类编译工具链)下图 Scons安装成功界面,版本要求3.0.4以上智能甲醛检测-开源基础软件社区安装python模块sudo pip3 install setuptools kconfiglib pycryptodome ecdsa six --upgrade --ignore-installed six安装gcc_riscv32(WLAN模组类编译工具链)打开Linux终端。下载gcc_riscv32镜像,下载链接。设置环境变量将压缩包解压到根目录tar -xvf gcc_riscv32-linux-7.3.0.tar.gz -C ~设置环境变量。vim ~/.bashrc将以下命令拷贝到.bashrc文件的最后一行,保存并退出。export PATH=/gcc_riscv32/bin:$PATH生效环境变量。source ~/.bashrc在命令行中输入如下命令,如果能正确显示编译器版本号,表明编译器安装成功。riscv32-unknown-elf-gcc -v4. 源码下载&编译准备 1.码云工具下载 curl cid:link_1 > /usr/local/bin/repo chmod a+x /usr/local/bin/repo pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple requests 2.代码下载 1) OpenHarmony代码下载#特别注意:请下载OpenHarmony 1.0.1 版本,后续会更新支持OpenHarmony其他版本 mkdir ~/OpenHarmony1.01 cd ~/OpenHarmony1.01 repo init -u git@gitee.com:openharmony/manifest.git -b OpenHarmony_1.0.1_release --no-repo-verify repo sync -c repo forall -c 'git lfs pull' 1. 2) 设备侧代码下载具体仓库地址:cid:link_0具体下载命令如下:git clone git@gitee.com:openharmony-sig/knowledge_demo_smart_home.git 1.3) 编译前准备代码拷贝 假设knowledge_demo_smart_home和源码OpenHarmony1.01均存放在你的ubuntu用户根目录下,命令如下: cp -rfa ~/knowledge_demo_smart_home/dev/device/bearpi ~/OpenHarmony1.01/device/ cp -rfa ~/knowledge_demo_smart_home/dev/team_x ~/OpenHarmony1.01/vendor/ cp -rfa ~/knowledge_demo_smart_home/dev/third_party/iot_link ~/OpenHarmony1.01/third_party/整合并修改完成后的目录结构如下图: 5. 编译&烧录编译命令: hb set // 如果是第一次编译,Input code path 命令行中键入"./" 指定OpenHarmony工程编译根目录后 回车, 如下图所示,使用键盘上下键选中智能甲醛检测设备hb build // 如果需要全量编译,可以添加-f 选项详细的代码编译及固件烧录步骤,请参考 编译和烧录指南6. 设备配网在设备上电前需准备好安装了数字管家应用的HarmonyOS手机,详情见数字管家应用开发, 并在设置中开启手机的NFC功能;写设备NFC标签,详细操作见设备NFC标签指导文档;烧录完成后,上电。开发者在观察开发板上状态LED灯以8Hz的频率闪烁时,将手机上半部靠近开发板NFC标签处;无需任何操作手机将自动拉起数字管家应用并进入配网状态,配网过程中无需输入热点账号密码。 具体无感配网相关流程参考7. 操作体验1)阈值设置配网完成后,数字管家应用会自动进入智能台灯的控制页面,通过控制页面设置甲醛传感器告警阈值。2)甲醛超标告警当检测到的甲醛数值,超过预先设定的阈值时,会通知数字管家应用告警,并且告警消息还会推送同一家庭账号的所有成员。原文地址 https://ost.51cto.com/posts/10901 原文作者: 奶盖
  • [技术干货] 【OpenHarmony样例】基于启航KP_IOT开发板的智能风扇模块【转】
    本示例将演示如何利用启航KP_IOT主控板和智能风扇模块进行案例开发。模块介绍智能风扇模块主要的部件有STH30温湿度传感器,一个红外传感器,一个led灯,一个按键和电机,该模块能够实现按键控制电机的启停,电机启动一共分三档,按一次按键增加一个档位,控制电机这一部分用到了pwm,和gpio的知识点。该模块上的STH30传感器可以监控环境温湿度,STH30是通过i2c进行数据交互的,采集的数据还可以显示在oled屏上,oled屏是通过spi进行数据交互。模块上的红外传感器能够实现对物体的检测,当红外传感器检测到物体时led灯会被点亮。智能风扇模块主要试验步骤我们将调用motor_demo()函数,我们就可以在motor_module.c文件中motor_demo()函数声明中完成电机的控制功能,电机控制需要用到pwm,按键需要用到一个gpio,第一步先对io口进行复用,像i2c,pwm,spi,uart等这样功能性引脚复用是在wifiiot/init/app_io_init.c文件中完成的。查看电路原理图和芯片手册中可以知道电机是使用的pwm2,知道电机使用的是pwm2之后,就要知道pwm2是哪个gpio引脚输出的,在include/hi_io.h中可以查看,每个gpio引脚可以复用的功能。gpio2管能够复用成gpio,uart1_rts,spi,pwm2_out等功能,我们需要用到的是pwm2_out,所以在wifiiot/init/app_io_init.c中将gpio_2复用成pwm2_out功能,设置引脚功能的函数hi_u32hi_io_set_func(hi_io_name id, hi_u8 val)的具体功能介绍可以在include/hi_io.h中可以查看。pwm设置完成之后在motor_module.c文件中motor_gpio_io_init()函数中对按键接入的引脚进行复用,从原理图可看到按键KEY-1是接GPIO_05。步骤1 按键对应io5之后在motor_gpio_io_init()中将io5复用成gpio/*gpio5按键控制电机速度*/ ret = hi_io_set_func(HI_IO_NAME_GPIO_5, HI_IO_FUNC_GPIO_5_GPIO); if (ret != HI_ERR_SUCCESS) { printf("===== ERROR ===== gpio -> hi_io_set_func ret:%d\r\n", ret); return; } printf("----- gpio5 fan set func success-----\r\n"); ret = hi_gpio_set_dir(HI_GPIO_IDX_5, HI_GPIO_DIR_IN); if (ret != HI_ERR_SUCCESS) { printf("===== ERROR ===== gpio -> hi_gpio_set_dir1 ret:%d\r\n", ret); return; } printf("----- gpio set dir success! -----\r\n");io设置完成之后,就可以进行功能的编写了,我们想要实现的功能是通过按键控制电机的启停,电机有三个档位,按键按一次增加一个档位,电机处于三档时再按一次按键电机将停止。首先我们要创建一个任务去实时监听按键接入io引脚的状态,OpenHarmony系统中任务的创建调用hi_u32hi_task_create(hi_u32 *taskid, const hi_task_attr attr,hi_void (*task_route)(hi_void *), hi_void *arg);步骤2 创建的电机任务的属性,包括任务优先级,任务栈的大小,任务名,在任务处理函数中去实现我们想要的功能//创建的电机任务的属性,包括任务优先级,任务栈的大小,任务名等 static unsigned int g_MonitorTask; const hi_task_attr MonitorTaskAttr = { .task_prio = 20, //优先级范围20~30之间 .stack_size = 4096, //任务大小 .task_name = "BuggyNetworkMonitorTask",//任务名称,可自行修改 }; void *MonitorOledTask(void * para) /* OLEDtask处理函数 */ { while(1){ test_led_screen(); printf("OLED task \r\n"); } return NULL; } // 电机task处理函数 void *MonitorMotorTask(void * para) { while(1){ gpio_getval(); //主要任务,对电机的控制在此函数中实现 infrared_ctrl(); //printf("fan task \r\n"); } return NULL; }步骤3 在gpio_getval()实现对电机控制;//按键控制电机程序 hi_void gpio_getval(hi_void) { hi_u32 ret; int temp; static int key = 0; //将gpio_val_1置为1,置为1是因为从原理图中可知按键默认是高电平,按下为低电平 hi_gpio_value gpio_val_1 = HI_GPIO_VALUE1; temp = infrared_ctrl(); //获取gpio5引脚电平,并赋值给gpio_val_1 ret = hi_gpio_get_input_val(HI_GPIO_IDX_5, &gpio_val_1); if (ret != HI_ERR_SUCCESS) { printf("===== ERROR ===== gpio -> hi_gpio_get_input_val ret:%d\r\n", ret); return; } //printf("----- gpio input val is:%d. -----\r\n", gpio_val_1); //当gpio_val_1为低电平是说明按下了按键,按1次按键增加一个档位 if(gpio_val_1 == 0){ //休眠1s是为了消除按键的抖动 sleep(1); if(gpio_val_1 == 0){ key++; } //key表示是几档,根据不同的档位再输出不同占空比的pwm波去控制电机 switch(key){ case 0: break; case 1: //电机1档,控制端口2输出1占空比的pwm波 motor_pwm_start(1); break; case 2: //电机2档,控制端口2输出2占空比的pwm波 motor_pwm_start(2); break; case 3: //电机3档,控制端口2输出3占空比的pwm波 motor_pwm_start(3); break; default: printf("invalid mode \r\n"); } //当key大于4或等于0时停止电机 if(key >= 4 || key == 0 || temp == 1){ key = 0; ret = hi_pwm_stop(HI_PWM_PORT_PWM2); if(ret != 0){ printf("hi_pwm_stop failed \r\n"); } } } //printf("key : %d \r\n",key); }pwm波控制电机输出部分程序:在使用pwm之前需要先对pwm进行初始化,初始化pwm只需要调用hi_pwm_init(parm),函数中的参数(parm)是需要初始化的端口,使用的pwm2需要填宏定义HI_PWM_PORT_PWM2,具体宏定义含义在include/hi_pwm.h中有说明。步骤4 对端口的初始化只需要完成一次,所以在创建电机任务之前调用一次motor_pwm_init()即可hi_void motor_pwm_init(hi_void) { int ret = -1; ret = hi_pwm_deinit(HI_PWM_PORT_PWM2); //初始化端口2 if(ret != 0){ printf("hi_pwm_deinit failed :%#x \r\n",ret); } ret = hi_pwm_init(HI_PWM_PORT_PWM2); //初始化端口2 if(ret != 0){ printf("hi_pwm_init failed :%#x \r\n",ret); } ret = hi_pwm_set_clock(PWM_CLK_160M); //设置端口2的时钟源频率 if(ret != 0){ printf("hi_pwm_set_clock failed ret : %#x \r\n",ret); } }对电机速度的控制实际上就是控制pwm的占空比和频率,想要输出不同占空比的pwm波调用函数hi_u32hi_pwm_start(hi_pwm_port port, hi_u16 duty, hi_u16freq);参数port表示端口号,duty占空比值,freq频率。在我们使用的模块中,时钟频率默认是160000000hz,所以可以定义一个宏去表示时钟频率,这里我们是用PWM_CLK_FREQ表示时钟频率,分频倍数165535,频率范围就是2441160000000(频率=时钟源频率/分频倍数),我们用最低频率就可以了,所以将频率用一个宏freq去表示值为2441。步骤5 motor_pwm_start(unsigned int duty)中duty就表示占空比,想让pwm2端口输出多少占空比的波形,直接在调用该函数时传入占空比值就可以了。hi_void motor_pwm_start(unsigned int duty) { int ret = 0; DBG("motor start \r\n"); if(duty == 0){ ret = hi_pwm_stop(HI_PWM_PORT_PWM2); //停止pwm2端口输出 if(ret != 0){ printf("hi_pwm_start failed ret : %#x \r\n",ret); } } ret = hi_pwm_start(HI_PWM_PORT_PWM2, duty*(PWM_CLK_FREQ/freq)/100, PWM_CLK_FREQ/freq); //输出duty占空比的pwm波 if(ret != 0){ printf("hi_pwm_start failed ret : %#x \r\n",ret); } }步骤6 motor_pwm_start(unsigned int duty)中duty就表示占空比,想让pwm2端口输出多少占空比的波形,直接在调用该函数时传入占空比值就可以了。hi_void motor_demo(hi_void) { int ret; motor_gpio_io_init(); //完成对按键所接io的复用 motor_pwm_init(); //对pwm进行初始化 //创建一个任务去专门处理电机控制任务 ret = hi_task_create(&g_MonitorTask, // task标识// &MonitorTaskAttr, MonitorMotorTask, // task处理函数 // NULL); // task处理函数参数 // if (ret < 0) { printf("Create monitor motor task failed [%d]\r\n", ret); return; } return; }红外传感器模块红外传感器有一个发射端和一个接收端,当发射端发出的电磁波被挡住返回,接收端接收到后红外传感器接到模块上的引脚就会从低电平变成高电平,所以我们可以通过监控红外传感器的引脚电平高低来判断是否检测到物体,目前实现的现象是,当检测到物体时led就会被点亮,没检测到物体led就灭。写程序之前我们要先确定红外传感器接入的引脚和led接入的引脚,从原理图中可以看到红外传感器LED_infrared接入的引脚是GPIO_07,LED_SW1灯接入的引脚是GPIO_06。步骤1 知道红外传感器和led接入的引脚后,就需要对相应的IO进行复用,因为是同一个模块所以可以在motor_gpio_io_init()中实现io7,io8的复用。//设置io8的方向,因为led灯是输出信号,所以设置成out ret = hi_gpio_set_dir(HI_GPIO_IDX_8, HI_GPIO_DIR_OUT); if (ret != HI_ERR_SUCCESS) { printf("===== ERROR ===== gpio -> hi_gpio_set_dir1 ret:%d\r\n", ret); return; } /*gpio7 电机模块红外传感*/ ret = hi_io_set_func(HI_IO_NAME_GPIO_7, HI_IO_FUNC_GPIO_7_GPIO); if (ret != HI_ERR_SUCCESS) { printf("===== ERROR ===== gpio -> hi_io_set_func ret:%d\r\n", ret); return; } printf("----- io set func success-----\r\n"); //设置io7的方向,因为红外传感器是输入信号,所以设置成输入 ret = hi_gpio_set_dir(HI_GPIO_IDX_7, HI_GPIO_DIR_IN); if (ret != HI_ERR_SUCCESS) { printf("===== ERROR ===== gpio -> hi_gpio_set_dir1 ret:%d\r\n", ret); return; } printf("----- gpio set dir success! -----\r\n");步骤2对io功能复用完成后,就可以完成对led控制这一部分的功能了,首先这两引脚的默认值都是低电平,所以先将这两个引脚赋值HI_GPIO_VALUE0,然后根据gpio_val_7引脚的电平高低来判断红外传感器是否检测到物体,检测到物体是将gpio_val_8置为高电平点亮led。hi_void infrared_ctrl(hi_void) { hi_u32 ret; hi_gpio_value gpio_val_7 = HI_GPIO_VALUE0; //设置gpio_val_7默认值 hi_gpio_value gpio_val_8 = HI_GPIO_VALUE0; //设置gpio_val_8默认值 ret = hi_gpio_get_input_val(HI_GPIO_IDX_7, &gpio_val_7); //监控gpio_val_7的电平 if (ret != HI_ERR_SUCCESS) { printf("===== ERROR ===== gpio -> hi_gpio_get_input_val ret:%d\r\n", ret); return; } //printf("----- gpio input val is:%d. -----\r\n", gpio_val_7); if(gpio_val_7 == 1){ hi_gpio_set_ouput_val(HI_GPIO_IDX_8,HI_GPIO_VALUE1); //gpio_val_7为高电平时,将HI_GPIO_IDX_8置为高电平输出 }else{ hi_gpio_set_ouput_val(HI_GPIO_IDX_8,HI_GPIO_VALUE0);//gpio_val_7为低电平时,将HI_GPIO_IDX_8置为低电平输出 } }步骤3 功能完成后就需要在适合的时机去调用,因为红外线监控也是需要实时监控gpio引脚,和监控按键一样所以可以在电机任务中去调用。void *MonitorMotorTask(void * para) /* 电机task处理函数 */ { while(1){ gpio_getval(); //电机按键监控 infrared_ctrl(); //红外传感器监控 } return NULL; }sht3x温湿度传感器模块SHT3x-DIS是Sensirion新一代的温湿度传感器,精度为±2%RH和±0.3℃,输入电压范围从2.4V到5.5V,采用IIC总线接口,速率可达1MHz。测量温湿度范围分别为是-40℃ ~ 125℃和0 ~ 100%。具体规格和原理参考说明手册。步骤1 初始化sth3xvoid SHT3X_init(void) { int ret = 0; unsigned short data[2] = {0}; SHT3X_SoftReset(); //软件复位SHT3X SHT3x_WriteCMD(CMD_READ_SERIALNBR); //向i2c发送读命令 SHT3x_WriteCMD(CMD_MEAS_PERI_2_M); //设置读取周期为2hz }步骤2 读取测量数据void SHT3X_ReadMeasurementVal(unsigned int para) { (void) para; static int cunt = 0; static float humidity = 0.0; static float temperature = 0.0; SHT3X_ReadMeasurementBuffer(&temperature,&humidity); //将读取数据存到temperature和humidity中 } //数据存储的具体实现 void SHT3X_ReadMeasurementBuffer(float* temperature, float* humidity) { unsigned int rawValueTemp = 0; SHT3x_WriteCMD(CMD_FETCH_DATA); //读取数据前先发送一个周期读取指令 SHT3x_Read4BytesDataAndCrc((unsigned short *)&rawValueTemp);//读取i2c上四个字节的数据 dump_buf((unsigned char *)&rawValueTemp,sizeof(rawValueTemp)); //调试打印读取的数据 *temperature = SHT3X_CalcTemperature(rawValueTemp); //将读取的数据转换成浮点型温度数据 *humidity = SHT3X_CalcHumidity(*((unsigned short *)(&rawValueTemp)+1));//将读取的数据转换成浮点型湿度数据 Temperature = *temperature; Humidity = *humidity; DBG("temp :%f,hum :%f \r\n",Temperature,Humidity); //打印读取的温湿度 } //将读取的数据转换成浮点型的温度 static float SHT3X_CalcTemperature(unsigned short rawValue) { return 175.0f * (float)rawValue / 65535.0f - 45.0f; //转换公式 } //将读取的数据转换成浮点型的湿度 static float SHT3X_CalcHumidity(unsigned short rawValue) { return 100.0f * (float)rawValue / 65535.0f; //转换公式 } //读取4字节数据的具体实现 int SHT3x_Read4BytesDataAndCrc(unsigned short *data) { int ret = -1; unsigned char sendbuf[2] = {0}; unsigned char rcvbuf[6] = {0}; hi_i2c_data sht3x_i2c_data = { 0 }; //i2c在该模块的数据收发数据都是存储在结构体中的,该结构体可以再include/hi_i2c.h中查看 sht3x_i2c_data.send_buf = sendbuf; sht3x_i2c_data.send_len = sizeof(sendbuf); sht3x_i2c_data.receive_buf = rcvbuf; sht3x_i2c_data.receive_len = sizeof(rcvbuf); if(data == NULL){ DBG("invalid para \r\n"); return ret; } ret = hi_i2c_read(0, ((unsigned char)0x44) << 1 | 0x01, &sht3x_i2c_data); //sht3x地址为0x44,读温湿度传感器中数据,数据存储在sht3x_i2c_data中 if(ret != 0){ DBG("hi_i2c_read failed ret :%#x \r\n",ret); return ret; } ret = SHT3X_CheckCrc(rcvbuf,2,rcvbuf[2]); //将读取的数据进行校验 if(ret != NO_ERROR){ DBG("read serial number crc check failed \r\n"); return ret; } ret = SHT3X_CheckCrc(&rcvbuf[3],2,rcvbuf[5]); //将读取的数据进行校验 if(ret != NO_ERROR){ DBG("read serial number crc check failed \r\n"); return ret; } data[0] = rcvbuf[0] << 8 | rcvbuf[1]; //将数据存到data数组中 data[1] = rcvbuf[3] << 8 | rcvbuf[4]; return 0; }步骤3 任务调用hi_void motor_demo(hi_void) { int ret; SHT3X_init(); //初始化SHT3X ret = hi_task_create(&g_MonitorTask, // task标识 // &MonitorTaskAttr, MonitorSthTask, // task处理函数 // NULL); // task处理函数参数 // if (ret < 0) { printf("Create monitor motor task failed [%d]\r\n", ret); return; } return; }到这一步温湿度传感器的程序已经编写完成了,可以将程序进行编译然后下载到模组中验证一下是否可以读取温湿度,如果能读取到温湿度,在日志中会打印出读取的数据。OLED显示模块采集完成数据之后可以在oled模块上显示,oled模块的具体开发详见oled开发流程知道,这里是直接使用oled去显示SHT3X读取的温湿度,显示温湿度首先我们要对oled进行初始化,我们使用的spi0所以初始化时spi_id=0。hi_void screen_spi_master_init(hi_spi_idx spi_id){int ret = -1;//screen_ERR;test_spi_para spi_para; //test_spi_para结构体是spi的基础属性,定义在oled_module/spi_screen.h文件中步骤1 给spi基础属性赋值spi_para.spi_id = spi_id; //spi端口号,我们是用的是0 spi_para.irq = HI_FALSE; //是否启用中断,选择否 spi_para.cfg_info.data_width = HI_SPI_CFG_DATA_WIDTH_E_8BIT; //传输数据位为8位 spi_para.cfg_info.cpha = HI_SPI_CFG_CLOCK_CPHA_0; //时钟相位0,采集第一个跳变沿数据 spi_para.cfg_info.cpol = HI_SPI_CFG_CLOCK_CPOL_0; //时钟极性0,空闲状态为低电平 spi_para.cfg_info.fram_mode = HI_SPI_CFG_FRAM_MODE_MOTOROLA; //选用的通讯协议 spi_para.cfg_info.endian = HI_SPI_CFG_ENDIAN_LITTLE; //数据传输为小段模式 spi_para.slave = HI_FALSE; //没有从机 spi_para.lb = HI_FALSE; //不设置回环测试模式 spi_para.dma_en = HI_FALSE; //不采用dma spi_para.cfg_info.freq = 2000000; //通讯频率2Mhz test_spi_printf("app_demo_spi_test_cmd_mw_sr Start"); ret = screen_spi_init(spi_para.spi_id, &(spi_para.cfg_info), spi_para.slave); //spi的系统初始化 if (ret == HI_ERR_SUCCESS) { test_spi_printf("SPI init succ!"); } else { test_spi_printf("SPI init fail! %x ", ret); return; } hi_spi_set_loop_back_mode(spi_para.spi_id, spi_para.lb); //设置回环测试模式 hi_sleep(1000); /* 1000 */ hi_spi_set_irq_mode(spi_para.spi_id, spi_para.irq); //设置中断模式 hi_spi_set_dma_mode(spi_para.spi_id, spi_para.dma_en); //设置dma模式 hi_sleep(1000); /* 1000 */ }步骤2 初始化完成之后,需要创建一个oled任务去完成显示功能ret = hi_task_create(&g_MonitorTask, // task标识 // &MonitorTaskAttr, MonitorOledTask, // task处理函数 // NULL); // task处理函数参数 // if (ret < 0) { printf("Create monitor oled task failed [%d]\r\n", ret); return; } void *MonitorOledTask(void * para) /* OLEDtask处理函数 */ { while(1){ test_led_screen(); //显示功能 printf("OLED task \r\n"); } return NULL; }温湿度的显示主要是由TEST_Menu2()显示的,这个oled模块显示数字有一个特点,它显示20这样的两位数时,是将这两位数分开来显示的,先显示2再显示0,我们读取的温度是一个浮点型数据,所以在显示时需要将各个位上的数字分离出来。void TEST_Menu2(void) { extern float Temperature; //Temperature的读取是在不同的文件中,所以想在这个文件中使用就需要将Temperature定义成全局变量,这边引用时加extern extern float Humidity; printf("Temperature:%f Humidity:%f \r\n",Temperature,Humidity); int a = 0; int b = 0; int c = 0; int d = 0; int e = 0; int f = 0; int g = 0; a = Temperature; b = a / 10; //整除获取十位上的数据 c = a % 10; //取余获取个位上的数据 d = (Temperature - a) * 10; //Temperature为浮点型数据,a为整形,相减之后就是小数,再乘十,获取到的就是小数后的第一位 e = Humidity; f = e / 10; //整除获取十位上的数据 g = e % 10; //取余获取各位上的数据 printf("b:%d c:%d d:%d f:%d g:%d\r\n",b,c,d,f,g); u8 i; //图形界面的绘制 GUI_DrawLine(0, 10, WIDTH-1, 10,1); GUI_DrawLine(WIDTH/2-1,11,WIDTH/2-1,HEIGHT-1,1); GUI_DrawLine(WIDTH/2-1,10+(HEIGHT-10)/2-1,WIDTH-1,10+(HEIGHT-10)/2-1,1); GUI_ShowString(0,1,"2021-08-1",8,18); GUI_ShowString(14,HEIGHT-1-10,"Cloudy",8,1); GUI_ShowString(WIDTH/2-1+2,13,"TEMP",8,1); GUI_DrawCircle(WIDTH-1-19, 25, 1,2); GUI_ShowString(WIDTH-1-14,20,"C",16,1); GUI_ShowString(WIDTH/2-1+2,39,"HUMI",8,1); GUI_DrawBMP(6,16,51,32, BMP5, 1); //温湿度的显示 GUI_ShowNum(WIDTH/2-1+9,20,b,1,16,1); //温度的十位数字显示 GUI_ShowNum(WIDTH/2-1+9+8,20,c,1,16,1); //温度的十位数字显示 GUI_ShowString(WIDTH/2-1+9+8+8,20,".",16,1); //小数点显示 GUI_ShowNum(WIDTH/2-1+9+8+16,20,d,1,16,1); //温度的小数显示 GUI_ShowNum(WIDTH/2-1+5,46,f,1,16,1); //湿度的十位显示 GUI_ShowNum(WIDTH/2-1+5+8,46,g,1,16,1); //湿度的个位显示 GUI_ShowString(WIDTH/2-1+5+8+8,46,"/rh",16,1); //湿度的单位显示 sleep(2); }步骤1 在motor_demo()中去调用hi_void motor_demo(hi_void) { int ret; motor_gpio_io_init(); //智能风扇模块gpio的初始化 SHT3X_init(); //温湿度传感器的初始化 motor_pwm_init(); //pwm的初始化 hi_spi_deinit(HI_SPI_ID_0); screen_spi_master_init(0); //spi的初始化 ret = hi_task_create(&g_MonitorTask, // task标识 // &MonitorTaskAttr, MonitorOledTask, // oled task处理函数 // NULL); // task处理函数参数 // if (ret < 0) { printf("Create monitor oled task failed [%d]\r\n", ret); return; } ret = hi_task_create(&g_MonitorTask, // task标识 // &MonitorTaskAttr, MonitorMotorTask, // motor task处理函数 // NULL); // task处理函数参数 // if (ret < 0) { printf("Create monitor motor task failed [%d]\r\n", ret); return; } ret = hi_task_create(&g_MonitorTask, // task标识 // &MonitorTaskAttr, MonitorShtTask, // sht task处理函数 // NULL); // task处理函数参数 // if (ret < 0) { printf("Create monitor motor task failed [%d]\r\n", ret); return; } return; }修改 applications / sample / wifi-iot / app / 路径下 BUILD.gn 文件,指定 motor_module 参与编译。"22_KP_SHT30_example:motor_module",运行结果将智能风扇模块和oled模块安装在开发板上,将上面编译好的程序下载到模组上验证温湿度的显示。原文地址:【OpenHarmony样例】基于启航KP_IOT开发板的智能风扇模块 - OpenHarmony开源社区 - 电子技术论坛 - 广受欢迎的专业电子论坛! (elecfans.com)
  • [技术干货] 11月嵌入式项目合集
    基于STM32的油井数据采集与处理cid:link_2本文介绍了油井数据采集与传输的流程,并给出了相应的Python代码示例。通过实时采集油井数据,并将其传输到服务器,从而实现对油井状态的监测和维护。可作为平时训练的例子。 开天平台+鸿蒙OS小熊派打造智能大棚温控报警cid:link_0本文把华为的众多生态结合在一起运用,对于想要了解华为云iot生态的用户具有非常好的借鉴意义IoTDA设备接入服务和边缘计算的结合:构建高效的边缘物联网方案cid:link_1本文介绍了边缘计算的概念,并且提供了一些python版本的demo,可以为入门的iot的新手提供一些边缘计算方面的的帮助。STC89C52+HX711完成电子秤设计cid:link_3此文介绍了C52制作一个电子秤,可以作为学习C52单片机的入门项目,丰富嵌入式开发的经验和了解电路的整体设计。IoTDA平台OTA升级与设备远程控制:华为云物联网平台的能力介绍cid:link_3
  • [技术干货] 启航kp OpenHarmony环境搭建
    前提启航kp OpenHarmony环境搭建搭建好OpenHarmony环境未搭建好可以参考OpenHarmony docker环境搭建安装vscode下载好启航kp所需的开发包和样例下载地址搭建过程进入正确文件夹首先要进入 /home/openharmony 目录下,如果没有打开在vsc左上角找到文件,点击,然后找到打开文件夹,输入想要进入的目录。能看到便代表成功进入。配置开发板所需要的文件在vendor文件夹内新增文件夹:isoftstone,把从gitee下载文件中vendor_isoftstone文件夹中的qihang文件夹复制到isoftstone目录下。device/board文件夹内新增文件夹:isoftstone,在isoftstone文件夹中新建文件夹:qihang,再将附加包内的board_qihang文件夹的人内容拷贝到这个文件夹内:检验是否安装成功输入hb set选中启qihang输入hb build -f尝试编译输出 qinghang build success则构建成功。制作“hello word”案例在device/board/isoftstone/qihang/app目录建一个目录:01hello,然后在这个目录下新建文件:hello.c内容如下#include "ohos_init.h" void hello_demo(void) { printf("hello word!\n") } SYS_RUN(oled_demo); 在hello.c同级别目录添加文件BUILD.gn,填入以下内容static_library("hello_demo"){ sources=["hello.c"] } 在app目录BUILD.gn添加01hello模块import("//build/lite/config/component/lite_component.gni") lite_component("app") { features = [ "01hello:hello_demo", ] } hb set选择启航开发板hb build -f进行编译有以下输出表示编译成功6。 编译成功后可以在out/qihang/qihang/Hi3861_wifiiot_app_allinone.bin找到编译后的二进制文件
  • [技术干货] OpenHarmony docker环境搭建
    OpenHarmony docker环境搭建要求一台安装ubuntu的虚拟机,vscode软件安装docker在 Ubuntu 上安装 Docker 非常直接。我们将会启用 Docker 软件源,导入 GPG key,并且安装软件包。首先,更新软件包索引,并且安装必要的依赖软件,来添加一个新的 HTTPS 软件源:sudo apt update sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common使用下面的 curl 导入源仓库的 GPG key:curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -将 Docker APT 软件源添加到你的系统:sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"现在,Docker 软件源被启用了,你可以安装软件源中任何可用的 Docker 版本。01.想要安装 Docker 最新版本,运行下面的命令。如果你想安装指定版本,跳过这个步骤,并且跳到下一步。sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io02.想要安装指定版本,首先列出 Docker 软件源中所有可用的版本:sudo apt update apt list -a docker-ce可用的 Docker 版本将会在第二列显示。docker-ce/focal 5:19.03.93-0ubuntu-focal amd64 通过在软件包名后面添加版本=<VERSION>来安装指定版本:sudo apt install docker-ce=<VERSION> docker-ce-cli=<VERSION> containerd.io 一旦安装完成,Docker 服务将会自动启动。你可以输入下面的命令,验证它: sudo systemctl status docker 输出将会类似下面这样:● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2020-05-21 14:47:34 UTC; 42s ago ...当一个新的 Docker 发布时,你可以使用标准的sudo apt update && sudo apt upgrade流程来升级 Docker 软件包。拉取镜像运行 Docker 软件,打开 CMD 命令行或者 PowerShell 终端,使用指令下载 docker 官方镜像:docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0等待下载完成之后,使用 docker images 可以查看到已下载的 docker 镜像 此时镜像名称太长不方便使用,可以使用重命名操作对镜像重命名:docker image tag swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0 openharmony-docker:1.0.0此时使用 docker images 再次查看镜像,发现多出一个名为 openharmony-docker:1.0.0 的镜像 可以执行docker rmi swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0删除旧的镜像: 执行docker run -it openharmony-docker:1.0.0 指令可以运行镜像可以看到系统直接进入到了/home/openharmony,但是此时仅是容器运行成功了,还没有代码,无法完成开发,接下来需要获取代码OpenHarmony 代码获取通过git(不推荐,有时会卡死)首先要设置git用户名和邮箱,否则拉去代码时会报错git config --global user.name "Your Name" git config --global user.email "youremail@yourdomain.com"拉去代码repo init -u git@gitee.com:openharmony/manifest.git -b OpenHarmony-3.2-Release -g ohos:mini repo sync -c repo forall -c 'git lfs pull'通过httprepo init -u https://gitee.com/openharmony/manifest.git -b OpenHarmony-3.2-Release -g ohos:mini repo sync -c repo forall -c 'git lfs pull'检验输入hb -v如果出现版本号代表成功Vscode 安装开发板实验需要烧录固件,所以要用到 vscode 编辑器导出固件 到该网址下载最新版的 Visual Studio Code,简称 vscode,下载完成后执行安装. 网址: cid:link_0安装 vscode 插件打开安装好的 vscode 编辑器,点击左侧插件图标,输入 remote ssh 点击安装图标,等待安装完成,安装完成之后左侧会出现下面的图标 然后重复步骤安装入 dev contains 远程连接服务器3、添加服务器连接配置 点击该选项卡,会进入SSH TARGETS的添加,如下图所示:点击添加按钮,输入远程服务器的地址,账号和ip根据自己的情况进行修改,如下图所示:保存之后,会将刚才的连接信息存储在 C:\Users\chaxun.ssh\config 中。此时就可以在SSH TARGETS中看到添加的远程服务器地址了:4、连接服务器 右键选择远程服务器,如果远程服务器能够连接成功,此时会需要你输入密码:5、基本操作例如我点击Open Folder,这里就会让你选择打开的文件目录:点击ok按钮打开 /home/zhaxun 之后,会需要再次输入密码:启动和连接镜像启动镜像的方式可以是终端命令行,如果容器已启动,可以选择 attach 连接容器 点击连接容器之后,会弹出一个新窗口,点击左侧上面第一个图标,会显示该 容器内的文件系统(需要一点缓冲时间) 如果界面同以上截图不一样,而是如下所示: 就点击打开文件夹,在上方弹出的对话框输入/home/openharmony,再点击确 定, 等待片刻就会显示出文件列表,接下来就可以像操作本地文件一样打开文件 并进行编辑,然后修改一个文件:在顶部菜单栏点击终端,再选择新建终端,可以打开终端: 注意观察弹出来的终端,工作目录是否是/home/openharmony,如果不是请检 查前面的操作是否错误或有遗漏 在终端命令行输入:hb set 指令,再输入回车,到达选择开发板的界面,用鼠标 或键盘上下键选择 qemu_mini_system_demo,再敲回车:选择好了开发板,就可以执行构建命令: hb build -f 此时系统开始构建,由于我们使用的是 docker 环境,在制作镜像的时候环境已 经准备好了,所以不需要配置其他的脚本或者工具即可以达到编译固件的目的. 最后终端会显示编译成功,我们可以在 out 相应的目录下找到对应的固件,输 入:ls out/arm_mps2_an386/qemu_mini_system_demoqemu 模拟器的运行 由于模拟器的运行不涉及到具体的硬件,所以本实验不需要烧录步骤,在 docker 控制台终端输入./qemu-run,再输入 y 就能运行 qemu 模拟器了,下面是运 行状态的截图: 在 qemu 的终端里可以输入 help 命令查看该模拟器支持运行哪些指令: 同学们可以自行尝试列出来的指令退出模拟器的运行: 按住 Ctrl+a 然后同时放开,再按一下 x 键即可退出 qemu 终端可以看出,系统此处退出了 qemu 模拟器回到了 doc
  • [问题求助] iot未来
    iot在未来仍会是一个很热门的方向吗
  • [课程学习] 关于基于物联网平台构建智慧路灯应用使用LoRa进行实践设计的建议
    传统的城市照明系统照明运营模式落后,监控维修不到位,难以实现按需照明,节能减排需求巨大且信息化管理缺失,而国内传统的智慧照明领域,基本采用PLC和GPRS技术,数据传输的局限性大,部署复杂,网络覆盖面临困境。如今,物联网技术快速发展,基于物联网平台构建智慧路灯应用具有令人期待的发展前景。通过华为云《基于物联网平台构建智慧路灯应用》提出的基于华为云物联网服务的解决方案和实践,学习了解到了两种实践设计方案。两种方案中,不同厂家的路灯都统一接入平台,可以屏蔽网络以及协议的差异化,解耦应用和终端,简化设备对接的难度,路灯可通过网关间接或者直接接入,兼容传统路灯,并且都利用了NB-IoT的优势——低功耗、低成本、强覆盖、大连接,提高了设备接入的效率,且基于云端构建应用,可以帮助用户简化细节,高效安全应用。在具体系统设计方面,第一种方案,设备上传到物联网平台后,由物联网平台转发数据至DIS服务,进行数据分发,然后应用获取到数据,应用可基于ECS和DevCloud简化构建流程和细节,第二种方案没有了DIS数据分发服务,但是应用可以订阅物联网平台的信息,实时监测到变化,然后下发命令到平台和应用,两种方式各有各的优点和不足,可以根据具体的适用场景选择使用。上述方案都使用了NB-IoT,虽国内NB-IoT发展势头极好,但是NB-IoT使用授权频段,而LoRa使用非授权频段,相较于NB-IoT,LoRa可以自由地实现按需部署和独立组网的需求,在实际应用中,客户对于组网有大量的需求,尤其是在局域网区域内,相比于NB-IoT,LoRa可以极大降低部署成本。此外,LoRa相比于NB-IoT具有更低的功耗,事实上一般NB-IoT的发射功耗要比LoRa的发射功耗大3倍,可以实现更远距离的传输。LoRa的抗干扰能力和抗多径特点使得基于LoRa,在低级信噪比以及复杂环境下传输和解码信号都具有较低的误码率和丢包率,所以建议不妨基于LoRa开展对比实验看可否进一步提升基于物联网平台构建智慧路灯应用性能以及制定更高效的方案。以上为个人学习感想以及实践设计改进建议。
  • [问题求助] 先楫hpm6750、飞鸿SEEK100(8541E)、小熊派这三个开发板,有什么区别,生态如何,建议使用哪一个开发板?
    先楫hpm6750、飞鸿SEEK100(8541E)、小熊派这三个开发板,有什么区别,生态如何,建议使用哪一个开发板?
  • [技术干货] 寻卡指令
     实验目的了解15693协议学基于15693协议的读取卡的ID号,通过手动发送寻卡命令进行寻卡。实验环境硬件:13.56M_RFID开发板,UART串口底板,ST-LINK仿真器,基于15693的卡片软件:Keil5实验原理STM32单片机通过SPI接口控制RC632芯片,RC632是可以使用14443A、14443B、15693三种协议的读卡器芯片。STM32通过SPI控制RC632寻找范围内的15693卡片,当寻找到相应卡片后会将卡片ID号发送到串口。实验步骤将ST-LINK仿真器一端连在电脑,一端连在UART调试底板的JTAG接口上。用Keil软件打开工程\Components\第五章基于ISO15693协议的应用实验\2_寻卡指令\Project\PROJECT0\Project\STM32Project.uvprojx打开Keil软件,Project->Open Project​编译程序,点击按钮如图:​编译通过之后下载程序到RFID模块,点击按钮如图:​打开串口调试工具 AccessPortAccessPort软件参数设置方法见 第二章2.4串口软件使用说明命令解释向串口助手发送{$CARDSCAN=1}命令采用普通方式寻找单张卡片向串口助手发送{$CARDSCAN=2}命令采用防碰撞方式寻卡步骤首先将一张卡片放入天线识别区内,先通过发送{$CARDSCAN=1}命令寻找到一张卡片,发送一次会收到正在寻卡的提示,当寻找到一张卡片时会回复 “找到卡片 ID= XXXXXXXXXXXXXXXX”​发送{$CARDSCAN=2}命令可以使用防碰撞方式寻找多张卡,此时将多张卡片放入天线识别区可以读到多张卡片的ID号。​
  • [专题汇总] 九月份开发总结
    一、前言在过去的一个月里,我深入研究和开发与STM32微控制器相关的项目。作为一款广泛应用于嵌入式系统开发的强大工具,STM32系列微控制器以其出色的性能和丰富的功能而备受推崇。在这个开发总结中,我将回顾我在九月份的工作成果、遇到的挑战以及收获的经验。通过研究和实践,我对STM32的理解不断深化,并且在项目开发中取得了令人满意的进展。以下是我在九月份的开发总结。二、项目目录【1】MQTT报文格式(第二篇)cid:link_4主要讲解剩余长度、可变报头、报文标识符Packet Identifier等内容,让人深度了解MQTT的报文格式。【2】MQTT报文格式(第三篇)cid:link_5主要讲解有效载荷Payload、以及各版本的规范声明。【3】【问题解决】OpenHarmony docker环境搭建所见的问题和解决cid:link_6主要为研究OpenHarmony docker环境搭建所遇到的一些问题进行避坑的,采用Ubuntu桌面版对OpenHarmony docker环境进行搭建【不建议使用桌面版进行配置,博主这边遇到的问题都是桌面版的!!!】。【4】基于STM32的温度检测与监控cid:link_7温度检测与监控在现代工程和科学应用中具有重要作用,尤其在领域如气象学、工业自动化和电子设备维护中。本文介绍如何使用STMicroelectronics的STM32微控制器来创建一个简单而有效的温度检测系统,以监控环境温度。【5】基于STM32的震动检测系统设计与实现cid:link_8震动检测系统是通过采集传感器获得的震动信号,对这些信号进行分析、处理和判定,以检测出可能存在的异常情况。本系统采用STM32F103单片机作为控制核心,配合加速度传感器采集震动信号,并通过LCD显示屏展示结果。【6】基于STM32的温湿度传感器设计cid:link_9本设计的目标是通过STM32微控制器读取温湿度传感器的数据,并将其显示在LCD屏幕上。我将通过I2C通信协议连接STM32与温湿度传感器,然后使用LCD显示模块将读取到的数据显示出来。该设计具有简洁的硬件连接和易于理解的软件代码,适合小白入门物联网及嵌入式系统的开发。【7】基于STM32的电机驱动设计cid:link_10本设计的目标是通过STM32微控制器实现一个双向速度可调的直流电机驱动系统。我使用STM32的PWM模块来生成控制信号,并通过一个H桥电路来实现电机的正反转。系统的用户界面将使用按钮来控制电机的启停和转速调节。该设计具有简明的硬件连接和易于理解的软件代码,适合小白入门电机驱动及嵌入式系统的开发。【8】基于STM32的通信模块设计cid:link_11本设计的目标是通过STM32微控制器实现一个无线通信模块,支持数据的发送和接收。我使用一个常见的无线通信模块(如NRF24L01),充当发送器和接收器之间的无线数据传输通道。系统的用户界面将使用串口通信进行控制和监控。该设计具有简明的硬件连接和可扩展的数据传输接口,适合小白入门通信模块和嵌入式系统的开发。【9】基于STM32的智能风扇设计cid:link_0随着智能家居技术的发展,越来越多的家庭设备变得智能化,其中包括了家庭电器。本文将介绍如何使用STM32微控制器设计一个智能风扇系统,该系统可以通过智能手机或其他智能设备进行远程控制。这个项目将引导完成从硬件选型到编程的整个过程,帮助创建一个简单但实用的智能家居设备。【10】基于树莓派和PCA9685控制二维云台的设计与实现cid:link_12二维云台是机器人和摄像头等设备中常见的部件,它可以实现水平和垂直方向的旋转,从而扩展设备的视野。本文将介绍如何使用树莓派和PCA9685舵机驱动模块来设计和实现一个简单的二维云台控制系统。【11】基于OpenHarmony的启航开发板的基础操作cid:link_13在物联网(IoT)领域,开发板扮演着至关重要的角色,为开发人员提供了实验和原型设计的平台。而OpenHarmony作为一个开源、可信赖的操作系统,为开发人员提供了便利和灵活性。本篇博客将介绍基于OpenHarmony的启航开发板的基础操作,并引导读者进入物联网开发的精彩世界。【12】物联网与传统网络的区别:开启智能时代的技术演进cid:link_1随着科技的飞速发展,物联网(Internet of Things,简称IoT)已经成为改变世界的重要驱动力之一。它不仅将个人、设备和网络连接起来,还创造了无穷无尽的可能性,影响着各个行业。那么,物联网和传统网络之间究竟有哪些区别?本文将深入探讨这个问题,并展示物联网的独特之处。【13】解析:物联网中的边缘计算是什么?cid:link_2在物联网技术不断发展的今天,边缘计算成为了一个备受关注的概念。它为物联网的应用和服务提供了更高效、响应更快的计算能力。那么,物联网中的边缘计算到底是什么?在本篇博客中,我深入探讨边缘计算的概念、优势以及在物联网中的应用。【14】解析IOT中的自动化和自动化配置cid:link_14随着科技的迅速发展,物联网(Internet of Things, IoT)已经成为了当今社会的一个热门话题。它将各种设备、传感器以及网络连接起来,实现了信息的互联互通,为我们的生活带来了极大的便利。在物联网中,自动化和自动化控制是两个至关重要的概念,它们为整个系统的稳定运行和高效管理提供了关键支持。本篇博客将深入探讨IOT中的自动化和自动化控制的含义、原理以及应用。【15】解析物联网设备的能耗优化cid:link_3物联网(Internet of Things, IoT)作为一种连接设备和传感器的网络,已经成为现代生活中不可或缺的一部分。然而,众多的物联网设备的普及和大规模部署也带来了能源消耗的问题。为了实现可持续发展和能源效率,优化物联网设备的能耗是一项至关重要的任务。本篇博客将探讨物联网设备的能耗优化的重要性,并介绍一些有效的优化方法。
  • [PLC专区] 【AR502H】【PLC】 PLC CCO 如何设置domain ?
       我的PLC   CCO 默认 domain 是 electricity, 相改成 common, 按文档操作没有成功。请问是什么原因?
  • [PLC专区] 如何修改PLC头端的领域(domain) ?
        我有个PLC CCO设备,默认的domain 是electricity, 想修改为 common.  按文档操作,没有成功,请行家帮我看看,谢谢。
  • 【资源】物联网工作级开发者认证(HCCDP–IoT)实验资源
    物联网工作级开发者认证(HCCDP–IoT)实验资源,详见附件;请登录个人华为帐号,然后下载附件。1、设备模拟器MQTT设备模拟器使用指导 | MQTT_Simulator.zip NB-IoT设备模拟器使用指导 | NB-IoTDeviceSimulatorCh.zip 2、模组集成开发资源L610_Driver.zipST-Link.zipSSCOM-HuaweiCloud.zipSTM32_ST-LINK_Utility_v4.5.0.zipSTM32U575_ADP-L610-Arduino_Project.zip
总条数:7138 到第 页
上滑加载中