HAL_Project/Project -APP-V1.0/Hardware/REALY/relay.c

151 lines
5.5 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "main.h"
//继电器引脚初始化
void relayInit(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIOB_RCC_ENABLE;
GPIOD_RCC_ENABLE;
GPIO_InitStruct.Pin = Realy1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(Realy1_GPIO_Port, &GPIO_InitStruct);
GPIO_InitStruct.Pin = Realy2_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(Realy2_GPIO_Port, &GPIO_InitStruct);
GPIO_InitStruct.Pin = Realy3_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(Realy3_GPIO_Port, &GPIO_InitStruct);
GPIO_InitStruct.Pin = Realy4_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(Realy4_GPIO_Port, &GPIO_InitStruct);
//从存储器中恢复继电器状态
MqttInfoStr.Relay_State[1] ? Relay1_OFF : Relay1_ON;
MqttInfoStr.Relay_State[2] ? Relay2_OFF : Relay2_ON;
MqttInfoStr.Relay_State[3] ? Relay3_OFF : Relay3_ON;
MqttInfoStr.Relay_State[4] ? Relay4_OFF : Relay4_ON;
log_info("继电器1状态为:%s",MqttInfoStr.Relay_State[1] ? "" : "");
log_info("继电器2状态为:%s",MqttInfoStr.Relay_State[2] ? "" : "");
log_info("继电器3状态为:%s",MqttInfoStr.Relay_State[3] ? "" : "");
log_info("继电器4状态为:%s",MqttInfoStr.Relay_State[4] ? "" : "");
//读取存储器的继电器状态发送给云平台
CAT1_printf("AT+MPUB=\"/iot/data/up/%s\",0,0,\"{\\22header\\22:\\22iot.prop.post\\22,\\22body\\22:{\\22sw1\\22:%d,\\22sw2\\22:%d,\\22sw3\\22:%d,\\22sw4\\22:%d}}\"\r\n",
MqttInfoStr.ClientID,
MqttInfoStr.Relay_State[1]?1:0,
MqttInfoStr.Relay_State[2]?1:0,
MqttInfoStr.Relay_State[3]?1:0,
MqttInfoStr.Relay_State[4]?1:0);
}
// 继电器响应网络数据
//收到主机控制指令:+MSUB: "/iot/data/down/cfd6dba662690a5e",118 byte,{"id":"977013940154814794","header":"iot.prop.set","version":"1.0","body":{"sw1":{"time":1713104741005,"value":true}}}
void relayAction(uint8_t *data) {
uint8_t i = 0;
char *TempPointer; // 临时指针
char CmdId[18] = {0}; // 存贮id的数据以响应服务器下发的数据
char IdFlag = 0; // id的计数标志位用于判断ID中是否出现异常字符
if(strstr((char *)data,MqttInfoStr.Topic)) { //查找 /iot/data/down/ 出现的位置
TempPointer = strstr((char *)data,"\"id\":"); // 记录ID位置 {"id":"1117
TempPointer += 6; //除去"id": 5个字符 应该从第6个开始取
IdFlag = 0;
log_info("ID起始位置为%s", TempPointer); //打印结果ID起始位置为977187088401715548","header":"iot.sub.prop.set","version":"1.0","body":{"sw2":{"time":1713146022764,"value":true}}}
for (i = 0; i < 18; i++) {
// 存储id(响应帧,必要参数)
if (((TempPointer[i] >= '0') && (TempPointer[i] <= '9')) || ((TempPointer[i] >= 'a') && (TempPointer[i] <= 'z')) || ((TempPointer[i] >= 'A') && (TempPointer[i] <= 'Z'))) {
CmdId[i] = TempPointer[i];
IdFlag++;
} else {
IdFlag = 0;
log_info("ID中混有非法字符,将不会发送反馈数据");
log_info("ID指针为%s", TempPointer); //此语句千万不能用printf 而是得用log_info 否则程序卡死 很难找到原因
}
}
if (IdFlag >= 18) { // ID为18位当ID>=18时说明ID正常
log_info("ID中一切字符正常");
}
if(strstr((char *)data,"\"sw")) { //先判断收到的数据是不是开关量
TempPointer = strstr((char *)data,"\"sw"); // 记录sw位置
switch(TempPointer[3]) { // 判断操作哪个开关
case '1':
if (strstr((char *)data, "true")) {
log_info("开关1打开");
Relay1_ON;//
MqttInfoStr.Relay_State[1] = 1;
}
if (strstr((char *)data, "false")) {
log_info("开关1关闭");
MqttInfoStr.Relay_State[1] = 0;
Relay1_OFF;//
}
break;
case '2':
if (strstr((char *)data, "true")) {
log_info("开关2打开");
Relay2_ON;//
MqttInfoStr.Relay_State[2] = 1;
}
if (strstr((char *)data, "false")) {
log_info("开关2关闭");
Relay2_OFF;//
MqttInfoStr.Relay_State[2] = 0;
}
break;
case '3':
if (strstr((char *)data, "true")) {
log_info("开关3打开");
Relay3_ON;//
MqttInfoStr.Relay_State[3] = 1;
}
if (strstr((char *)data, "false")) {
log_info("开关3关闭");
Relay3_OFF;//
MqttInfoStr.Relay_State[3] = 0;
}
break;
case '4':
if (strstr((char *)data, "true")) {
log_info("开关4打开");
Relay4_ON;//
MqttInfoStr.Relay_State[4] = 1;
}
if (strstr((char *)data, "false")) {
log_info("开关4关闭");
Relay4_OFF;//
MqttInfoStr.Relay_State[4] = 0;
}
break;
}
}
eepromWriteData(0, &MqttInfoStr, MQTT_STRUCT_LEN);
CAT1_printf("AT+MPUB=\"/iot/data/up/%s\",0,0,\"{\\22header\\22:\\22iot.prop.post\\22,\\22body\\22:{\\22sw1\\22:%d,\\22sw2\\22:%d,\\22sw3\\22:%d,\\22sw4\\22:%d}}\"\r\n",
MqttInfoStr.ClientID,
MqttInfoStr.Relay_State[1]?1:0,
MqttInfoStr.Relay_State[2]?1:0,
MqttInfoStr.Relay_State[3]?1:0,
MqttInfoStr.Relay_State[4]?1:0);
HAL_Delay(50);//需要延时 可以很短
//推送回复消息 OK
CAT1_printf("AT+MPUB=\"/iot/data/up/%s\",0,0,\"{\\22id\\22:\\22%s\\22,\\22code\\22:0,\\22message\\22:\\22OK\\22}\"\r\n",MqttInfoStr.ClientID, CmdId);
}
}