2024年寒假在家练 - 基于TI MSPM0L1306设计智能温度调节展示系统
该项目使用了MSPM0L1306,实现了智能温度调节展示系统的设计,它的主要功能为:热敏电阻检测温度变化,彩色LCD显示当前温度和设定阈值。LED和RGB LED根据温度高低展示不同颜色。按键用于设置温度阈值,电位计调节LED显示的模式和强度。。
标签
MPU
显示
开发板
2024寒假练
来碗云天明?
更新2024-04-02
北京交通大学
282

项目简介

本项目设计了一个基于温度变化的彩色LCD显示系统,使用温度传感器NST112采集温度数据,并将其以直观的方式显示在彩色LCD上。用户可以通过电位计调节LED显示模式和亮度。该系统可以应用于各种场景,例如:

工业环境:监测设备温度,防止过热或过冷

家居环境:监测室内温度,调节空调或暖气

科研环境:采集温度数据进行分析

项目功能介绍

温度测量:使用NST112温度传感器实时采集环境温度,并将其显示在LCD上。

温度显示:将温度值以数字方式显示在彩色LCD上,方便用户查看。

显示模式调节:通过电位计调节LED模式

亮度调节:通过电位计调节LED显示亮度,适应不同环境光线条件。

设计思路

  • 采用MSPM0 L1306单片机作为系统的控制核心
  • 使用温度传感器NST112通过硬件I2C通信采集温度数据
  • 使用彩色LCD通过模拟SPI通信显示温度信息
  • 使用电位计改变PWM周期和占空比,通过PWM捕获来获取PWM波的周期和占空比来实现调节显示模式和亮度

硬件框图

软件流程图

硬件介绍

MSPM0 L1306单片机:MSPM0 L1306是一款低功耗、高性能的16位单片机,具有丰富的片上外围资源,能够满足本系统的控制需求。

温度传感器NST112:NST112是一款高精度、低功耗的数字温度传感器,能够提供精确的温度测量。

彩色LCD:彩色LCD能够以直观的方式显示温度信息,提高系统的用户体验。

电位计:电位计可以调节显示模式和亮度,方便用户进行个性化设置。

项目图片

主要代码片段及说明

main.c

#include "ti_msp_dl_config.h"
#include "delay.h"
#include "QDTFT_demo.h"
#include "Lcd_Driver.h"
#include "GUI.h"
#include "LED.h"
#include "Key.h"
#include "IIC.h"
#include "PWM_Capture.h"


extern float Temperature;
uint8_t temp_threshold;
uint16_t duty = 650;
uint16_t duty_max=650;
bool dir = 0;
bool LED_Mode=0;//0为普通,1为闪烁

struct PWM pwm;

int main(void)
{
uint8_t KEY_Num;
SYSCFG_DL_init();
LED_Init();
Lcd_Init();
Lcd_Clear(GRAY0);
Key_Init();
temp_threshold=25;

while (1)
{

pwm=Get_PWM_PAD();//268<pwm.Period<507 34< pwm.Duty<80
if(pwm.Duty>=75)
{
duty_max=80;
}
else if(pwm.Duty<=40)
{
duty_max=650;
}
if(pwm.Period>=490)
{
LED_Mode=0;
}
else if(pwm.Period<=285)
{
LED_Mode=1;
}
if(LED_Mode==1)
{
if(dir == 0)
{
duty=duty_max;
dir = 1;
}
else
{
duty=0;
dir=0;
}
}
IICstart();
KEY_Num=Key_GetNum();
if(KEY_Num==1)
{
temp_threshold++;

}
else if(KEY_Num==2)
{
temp_threshold--;

}
Gui_DrawFont_GBK16(10,90,BLACK,GRAY0,"温度阈值:");
Gui_DrawFont_int_Num(20,110,BLACK,GRAY0,temp_threshold);
Gui_DrawFont_GBK16(40,110,BLACK,GRAY0,"℃");


if(Temperature<=temp_threshold)
{
Gui_DrawFont_GBK16(2,10,GREEN,GRAY0, "室温:");
Gui_DrawFont_FloatNum(40,10,GREEN,GRAY0, Temperature);
Gui_DrawFont_GBK16(100,10,GREEN,GRAY0,"℃");
Gui_DrawFont_GBK16(16,40,GREEN,GRAY0," ");
Gui_DrawFont_GBK16(10,60,GREEN,GRAY0," ");
if(LED_Mode==1)
{
DL_Timer_setCaptureCompareValue ( PWM_LED2_INST ,0 ,GPIO_PWM_LED2_C1_IDX);
DL_Timer_setCaptureCompareValue ( PWM_LED2_INST ,0 ,GPIO_PWM_LED2_C0_IDX);
DL_Timer_setCaptureCompareValue ( PWM_LED1_INST ,duty ,GPIO_PWM_LED1_C0_IDX);
}
else
{
DL_Timer_setCaptureCompareValue ( PWM_LED1_INST ,duty_max ,GPIO_PWM_LED2_C0_IDX);
DL_Timer_setCaptureCompareValue ( PWM_LED2_INST ,0 ,GPIO_PWM_LED2_C1_IDX);
DL_Timer_setCaptureCompareValue ( PWM_LED2_INST ,0 ,GPIO_PWM_LED2_C0_IDX);
}
}
else
{
Gui_DrawFont_GBK16(2,10,RED,GRAY0, "室温:");
Gui_DrawFont_FloatNum(40,10,RED,GRAY0, Temperature);
Gui_DrawFont_GBK16(100,10,RED,GRAY0,"℃");
Gui_DrawFont_GBK16(16,40,RED,GRAY0,"高温");
Gui_DrawFont_GBK16(10,60,RED,GRAY0,"超出预设温度");
if(LED_Mode==1)
{
DL_Timer_setCaptureCompareValue ( PWM_LED2_INST ,0 ,GPIO_PWM_LED2_C0_IDX);
DL_Timer_setCaptureCompareValue ( PWM_LED1_INST ,0 ,GPIO_PWM_LED1_C0_IDX);
DL_Timer_setCaptureCompareValue ( PWM_LED2_INST ,duty ,GPIO_PWM_LED2_C1_IDX);

}
else
{
DL_Timer_setCaptureCompareValue ( PWM_LED2_INST ,duty_max ,GPIO_PWM_LED2_C1_IDX);
DL_Timer_setCaptureCompareValue ( PWM_LED2_INST ,0 ,GPIO_PWM_LED2_C0_IDX);
DL_Timer_setCaptureCompareValue ( PWM_LED1_INST ,0 ,GPIO_PWM_LED1_C0_IDX);
}
}
}
}
  • 主循环 (while(1)): 该循环持续执行程序逻辑。
    • 读取PWM信号
      • pwm = Get_PWM_PAD(): 该函数获取捕获到的PWM信号信息并存储在 pwm 结构中。
    • 根据PWM周期调整占空比
      • 代码检查捕获到的PWM周期 (pwm.Period) 并根据该值调整 duty_max 变量。这表明外部控制机制可能会影响LED亮度。
    • 根据PWM周期选择LED模式
      • 类似于上一点,代码检查 pwm.Period 并根据该值设置 LED_Mode 标志。这暗示外部控制也可能定义LED工作模式。
    • 闪烁LED逻辑(如果 LED_Mode 为1)
      • 代码根据 dir 标志设置 duty 变量在最大值 (duty_max) 和0之间,实现简单的LED闪烁行为。
    • 读取用户输入
      • IICstart(): 启动I2C通信并读取温度。
      • KEY_Num = Key_GetNum(): 获取按键值。
    • 根据用户输入更新温度阈值
      • 代码检查 KEY_Num 值并根据该值增加或减少 temp_threshold
    • 显示温度和阈值
      • 代码使用 Gui_DrawFont_GBK16 和 Gui_DrawFont_int_Num 函数(可能来自包含的库)在LCD上显示文本和数值,包括当前温度、阈值和单位。
    • 根据温度控制LED和文本颜色
      • 代码检查 Temperature 值与 temp_threshold 的比较结果。
        • 低于阈值(绿色)
          • 以绿色显示“室温”和温度值。
          • 根据 LED_Mode 将LED颜色(通过PWM控制)设置为绿色。
        • 高于阈值(红色)
          • 以红色显示“室温”和温度值。
          • 显示超过阈值的警告信息。
          • 根据 LED_Mode 将LED颜色(通过PWM控制)设置为红色。
  • 将NST112返回的温度信息进行解码换算:
float GetTemp(uint8_t volatile* buff)
{
uint8_t high, low;
uint16_t temp, num;
float temperature = 0;
high = buff[0];
low = buff[1];
if(high & 0x80){
temp = (high << 8) | low;
num = (((~temp) >> 4) + 1) & 0x0fff;
temperature = -0.0625 * num;
}else{
temp = (high << 8) | low;
num = temp >> 4;
temperature = 0.0625 * num;
}
return temperature;
}

遇到的主要难题及解决方法

温度测量精度问题:为了提高温度测量精度,使用了高精度温度传感器NST112。

LCD显示问题:为了提高LCD显示效果,优化了显示算法。

未来的计划或建议

将系统扩展为无线系统,可以通过手机或其他设备进行远程监控

增加更多功能,例如:历史温度数据存储和查询、温度报警功能、温控功能等。

总结

本项目设计了一个基于温度变化的彩色LCD显示系统,该系统具有以下特点:

测量精度高

显示直观

操作简单

功能扩展性强

该系统可以应用于各种场景,具有一定的实用价值。

附件下载
TI.zip
基于TI MSPM0L1306开发板的智能温度调节展示系统
团队介绍
北京交通大学 通信工程 窦海城
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号