基于STM32的智能插座远程控制系统
本文详细介绍基于STM32的刷卡指纹智能门禁系统。
获取资料/指导答疑/技术交流/选题/帮助,请点链接:
https://gitee.com/zengzhaorong/share_contact/blob/master/stm32.txt
1 系统功能
1.2 功能概述
本系统是由stm32硬件端和机智云APP构成,两者通过WIFI无线连接,采用机智云官方协议通信,硬件端由STM32和外设模块(HLM8032电压电流功率传感器、ESP8266WIFI模块,继电器,DHT11温湿度传感器,MQ2烟雾传感器,OLED,AMS1117电源转换模块,家用排插)组成。主要实现以下功能:
1.远程控制插座开关,可定时关闭插座;
2.远程监控插座电压,电流,功率,温湿度等参数;
3.当插座电压,电流,功率,温湿度等参数超过APP设定的阈值,自动断开插座电源,并发送警报信息到机智云APP;
4.OLED实时显示电压,电流,功率,温湿度,定时时间等。
1.2 实物图


1.3 主要功能图解
1.3.1 OLED实时显示电压,电流,功率,温湿度

1.3.2 继电器定时关闭

1.3.3 ESP8266 WIFI配网

1.3.4 机智云APP功能展示

1.3.5 传感器数据监测异常报警

2 硬件概述
2.1 原理图

3 软件实现(部分代码展示)
3.1 hlm8032串口初始化
static void MX_USART3_UART_Init(void)
{
huart3.Instance = USART3;
huart3.Init.BaudRate = 4800;
huart3.Init.WordLength = UART_WORDLENGTH_8B;
huart3.Init.StopBits = UART_STOPBITS_1;
huart3.Init.Parity = UART_PARITY_NONE;
huart3.Init.Mode = UART_MODE_TX_RX;
huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart3.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart3) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}
3.2 hlm8032接收数据处理
void hlm8032_data_analysis(hlm8032_data_st *data,uint8_t *src)
{
static uint8_t k=0;
uint32_t VP_REG=0,V_REG=0,CP_REG=0,C_REG=0,PP_REG=0,P_REG=0,PF_COUNT=0,PF=0;
if(src[0]!=0xaa)//оƬÎó²îÐÞÕý¹¦ÄÜÕý³££¬²ÎÊýÕý³£
{
VP_REG=src[2]*65536+src[3]*256+src[4];//¼ÆËãµçѹ²ÎÊý¼Ä´æÆ÷
V_REG=src[5]*65536+src[6]*256+src[7];//¼ÆËãµçѹ¼Ä´æÆ÷
data->voltage = (VP_REG/V_REG)*Ue;//¼ÆËãµçѹֵ£¬1.88ΪµçѹϵÊý£¬¸ù¾ÝËù²ÉÓõķÖѹµç×è´óСÀ´È·¶¨
//printf("µçѹֵ£º%0.2fV; ",data->voltage);
CP_REG=src[8]*65536+src[9]*256+src[10];//¼ÆËãµçÁ÷²ÎÊý¼Ä´æÆ÷
C_REG=src[11]*65536+src[12]*256+src[13];//¼ÆËãµçÁ÷¼Ä´æÆ÷
data->current = ((CP_REG*Ce*100)/C_REG)/100.0;//¼ÆËãµçÁ÷Öµ
//printf("µçÁ÷Öµ£º%0.3fA; ",data->current);
//printf(" %X ",src[0]);
if(src[0]>0xf0)//ÅжÏʵʱ¹¦ÂÊÊÇ·ñδÒç³ö
{
//printf("δ½ÓÓõçÉ豸!");
}
else
{
PP_REG=src[14]*65536+src[15]*256+src[16];//¼ÆË㹦ÂʲÎÊý¼Ä´æ
P_REG=src[17]*65536+src[18]*256+src[19];//¼ÆË㹦ÂʼĴæÆ÷
data->power = (PP_REG/P_REG)*Ue*Ce;//¼ÆËãÓÐЧ¹¦ÂÊ
//printf("ÓÐЧ¹¦ÂÊ£º%0.2fW; ",data->power);
}
if((src[20]&0x80)!=old_reg)//ÅжÏÊý¾Ý¸üмĴæÆ÷×î¸ßλÓÐûÓзת
{
k++;
old_reg=src[20]&0x80;
}
PF=(k*65536)+(src[21]*256)+src[22];//¼ÆËãÒÑÓõçÁ¿Âö³åÊý
PF_COUNT=((100000*3600)/(PP_REG*Ue*Ce))*10000;//¼ÆËã1¶Èµç¶ÔÓ¦µÄÂö³åÊýÁ¿
data->power_consumption = ((PF*10000)/PF_COUNT)/10000.0;//¼ÆËãÒÑÓõçÁ¿
//printf(" %d %d ",PF,PF_COUNT);
//printf("ÒÑÓõçÁ¿£º%0.4f¡ã\r\n",data->power_consumption);
}
else//оƬÎó²îÐÞÕý¹¦ÄÜʧЧ
{
printf("data error\r\n");
}
}
3.3 机智云下发数据处理
int8_t gizwitsEventProcess(eventInfo_t *info, uint8_t *gizdata, uint32_t len)
{
uint8_t i = 0;
dataPoint_t *dataPointPtr = (dataPoint_t *)gizdata;
moduleStatusInfo_t *wifiData = (moduleStatusInfo_t *)gizdata;
protocolTime_t *ptime = (protocolTime_t *)gizdata;
#if MODULE_TYPE
gprsInfo_t *gprsInfoData = (gprsInfo_t *)gizdata;
#else
moduleInfo_t *ptModuleInfo = (moduleInfo_t *)gizdata;
#endif
if((NULL == info) || (NULL == gizdata))
{
return -1;
}
for(i=0; i<info->num; i++)
{
switch(info->event[i])
{
case EVENT_relay_switch:
currentDataPoint.valuerelay_switch = dataPointPtr->valuerelay_switch;
GIZWITS_LOG("Evt: EVENT_relay_switch %d \n", currentDataPoint.valuerelay_switch);
if(0x01 == currentDataPoint.valuerelay_switch)
{
//user handle
}
else
{
//user handle
}
break;
case EVENT_relay_timer:
currentDataPoint.valuerelay_timer = dataPointPtr->valuerelay_timer;
GIZWITS_LOG("Evt:EVENT_relay_timer %d\n",currentDataPoint.valuerelay_timer);
time_change(currentDataPoint.valuerelay_timer,&relay_timer);
//user handle
break;
case EVENT_mq2_limit:
currentDataPoint.valuemq2_limit = dataPointPtr->valuemq2_limit;
GIZWITS_LOG("Evt:EVENT_mq2_limit %d\n",currentDataPoint.valuemq2_limit);
//user handle
break;
case EVENT_current_limit:
currentDataPoint.valuecurrent_limit = dataPointPtr->valuecurrent_limit;
GIZWITS_LOG("Evt:EVENT_current_limit %4f\n",currentDataPoint.valuecurrent_limit);
//user handle
break;
case EVENT_vol_limit:
currentDataPoint.valuevol_limit = dataPointPtr->valuevol_limit;
GIZWITS_LOG("Evt:EVENT_vol_limit %4f\n",currentDataPoint.valuevol_limit);
//user handle
break;
case EVENT_power_limit:
currentDataPoint.valuepower_limit = dataPointPtr->valuepower_limit;
GIZWITS_LOG("Evt:EVENT_power_limit %4f\n",currentDataPoint.valuepower_limit);
//user handle
break;
case EVENT_temp_limit:
currentDataPoint.valuetemp_limit = dataPointPtr->valuetemp_limit;
GIZWITS_LOG("Evt:EVENT_temp_limit %4f\n",currentDataPoint.valuetemp_limit);
//user handle
break;
case EVENT_humi_limit:
currentDataPoint.valuehumi_limit = dataPointPtr->valuehumi_limit;
GIZWITS_LOG("Evt:EVENT_humi_limit %4f\n",currentDataPoint.valuehumi_limit);
//user handle
break;
case WIFI_SOFTAP:
break;
case WIFI_AIRLINK:
break;
case WIFI_STATION:
break;
case WIFI_CON_ROUTER:
break;
case WIFI_DISCON_ROUTER:
break;
case WIFI_CON_M2M:
break;
case WIFI_DISCON_M2M:
break;
case WIFI_RSSI:
GIZWITS_LOG("RSSI %d\n", wifiData->rssi);
break;
case TRANSPARENT_DATA:
GIZWITS_LOG("TRANSPARENT_DATA \n");
//user handle , Fetch data from [data] , size is [len]
break;
case WIFI_NTP:
GIZWITS_LOG("WIFI_NTP : [%d-%d-%d %02d:%02d:%02d][%d] \n",ptime->year,ptime->month,ptime->day,ptime->hour,ptime->minute,ptime->second,ptime->ntp);
break;
case MODULE_INFO:
GIZWITS_LOG("MODULE INFO ...\n");
#if MODULE_TYPE
GIZWITS_LOG("GPRS MODULE ...\n");
//Format By gprsInfo_t
GIZWITS_LOG("moduleType : [%d] \n",gprsInfoData->Type);
#else
GIZWITS_LOG("WIF MODULE ...\n");
//Format By moduleInfo_t
GIZWITS_LOG("moduleType : [%d] \n",ptModuleInfo->moduleType);
#endif
break;
default:
break;
}
}
return 0;
}
3.4 机智云上传数据处理
static void upstream_data_hdl(void)
{
currentDataPoint.valuetemp = temperature;//Add Sensor Data Collection
currentDataPoint.valuehumi = humirity;//Add Sensor Data Collection
currentDataPoint.valuemq2 = mq2_value;
currentDataPoint.valuerelay_vol = hlm8032.voltage;
currentDataPoint.valuerelay_current = hlm8032.current;
currentDataPoint.valuepower = hlm8032.power;
if(relay_timer.hours || relay_timer.mins || relay_timer.seconds){
currentDataPoint.valuerelay_timer = relay_timer.hours*60 + relay_timer.mins+1;
}else{
currentDataPoint.valuerelay_timer = 0;
}
}
获取详细资料/指导答疑/技术交流/选题/帮助,请点链接:
https://gitee.com/zengzhaorong/share_contact/blob/master/stm32.txt
更多推荐



所有评论(0)