描述
<h3>1、项目功能介绍</h3>
<hr>
<p>按下温度或湿度按键后,主控从睡眠中唤醒,通过I2C接口,与<strong>盛思锐温湿度模块</strong>通信获取检测到的环境温度和湿度,通过数码管显示温度或湿度,显示若干秒后,再次进入睡眠。主控为STM32G030K6T6,使用两节7号电池供电,软件使用stm32CubeIDE开发,使用HAL库。</p>
<p><img src="//image.lceda.cn/oshwhub/670b21967b974018876bb1c22c520c94.jpg" alt="微信图片_20240730073701-17223042013781.jpg"></p>
<p><img src="//image.lceda.cn/oshwhub/e4c6d69342a3496ead15955280669439.jpg" alt="微信图片_20240730073714.jpg"></p>
<h3>2、项目属性</h3>
<hr>
<p><strong>立创训练营</strong>(温湿度检测仪训练营)作业</p>
<h3>3、开源协议</h3>
<hr>
<p><strong>GPL 3.0</strong></p>
<h3>4、硬件部分</h3>
<hr>
<h4>(1)电池防反接、电池仓、测量电池电压</h4>
<p><img src="//image.lceda.cn/oshwhub/8dd57a8486204e7d9c4c405ea92abe69.png" alt="image.png"></p>
<p>通过pmos管防止电池反接烧坏电路,通过两个10kΩ电阻分压测量电池电压,注意:电阻精度应选择<strong>1%</strong></p>
<h4>(2)主控、晶振、复位电路</h4>
<p><img src="//image.lceda.cn/oshwhub/c0795d8e58584dda84e5dd9b82214c05.png" alt="image.png"></p>
<p>根据<a href="https://atta.szlcsc.com/upload/public/pdf/source/20200511/C529329_A1CB615556C746C4EA827FCAD1461480.pdf" target="_blank">主控数据手册</a>可以使用2.0v~3.6v供电,所以,可以直接使用两节7号电池串联供电,为了提升时钟信号准确性,外接了低速无源晶振。</p>
<h4>(3)调试接口与扩展接口</h4>
<p><img src="//image.lceda.cn/oshwhub/588ccae3a30243a19f15106b60d94674.png" alt="image.png"></p>
<p>使用ST-LINK调试,留了SWCLK和SWDIO接口,将未使用的io接口引出。</p>
<h4>(4)低电量指示灯</h4>
<p><img src="//image.lceda.cn/oshwhub/13e78f3b107341958b665657fb717a91.png" alt="image.png"></p>
<p>一个led灯,用于指示电池电量低/</p>
<h4>(5)数码管控制与数码管</h4>
<p><img src="//image.lceda.cn/oshwhub/1ad58c8db3e348cfa7f3119f4be34609.png" alt="image.png"></p>
<p>为了减少主控IO使用数量,使用8位移位寄存器,该寄存器8位串行输入,并行输出。RCLK引脚每接收一个升沿时,从SER引脚接收一位数据,当接收了8位数据后,SRCLK引脚接收一个升沿,将刚才接收到的8位数据输出到QA~QH引脚。</p>
<p>如图:</p>
<p><img src="//image.lceda.cn/oshwhub/a0dee06c9391453c9ed897f6358627f6.png" alt="image.png"></p>
<p>数码管引脚:</p>
<p><img src="//image.lceda.cn/oshwhub/94d600431a79452f80e0737bb977ea75.png" alt="image.png"></p>
<h4>(6)盛思锐温湿度模块</h4>
<p><img src="//image.lceda.cn/oshwhub/1e0a05a13e4a4cdca6ba7a97471326f0.png" alt="image.png"></p>
<p>根据<a href="https://item.szlcsc.com/24072575.html?fromZone=s_s__%2522c22437501%2522" target="_blank">数据手册</a>,模块使用I2C通信,给SDA和SCL分别接10kΩ上拉电阻</p>
<p><img src="//image.lceda.cn/oshwhub/28537b8cff634ca7aaf385ad25e73940.png" alt="image.png"></p>
<p>注意,引脚顺序</p>
<p><img src="//image.lceda.cn/oshwhub/9c0518518dc94452bf19ac0fcf2c9a70.png" alt="image.png"></p>
<h4>(7)按键</h4>
<p><img src="//image.lceda.cn/oshwhub/8cf5e5aac13a41e2980fc9c1aed0ed44.png" alt="image.png"></p>
<p>当sw1按下,数码管显示温度,当sw2按下,数码管显示湿度</p>
<h4>(8)PCB设计</h4>
<p>注意要给传感器模块留足空间,晶振底部不能铺铜和走线。</p>
<h4>(9)焊接</h4>
<p>先焊贴片后焊插件</p>
<h4>(10)测试</h4>
<p>最后用万用表电阻档测量3v引脚与GND是否短接,若电阻太小,说明短接</p>
<h3>5、软件部分</h3>
<hr>
<h4>(1)环境搭建</h4>
<ul>
<li>下载JAVA8:<a href="https://www.java.com/zh-CN/" target="_blank">java.com/zh-CN/</a></li>
</ul>
<p><img src="//image.lceda.cn/oshwhub/6122cbe76682499294b688ec8f481e38.png" alt="image.png"></p>
<ul>
<li>下载stm32CubeIDE:<a href="https://www.st.com/en/development-tools/stm32cubeide.html" target="_blank">https://www.st.com/en/development-tools/stm32cubeide.html</a></li>
</ul>
<p><img src="//image.lceda.cn/oshwhub/cbed15ec0f9c46d7856bd433b0f301f8.png" alt="image.png">
注意安装路径不要有中文</p>
<ul>
<li>在stm32CubeIDE登录自己的账号</li>
</ul>
<h4>(2)创建工程</h4>
<p><img src="//image.lceda.cn/oshwhub/b9531f10929a4fb8aeae82d4f62df98c.png" alt="image.png"></p>
<h4>(3)图形化界面配置引脚</h4>
<p><img src="//image.lceda.cn/oshwhub/ce2efdf0d46a413aa6028b366d8740ac.png" alt="image.png"></p>
<p><strong>GPIO</strong></p>
<p><img src="//image.lceda.cn/oshwhub/9476d0d06fe542fe8ee795457f3fed12.png" alt="image.png">
<strong>ADC</strong></p>
<p><img src="//image.lceda.cn/oshwhub/5adbd3f558794074aea378b886051dcc.png" alt="image.png">
<strong>TIM</strong></p>
<p><img src="//image.lceda.cn/oshwhub/2054e01b8b644e208d25d7c82b6c7e44.png" alt="image.png"></p>
<h4>(4)代码编写</h4>
<p>原课程项目文档<a href="https://www.yuque.com/wldz/jlceda/nhdssggs78punq4a" target="_blank">204:桌面温湿度仪项目文档 (yuque.com)</a>,在此基础上,略有改动。</p>
<h5><strong>总体逻辑</strong></h5>
<ul>
<li>初始化:系统启动时,初始化所有相关的硬件接口,包括GPIO, I2C, ADC, 和定时器。</li>
<li>睡眠模式:在主循环中,设备默认进入睡眠模式,等待按键中断唤醒。</li>
<li>按键处理:当温度或湿度按键被按下触发中断唤醒设备,并通过消抖处理后,调用 Body() 函数读取并处理温湿度数据,启动定时器进行数据显示。</li>
<li>显示控制:通过定时器中断控制数码管显示,显示温度或湿度数据。如果在一定时间内没有按键操作,设备将自动返回睡眠状态。</li>
<li>电压监控:在 Body() 函数中,还会检查电池电压,如果电压过低,将点亮LED0作为指示。</li>
</ul>
<h5><strong>adc.c</strong></h5>
<pre><code class="language-c">/*adc.c*/
float Get_VolValue(void)
{
uint32_t ADC_Value = 0;
float VolValue = 0;
HAL_ADC_Start(&hadc1); // 启动ADC
HAL_ADC_PollForConversion(&hadc1, 50); // 等待转换完成或超时
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))
{
ADC_Value = HAL_ADC_GetValue(&hadc1); // 读取ADC值
VolValue = (ADC_Value*3.0f)/4095.0f; // 将ADC值转换为电压值
}
return VolValue; // 返回电压值
}
</code></pre>
<h5><strong>i2c.c</strong></h5>
<pre><code class="language-c">
/*i2c.c*/
void SHT40_Read_RHData(float *temperature,float *humidity)
{
uint8_t writeData[1] = {0xFD}; // 用于启动温湿度传感器的命令
uint8_t readData[6] = {0}; // 存储从传感器读取的数据
uint32_t tempData = 0;
HAL_I2C_Master_Transmit(&hi2c1, (uint16_t)SHT40_Write, (uint8_t *)writeData, 1, HAL_MAX_DELAY); // 向传感器发送命令
HAL_Delay(10); // 等待传感器处理
HAL_I2C_Master_Receive(&hi2c1, (uint16_t)SHT40_Read, (uint8_t *)readData, 6, HAL_MAX_DELAY); // 从传感器接收数据
tempData = readData[0] </code></pre>
评论(0)