竹子建站模板怎么下载,无锡信息网招聘,wordpress主题siren,哪个网站可以做论文简述最终效果 基于NodeMCU的物联网空调控制系统设计 项目介绍
该项目是“物联网实验室监测控制系统设计#xff08;仿智能家居#xff09;”项目中的“家电控制设计”中的“空调控制”子项目#xff0c;最前者还包括“物联网设计”、“环境监测设计”、“门禁系统设计计”和“小…最终效果 基于NodeMCU的物联网空调控制系统设计 项目介绍
该项目是“物联网实验室监测控制系统设计仿智能家居”项目中的“家电控制设计”中的“空调控制”子项目最前者还包括“物联网设计”、“环境监测设计”、“门禁系统设计计”和“小程序设计”等内容。本文只介绍“空调控制”部分。
项目功能实现的大致思路为当单片机接收到MQTT服务器传来的发射红外信号的指令时驱动红外发射模块发射相应的信号。 硬件设计
接线 NodeMCU 数字38kHz红外发射模块 VCC VCC GND GND D2 DAT
PCB设计
此电路板仅是为了代替杜邦线而已上面只有引脚排座而没有任何电子元件。
工程 - 立创开源硬件平台 成本 NodeMCU 数字38kHz红外发射模块 27.9 2.07
其中共需30元左右来购买该项目所需的模块。此外还需1根数据线、焊接工具电烙铁、锡丝、引脚排座、PCB打板或若干杜邦线。
软件设计
本次的开发环境为Arduino IDE开发板型号为NodeMCU 0.9 (ESP-12 Module)。
在初始化之后等待小程序下发空调参数据此发射红外信号。 连接WiFi以及接收MQTT服务器传来的消息可参考利用ESP-01S中继实现STM32F103C8T6与MQTT服务器的串口双向通信_mqtt和stm32开发板通信-CSDN博客
解析JSON数据可参考Arduino中解析JSON数据-CSDN博客
发射红外信号可参考使用“NodeMCU”、“红外模块”实现空调控制-CSDN博客
#include ESP8266WiFi.h
#include PubSubClient.h
#include ArduinoJson.h
#include Arduino.h
#include IRremoteESP8266.h
#include ir_Gree.h //格力空调红外编码解析库是IRremoteESP8266.h的子库IRremoteESP8266.h还有其他主流品牌的红外编码解析子库// 设置wifi接入信息和MQTT服务器
const char* wifiname DOILMSBOIOT;
const char* password doilmsboiot;
const char* mqttServer broker.emqx.io;bool receive_message_flag 0; //1表示收到信息但还未发射信号0表示未收到信息或已发射信号WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);// 待解析的json文件所需空间75~77个字节正好初始值为最多的77字节若初始化时空间不足收到信息后无法赋值
String json {\switch\:false,\mode\:\自动\,\temperature\:25,\windSpeed\:0,\swing\:false};// 创建DynamicJsonDocument对象
const size_t capacity JSON_OBJECT_SIZE(5) 128 ; //5表示待解析的JSON对象中有5对数据128为解析过程中需要的额外空间可在此网站计算 https://arduinojson.org/v6/assistant/#/step1
DynamicJsonDocument doc(capacity);// 解析后的空调参数
bool switch_Bool ;
String mode_Str ;
int temperature_Int ;
int wing_speed_Int ;
bool vertical_swing_Bool ;const uint16_t kIrLed 4; //ESP-12F芯片的4引脚即NODEMCU开发板的D2引脚.
IRGreeAC ac(kIrLed); //创建格力空调红外发射对象void setup()
{Serial.begin(9600); // 启动串口通讯WiFi.mode(WIFI_STA); //设置ESP8266工作模式为无线终端模式connectWifi(); // 连接WiFimqttClient.setServer(mqttServer, 1883); // 设置MQTT服务器和端口号mqttClient.setCallback(receiveCallback); // 设置MQTT订阅回调函数connectMQTTserver(); // 连接MQTT服务器ac.begin(); //启动红外发射
}void loop()
{if (mqttClient.connected()) // 如果开发板成功连接服务器{ mqttClient.loop(); // 处理信息(收到信息后的回调函数)以及心跳} else // 如果开发板未能成功连接服务器{ connectMQTTserver(); // 则尝试连接服务器并订阅主题}if (receive_message_flag 1) //收到信息但还未发射信号{ deserializeJson(doc, json); // 反序列化数据// 解析收到的数据信息switch_Bool doc[switch].asbool();mode_Str doc[mode].asString();temperature_Int doc[temperature].asint();wing_speed_Int doc[windSpeed].asint();vertical_swing_Bool doc[swing].asbool(); send_IR(switch_Bool, mode_Str, temperature_Int, wing_speed_Int, vertical_swing_Bool); //向空调发射红外信号receive_message_flag 0; //已发射信号}
}// 连接MQTT服务器并订阅主题
void connectMQTTserver()
{// 根据ESP8266的MAC地址生成客户端ID避免与其它ESP8266的客户端ID重名String clientId esp8266- WiFi.macAddress();if (mqttClient.connect(clientId.c_str())) //如果成功连接MQTT服务器{ Serial.print(MQTT Server Has Connected. );Serial.print(Server Address: );Serial.println(mqttServer);Serial.print(ClientId: );Serial.println(clientId);subscribeTopic(); // 订阅指定主题} else {Serial.print(MQTT Server Connect Failed. Client State:);Serial.println(mqttClient.state());delay(3000);}
}// 收到信息后的回调函数
void receiveCallback(char* topic, byte* payload, unsigned int length)
{Serial.print(Message with the topic of [ );Serial.print(topic);Serial.println( ] has been received.);Serial.print(Content: );for (int i 0; i length; i) {Serial.print((char)payload[i]);json[i] (char)payload[i]; //将收到的信息赋给json以便后续解析和发射信号}Serial.println();for (int i length; i 77; i) //清除掉多余字符{json[i] \0;}receive_message_flag 1; //表示收到信息但还未发射信号Serial.print(Message Length (Bytes) : );Serial.println(length);Serial.println( );
}// 订阅指定主题
void subscribeTopic()
{String topicString deviceControl3/airConditioner; // 订阅主题的名称char subTopic[topicString.length() 1]; strcpy(subTopic, topicString.c_str());if(mqttClient.subscribe(subTopic)) //如果成功订阅主题{Serial.print(Subscrib Topic: );Serial.println(subTopic);Serial.println();} else {Serial.print(Subscribe Fail...);}
}// ESP8266连接wifi
void connectWifi()
{WiFi.begin(wifiname, password);Serial.println(Connecting to WiFi);while (WiFi.status() ! WL_CONNECTED) //等待WiFi连接,当wifi未连接时,持续输出.;成功连接后输出连接成功信息{delay(1000);Serial.print(.);}Serial.println();Serial.println(WiFi Connected!); Serial.println();
}//向空调发射红外信号
void send_IR(bool switch_Bool, String mode_Str, int temperature_Int, int wing_speed_Int, bool vertical_swing_Bool)
{//这几句程序的顺序不要变if(switch_Bool 0){ac.off(); //开机}if(switch_Bool 1){ac.on(); //关机}ac.setModel(YBOFB); //遥控器型号if(mode_Str 自动){ac.setMode(kGreeAuto); //自动模式下默认温度25度后面的温度设置程序失效}if(mode_Str 制热){ac.setMode(kGreeHeat);}if(mode_Str 制冷){ac.setMode(kGreeCool);}ac.setFan(wing_speed_Int); // 1风速低、2风速中、3风速高、0自动风速ac.setTemp(temperature_Int); if(vertical_swing_Bool 0){ac.setSwingVertical(0,kGreeSwingLastPos); //关闭上下扫风}if(vertical_swing_Bool 1){ac.setSwingVertical(1,kGreeSwingAuto); //开启上下扫风} ac.send(); //发射红外信号
}