标题:
基于机智云的一主机多从机的程序结构设计
[打印本页]
作者:
LHM
时间:
2022-10-3 19:39
标题:
基于机智云的一主机多从机的程序结构设计
之前在学习做的设计里面使用了一主机多从机的结构设计。
#include "main.h"
uint8_t UIflag=0;
uint8_t UIflag2=0;
//对机智云设备进行初始化
void GizWitsInit(void )
{
BASIC_TIM_Init(); //利用定时器给设备提供一个1MS的精确时钟
TIM_RCC_APB1PeriphClockCmd(TIM_RCC_APB1Periph_TIMX,ENABLE); //开定时器时钟
esp_usartx_init(); // wifi初始化 波特率必须为9600 //WIFI串口初始化 波特率9600
userInit(); //设备状态结构体初始化,用来跟ESP8266进行接收发送的通信
memset((uint8_t*)¤tDataPoint, 0, sizeof(dataPoint_t)); //初始化内存
gizwitsInit(); //缓冲区初始化
// //初始化RTC时钟
// RTC_NVIC_Config(); // 配置RTC秒中断优先级
// RTC_CheckAndConfig(&systmtime);
}
/*
主板使用的模块功能进行初始化(不包括机智云要使用的设备)
*/
void Hardware_Init(void )
{
DHT11_Init(); //温湿度传感器初始化
Init_BH1750(); //光照传感器初始化
ADCx_Init(); //ADC采样初始化,进行烟雾的AD数值采样
LED_GPIO_Config(); //LED灯初始化
USART_Config(); //串口通信初始化
GOIO_PWM_MONE_Init(); //利用PWM控制舵机以及风扇转速
JLX12864G_086_GPIOInit();
initial_lcd();
clear_screen();
//TimeInit();
StepperMotor4_2(); //步进电机初始化
}
/**
* @brief 主函数
* @param 无
* @retval 无
*/
int main ( void )
{
volatile int key=0;
// char YearDate[100];
volatile int ty=0;
volatile int xz=0;
UInum=1;
protocolTime_t *ptime=(protocolTime_t *)(uint8_t *)&gizwitsProtocol.TimeNTP; //获取网络时间结构体
Hardware_Init();//对板卡硬件初始化
GizWitsInit(); //对云协议进行初始化
IWDG_Config(IWDG_Prescaler_256 ,10000);
while ( 1 )
{
TIM_Cmd(TIM3, ENABLE);
gizwitsnetwork(); //按键配网
user_bh1750(); //开启BH1750工作,并获取数据
userHandle(); //用户采集
gizwitsHandle((dataPoint_t *)¤tDataPoint);//协议处理
// Manual_mode();
Main_function();
ClockCalculate();
/***解析语音模块的串口数据***/
if (usartdataflag==1)
{
Uart5ReceiveEndDetection();
usartdataflag=0;
DisposeUart5ReceiveData(); //数据解析
}
/***解析台灯模块的串口数据***/
if(usart4dataflag==1)
{
Uart4ReceiveEndDetection();
usart4dataflag=0;
DisposeUart4ReceiveData(); //数据解析
}
if (UInum==1) //自动模式
{
Automatic_mode();
}
if(timer>=100)
{
timer=0;
Displayinterface();
}
/******************************RTC时钟*****************************/
/* 每过1s 更新一次时间*/
if (TimeDisplay == 1)
{
/* 当前时间 */
Time_Display( RTC_GetCounter(),&systmtime);
// Timedistributionfunction(&systmtime);
TimeDisplay = 0;
ty++;
doortime++;
worktime++;
if(ty==120) //120秒,两分钟
{
xz=1; //时间校准标志位
ty=0;
}
}
/*************从机时间校准***************/
/******************运行保护**************************/
if (dooropen==1) //门锁保护
{
if (doortime==1)
{
dooropen=0;
GPIO_ResetBits(room_GPIO_PORT,room_GPIO_PIN);
}
}
if ((closeflag1==1)&&(worktime>=1)) //窗帘保护
{
closeflag1=0;
closeflag=1;
// GPIO_SetBits(GPIOE,GPIO_Pin_4);
TIM_Cmd(TIM2, DISABLE);
}
if((openflag1==1)&&(worktime>=1))
{
openflag1=0;
openflag=1;
// GPIO_SetBits(GPIOE,GPIO_Pin_4);
TIM_Cmd(TIM2, DISABLE);
}
// sprintf (information3,"%d %d ",closeflag1,worktime);
// display_string_5x8_1(7,5,information3);
/*******************************************************/
if(wifi_link==1)
{
if (usartoneflag==0) //网络链接成功下发一次时间同步
{
usartoneflag=1;
Timedistributionfunction(); //下发给从机校准时间
}
if (alinghourflag2==1)
{
alinghourflag2=0;
Timedistributionfunction(); //下发给从机校准时间
}
key=KEY_Scan(1);
if( key == 16 ) //网络时间同步按键
{
// /*用接收到的时间设置RTC*/
// Time_Adjust(&networktime);
// //向备份寄存器写入标志
// BKP_WriteBackupRegister(RTCC_BKP_DRX, RTc_BKP_DATA);
Timedistributionfunction(); //下发给从机校准时间
}
// else if( xz==1) //网络时间校准
// {
// /*用接收到的时间设置RTC*/
// Time_Adjust(&networktime);
// //向备份寄存器写入标志
// BKP_WriteBackupRegister(RTCC_BKP_DRX, RTc_BKP_DATA);
// xz=0; //时间校准标志位清零
// Timedistributionfunction(); //下发给从机校准时间
// }
}
IWDG_Feed(); //喂狗防止复位
}
}
/************************************************
显示屏显示UI界面控制函数
*************************************************/
void Displayinterface(void)
{
if (UInum==1) //默认
{
if(Manualflagbit2==0)
{
if (UI1flag1==0)
{
UI1flag1=1;
UI1flag2=0;
UI2flag1=0;
UI2flag2=0;
clear_screen();
Manualflagbit=0;
}
display_string_5x8_1(1,0,information1);
display_string_5x8_1(3,0,information3);
display_string_5x8_1(5,0,information4);
display_string_5x8_1(7,0,information2);
display_string_5x8_1(8,5,"M:A");
}
else
{
if (UI1flag2==0)
{
UI1flag2=1;
UI1flag1=0;
UI2flag1=0;
UI2flag2=0;
clear_screen();
Manualflagbit=0;
}
display_string_5x8_1(1,0,information1);
display_string_5x8_1(3,0,UIBUFF1);
display_string_5x8_1(5,0,UIBUFF2);
display_string_5x8_1(7,0,UIBUFF3);
// display_string_5x8_1(8,0," ");
}
}
if (UInum==2) //手动档界面
{
if(Manualflagbit==0)
{
if (UI2flag1==0)
{
UI1flag1=0;
UI1flag2=0;
UI2flag2=0;
UI2flag1=1;
clear_screen();
Manualflagbit2=0;
}
display_string_5x8_1(1,0,information1);
display_string_5x8_1(3,0,information3);
display_string_5x8_1(5,0,information4);
display_string_5x8_1(7,0,information2);
display_string_5x8_1(8,5,"M:H");
}
else
{
if (UI2flag2==0)
{
UI1flag1=0;
UI1flag2=0;
UI2flag2=1;
UI2flag1=0;
clear_screen();
Manualflagbit2=0; //清除自动设置
}
display_string_5x8_1(1,2,"Manual control mode");
sprintf (information6,"valueLED2:%d ",currentDataPoint.valueLED2);
display_string_5x8_1(2,2,information6);
sprintf (information7,"valuefan:%d ",currentDataPoint.valuefan);
display_string_5x8_1(3,2,information7);
sprintf (information7,"valueventilator:%d ",currentDataPoint.valueventilator);
display_string_5x8_1(4,2,information7);
sprintf (information7,"valuewidow:%d ",currentDataPoint.valuewidow);
display_string_5x8_1(5,2,information7);
sprintf (information7,"valuedoor:%d ",currentDataPoint.valuedoor);
display_string_5x8_1(6,2,information7);
sprintf (information5,"valueLED1:%d ",currentDataPoint.valueLED1);
display_string_5x8_1(7,2,information5);
}
}
if (UInum==3)
{
clear_screen();
UIflag=0;
UIflag2=0;
}
}
/************************************************
对模块进行配网
KEY1按下为: WIFI复位
*************************************************/
void gizwitsnetwork(void )
{
volatile int network_key=0;
network_key=KEY_Scan(1);
if(network_key==1)//KEY1按键
{
// printf("WIFI进入AirLink连接模式\r\n");
gizwitsSetMode(WIFI_AIRLINK_MODE);//Air-link模式接入
}
}
/**
* @brief 用户获取光照强度数据接口
* @param 无
* @retval result_lx 光照强度
*/
void user_bh1750(void)
{
float light=0; //光强度缓存区
//获取光照
Start_BH1750();
delay_ms(180);
Read_BH1750();
light=Convert_BH1750();
//delay_ms(1000);
// printf("light:%f\n",light);
}
/*USART4数据帧超时检测*/
void Uart4ReceiveEndDetection(void) //数据帧结束检测
{ //每一毫秒执行一次
if(Uart4ReceiveTimeout > 0)
{
Uart4ReceiveTimeout--;
if((Uart4ReceiveTimeout >= 0) && (usart4_rcvd_len > 4)) //判断通讯接收是否超时
{
// Uart3ReceiveDataLength = 0; //将接收地址偏移寄存器清零
usart4_rcvd_flag = 1;
}
}
}
void DisposeUart4ReceiveData(void)
{
// uint8_t i;
uint8_t i=0,j=0,len;
char* pData1 = 0;
unsigned int usart4_data_hex[50];
if(usart4_rcvd_flag == 1)
{
//printf ("1\r\n");
/*对串口接收到的数据进行解析提前处理*/
len=15;
pData1 = strstr((const char*)usart4_rcvd_buf,"55AA01");
for(i=0;i<=len;i++)
{
usart4_data_hex[i]=str2hex(pData1 + j, 2); //从条码开始接收解析
j+=2;
}
if(usart4_data_hex[2] == 0x01) //地址码
{
if(usart4_data_hex[3] == 0x01) //功能码
{
switch(usart4_data_hex[4]) // 分类码
{
case 0x02: //台灯
if(usart4_data_hex[6]==65535) break;
else
{
currentDataPoint.valueLED2=usart4_data_hex[6];
printf("台灯:%d\r\n",currentDataPoint.valueLED2);
break;
}
default :break;
}
}
if(usart4_data_hex[3] == 0x02) //功能码 查询时间
{
switch(usart4_data_hex[4]) // 分类码
{
case 0x01:Timedistributionfunction();break;
default :break;
}
}
}
memset(usart5_rcvd_buf, 0, sizeof(usart5_rcvd_buf));
usart5_rcvd_len = 0; //将接收地址偏移寄存器清零
usart4_rcvd_flag = 0;
}
}
/*处理蓝牙音响和核心板直接的数据处理*/
/*数据帧超时检测*/
void Uart5ReceiveEndDetection(void) //数据帧结束检测
{ //每一毫秒执行一次
if(Uart5ReceiveTimeout > 0)
{
Uart5ReceiveTimeout--;
if((Uart5ReceiveTimeout >= 0) && (usart5_rcvd_len > 4)) //判断通讯接收是否超时
{
// Uart3ReceiveDataLength = 0; //将接收地址偏移寄存器清零
usart5_rcvd_flag = 1;
}
}
// printf ("U:%d,UL%d",Uart5ReceiveTimeout,usart5_rcvd_len);
}
void DisposeUart5ReceiveData(void)
{
// uint8_t i;
uint8_t i=0,j=0,len;
char* pData1 = 0;
unsigned int usart5_data_hex[50];
if(usart5_rcvd_flag == 1)
{
//printf ("1\r\n");
/*对串口接收到的数据进行解析提前处理*/
len=15;
pData1 = strstr((const char*)usart5_rcvd_buf,"55AA01");
for(i=0;i<=len;i++)
{
usart5_data_hex[i]=str2hex(pData1 + j, 2); //从条码开始接收解析
j+=2;
//printf ("DATA:%d",usart5_data_hex[i]);
}
// if(usart4_data_hex[usart4_data_hex[5] + 6] == BCC_CheckSum(&usart4_rcvd_buf[2], (length + 4)))
// {
/*对接收的数据进行判断处理 55AA0101***DB */
// printf ("2\r\n");
if(usart5_data_hex[2] == 0x01) //地址码
{
// printf ("3\r\n");
if(usart5_data_hex[3] == 0x01) //功能码
{
// printf ("4\r\n");
switch(usart5_data_hex[4]) // 分类码
{
case 0x01: //灯光
currentDataPoint.valueLED1=usart5_data_hex[6];
printf("灯光:%d\r\n",currentDataPoint.valueLED1);
break;
case 0x02: //台灯
currentDataPoint.valueLED2=usart5_data_hex[6];
if (currentDataPoint.valueLED2==1)
{
Usart_SendString(DEBUG_USART4,"55AA020102090100DB0D\r\n"); //开台灯
}
else
{
Usart_SendString(DEBUG_USART4,"55AA020102090000DB0D\r\n");//关台灯
}
printf("台灯:%d\r\n",currentDataPoint.valueLED2);
break;
case 0x03: //风扇
currentDataPoint.valuefan=usart5_data_hex[6];
printf("风扇:%d\r\n",currentDataPoint.valuefan);
break;
case 0x05: //窗帘
currentDataPoint.valuewidow=usart5_data_hex[6];
printf("窗帘:%d\r\n",currentDataPoint.valuewidow);
break;
case 0x06: //排烟机
currentDataPoint.valueventilator=usart5_data_hex[6];
printf("排烟机:%d\r\n", currentDataPoint.valueventilator);
break;
default :break;
}
}
}
memset(usart5_rcvd_buf, 0, sizeof(usart5_rcvd_buf));
usart5_rcvd_len = 0; //将接收地址偏移寄存器清零
usart5_rcvd_flag = 0;
}
}
unsigned int str2hex(char * start,char length) //字符串起始地址, length 字符长度
{
char i = 0;
unsigned char res_tem= 0x00;
unsigned int res = 0x0000;
res_tem = 0;
res = 0;
for(i = 0; i < length; i++)
{
if((*(start+i)>='0')&&(*(start+i)<='9'))
{
res_tem = *(start+i)-'0';
res = res+res_tem*pow(16,length-i-1);
}
else if((*(start+i)>='A')&&(*(start+i)<='F')) //约定只用大写
{
res_tem = *(start+i)-'A'+10;
res = res+res_tem*pow(16,length-i-1);
}
else
{
res = 0xFFFF; //错误数值就返回默认值
break;
}
}
return res & 0xFFFF;
}
/*将字符串s转换成相应的整数*/
// int atoi(char s[])
// {
// int i;
// int n = 0;
// for (i = 0; s[i] >= '0' && s[i] <= '9'; ++i)
// {
// n = 10 * n + (s[i] - '0');
// }
// return n;
// }
unsigned int str2dec(char * start,char length) //字符转10进制, 字符串其实地址, length 字符长度
{
char i = 0;
unsigned char res_tem= 0x00;
unsigned int res = 0x0000;
res_tem = 0;
res = 0;
for(i = 0;i<length;i++)
{
if((*(start+i)>='0')&&(*(start+i)<='9'))
{
res_tem = *(start+i)-'0';
res = res+res_tem*pow(10,length-i-1);
}
else
{
res = 0xFFFF; //错误数值就返回默认值
break;
}
}
return res & 0xFFFF;
}
/* 将无符号十进制数拆分并转换为字符形式,返回字符串长度 */
char uBinaryToAscii(unsigned int value, char *str)
{
char i;
char num_str[10] = { 0 };
unsigned int quotient;
unsigned char len;
len = 0;
quotient = value / 10;
while (quotient != 0)
{
num_str[len] = value % 10 + '0';
len++;
value = quotient;
quotient = value / 10;
}
if (value != 0)
{
num_str[len] = value + '0';
len++;
}
for (i = 0; i < len; i++)
{
*str = num_str[len-i-1];
str++;
}
return len;
}
/* 将有符号十进制数拆分并转换为字符形式,返回字符串长度 */
/* 调用了uBinaryToAscii函数 */
char sBinaryToAscii(int value, char *str)
{
char len;
if (value < 0)
{
*str = '-';
str++;
len = uBinaryToAscii(-value, str);
return len + 1;
}
else
{
len = uBinaryToAscii(value, str);
return len;
}
}
void Timedistributionfunction(void ) //用于接收网络时间
{
//时间
if (networktime.tm_mon<10) networktime.tm_mon=networktime.tm_mon+60;
if (networktime.tm_mday<10) networktime.tm_mday=networktime.tm_mday+60;
if (networktime.tm_hour<10) networktime.tm_hour=networktime.tm_hour+60;
if (networktime.tm_min<10) networktime.tm_min=networktime.tm_min+60;
sBinaryToAscii(networktime.tm_year,timedata); //年
sBinaryToAscii(networktime.tm_mon,timedata+4); //月
sBinaryToAscii(networktime.tm_mday,timedata+6); //日
sBinaryToAscii(networktime.tm_hour,timedata+8); //时
sBinaryToAscii(networktime.tm_min,timedata+10); //分
//sBinaryToAscii(networktime.tm_sec,timedata+7); //秒
sprintf(Timedatabuff,"%s%c%c%c%c%c%c%c%c%c%c%c%c%s\r\n",Timedata,timedata[0],timedata[1],timedata[2],timedata[3],timedata[4],timedata[5],timedata[6],\
timedata[7],timedata[8],timedata[9],timedata[10],timedata[11],enddatabuff);
// printf("%s\r\n",Timedatabuff);
Usart_SendString(DEBUG_USART4,Timedatabuff);
}
/*-------------------------------------------------------
内部通讯协议的CRC16计算函数。
-------------------------------------------------------*/
uint32_t ecbm_databuff_rtu_crc=0xFFFF; //初始化CRC变量各位为1。
void ecbm_databuff_rtu_crc16(uint8_t buf)
{
uint8_t j;
ecbm_databuff_rtu_crc^=buf; //当前数据异或CRC低字节,在C51里可以直接处理。
for(j=0;j<8;j++)
{ //计算每个字节的每一位。
if(ecbm_databuff_rtu_crc&0x01)
{ //判断右移前最低位是否为1。
ecbm_databuff_rtu_crc=(ecbm_databuff_rtu_crc>>1)^0xA001;//如果为1则右移并异或表达式。
}
else
{
ecbm_databuff_rtu_crc>>=1; //否则直接右移一位。
}
}
}
复制代码
本人初学,仅供参考,存在错误和不足之处,请大家回帖多多指教,切勿照搬,代码下载:
代码.7z
(554.77 KB, 下载次数: 10)
2022-10-4 15:18 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1