wenbo2005.online

学习记录 / STM32

STM32 与 ESP01s 联动上传数据

STM322024-11-01

一,ESP8266-01s端代码(只有心跳发送权):

#include <ESP8266WiFi.h>
#include <WiFiClient.h>

int LEDPin1 = 2;

//设置需要连接的wifi的名称和密码
const char *wifi_name = "MyESP8266";
const char *wifi_password = "12345678";
const char *host = "121.37.241.174";            //外网服务器IP
const int httpPort = 8600;                     //外网服务器端口

//2319073311
//***
const char *user_logo = "Huang1029";                                 //设备标识
const char *user_key = "***";            //传输秘钥

WiFiClient client;                              //声明对象

void Go_WIFI()
{
  while(WiFi.status()!=WL_CONNECTED)            //连接成功前,LED将快速闪烁
  {
    bool led_flag = digitalRead(LEDPin1);
    digitalWrite(LEDPin1,!led_flag);
    delay(100);
  }
  Serial.print(WiFi.SSID());
  Serial.println(" WIFI OK");
}

void Go_Server()
{
  Serial.println("Start connecting to a server");
  while(!client.connected())                     //连接成功前,LED将慢闪烁
  {
    client.connect(host,httpPort);               //该函数需要花费一定的时间
    bool led_flag = digitalRead(LEDPin1);
    digitalWrite(LEDPin1,!led_flag);
    delay(500);
  }
  digitalWrite(LEDPin1,0);                         //连接成功后,LED常亮
  Serial.println("Server OK");
}

void RST_Go_WIFI()                               //断开重连WIFI
{
  if(WiFi.status()!=WL_CONNECTED)
  {
    WiFi.disconnect();                            //清除之前的配置,可能因为信号道不同连不上
    WiFi.begin(wifi_name,wifi_password);          //开始连接路由器
    Go_WIFI();
  }
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  Serial.println("Initing...");

  pinMode(LEDPin1, OUTPUT);
  digitalWrite(LEDPin1, 1);

  WiFi.mode(WIFI_STA);                          //设置为STA模式
  WiFi.begin(wifi_name,wifi_password);          //开始连接路由器

  Go_WIFI();
  Go_Server();
}

bool one = 0;
void Go_NewCloud()
{
  if(WiFi.status()!=WL_CONNECTED)
  {
    WiFi.disconnect();                            //清除之前的配置,可能因为信号道不同连不上
    WiFi.begin(wifi_name,wifi_password);          //开始连接路由器
    Go_WIFI();
  }
  else if(!client.connected())                    //服务器断开重连
  {
    one = 0;
    Go_Server();
    return;
  }
  else if(one == 0)
  {
      //通过TCP连接新大陆平台
      char users[80];
      sprintf(users,"{\"t\":1,\"device\":\"%s\",\"key\":\"%s\",\"ver\":\"v1.1\"}\r\n", user_logo,user_key);
      client.print(users);
      one = 1;
  }
}

unsigned long tx_time=0;
void HeartbeatTx_Data()
{
  if(millis() - tx_time < 10000) return;
  tx_time = millis();

  char txbuff[20];
  sprintf(txbuff,"$#AT#");//心跳请求
  client.print(txbuff);
}

unsigned long rx_time=0;
void ServerRx_Data()
{
  if(millis() - rx_time < 1000) return;
  rx_time = millis();

    String Jsonbuff="";
    while(client.available()>0)//读取服务端发送过来的信息
    {
      Jsonbuff+=char(client.read());
      delay(1);
    }
    if (Jsonbuff.length() != 0)//如果不是非空字符串,则打印
    {
      Serial.println(Jsonbuff);//打印云端响应数据,发送到stm32
    }
    Jsonbuff = "";
}

void loop() {
  // put your main code here, to run repeatedly:
  Go_NewCloud();
  HeartbeatTx_Data();//数据发送权移至stm32,保留心跳发送
  ServerRx_Data();//接收服务器信息,并转发到stm32
  Stm32Rx_Data();//接收stm32信息,并转发到服务器
}

unsigned long stm32_rx_time=0;
void Stm32Rx_Data()
{
  if(millis() - stm32_rx_time < 1000) return;
  stm32_rx_time = millis();

    String Databuff="";
    while(client.available()>0)//读取stm32发送过来的信息
    {
      Databuff+=char(client.read());
      delay(1);
    }
    if (Databuff.length() != 0)
    {
      client.print(Databuff);
    }
    Databuff = "";
}

二,STM32端部分代码(传感器采集数据发送到ESP8266-01s):

//控制数据上云频率,只有当有数据发送到ESP01S时,ESP01S才会发生使其上云
_Bool two_pointer;//切换发送标志位,防止频繁上传
uint32_t esp01s_tx_time=0;
void Esp01s_Tx_Proc()
{
    if(uwTick - esp01s_tx_time<10000) return;
    esp01s_tx_time = uwTick;

    char sendbuff[50];
    int length = 0;

    if(two_pointer && mylatitude!=0&&mylongitude!=0)//经纬度
    {
        length = sprintf(sendbuff,"{\"t\": 3,\"datatype\":1,\"datas\": { \"Lat:%f,\"Log\":%f},\"msgid\": 123}",
            mylatitude,mylongitude);//无需回车
    }
    if(!two_pointer && bmp280_temp!=0 && bmp280_ap!=0 && mq135_value!=0)//温度,气压,空气质量
    {
        length = sprintf(sendbuff,"{\"t\": 3,\"datatype\":1,\"datas\": { \"BmpTemp\":%d,\"BmpPressure\":%d,\"MqAir\":%.1f},\"msgid\": 123}",
            (int)bmp280_temp,(int)bmp280_ap,mq135_value);//无需回车
    }
    HAL_UART_Transmit(&huart3,(uint8_t*)sendbuff,strlen(sendbuff),50);//strlen获取实际长度
}