说一个不起眼的小知识点----时钟相位

outclk1:10Mhz

outclk2:10Mhz(+90°)

波形如下图所示

关于相位时钟

outclk1:10Mhz

outclk2:10Mhz(-90°)

波形如下图中所示

关于相位时钟

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RT-Thread X STM32 全连接大赛 智能甲醛检测仪 作者: 乔季军 开发环境:RT-Thread Studio 硬件框架:基于RT-Thread 提供的ART-PI 开发板实现,详细硬件请参考项目设计文档 【RT-Thread作品秀】智能甲醛检测仪作者:乔季军 概述家里房子装修完已经快一年了,装修完一直保持着通风,最近回家住的比较频繁,每次回去住总还是觉得比较别扭,总担心屋里的甲醛会不会还是超标,自己总想着搞一个甲醛检测仪的装置来放到屋里,这样就能够实时查看到屋里面的甲醛浓度了。调研了一番,发现市面上的比较便宜的甲醛检测装置基本都不准确,于是乎自己便开始搜寻相关传感器,寻思着能否自己DIY一个甲醛检测装置,在给自己寻找乐子的同时,也能够做一个使用的物件。 通过调研发现,目前市面上检测甲醛的传感器主要分为两类,一类是半导体式,另一类是电化学式。半导体式甲醛传感器主要是根据甲醛散发到周围空气中,导致周围空气的导电率发生变化来感知甲醛浓度的,这一类传感器主要是根据导电率的特性来检测甲醛的,很容易收到其他环境因素的影响,例如周围湿度的变化也会导致空气的导电率发生改变,因此使用这种传感器测得甲醛浓度就没有太大的参考意义了,另外一种是电化学式传感器, 这种传感器上面有一层滤膜,用来过滤空气中的其他干扰杂质,传感器中包含有一种能够和甲醛发生反应的催化剂,当催化剂和甲醛接触时,就会形成电信号的波动,电信号的波动和甲醛浓度值的变化有一定的关系,因此使用这种传感器检测的甲醛浓度相对来讲会更准确一些。 笔者在调研完之后,选择了英国达特公司设计生产的WZ-S-K 型电化学式甲醛检测传感器,用用来检测甲醛浓度值,此外,还使用到了DHT11 温湿度传感器,用于检测周围环境的温湿度信息。 该智能甲醛检测仪主要实现甲醛检测及温湿度检测功能,检测到的数据通过LCD显示屏实时的显示出来,同时还能够将传感器数据上传到ONENET物联网平台,用来记录历史传感器数据,同时也能够利用这些数据信息和其他设备联动。 开发环境硬件:ART-PI、DHT11温湿度传感器、达特WZ-S-K型甲醛传感器 RT-Thread版本:4.0.3 开发工具及版本:RT-Thread Studio 2.0.0 甲醛传感器介绍WZ-S-K 型甲醛检测传感器模组是英国达特公司设计的一款基于电化学的甲醛检测传感器,具有测量精度高、响应速度快、使用寿命长、功耗低等特点。该传感器能够直接将周围环境中的甲醛含量转换为浓度值,通过串口标准化输出,这款甲醛检测传感器能够非常方便的集成到产品中去,适用于智能家居、便携式测量仪表等产品。 RT-Thread使用情况概述使用 RT-Thread 开发物联网应用的优势已经非常明显了,借助于RT-Thread 软件包生态,开发者只需要关系自己的应用逻辑即可。 该项目使用到许多RT-Thread 的软件包,具体请参考以下截图。 演示视频: 比赛感悟这次比赛,我使用RT-Thread 从头到尾设计了一款基本满足正常使用的甲醛检测设备。整体下来,觉得使用RT-Thread 物联网操作系统进行应用开发还是非常便捷的,借助于软件生态,可以大大缩短开发周期。 设计过程中主要有两部分内容需要攻克,一部分是关于甲醛浓度检测及单位换算部分,这部分查阅了一些资料,总觉得不太合理,传感器输出的浓度单位为ppb或ppm(1ppm=1000ppb),而作为我们日常使用中,比较容易理解的单位是 mg/m3 ,从 ppb 到 mg/m3 之间的换算,网上有很多种法,其中我找到的最不合理的法就是 1ppm = 1mg/m3。经过深入研究,发现这其实是化学单位中常用的几个不同的单位,这两个单位之间的换算还要结合不同物质的物质的量来进行计算,经过自己实际对比验证和联系供应商验证问题,最终得出的结论为甲醛浓度单位ppm和 mg/m3 之间的换算关系为: 1ppm = 0.74666 mg/m3 这种看着不起眼的单位换算,背后还是有一些知识点需要理解的,如果单单的将 1ppm 理解为 1mg/m3 的话,最终会造成读取的数据不准确,那么这样的甲醛检测仪也就没有什么设计的意义了。 第二部分内容就是关于LCD显示部分的GUI部分,这部分开发工作相对可查的资料比较多,开源的GUI也很对,网上针对ART-PI进行的GUI适配工作也有很多分享,笔者也亲自适配了lvgl这套开源的GUI,但是对于笔者,还是希望能够在设计过程中深入理解LCD驱动和GUI部分的原理,于是乎在开发过程中,笔者自己动手编写了GUI部分的画点、画线、绘制圆、绘制矩形、显示字符等函数,在编写过程中也参考了正点原子的GUI部分的代码,但是这对于我理解GUI部分的原理已经足够了,借此机会,我还设计了几个GUI的控件,用来显示一些传感器数
以下是一个简单的搜索框示例,包含自定义搜索引擎功能: HTML代码: ``` <div class="search-container"> <input type="text" id="search-input" placeholder="Search..."> <button class="search-button" onclick="search()">Search</button> <div class="search-engines"> <button class="engine-button" onclick="selectEngine()">Google</button> <button class="engine-button" onclick="selectEngine()">Bing</button> <button class="engine-button" onclick="selectEngine()">Yahoo</button> <button class="engine-button" onclick="selectCustomEngine()">Add</button> <div id="custom-engine" class="hidden"> <input type="text" id="engine-name" placeholder="Enter engine name"> <input type="text" id="engine-url" placeholder="Enter engine search url"> <button class="add-button" onclick="addEngine()">Add Engine</button> </div> </div> </div> ``` CSS代码: ``` .search-container { display: flex; align-items: center; } #search-input { flex: 1; padding: 6px; font-size: 16px; border: none; border-radius: 4px; background-color: #f1f1f1; } .search-button { margin-left: 6px; padding: 6px 12px; font-size: 16px; border: none; border-radius: 4px; background-color: #4CAF50; color: #fff; cursor: pointer; } .search-engines { position: relative; } .engine-button { margin-left: 6px; padding: 6px 12px; font-size: 16px; border: none; border-radius: 4px; background-color: #f1f1f1; cursor: pointer; } #custom-engine { position: absolute; top: 100%; left: 0; margin-top: 6px; padding: 6px; border-radius: 4px; background-color: #fff; box-shadow: 0 2px 4px rgba(0,0,0,0.2); } .hidden { display: none; } ``` JS代码: ``` var searchUrl = 'https://www.google.com/search?q='; function search() { var searchInput = document.getElementById('search-input'); var query = searchInput.value; window.location.href = searchUrl + encodeURIComponent(query); } function selectEngine() { // TODO: set searchUrl based on selected engine // example: searchUrl = 'https://www.bing.com/search?q='; } function selectCustomEngine() { var customEngine = document.getElementById('custom-engine'); customEngine.classList.toggle('hidden'); } function addEngine() { var engineName = document.getElementById('engine-name').value; var engineUrl = document.getElementById('engine-url').value; if (engineName && engineUrl) { var engines = document.getElementsByClassName('search-engines')[0]; var button = document.createElement('button'); button.className = 'engine-button'; button.textContent = engineName; button.onclick = function() { searchUrl = engineUrl; selectEngine(); } engines.insertBefore(button, engines.lastChild); var customEngine = document.getElementById('custom-engine'); customEngine.classList.add('hidden'); } } ``` 上面的代码展示了一个简单的搜索框,包含一个文本输入框、搜索按钮和选择搜索引擎的按钮。点击搜索按钮会将查询字符串添加到搜索引擎的URL中,并打开新页面进行搜索。选择搜索引擎时,可以通过设置全局变量searchUrl来确定所选引擎的URL。添加自定义搜索引擎时,用户可以在弹出的表单中输入引擎名称和搜索URL,并将其添加为选项之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值