在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于STM32設計的數顯熱水器

DS小龍哥-嵌入式技術 ? 來源:DS小龍哥-嵌入式技術 ? 作者:DS小龍哥-嵌入式技 ? 2023-06-25 09:29 ? 次閱讀

一、項目介紹

當前介紹的項目是基于 STM32F103ZET6 系列 MCU 設計的數顯熱水器,通過顯示屏來顯示熱水器的溫度及其工作狀態,通過 PT100 傳感器檢測熱水器的溫度變化,并通過電加熱片實現加熱過程,以達到控制熱水器溫度的目的。

二、設計流程

2.1 硬件選型

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);
    }
    ...
}

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • OLED
    +關注

    關注

    119

    文章

    6220

    瀏覽量

    224827
  • STM32
    +關注

    關注

    2272

    文章

    10924

    瀏覽量

    357583
  • 熱水器
    +關注

    關注

    5

    文章

    217

    瀏覽量

    27146
  • Pt100
    +關注

    關注

    9

    文章

    172

    瀏覽量

    69253
  • STM32F103ZET6
    +關注

    關注

    9

    文章

    67

    瀏覽量

    21201
收藏 人收藏

    評論

    相關推薦

    基于STM32設計的太陽能熱水器

    本項目使用 STM32F103C8T6 微控制作為核心處理,結合多個傳感和執行,實現了太陽能熱水
    的頭像 發表于 06-26 09:29 ?2518次閱讀
    基于<b class='flag-5'>STM32</b>設計的太陽能<b class='flag-5'>熱水器</b>

    燃氣熱水器的自檢方法

    據櫻花衛廚的安檢技術人員介紹,使用燃氣熱水器的客戶,自行檢查非常重要,自檢方式也很簡便:燃氣熱水器打開時,看指示燈和數碼顯示屏顯示的內容是否正常,有沒有出現故障帶;透過熱水器的觀察孔,觀察火苗是否為
    發表于 01-25 16:22

    太空能熱水器介紹—摘自《新型熱水器的使用與維修》

    `原書信息:新型熱水器的使用與維修978-7-111-39381-8辛長平 編著本書主要內容有:基礎知識;空氣能熱水器的性能與工作原理,空氣能熱水器工作循環系統與主要部件,空氣能熱水器
    發表于 09-18 10:52

    熱水器出現水垢及處理方法

    熱水器出現水垢,也許很多人都要問水垢是什么呢?出現水垢又有什么影響?這又該怎么辦呢?比如說:家里的熱水器看上去明明是好的,但是為什么制熱效果不如從前的好呢?每次都要加熱很長的時間,并且,相同溫度的水
    發表于 06-15 16:51

    【GoKit申請】基于GoKit的智能熱水器的設計

    申請理由:家里的熱水器既不能顯示溫度,也不能遠程控制,又不能開關控制,很耗電。在物聯網時代,作為電子工程師,自己動手開發一個很有必要哦~·!項目描述:利用stm32與溫度傳感相連,數據采集后發送給
    發表于 11-02 10:47

    熱水器控制

    求單片機的熱水器控制設計資料,哪位大神會做熱水器控制的仿真啊?求好人分享
    發表于 04-12 18:52

    熱水器問題

    我的智能熱水器上電都是待機狀態,無法使用智能插座,如何改裝或操作
    發表于 02-19 08:59

    如何避免燃氣熱水器引起的危險

    如何避免燃氣熱水器引起的危險如何才能避免燃氣熱水器引起的危險呢?專家介紹,最好的辦法是淘汰直排式熱水器和壽命到期的熱水器,同時使用時
    發表于 02-21 15:48 ?2365次閱讀

    空氣能熱水器和電熱水器哪個好?空氣能熱水器和電熱水器有什么不同

     電熱水器是指以電作為能源進行加熱的熱水器。是與燃氣熱水器、太陽能熱水器相并列的三大熱水器之一。電熱水器
    發表于 01-03 09:22 ?3823次閱讀

    空氣能熱水器跟普通熱水器有什么區別

    熱水器就是指通過各種物理原理,在一定時間內使冷水溫度升高變成熱水的一種裝置。按照原理不同可分為電熱水器、燃氣熱水器、太陽能熱水器、磁能
    發表于 01-03 14:14 ?3961次閱讀

    熱水器漏電保護跳閘原因

    熱水器漏電保護跳閘原因。原因有很多,只有對熱水器跳閘和熱水器跳閘原因有充分的了解,才能正確判斷熱水器漏電保護
    的頭像 發表于 12-25 15:50 ?8.2w次閱讀

    熱水器和燃氣熱水器哪個好

    熱水器是如今城鎮家庭家電必不可以少的產品,電熱水器看似簡單,但是非常重要,對于初次裝修的小白來說,安裝前多了解十分有必要。是安裝電熱水器好還是燃氣熱水器好呢?
    的頭像 發表于 02-28 11:42 ?4070次閱讀

    零冷水熱水器與普通熱水器的優缺點

    前段時間,朋友家安裝的一種叫做“零冷水熱水器”引起了我的注意。據了解,這種零冷水熱水器可以實現普通熱水器無法實現的效果,在使用熱水時不需要再等待十幾秒鐘了,即開即熱,大大提升了使用體驗
    的頭像 發表于 12-05 09:56 ?8.1w次閱讀

    使用STM32熱水器控制系統設計

      摘要:針對熱水器在智能家居中的實際應用,設計了一種基于STM32熱水器控制系統,用戶可以遠程實現熱水器的水溫控制。本設計以STM32F
    發表于 07-20 15:02 ?13次下載

    燃氣熱水器使用方法 燃氣熱水器的升大小有什么區別

    燃氣熱水器是一種通過燃燒燃氣產生熱能,并將其傳遞給水的設備,用于供應熱水。它是現代家庭生活中常見的一種熱水供應方式。本文將介紹燃氣熱水器的使用方法以及不同升
    的頭像 發表于 02-04 16:55 ?1733次閱讀
    主站蜘蛛池模板: 最刺激黄a大片免费观看下截 | 日本三级黄色录像 | 国产成人精品日本亚洲网站 | 午夜免费福利网站 | 好紧好湿好黄的视频 | 乱妇伦小说 | 人人干国产 | 亚洲久优优色优在线播放 | 四虎网站 | 国产拍拍拍免费视频网站 | 老色99久久九九精品尤物 | 天天操天天射天天舔 | 国产一级特黄老妇女大片免费 | 澳门三级bd高清 | 国产福利萌白酱喷水视频铁牛 | 男人的午夜影院 | 二级特黄绝大片免费视频大片 | 欧美一区二区三区精品 | 夜色爽| 久久久久国产一级毛片高清片 | 久久综合中文字幕 | 国产亚洲精品美女久久久 | 好大好硬好深好爽想要免费视频 | 亚洲欧美在线观看 | 美女视频永久黄网站免费观看国产 | 天天躁狠狠躁 | 一级做a爱片特黄在线观看免费看 | 三级天堂 | 亚洲看片| 禁网站在线观看免费视频 | 小屁孩和大人啪啪 | 国产精品久久久亚洲456 | 天天色天天操综合网 | 久久夜夜操妹子 | 亚洲高清国产拍精品影院 | 激情欧美在线 | 亚洲成a人在线播放www | 欧美成人性色区 | 啪啪小视频网站 | 亚洲免费一区二区 | 久久久夜夜夜 |