内容介绍
内容介绍
项目简介
本项目设计了一个基于温度变化的彩色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周期 (
- 根据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
查看更多
猜你喜欢
2024年寒假练 - 基于TI MSPM0L1306的综合开发平台的智能温度调节展示系统该项目使用了iar软件、C语言,实现了基于TI MSPM0L1306的综合开发平台的智能温度调节展示系统的设计,它的主要功能为:热敏电阻检测温度变化, 彩色LCD显示当前温度、设定阈值、加热状态和ADC采样值。 RGB LED根据温度高低展示不同颜色。 按键用于控制加热, 电位计调节RGB LED显示的模式和刷新。旋转式编码器调节温度阈值。
Acquaaaaaaa
534
2024年寒假练 - 基于MSPM0L1306设计智能温度调节展示系统该项目使用了MSPM0L1306开发板、IAR、sysconfig,实现了智能温度调节展示系统的设计,它的主要功能为:通过多种方式在LCD显示屏和RGB LED上显示温度,且可设置温度阈值,超过后报警。
IXI
1187
2024年寒假练 - 基于TI MSPMOL1306设计智能温度调节展示系统该项目使用了TI MSPMOL1306,实现了智能温度调节展示系统的设计,它的主要功能为:热敏电阻检测温度变化,彩色LCD显示当前温度和设定阈值。LED和RGB LED根据温度高低展示不同颜色。按键用于设置温度阈值,电位计调节LED显示的模式和强度。。
YXR
547