本帖最后由 jinglixixi 于 2025-2-17 11:20 编辑
通过前面的技术铺垫,可以将其整合成一个具有智感效果的电热水壶,它由OLED屏来显示感知数据并具有双设双控的功能,即可以设置水位高度和加热温度、可控制注水的高度和加热的温度。 在水位的管控上,是通过超声波模块来实现,它有2个工位,一个在水壶外,是通过手掌来设置注水高度的;一个工位是在水壶上端,它是在向水壶注水时监控水位的高度,一旦达到指定的水位高度,则控制水泵停止注水,并将超声波模块转换到设置水位的工位,以供下一次使用。 另一个是通过电位器来设置加热温度,用NTC温度传感器来检测加热温度,当达到设置温度时,会控制加热器暂停加热,在温度低于设置温度时,会再次启动加热以维持在指定的温度值。 实现双设双控的显示界面如图1所示:
图1 显示界面形式
实现OLED屏界面显示的程序为: int main(void)
{
uint8_t dat,i;
uint8_t zl[10]={0x7E,0xFF,0x06,0x03,0x00,0x00,0x01,0xFE,0xF7,0xEF};
GPIO_Config_T gpioConfig;
USART_Config_T usartConfig;
APM_DelayInit();
GPIO_Init();
KEY_Init();
APM_DelayUs(100);
ADC_Init();
OLED_Init();
OLED_Clear();
OLED_ShowCHinese(24,0,0);
OLED_ShowCHinese(40,0,1);
OLED_ShowCHinese(56,0,2);
OLED_ShowCHinese(72,0,3);
OLED_ShowCHinese(88,0,4);
OLED_ShowCHinese(0,2,5);
OLED_ShowCHinese(16,2,6);
OLED_ShowCHinese(64,2,7);
OLED_ShowCHinese(80,2,8);
OLED_ShowCHinese(0,6,11);
OLED_ShowCHinese(16,6,12);
OLED_ShowChar(32,2,':',16);
OLED_ShowChar(96,2,':',16);
OLED_ShowNum(40,2,6,2,16);
OLED_ShowNum(104,2,36,2,16);
OLED_ShowChar(32,4,':',16);
OLED_ShowChar(96,4,':',16);
OLED_ShowNum(40,4,6,2,16);
OLED_ShowNum(104,4,36,2,16);
OLED_ShowChar(32,6,':',16);
OLED_ShowChar(96,6,':',16);
OLED_ShowString(40,6,"OFF",16);
OLED_ShowString(104,6,"OFF",16);
while (!ADC_ReadStatusFlag(ADC_FLAG_ADRDY));
ADC_StartConversion();
while (1)
{
ADC_MultiChannelPolling();
APM_DelayMs(500);
}
}
1)超声波测控程序 含有工位切换与检测数据显示的超声波测距程序为:
void USART_Receive_Isr(void)
{
uint8_t dat;
uint16_t l;
if (USART_ReadStatusFlag(MINI_COM1, USART_FLAG_RXBNE) == SET)
{
dat = (uint8_t)USART_RxData(MINI_COM1);
sj[j]=dat;
j=j+1;
}
if((j==4)&&(f<3))
{
l=sj[1]*256+sj[2]; // mm
l=l/10; // cm
if(GPIO_ReadInputBit(GPIOC, GPIO_PIN_13)==1)
{
OLED_ShowNum(40,2,l,2,16); // 设置
s1=l;
if(f==2) f=f+1;
}
else
{
OLED_ShowNum(40,4,l,2,16); // 测距
if(l<s1)
{
OLED_ShowString(40,6,"OFF",16);
}
else
{
OLED_ShowString(40,6,"ON ",16);
}
f=2;
}
j=0;
if(f<3) printf("%c", 0x55);
}
}
图2 超声波测距
在控制方面,是采用开发板上控制电机的某一相来控制注水水泵的启停;而加热器的控制则是用继电器或可控硅来完成。
2)NTC温度测控程序 为与主界面相匹配,相应的A/D数据采集与显示程序为: void ADC_MultiChannelPolling(void)
{
float voltage;
uint8_t index;
uint16_t W,P,O;
for (index = 0; index < ADC_CH_SIZE; index++)
{
voltage = (adcData[index] * 3300.0) / 4095.0;
if(index == 1)
{ // NTC
OLED_ShowNum(40,2,(voltage-1540),4,16);
O=bh(voltage-1540);
OLED_ShowNum(104,4,O,2,16);
if(O<P)
{
GPIO_ClearBit(GPIOA, GPIO_PIN_12);
OLED_ShowString(104,6,"ON ",16);
}
else
{
GPIO_SetBit(GPIOA, GPIO_PIN_12);
OLED_ShowString(104,6,"OFF",16);
}
}
if(index == 2)
{ // 电位器
W=bh(voltage);
P=W;
OLED_ShowNum(104,2,W,2,16);
}
}
}
图3 温度检测
|