描述
<h3 style="line-height:1.8">* 1、项目功能介绍</h3>
<p style="line-height:1.8"> 桌面温湿度检测仪是一种用于测量和显示环境温度和湿度的小型设备。它通常放置在桌面或其他室内位置,以便随时监测和查看当前的环境状况,以下是一些根据立创训练营DIY桌面温湿度检测仪。</p>
<p> <strong>1.1主要元器件</strong>:使用<a href="https://item.szlcsc.com/549609.html?fromZone=s_s__%2522stm32g030k6t6%2522" target="_blank">STM32G030K6T6</a>的主控芯片,传感器使用<a href="https://list.szlcsc.com/brand/506.html" target="_blank">瑞士盛思锐</a>的<a href="https://item.szlcsc.com/3188621.html?fromZone=s_s__" target="_blank">SHT40-AD1B,</a>显示使用三位共阳极数码管,供电使用2节的7号干电池。</p>
<p> <strong> 1.2.测量范围:</strong>桌面温湿度检测仪能够测量的温度范围在-10℃到50℃之间,湿度范围在20%到95%之间</p>
<h3 style="line-height:1.8">*2、项目属性</h3>
<hr>
<p style="line-height:1.8"><strong><span style="color:#95a5a6;font-size:14px">首次公开</span></strong></p>
<h3 style="line-height:1.8">* 3、开源协议</h3>
<hr>
<p style="line-height:1.8"><span style="color:#95a5a6;font-size:14px">使用GPL3.0开源协议</span></p>
<h3 style="line-height:1.8">*4、硬件部分</h3>
<p style="line-height:1.8"><span style="font-size:12pt"><strong>4.1主控芯片电路</strong></span></p>
<p style="line-height:1.8"><img style="display:block;margin-left:auto;margin-right:auto" src="//image.lceda.cn/oshwhub/86006125bf3a4166b0b1d772cba5690a.png"></p>
<p style="line-height:1.8"> 主控使用是<a href="https://item.szlcsc.com/549609.html?fromZone=s_s__%2522stm32g030k6t6%2522" target="_blank">STM32G030K6T6</a>芯片,外围的电路很就3个,一个是拉高复位(NRT)电路和芯片电源滤波电路。</p>
<p style="line-height:1.8"><img style="display:block;margin-left:auto;margin-right:auto" src="//image.lceda.cn/oshwhub/cd9f114a93e54630b209f7b7916285ec.png"></p>
<p style="line-height:1.8"> 还有一个就是晶振电路,使用是32.786KHZ的低速的外部晶振,其实芯片内部的晶振也可以满足本次的设计需要(后续可以省去,节约成本)</p>
<p style="line-height:1.8"><span style="font-size:12pt"><strong>4.2数据显示电路</strong></span></p>
<p style="line-height:1.8"><span style="font-size:12pt"><strong><img style="display:block;margin-left:auto;margin-right:auto" src="//image.lceda.cn/oshwhub/a449e8fb971e4cb4b4f73e215b159e49.png"></strong></span></p>
<p style="line-height:1.8"><span style="font-size:16px"> 本次使用的数码管显示温湿度,采用0.56寸三位数共阳极码管,具有成本低,功耗低特点,但不足之处是占用MUC的IO口,本身<a href="https://item.szlcsc.com/549609.html?fromZone=s_s__%2522stm32g030k6t6%2522" target="_blank">STM32G030K6T6的IO少。故采用</a></span><span style="font-size:12pt">移位寄存器电路,数码管移位寄存器使用74HC595移位电路如下</span></p>
<p style="line-height:1.8"><img style="display:block;margin-left:auto;margin-right:auto" src="//image.lceda.cn/oshwhub/d1738f1034d44e38920b0f0184aafadf.png"></p>
<div>
<p id="u816407a2"> N74HC595驱动时序相对简单,首先输入高电平或低电平到SER引脚中,随后产生一个SCLK的上升沿,将数据发送出去,这里是8位数据移位寄存器,所以循环8次,最后一个RCLK的上升沿将数据锁存住,保持不变,直到下一次发送;</p>
<p id="ud8625ed8">这里模拟一下发送时序;首先待发送的数据是0xFE(1111 1110)</p>
<p id="u1a74faf7">此时先发送最高位,也就是0xFE&0x80,判断高低电平;随后数据被送入QA;</p>
<p id="ue0538ee5">然后继续,发送次高位,也就是(0xFE<<1)&0x80,判断高低电平,随后之前的数据被挤到QB,这个数据移位到QA。</p>
<p id="ub311e616">依次类推...</p>
<p id="ue2eda7ba"><img style="display:block;margin-left:auto;margin-right:auto" src="//image.lceda.cn/oshwhub/e240d9b98b7e4c189683b543a4261df3.png" alt="" width="750" height="630"></p>
<p id="u9b79be1f"> 知道如何驱动数码管后就是想办法在指定位置显示数据了,根据前面的原理图可知,这两个数码管的阴极总共是6个阴极,全部连接在SN74HC595-U6上,通过这一个595芯片,可以指定某一个位导通,同时,两个数码管的阳极,又分别连接在另外两个595芯片上,通过这两个芯片配合,就可以实现单个位显示数据</p>
</div>
<h3>4.3供电电路</h3>
<p><span style="font-size:12pt"> 本项目使用两节干电池供电,为防止反接导致元器件烧毁,我们使用WST3401作为防护,并且通过两个10K电阻来取样判断电量是否充足。值得注意的是由于这里电阻采样而不是限流作用,所以对精度有要求,我们要使用0.1%误差的电阻</span></p>
<p style="line-height:1.8"> </p>
<ul>
<li style="line-height:1.8"><img style="display:block;margin-left:auto;margin-right:auto" src="//image.lceda.cn/oshwhub/ff968fb27ab642bd972e237605c37a23.png"></li>
</ul>
<h3>4.4传感器电路</h3>
<p> <span style="font-size:12pt">温湿度传感器使用盛思锐的 SHT40 为了方便,我们使用模块而非传感器直接焊接,我们使用1.27的4p排母来连接模块,传感器使用I²C通讯,注意使用上拉电阻,本次使用是4.7k也可以使用10k电阻。具体驱动代码编写可以参考<a title="SHT40 数据手册" href="https://atta.szlcsc.com/upload/public/pdf/source/20211021/851BA36A5CA574D725310F52CADA4510.pdf" target="_blank">https://atta.szlcsc.com/upload/public/pdf/source/20211021/851BA36A5CA574D725310F52CADA4510.pdf</a></span></p>
<p><img style="display:block;margin-left:auto;margin-right:auto" src="//image.lceda.cn/oshwhub/bea124c234bf4469a1c378523ca52a47.png"></p>
<p style="line-height:1.8"><span style="font-size:12pt"><strong>4.5 实物</strong></span></p>
<p style="line-height:1.8"><span style="font-size:10pt"> <span style="font-size:12pt"> <strong>4.51 </strong> 3D仿真图</span></span></p>
<p style="line-height:1.8"><span style="font-size:12pt"><strong><img src="//image.lceda.cn/oshwhub/a93d10d591f74e6aa30d5dc97f343871.png"></strong></span></p>
<p style="line-height:1.8"><span style="font-size:12pt"><strong>4.51 PCB打板图</strong></span></p>
<p style="line-height:1.8"><img src="//image.lceda.cn/oshwhub/ad99642302a941fb8b708705dc55092a.jpg" alt="" width="1906" height="1025"></p>
<p style="line-height:1.8"><span style="font-size:12pt"><strong>4.52 实物焊接图</strong></span></p>
<p style="line-height:1.8"><span style="font-size:12pt"><strong><img src="//image.lceda.cn/oshwhub/56000b4bcda64d829e82b243f65cd752.jpg" alt="" width="965" height="883"></strong></span></p>
<h3 style="line-height:1.8">*5、软件部分</h3>
<p> 软件开发使用是keil 5+VS code+STM32CUBEMX,关于Keil 5 +STM32 CUBEMX的软件的安装配置在<a href="https://www.yuque.com/wldz/jlceda/xr3fqzaxtxd2bahn" target="_blank">https://www.yuque.com/wldz/jlceda/xr3fqzaxtxd2bahn</a></p>
<p>可以参考一下,关于VS code的配置比较麻烦,可以参考<a href="https://blog.csdn.net/Johnor/article/details/134353311" target="_blank">vscode 和 keil协同使用开发stm32程序,超详细教程_vscode keil-CSDN博客</a></p>
<p><img style="display:block;margin-left:auto;margin-right:auto" src="//image.lceda.cn/oshwhub/ffee30d0ae99475bb9fd10faeb5b6cca.png"></p>
<p> 代码部分大部分是根据训练营给的代码进行调试的,因为我是复刻,所以几乎没有什么需要改动的地方,但因为官方提供是共阴极数码,而我用是共阳级数码管,加之我数码管焊反,需要改动的3个地方部分代码,改动代码如下:</p>
<div style="text-align:left"> 第1部分</div>
<div style="text-align:left">uint16_t sgh_value[11]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x80};//共阳极 焊反数据显示数组</div>
<div style="text-align:left"> </div>
<div style="text-align:left"> 第2部分</div>
<div style="text-align:left">void SN7HC595_Send_Data(unsigned char sn_num,unsigned int sendValue)//SN7H发送数据函数</div>
<div style="text-align:left">{</div>
<div style="text-align:left">uint8_t i=0;</div>
<div style="text-align:left">if(sn_num==1)</div>
<div style="text-align:left">{</div>
<div style="text-align:left">for(i=0;i<8;i++)</div>
<div style="text-align:left">{</div>
<div style="text-align:left"> if(sendValue&&(0x01<<i)==1)</div>
<div style="text-align:left">{</div>
<div style="text-align:left">HAL_GPIO_WritePin(LED1_SER_GPIO_Port,LED1_SER,GPIO_PIN_SET);</div>
<div style="text-align:left">}</div>
<div style="text-align:left">else</div>
<div style="text-align:left">{</div>
<div style="text-align:left">HAL_GPIO_WritePin(LED1_SER_GPIO_Port,LED1_SER,GPIO_PIN_RESET);</div>
<div style="text-align:left">}</div>
<div style="text-align:left">HAL_GPIO_WritePin(LED1_SCLK_GPIO_Port,LED1_SCLK,GPIO_PIN_RESET);</div>
<div style="text-align:left">HAL_GPIO_WritePin(LED1_SCLK_GPIO_Port,LED1_SCLK,GPIO_PIN_SET);</div>
<div style="text-align:left">}</div>
<div style="text-align:left">HAL_GPIO_WritePin(LED1_RCLK_GPIO_Port,LED1_RCLK,GPIO_PIN_RESET);</div>
<div style="text-align:left">HAL_GPIO_WritePin(LED1_RCLK_GPIO_Port,LED1_RCLK,GPIO_PIN_SET);</div>
<div style="text-align:left"> }</div>
<div style="text-align:left">else if(sn_num==2)</div>
<div style="text-align:left">{</div>
<div style="text-align:left">for(i=0;i<8;i++)</div>
<div style="text-align:left">{</div>
<div style="text-align:left"> </div>
<div style="text-align:left">if(sendValue&&(0x01<<i)==1)</div>
<div style="text-align:left">{</div>
<div style="text-align:left">HAL_GPIO_WritePin(LED2_SER_GPIO_Port,LED2_SER,GPIO_PIN_SET);</div>
<div style="text-align:left">}</div>
<div style="text-align:left">else </div>
<div style="text-align:left">{</div>
<div style="text-align:left">HAL_GPIO_WritePin(LED2_SER_GPIO_Port,LED2_SER,GPIO_PIN_RESET);</div>
<div style="text-align:left">}</div>
<div style="text-align:left">HAL_GPIO_WritePin(LED2_SCLK_GPIO_Port,LED2_SCLK,GPIO_PIN_RESET);</div>
<div style="text-align:left">HAL_GPIO_WritePin(LED2_SCLK_GPIO_Port,LED2_SCLK,GPIO_PIN_SET);</div>
<div style="text-align:left">}</div>
<div style="text-align:left">HAL_GPIO_WritePin(LED2_RCLK_GPIO_Port,LED2_RCLK,GPIO_PIN_RESET);</div>
<div style="text-align:left">HAL_GPIO_WritePin(LED2_RCLK_GPIO_Port,LED2_RCLK,GPIO_PIN_SET);</div>
<div style="text-align:left">}</div>
<div style="text-align:left">else if(sn_num==3)</div>
<div style="text-align:left">{</div>
<div style="text-align:left">for(i = 0;i < 8;i++)</div>
<div style="text-align:left">{</div>
<div style="text-align:left">if(((sendValue << i)&0x80)!=0)</div>
<div style="text-align:left">{</div>
<div style="text-align:left">HAL_GPIO_WritePin(DIG_SER_GPIO_Port,DIG_SER,GPIO_PIN_SET);</div>
<div style="text-align:left">}</div>
<div style="text-align:left">else</div>
<div style="text-align:left">{</div>
<div style="text-align:left">HAL_GPIO_WritePin(DIG_SER_GPIO_Port,DIG_SER,GPIO_PIN_RESET);</div>
<div style="text-align:left">}</div>
<div style="text-align:left">HAL_GPIO_WritePin(DIG_SCLK_GPIO_Port,DIG_SCLK,GPIO_PIN_RESET);</div>
<div style="text-align:left">HAL_GPIO_WritePin(DIG_SCLK_GPIO_Port,DIG_SCLK,GPIO_PIN_SET);</div>
<div style="text-align:left">}</div>
<div style="text-align:left"> HAL_GPIO_WritePin(DIG_RCLK_GPIO_Port,DIG_RCLK,GPIO_PIN_RESET);</div>
<div style="text-align:left"> HAL_GPIO_WritePin(DIG_RCLK_GPIO_Port,DIG_RCLK,GPIO_PIN_SET);</div>
<div style="text-align:left">}</div>
<div style="text-align:left"> </div>
<div style="text-align:left">}</div>
<div style="text-align:left"> </div>
<div style="text-align:left"> 第3部分</div>
<div style="text-align:left">
<div>void ShowNum(uint8_t row, uint8_t column, uint8_t value)</div>
<div>{</div>
<div>if(row == 1)</div>
<div>{</div>
<div>switch(column)</div>
<div>{</div>
<div>case 1://Èç¹ûÊǵÚÒ»ÅŵÚÒ»¸ö</div>
<div>SN74HC595_Send_Data(SN_DIG,0x04);</div>
<div>SN74HC595_Send_Data(SN_LED1,sgh_value[value]);//ÏÔʾֵ¶ÔÓ¦16½øÖÆÊý</div>
<div>break;</div>
<div>case 2:</div>
<div>SN74HC595_Send_Data(SN_DIG,0x02);</div>
<div>SN74HC595_Send_Data(SN_LED1,sgh_value[value]);</div>
<div>break;</div>
<div>case 3:</div>
<div>SN74HC595_Send_Data(SN_DIG,0x01);</div>
<div>SN74HC595_Send_Data(SN_LED1,(sgh_value[value]&0x7F));</div>
<div>break;</div>
<div>default:</div>
<div>break;</div>
<div>}</div>
<div>SysCtlDelay(1000);//????50us</div>
<div>SN74HC595_Send_Data(SN_LED1,0xFF);//ÏûÓ°£¬·ÀÖ¹´íλ</div>
<div>}</div>
<div>else</div>
<div>{</div>
<div>switch(column)</div>
<div>{</div>
<div>case 1:</div>
<div>SN74HC595_Send_Data(SN_DIG,0x20);</div>
<div>SN74HC595_Send_Data(SN_LED2,sgh_value[value]);</div>
<div>break;</div>
<div>case 2:</div>
<div>SN74HC595_Send_Data(SN_DIG,0x10);</div>
<div>SN74HC595_Send_Data(SN_LED2,sgh_value[value]);</div>
<div>break;</div>
<div>case 3:</div>
<div>SN74HC595_Send_Data(SN_DIG,0x08);</div>
<div> SN74HC595_Send_Data(SN_LED2,(sgh_value[value]&0x7F));</div>
<div>break;</div>
<div>default:</div>
<div>break;</div>
<div>}</div>
<div>SysCtlDelay(1000);//????50us</div>
<div>SN74HC595_Send_Data(SN_LED2,0xFF);</div>
<div>}</div>
<div>}</div>
</div>
<div style="text-align:left"> </div>
<div style="text-align:left"> 其他代码可以参考 立创训练营给的资料文档https://www.yuque.com/wldz/jlceda/xr3fqzaxtxd2bahn</div>
<div style="text-align:left"> 里面的软件开发讲解比较详细。<img src="//image.lceda.cn/oshwhub/f9595a2216ab4382a1ad7483471ed2d1.png"></div>
<h3 style="line-height:1.8">*6、大赛LOGO验证</h3>
<hr>
<p style="line-height:1.8"> </p>
<p style="line-height:1.8"><img src="//image.lceda.cn/oshwhub/80872c833f2b48f1b68a8106fcbed4bc.png"></p>
<p style="line-height:1.8"> </p>
<h3 style="line-height:1.8">* 7、演示您的项目并录制成视频上传</h3>
<hr>
<p style="line-height:1.8">第一个视频是实物,第一次焊接,有很多错误,反复重新焊接,导致不美观,建议新手使用低温锡加焊台</p>
<p style="line-height:1.8">第二个是PCB视频</p>
<p style="line-height:1.8"> </p>
<p style="line-height:1.8"><span style="font-size:14px"><a href="/posts/de460543d4cf4dacb5f0326612455578" target="_blank">前往查看更多详情 ></a></span></p>
<p style="line-height:1.8"> </p>
-
video(2).mp4
-
屏幕录制 2024-08-19 215239.mp4
评论(0)