1.硬件型号
(1)NodeMCN型号:ESP8266MOD。
(2)STM32型号:STM32最小系统。
2.软件
(1)通过Arduino IDE编写ESP8266-NODE模块的程序(Arduino IDE需要包含esp8266 by ESP8266和PubSubClient)。
(2)通过Keil uVision5编写STM32的程序。
3.引脚连线
(1)ESP8266-NODE与STM32连线
ESP8266-NODE | STM32 |
RX | A9 |
TX | A10 |
百度网盘链接:
链接 :百度网盘 请输入提取码
提取码:a8oi
4.(1)ESP8266-NODE代码(Arduino IDE)
#include <ESP8266WiFi.h>
/* 依赖 PubSubClient 2.4.0 */
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <SoftwareSerial.h>
/* 连接您的WIFI SSID和密码 */
#define WIFI_SSID ""
#define WIFI_PASSWD ""
#define SENSOR_PIN LED_BUILTIN
/* 线上环境域名和端口号 */
#define MQTT_SERVER ""
#define MQTT_PORT 1883//端口号
#define MQTT_USRNAME ""
#define CLIENT_ID ""
#define MQTT_PASSWD ""
//发布消息用的topic
#define PubTopic ""
WiFiClient espClient;
PubSubClient client(espClient);
int i=0;
char *inputString = ""; // a String to hold incoming data
// String inputString = "";
//收到消息后的回调函数
void callback(char *topic, byte *payload, unsigned int length)
{
int i=0;
char *a;
payload[length] = '\0';
a=(char *)payload;
if(i=0)
{
i++;
}
else
{
Serial.print(a);
}
}
//wifi初始化
void wifiInit()
{
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWD);
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
Serial.print("C");
}
delay(1000);
Serial.print("D");
client.setServer(MQTT_SERVER, MQTT_PORT); /* 连接WiFi之后,连接MQTT服务器 */
client.setCallback(callback);
}
//连接到服务器
void mqttCheckConnect()
{
while (!client.connected())
{
Serial.print("E");
if (client.connect(CLIENT_ID, MQTT_USRNAME, MQTT_PASSWD))
{
Serial.print("F");
}
else
{
delay(5000);
}
}
}
void setup()
{
Serial.begin(9600); //开启串口
wifiInit();//连接wifi
mqttCheckConnect();//连接阿里云;
}
void pubMsg(char *msg)
{
boolean b;
b=client.publish(PubTopic, msg);
if(b==0)
{
Serial.print("G");
}
else
{
Serial.print("H");
}
}
void serialEventRun()
{
while (Serial.available())
{
char inChar = (char)Serial.read();
// add it to the inputString:
inputString[i]= inChar;
i++;
if (inChar == '\0') {
pubMsg(inputString);
inputString="";
i=0;
}
}
}
// the loop function runs over and over again forever
void loop()
{
client.loop();//保持客户端的连接
}
(2)STM32(Keil uVision5)
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"
#include "LED.h"
uint8_t RxData;
int main(void)
{
LED_Init();
OLED_Init();
OLED_ShowString(1, 1, "RxData:");
Serial_Init();
while (1)
{
if (Serial_GetRxFlag() == 1)
{
RxData = Serial_GetRxData();
if(R>100)
{
R=0;
}
OLED_ShowHexNum(1, 8, RxData, 2);
if(RxData==0x43)
{
OLED_ShowString(2, 1, "wife connecting");
OLED_ShowString(3, 1, " ");
OLED_ShowString(4, 1, " ");
}
if(RxData==0x44)
{
OLED_ShowString(2, 1, "wife success! ");
}
if(RxData==0x45)
{
OLED_ShowString(3, 1, "qqit connecting");
}
if(RxData==0x46)
{
OLED_ShowString(3, 1, "qqlt success! ");
}
if(RxData==0x47)
{
OLED_ShowString(4, 1, "send failed! ");
}
if(RxData==0x48)
{
OLED_ShowString(4, 1, "send success! ");
}
if(RxData==0x41)
{
LED1_Turn();
}
if(RxData==0x42)
{
LED2_Turn();
}
Serial_SendString("Hello world");
Delay_ms(5000);
}
}
}
5.通信
(1)STM32每5000毫秒向ESP8266发送一个数据;
(2)ESP8266接收到数据后发送到阿里云日志;
6.实验过程
阿里云每5000毫秒收到由ESP8266发送的日志,查看日志可以看到STM32发送来的数据: