描述
<p><div class="document">
<h2>目录</h2>
<p style="line-height: 1;"><strong><span style="font-size: 18pt;">· </span></strong> <strong>1.项目基本介绍</strong></p>
<p style="line-height: 1;"><strong><span style="font-size: 18pt;">· </span></strong> <strong>2.硬件部分与PCB设计</strong></p>
<p style="line-height: 1;"><strong><span style="font-size: 18pt;">· </span> 3.焊接过程</strong></p>
<p style="line-height: 1;"><strong><span style="font-size: 18pt;">· </span> 4.软件代码设计</strong></p>
<p style="line-height: 1;"><strong><span style="font-size: 18pt;">· </span> 5.过程中可能遇到的问题与解决方法</strong></p>
<p style="line-height: 1;"><strong><span style="font-size: 18pt;">· </span> 6.写在后面</strong></p>
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">1.项目基本介绍</h3>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8; text-align: justify;"> 当下我们对于温湿度检测仪已经不陌生了。在日常生活中我们在工位、办公室、家庭客厅等地点或许会突然想了解一下周围环境的温湿度,那么一个测量相对精准的桌面温湿度检测仪就会相当便利我们的日常生活。此项目旨在自己动手制作一个桌面温湿度检测仪,为非原创DIY项目。这个桌面温湿度检测仪是主要通过SSTM32G030K6T6作为主控电路,附加外部晶振模块,SHT40温度传感器模块,三态输出的8位移位寄存器,数码管,电池盒等组成。</p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8; text-align: justify;"> 需要说明的是,<strong>本人是一个彻彻底底的电子小白</strong>。这次训练营是我第一次尝试电子项目的全流程设计开发,我只是完成了学习视频教学、制作复刻作品的工作,没有拓展一些其他功能。本开源文件实际上是对我自己成功验证项目的学习历程记录,旨在给其他感兴趣的<strong>零基础爱好者</strong>提供一个复刻的开源方案。</p>
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">2.硬件部分与PCB设计</h3>
<p style="text-align: justify;"><strong>2.1 硬件部分</strong></p>
<p style="text-align: justify;"><strong>1. 主控电路 (STM32微控制器)</strong></p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/oshwhub/0cf543be8e9d4a4d89cd9b72f4ca8c51.png" alt="" width="429" height="247" /><br />芯片: STM32G030K6T6,作为核心控制器,处理来自传感器的数据,并通过其他外设(如移位寄存器和LED)进行输出。主要接口包括与SHT40温湿度传感器的I2C接口(SCL, SDA),控制LED显示和三态移位寄存器的逻辑信号(LED1_SER, LED2_SER, LED1_RCLK, LED1_SCLK等等)。</p>
<p><strong>2.晶振模块</strong>:</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/oshwhub/d20958856d1c4956932828c6786edf07.png" width="262" height="287" /></p>
<p>X1 晶振 (32.768kHz), 以及配套的电容(C3, C4),提供STM32微控制器的时钟源,用于计时和控制系统运行。<br />3. SHT40温湿度传感器模块</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/oshwhub/230ac13b29b248a3b1f25c5eada785ed.png" width="234" height="268" /><br />U2 (SHT40),用于测量环境的温度和湿度,并通过I2C总线将数据传输到STM32微控制器。<br />4. 三态输出的移位寄存器</p>
<p><img src="//image.lceda.cn/oshwhub/7fa63f109d394f4fab107244d04c87d4.png" /><br />U3 和 U4 (SN74HC595PWR)。通过串行输入/输出控制多路LED或其他外设的状态。移位寄存器使得微控制器可以通过少量的GPIO控制大量的输出设备。输出引脚控制各个LED灯的状态(LED1-LED12)。<br />5. 按键和指示LED</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/oshwhub/9f8fbaacfa8e44e3940a36bb194f559c.png" /><br />SW1 (按钮), LED1, LED2。SW1是一个按钮开关,用于唤醒或测试系统。LED1, LED2用于指示系统状态,如信号测试或系统唤醒。<br />6. 电源管理</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/oshwhub/bd7cf3a952bc46a29333192a1f8f284a.png" /><br />电池模块 (B1, B2), 场效应管和稳压模块。这里使用两节1.5V的五号电池,提供电路的电源,并通过场效应管防止电池反接,保护电路。稳压模块负责将电池电压稳定到3V,供给系统的其他部分使用。</p>
<p>7. SWD下载调试接口</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/oshwhub/47681473dc9e46d6870ca4ed9e872be9.png" /><br /> H1接口,用于调试和程序下载,通过SWDIO和SWCLK连接到STM32微控制器。<br /><br /></p>
<p>8.数码管显示模块</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/oshwhub/a149a0d31dbf4eb1bb695a0ce2422a23.png" /></p>
<p style="text-align: justify;"> 数码管显示电路LED3、LED4 (数码管)。借助两个移位寄存器控制数码管的显示,通过串行数据输入(SER)和移位时钟(SRCLK)来传输数据,然后通过RCLK将数据锁存输出到数码管的各段。LED1_SER, LED2_SER: 分别控制两个移位寄存器的数据输入。<br />LED1_RCLK, LED1_SCLK: 用于控制移位寄存器的锁存和时钟信号。LED3、LED4 用于显示数字,每个数码管的各段(A-G 和 DP)分别由移位寄存器的输出(Q0-Q7)控制。移位寄存器的输出直接连接到数码管的各个段,从而实现数字显示。</p>
<p> <strong>2.2 PCB设计</strong></p>
<p><strong> </strong>对于刚接触PCB设计的小白,画PCB板其实不需要理解太多知识点,我个人感觉PCB设计首先从模仿开始学习,逐渐积累一些PCB画板的经验,比如:</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/oshwhub/8045c5f56d034aa7be75674cc5113f0a.png" /></p>
<p>1.晶振模块通常需要靠近芯片布置,这是因为晶振产生的时钟信号非常关键,用于驱动微控制器或其他数字电路。靠近芯片布置可以最小化时钟信号路径的长度,从而减少信号损耗和干扰,提高信号完整性。并且如果时钟信号不稳定,会导致整个系统的不稳定或工作不正常。将晶振靠近芯片,有助于确保时钟信号的稳定性,从而提高整个电路的可靠性。</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/oshwhub/719ea81e49f049b698a9a231381e8bcf.png" /></p>
<p>2.放置数码管时,需要考虑与移位寄存器引脚的相对位置关系,大体上是根据飞线的顺逆程度来选择放置的位置与方向。在元件放置时就选择合适的位置其实有助于后续引线的便利程度,也能减少PCB板出现过多的过孔。</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/oshwhub/56e977fd910140eeb9f66548dc3a4a08.png" /></p>
<p>3.一定要清楚元件摆放是为实物操作、实物验证、后续引线服务的。PCB板元件的摆放其实和下棋蛮相似的,统筹布局,还要瞻前顾后。比如上图中的卧贴式唤醒按键的位置就需要考虑我们在使用实物时能不能正常地使用它,按键需要伸出板边一定长度。</p>
<p> 详细的手把手教学可以参考<a href="<a href="https://www.bilibili.com/video/BV15y411i73T/?spm_id_from=333.788&amp;vd_source=e1efdcb74a5b6364d0d2debf26efe45a" target="_blank">https://www.bilibili.com/video/BV15y411i73T/?spm_id_from=333.788&amp;vd_source=e1efdcb74a5b6364d0d2debf26efe45a</a>" target="<em>blank" rel="noopener">官方的带做视频</a>,看完后其实相当有收获的。</p>
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">3.焊接过程</h3>
<p style="text-align: justify;"><strong> </strong>这一环节其实是对电子小白最不友好的。所谓的教程都有点偏理论的感觉,焊接实际上还是应该多动手实践。并且小白的焊接充满了未知性(:D),就算原理图和PCB设计的再好也没法完成实物的验证,另外买元件的钱也不是大风刮来的。我这里就简单写写我遇到的问题和经验,给零基础爱好者避避雷。</p>
<p style="text-align: justify;"><img src="//image.lceda.cn/oshwhub/76228a05ce7f447ea5bc3178e62fc9f9.jpg" /></p>
<p style="text-align: justify;"> 我们打好板子后,可以发现很多元件是贴片的。对于没有焊接经验的选手最好直接上某宝买一个加热台和一管锡膏,花少量成本就能解决许多麻烦事。将锡膏均匀涂在焊盘上(可以用个牙签什么的),然后就可以放在加热台上进行加热了。我也是第一次用加热台焊贴片元件,感觉相当方便。</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="//image.lceda.cn/oshwhub/3bc2e5d944da4f878bd5f7a5ac4d351e.jpg" /></p>
<p> 在焊接的时候难免会碰到连锡的情况,特别是在焊芯片引脚的时候,比如这种:</p>
<p><img src="//image.lceda.cn/oshwhub/988e0429a5814ce49c23f4a06a2f5228.jpg" width="805" height="1850" /></p>
<p> 连锡的引脚可以在元件基本焊接完成后再来处理。我是买了一些吸锡带,配合电烙铁来处理连锡的。如果除锡效果不佳,可以用吸锡带浸一些松香再放在引脚上吸走多余的锡。用上松香的话基本上能处理得很好了,就是有点影响外观:</p>
<p><img src="//image.lceda.cn/oshwhub/e1bdc2a6291642868e60964cb7e66cc9.jpg" /></p>
<p> 直插式的电池座、排母、数码管这些就避免不了使用电烙铁了。直插式的元件相对比较简单,备好电烙铁、锡丝和尖嘴钳,参考一下网上的一些视频、学习一下焊接步骤,问题其实不大的。不过焊直插式元件时特别要注意,最好遵循“从小到大,从低到高”的焊接顺序,避免实物放置不稳之类的问题影响焊接(我就栽了个跟头</em>(:з」∠)_)。</p>
<p> 最后的成果如图所示:</p>
<p><img src="//image.lceda.cn/oshwhub/c77d34fc3b784a0ba36ad9f2ddf16db3.jpg" /></p>
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">4.软件代码设计</h3>
<p><strong> </strong>首先,程序的烧录需要使用下载器,可以在某宝买一个PWLINK2的仿真调试DAP下载器,使用步骤如下:</p>
<p><img src="//image.lceda.cn/oshwhub/c51b73bc05574558a312f97198669059.png" /></p>
<p> 在温湿度检测仪连接电脑后点击Options for Target(如上图),在弹出界面中选择Debug->Use->选择CMSIS-DAP DEBUGGER,如下图:</p>
<p><img src="//image.lceda.cn/oshwhub/55aa8c8f33c04a4a81aa1ea3907f0062.png" /></p>
<p> 点击Setting,这里可能会出现下图的情况:</p>
<p><img src="//image.lceda.cn/oshwhub/f4a643f9bbd845049e2bb919a1224e2e.png" /></p>
<p> 这里会出现连接错误,可能是由于没上电池的原因(我也不知道是为啥),电池盒上电池之后就正常了,如下图:</p>
<p><img src="//image.lceda.cn/oshwhub/148ff398987a4baa8e10175935209fab.png" /></p>
<p> 软件代码的设计可以参考<a href="<a href="https://www.yuque.com/wldz/jlceda/nhdssggs78punq4a" target="_blank">https://www.yuque.com/wldz/jlceda/nhdssggs78punq4a</a>" target="_blank" rel="noopener">官方的项目文档</a>,附件会添加有完整工程的代码,参考官方的项目文档可以详细学习一下STM32的项目编写。对于零基础的爱好者来说,这一部分当然可以直接应用官方的代码,但如果能简单理解一下代码的编写逻辑,加以查找网络资料等,可能会对之后的学习有一定的帮助。更详细的编写原理可以向其他大佬的文档学习。</p>
<p> 简单解释一下官方的代码(主要是main函数里的):</p>
<p> 这个代码是一个使用STM32微控制器的C语言程序,负责测量温度和湿度并通过数码管显示。它包含了一些初始化和低功耗模式的管理代码。</p>
<div class="group/conversation-turn relative flex w-full min-w-0 flex-col agent-turn">
<div class="flex-col gap-1 md:gap-3">
<div class="flex flex-grow flex-col max-w-full">
<div class="min-h-[20px] text-message flex w-full flex-col items-end gap-2 whitespace-pre-wrap break-words [.text-message+&]:mt-5 overflow-x-auto" dir="auto" data-message-author-role="assistant" data-message-id="58ae6d3c-f7f6-442f-b228-769c679b2317">
<div class="flex w-full flex-col gap-1 empty:hidden first:pt-[3px]">
<div class="markdown prose w-full break-words dark:prose-invert dark">
<h3>1. <strong>文件头部</strong></h3>
<ul>
<li>文件头部提供了基本信息,如文件名称、简要说明和版权声明。</li>
</ul>
<h3>2. <strong>头文件引入</strong></h3>
<ul>
<li>包括了所需的外部库文件,如<code>main.h</code>、<code>adc.h</code>、<code>i2c.h</code>、<code>tim.h</code>和<code>gpio.h</code>。</li>
</ul>
<h3>3. <strong>结构体定义</strong></h3>
<ul>
<li>使用一个名为<code>DEVICE_PARAMTER</code>的结构体来存储设备参数,在<code>main()</code>函数开始前初始化了这个结构体。</li>
</ul>
<h3>4. <strong>main()函数</strong></h3>
<p> 程序的入口点。</p>
<ul>
<li>
<p><strong>变量定义</strong>:定义了<code>temperature</code>和<code>humidity</code>两个浮点型变量来存储温度和湿度数据。</p>
</li>
<li>
<p><strong>HAL_Init()</strong>:初始化硬件抽象层(HAL),重置所有外设并初始化Flash接口和系统时钟。</p>
</li>
<li>
<p><strong>SystemClock_Config()</strong>:配置系统时钟。</p>
</li>
<li>
<p><strong>HAL_DeInit()</strong>:解除所有外设的初始化,可能是用于进入低功耗模式前的准备。</p>
</li>
<li>
<p><strong>外设初始化</strong>:初始化GPIO、ADC1、I2C1和TIM14定时器。</p>
</li>
<li>
<p><strong>显示控制</strong>:使用<code>SN74HC595_Send_Data()</code>函数关闭数码管和LED显示。<code>SN74HC595</code>是一个串入并出移位寄存器芯片,用于控制多个LED或数码管。</p>
</li>
<li>
<p><strong>进入低功耗模式</strong>:暂停滴答定时器,然后执行<code>HAL_PWR_EnterSLEEPMode()</code>函数让设备进入睡眠模式。</p>
</li>
</ul>
<h3>5. <strong>while(1)循环</strong></h3>
<p> 主循环,负责检测按键状态并执行相应操作。</p>
<ul>
<li>
<p><strong>按键检测</strong>:如果<code>KeyStatus</code>处于<code>KEY_SHAKE_STATE</code>,则延时10毫秒消除抖动,检测按键是否按下。</p>
</li>
<li>
<p><strong>温湿度读取</strong>:如果按键按下,通过<code>SHT40_Read_RHData()</code>函数读取温湿度数据,并将其存入<code>device_paramter</code>结构体中的<code>Temp</code>和<code>Humi</code>字段。然后启动定时器<code>htim14</code>显示两次数据。</p>
</li>
<li>
<p><strong>低功耗模式管理</strong>:如果<code>sleepStatus</code>为1,设备进入休眠状态。</p>
</li>
</ul>
<h3>6. <strong>时钟配置</strong></h3>
<ul>
<li><code>SystemClock_Config()</code>函数配置了系统时钟源、时钟类型和时钟分频器。使用了高频内部振荡器(HSI)作为时钟源,并配置了PLL(锁相环)模块。</li>
</ul>
<h3>7. <strong>Error_Handler()</strong></h3>
<ul>
<li>错误处理函数,在发生错误时会停机并禁用所有中断。</li>
</ul>
<h3>8. <strong>assert_failed()</strong></h3>
<ul>
<li>
<p>如果启用了<code>USE_FULL_ASSERT</code>宏,该函数用于报告断言失败的位置。</p>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">5.过程中可能遇到的问题与解决方法</h3>
<p> 我在整个过程中遇到最大的问题就是电池的问题。不知道是不是焊接的问题,使用两节南孚电池的1.5V5号电池用不了多久就会出现漏液和异响。四节测试的南孚电池全部都遇到了这样的问题,我建议可以换个品牌的碱性电池或者直接用充电锂电池比较好(目前还没有出现问题)。</p>
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">6.写在后面</h3>
<p> 非常感谢嘉立创提供一个手把手教做项目的机会。对于我这样一个电子小白,或许在原理和代码编写方面还需要深入学习,但是完成一个复刻项目也给了我非常大的成就感,让我接触电子产品的DIY制作,触摸到这片领域的大门。今后希望有更多机会锻炼自己,我也会在课余深入学习原理方面的知识,期待下一次的项目文档能写得更好。</p>
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">7.项目属性</h3>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">项目首次公开,为训练营项目,未参与过其他比赛或在学校参加过答辩。</p>
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">8.大赛LOGO验证</h3>
<hr class="horizontal-splitline normal-bold-2" />
<p style="line-height: 1.8;"><img src="//image.lceda.cn/oshwhub/1591aa0853624bb5aa1877251f5c1d58.jpg" /></p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"> </p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"><span style="color: #95a5a6; font-size: 14px;"> </span></p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"> </p>
</div></p>
评论(0)