完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
这一节我们用MQTT控制STM32的小灯。 原理 :ESP8266接收到MQTT消息后,利用串口发送给STM32 STM32的代码就是串口控制代码,只不过在这个转口几经周折,从阿里云服务器到MQTT到ESP8266再到STM32的串口 代码分为两个部分,中转站ESP8266,最终处理STM32 ESP8266部分代码: 记得改WIFI 和服务器 #include #include #define LED D0 // GPIO引脚别名 仅使用于NodeMCU开发板 //默认使用'$'符号作为调试信息输出的标识 //默认使用'#'符号作为控制信息的标识开头 const char *WIFI_SSID = "xxxxx"; // WIFI名称 const char *WIFI_PASS = "xxxx"; // WIFI密码 const char *MQTT_BROKER = "xxxx"; // MQTT服务器地址 const int MQTT_PORT = 1883; // MQTT服务端口 const char *CLIENT_ID = "c001"; //客户端ID const char *PUBLISH_TOPIC = "pub01"; //发布的topic const char *SUBSCRIBE_TOPIC = "sub01"; //订阅的topic void callback(char *topic, uint8_t *message, unsigned int length); //回调函数声明,用于传入mqtt客户端构造函数作为参数 WiFiClient wifiClient; //参数: MQTT服务器地址,端口号,回调函数名,承载的连接(WIFI) PubSubClient mqttClient(MQTT_BROKER, MQTT_PORT, callback, wifiClient); //回调函数 void callback(char *topic, uint8_t *message, unsigned int length) { // MQTT_doPublishOnDefaultTopic("$Received message:"); String sTopic = topic; //将topic转换为String 可以加以处理 String sMessage = (char *)message; //将消息转换为String sMessage = sMessage.substring(0, length); //取合法长度 避免提取到旧消息 //MQTT发布函数 //MQTT_doPublishOnDefaultTopic(sMessage); //按字符判断mqtt消息中命令的作用 可以自行定义 if (sMessage.charAt(0) == '#') { //第一位# if (sMessage.charAt(1) == 'D') { //第一位l if (sMessage.charAt(2) == '1') { //第一位1 //处理#D1 digitalWrite(LED, 0); //输出低电平 digitalWrite(LED_BUILTIN, LOW); MQTT_doPublishOnDefaultTopic("openrn"); Serial.println("#D1rn"); } else if (sMessage.charAt(2) == '0') { //处理#D0 digitalWrite(LED, 1); //初始化输出高电平 digitalWrite(LED_BUILTIN, HIGH); MQTT_doPublishOnDefaultTopic("closern"); Serial.println("#D0rn"); } } if (sMessage.charAt(1) == 'd') { //处理#d... } } } // MQTT发布函数 需要使用可以解除注释 传入一个字符串 发送到默认配置的发布topic void MQTT_doPublishOnDefaultTopic(String payload) { //参数: 发布的话题,发布的内容 mqttClient.publish(PUBLISH_TOPIC, payload.c_str()); // String的c_str()方法将一个字符串转换为字符数组 } //所有Arduino程序都具备的配置函数 系统初始化后只执行一次 void setup() { pinMode(LED, OUTPUT); //初始化引脚 pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED, 1); //初始化输出高电平 digitalWrite(LED_BUILTIN, HIGH); //启用串口 Serial.begin(115200); // Serial.println("$Hello world!"); //串口输出消息 //连接WIFI WiFi.begin(WIFI_SSID, WIFI_PASS); //连接未成功时 循环等待 while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("$Still waiting..."); } Serial.println("$Wi-Fi connected"); Serial.print("$IP address: "); Serial.println(WiFi.localIP()); //进行MQTT连接 //当MQTT服务器连接不成功时 while (!mqttClient.connected()) { Serial.println("$Waiting for MQTT"); //执行(重试)MQTT连接 if (mqttClient.connect(CLIENT_ID)) { //连接成功后 订阅指定的topic if (mqttClient.subscribe(SUBSCRIBE_TOPIC, 0)) { // QoS: 0/1/2 [|0: 只发送一次(常用)|1: 至少发送一次|2: 一定收到一次] //Serial.println("$Subscribed."); //订阅成功 发送调试消息 MQTT_doPublishOnDefaultTopic("$Subscribed."); } else { Serial.println("$Subscribe failed."); //订阅不成功 发送调试消息 //如有需要 可以加死循环阻止程序继续运行 } } delay(1000); } } //所有Arduino程序都具备的循环函数 setup()函数执行后循环执行 void loop() { delay(500); mqttClient.loop(); //保证MQTT客户端持续运行和接收消息 } STM32部分代码 直接用正点原子的串口使用代码,main函数改成如下部分即可。 #include "led.h" #include "delay.h" #include "key.h" #include "sys.h" #include "usart.h" /************************************************ ALIENTEK精英STM32开发板实验4 串口 实验 技术支持:www.openedv.com 淘宝店铺:http://eboard.taobao.com 关注微信公众平台微信号:"正点原子",免费获取STM32资料。 广州市星翼电子科技有限公司 作者:正点原子 @ALIENTEK ************************************************/ int main(void) { delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(115200); //串口初始化为115200 LED_Init(); //LED端口初始化 KEY_Init(); //初始化与按键连接的硬件接口 while(1) { if(USART_RX_STA&0x8000) { if(USART_RX_BUF[0]=='#') { if(USART_RX_BUF[1]=='D') { if(USART_RX_BUF[2]=='1') { LED1=1; LED0=0; } if(USART_RX_BUF[2]=='0') { LED1=0; LED0=1; } } } USART_RX_STA=0; } } } 如有不懂的 欢迎咨询。 |
|
|
|
只有小组成员才能发言,加入小组>>
3284 浏览 9 评论
2960 浏览 16 评论
3464 浏览 1 评论
9008 浏览 16 评论
4054 浏览 18 评论
1122浏览 3评论
577浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
572浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2305浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1862浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 19:09 , Processed in 1.164112 second(s), Total 78, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号