单独例程-esp8266串口接收数据+解析+OLED屏幕

发布时间 2023-10-21 02:36:24作者: MKT-porter

 

 

发送端

String msg_esp=String()
+ String(fengsu[0])+"-"
+ String(dnegji[0])+"-"
+ String(MPU_x_y_z[0])+"-"
+ String(MPU_x_y_z[1])+"-"
+ String(MPU_x_y_z[2])+"-"
+ String(alram_speed_dgree[0])+"-"
+ String(alram_speed_dgree[1])+"-"
+";";

  

接收端

#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);


//#include <SoftwareSerial.h>
//实例化软串口
//SoftwareSerial mySerial(D2, D1); // RX, TX
//分割结果
#define sleng 11 //数组大小
String split_result[sleng];//手动动态调整数组大小,保证数组可以满足容量

/*字符串分割
输入参数
String zifuchuan,  输入字符串
String fengefu,    分隔符号-可以是多个
String result[]    输出结果
     
*/
void Split(String zifuchuan,String fengefu,String result[])
 {
  int weizhi; //找查的位置
  String temps;//临时字符串
  int i=0;
  do
  {
      weizhi = zifuchuan.indexOf(fengefu);//找到位置
      if(weizhi != -1)//如果位置不为空
      {
          temps=zifuchuan.substring(0,weizhi);//打印取第一个字符
          zifuchuan = zifuchuan.substring(weizhi+fengefu.length(), zifuchuan.length());
          //分隔后只取后面一段内容 以方便后面找查
      }
      else
      {  //上面实在找不到了就把最后的 一个分割值赋值出来以免遗漏
         if(zifuchuan.length() > 0)
          temps=zifuchuan;
      }
     
      result[i++]=temps;
      //Serial.println(result[i-1]);//在这里执行分割出来的字符下面不然又清空了
      temps="";
   }
   while(weizhi >=0);
  }

    /* 初始化 */
void setup() {
  
    
  Serial.begin(9600);
  while (!Serial) {
  }
     
  Serial.println("Goodnight moon!");
     
  //mySerial.begin(9600);

     // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x32
    Serial.println(F("SSD1306 allocation failed"));
    for (;;)
      ; // Don't proceed, loop forever
  }
  display.display();
  delay(500); // Pause for 2 seconds
 display.setTextSize(1);
 display.setTextColor(WHITE);
 display.setRotation(0);
      
}

/* 主函数 */
void loop() {

      //接收串口消息mySerial
  if (Serial.available()){
      String split_input =Serial.readStringUntil(';');
      //Serial.println(split_input);
    
      //分割解析
      Split(split_input,"-",split_result);//分割调用
          
      Serial.println("--------new data--------");
      //打印消息 检查是否为空
       for(int i=0;i<sleng;i++)
          {
            if(split_result[i]!="")
            {
             Serial.println(String(i)+"-"+split_result[i]);
            }
            else
            {
              split_result[i]="0";
             }
          }

          display.clearDisplay();
          display.setCursor(0, 0);
        
          display.print("wind speed:");
          display.println(split_result[0]);
          
          display.print("wind level:");
          display.println(split_result[1]);

            
          display.print("wind waring:");
          display.println(split_result[7]);
          
          display.print("angle x:");
          display.println(split_result[3]);
          display.print("angle y:");
          display.println(split_result[5]);
          display.print("angle z:");
          display.println(split_result[6]);

          
          display.print("angle waring:");
          display.println(split_result[8]);
          
          display.display();
          delay(100);


          String msg=String("")+"{"
                     +"\"风速(m/s)\":"+String(split_result[0])+","
                     +"\"风速等级\":"+String(split_result[1])+","
                     +"\"风速报警\":"+String(split_result[7])+","
                     
                     +"\"角度X轴\":"+String(split_result[3])+","
                     +"\"角度Y轴\":"+String(split_result[5])+","
                     +"\"角度Z轴\":"+String(split_result[6])+","
                     +"\"角度报警\":"+String(split_result[8])+","
                     +"}";
         Serial.println(msg); 
  }

  


     
}