基于STM32设计的数显热水器

发布时间:2023-08-15  

一、项目介绍

当前介绍的项目是基于 STM32F103ZET6 系列 MCU 设计的数显热水器,通过显示屏来显示热水器的温度及其工作状态,通过 PT100 传感器来检测热水器的温度变化,并通过电加热片实现加热过程,以达到控制热水器温度的目的。


二、设计流程

2.1 硬件选型

STM32F103ZET6 系列 MCU

OLED 显示屏

PT100 温度传感器

电加热片

继电器


2.2 软件设计

(1)显示屏


使用 OLED 显示屏来显示热水器的温度及其工作状态,通过 SPI 接口与 STM32 芯片进行通讯。设计温度值及其单位、热水器工作状态等。


(2)温度传感器


使用 PT100 温度传感器来检测热水器内部温度的变化,并将数据通过 ADC 转换后,传输给 STM32 芯片,以实现对热水器加热过程的控制。


(3)电加热片


使用电加热片模拟热水器加热过程,通过继电器控制电加热片的通断,以调节热水器的温度。


(4)控制系统


通过 STM32 芯片来实现对热水器的控制,读取温度传感器的数据。


三、代码设计

3.1 OLED显示屏

(1)SPI 接口初始化

需要对 STM32F103ZET6 的 SPI 接口进行初始化配置,设置相关的时钟和模式,使其能够与 OLED 显示屏进行通讯。


RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE); // 打开SPI3时钟

 SPI_InitTypeDef spi_init_type;

 spi_init_type.SPI_Direction = SPI_Direction_2Lines_FullDuplex;

 spi_init_type.SPI_Mode = SPI_Mode_Master;

 spi_init_type.SPI_DataSize = SPI_DataSize_8b;

 spi_init_type.SPI_CPOL = SPI_CPOL_Low;

 spi_init_type.SPI_CPHA = SPI_CPHA_1Edge;

 spi_init_type.SPI_NSS = SPI_NSS_Soft;

 spi_init_type.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32; // 设置 SPI 时钟频率为 72 MHz / 32 = 2.25MHz

 spi_init_type.SPI_FirstBit = SPI_FirstBit_MSB;

 SPI_Init(SPI3, &spi_init_type);

 SPI_Cmd(SPI3, ENABLE);

(2)OLED 显示屏初始化

以下是 OLED 显示屏的初始化代码:


void OLED_Init(void) {

     GPIO_SetBits(GPIOB, GPIO_Pin_6);   //RST SET

     GPIO_ResetBits(GPIOB, GPIO_Pin_6); //RST RESET

     GPIO_SetBits(GPIOB, GPIO_Pin_6);   //RST SET

 

     write_command(0xAE); // 关闭显示

     write_command(0xD5); // 设置时钟分频因子,震荡频率

     write_command(0x80); // 分频因子=1 ,震荡频率(fosc)=8MHz

     write_command(0xA8); // 设置驱动路数:MUX(复用方式)

     write_command(0x1F); // 1/32 duty (0x0F~0x3F)

     write_command(0xD3); // 设置显示偏移

     write_command(0x00); // 不偏移

     write_command(0x40); // 设置显示开始行[5:0], 对于设置了32行的液晶,

     // 这里的值为0表示从0行开始显示

     write_command(0x8D); // 对比度设置

     write_command(0x14); // AHB参考电压256等分 移位[3:0]100[n,1/256]

     write_command(0x20); // 水平方向上的寻址模式

     write_command(0x00); // 垂直方向上的寻址模式

     write_command(0xA1); // 设置段再映射

     write_command(0xC0); // 设置COM扫描方向

     write_command(0xDA); // 设置COM引脚硬件配置

     write_command(0x12);

     write_command(0x81); // 对比度设置

     write_command(0xBF); // 设置电荷泵电压

     write_command(0xD9); // 设置预充电周期

     write_command(0xF1);

     write_command(0xDB); // 设置VCOMH电压倍率

     write_command(0x40);

     write_command(0xAF); // 打开显示

 

     OLED_Clear(); // 清屏

 }

(3)OLED 显示函数

接下来编写 OLED 显示函数,实现字符和数字的显示功能。


void OLED_show_string(uint8_t x, uint8_t y, char *str) {

     uint8_t i = 0;

     while (str[i] != '') {

         OLED_show_char(x, y + i * 8, str[i]);

         ++i;

     }

 }

 

 void OLED_show_char(uint8_t x, uint8_t y, char ch) {

     uint8_t c = ch - 32;

     if (c >= 96) return;

     uint8_t* buffer = (uint8_t*)oled_buffer;

     uint8_t cx, cy;

     for (cy = 0; cy < 8; cy++) {

         uint8_t line = font[c][cy];

         for (cx = 0; cx < 6; cx++) {

             if (line & 0x1) {

                 buffer[(y + cy) * OLEDWIDTH + x + cx] = 1;

             } else {

                 buffer[(y + cy) * OLEDWIDTH + x + cx] = 0;

             }

             line > >= 1;

         }

     }

     OLED_Draw_Pixel(x + 6, y, 0);

     OLED_Draw_Pixel(x + 6, y + 1, 0);

     OLED_Draw_Pixel(x + 6, y + 6, 0);

     OLED_Draw_Pixel(x + 6, y + 7, 0);

 }

(4)结果显示

在代码中调用 OLED_show_string 函数和 OLED_show_char 函数显示数值和字符。


OLED_Init();

 OLED_Clear();

 OLED_show_string(0, 0, "HELLO WORLD!");

 OLED_show_string(0, 16, "TEMP:20 C");

3.2 测温代码

(1)引脚配置

需要对 STM32F103ZET6 的 IO 口进行配置,将用于连接 PT100 温度传感器的引脚设置为输入模式。


这里以 PA0 引脚作为 PT100 传感器的连接口(即 PT100 三线连接中的 R3 端),代码如下:


GPIO_InitTypeDef GPIO_InitStructure;

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入模式

 GPIO_Init(GPIOA, &GPIO_InitStructure);

(2)ADC 配置

接下来需要对 STM32F103ZET6 的 ADC 进行初始化配置,使其能够读取 PT100 温度传感器输出的电压信号。


这里以 ADC1 通道5 作为读取口,代码如下:


ADC_InitTypeDef ADC_InitStructure;

 RCC_ADCCLKConfig(RCC_PCLK2_Div6); // 设置 ADC 时钟为 PCLK2 的 1/6

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // 打开 ADC1 时钟

 ADC_DeInit(ADC1); // 初始化 ADC1

 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

 ADC_InitStructure.ADC_ScanConvMode = DISABLE;

 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; // 连续转换模式

 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

 ADC_InitStructure.ADC_NbrOfChannel = 1;

 ADC_Init(ADC1, &ADC_InitStructure);

 ADC_Cmd(ADC1, ENABLE); // 开启 ADC1

(3)温度转换函数

根据 PT100 温度传感器输出电压与温度的关系,可使用线性函数计算出温度值。


转换公式如下:


Rt = (Vref - Vpt) / Ipt // Rt 为 PT100 的阻值,Vref 为基准电压,Vpt 为 PT100 输出电压,Ipt 为 PT100 驱动电流

 Temp = a * Rt + b // Temp 为温度值,a 和 b 为经过拟合后的系数

其中 Rt 的计算需要使用差分运算放大器进行转换,这里不再赘述。假设已经得到 Rt 值,则温度转换函数代码如下:


float PT100_Get_Temperature(float Rt)

 {

     float a = 3.9083e-3f, b = -5.775e-7f, R0 = 100.0f; // 根据实际数据进行拟合得到 a、b 和 R0 的值

     float Tem, delta;

     delta = pow(Rt / R0, 2) + a * (Rt / R0) + b;

     Tem = (delta > 0) ? (-R0*a + sqrt(delta)) / (2 * b) : 0;

     return Tem;

 }

(4)数据采集

根据差分放大器输出的电压值得到 PT100 温度传感器的阻值,再根据阻值计算出实际温度,最后将温度值通过串口打印出来。以下是数据采集代码:


float ADC_Get_Voltage(void)

{

    float voltage = 0;

    uint16_t adc_val = 0;

    ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_239Cycles5); // 配置 ADC 通道5

    ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 使能软件触发 ADC 转换

    while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); // 等待转换结束

    adc_val = ADC_GetConversionValue(ADC1); // 读取 ADC 转换结果

    voltage = (float)adc_val * 3.3f / 4096; // 计算基准电压

    return voltage;

}


float PT100_Get_Rt(float Vpt)

{

    float Rsource = 10e3f, Rpt = 100.0f; // Rsource 为差分放大器输出电阻,Rpt 为 PT100 阻值

    float Ipt = (3.3f - Vpt) / Rsource; // 计算 PT100 驱动电流

    float Rt = (3.3f - Vpt) / Ipt; // 根据欧姆定律计算出 PT100 阻值

    return Rt;

}


void USART1_Send_Float(float f)

{

    char buf[32];

    sprintf(buf, "%.1f

", f); // 转换为字符串

    while (*buf)

    {

        USART_SendData(USART1, *buf);

        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);

        buf++;

    }

}


int main(void)

{

    ...

    while (1)

    {

        float Vpt = ADC_Get_Voltage(); // 获取差分放大器输出电压

        float Rt = PT100_Get_Rt(Vpt); // 计算 PT100 阻值

        float Temp = PT100_Get_Temperature(Rt); // 根据阻值计算温度

        USART1_Send_Float(Temp); // 将温度值打印到串口

        delay_ms(500);

    }

    ...

}


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    热水器电闸总跳闸是什么原因;如果热水器电闸总跳闸,那么我们需要先查找问题的根源,可能是以下原因导致电闸总跳闸: 1. 过载:如果热水器使用功率过高,超出了电路的额定容量,那么......
    也有保质期,下面是人民网整理的常见家用电器的安全使用年限,及时收藏。 ①电热毯:安全使用年限为6年,超期服役容易漏电引发火灾; ②电热水器:安全使用年限为8年,超期服役会增加漏电危险; ③电高压锅:安全使用......
    壶 第四种情况: 220V供电 1KW功率 阻性负载(比如单相热水器) 计算公式如下 电流=功率/电压 =1000W/220=4.54(约等于4.5A) 上面老王家的电热水器属于第四种情况, 220v供电......
    通过NTC热敏电阻监测水温的变化。当水温升高到特定阈值时,NTC热敏电阻的电阻值减小,电流增大,电路开关断开,电热水器停止加热。当水温低到特定阈值时,NTC热敏电阻的电阻值增大,电流减小,电路......
    箱四周留出一定空间,保证良好的散热能力;内部定期清理霜(无霜机型可PASS),定期清理内部过期食品。 热水器:超龄使用危险系数很高 热水器也是家庭中危险系数较高的一类电器。关于电热水器漏电致人死亡、燃气热水器......
    美的燃气热水器的风压故障跟水压有关系吗;  美的燃气热水器报风压故障跟水压有关系,但不一定就是水压引起的。风压和水压正常是燃气热水器正常工作的必要条件。   当我们打开热水龙头的时候,水气......
    能够通过传感器采集不同客户接入的自来水水体体质,通过AI水质智能调控,最后能够产出TDS都在80左右的优质矿泉水。 很多家庭为了能够随时使用热水进行生活、沐浴,家中的燃气热水器或是电热水器或许是常年打开的状态,这不......
    加热器等。 在征得客户同意后,该系统可以使用先进的软件对电力短缺作出反应,如将成千上万个家庭的电池(如电动汽车中的电池)从充电模式切换到放电模式,或让热水器等用电设备降低功率。 图片......
    电子温度探测、电热水壶、空调、冰箱等。        并不是所有电子产品都需要使用热敏电阻,比如在一些低成本、低精度和低要求的应用中,可以使用其他类型温度传感器代替热敏电阻。但是......
    热片 继电器 2.2 软件设计 (1)显示屏 使用 OLED 显示屏来显示热水器的温度及其工作状态,通过 SPI 接口与 STM32 芯片进行通讯。设计温度值及其单位、热水器工作状态等。 (2......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>