基于Arduino的ESP32串口传输数据与oled显示

初学ESP32

所用硬件 OLED屏幕 ESP32一块 USB转TTL一块

背景是上位机传送数据到ESP32上,收到数据后在根据数据进行相应倒数

整体思路为:初始化单片机后进入循环,循环分为两个状态,一个为接收数据状态,一个为具体倒数状态,通过switch和state_1,state_2来控制。虽然现在想来这个switch没什么必要。。。。 将就看吧。

在这里插入图片描述

单片机全部代码

#include <Wire.h>
//这几个库是要下载的
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
//如何使用串口和oled屏幕请关注公众号 “跳动的字节”,都是从那学的
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define SERIAL_RX_BUFFER_SIZE  512  // 接收缓冲区

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

//收到数据 屏幕打印出来
char recData=0; //接收的数据
char Head1 = 'A',Head2 = 'B',End = 'C';//校验位
//数据接受数组以及接收状态
char RxBuffer2[10];
int Rxcounter2=0;
int rxstate1 = 0;
//接收用的字符
char Rx1 ,Rx2, Rx3, Rx4,Rx5;
//处理后的数据
int Rt=0,Gt=0,Em=0;
int state_1=0,state_2=0;
//接收完成标志位
int R_flag = 0;


void setup() {
  // put your setup code here, to run once:
  //初始化串口和屏幕
  Serial.begin(9600);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }  
  delay(1000);
  
  
}


void loop() {
  
  // put your main code here, to run repeatedly:
  //判断是哪个状态
    switch(state_1)
  {
    case 0: state_2=0;
    break;
    case 1: state_2=1;
    break;
    }
// 接收状态,下面是个简单的接受协议 格式是帧头‘A’帧头 ‘B’ 数据位 帧尾‘C’
// 接收到帧头后开始接受数据 接收到帧尾之后开始处理数据
    if (state_2 == 0)
    {
      Serial.begin(9600);
      delay(500);
      while(R_flag == 0){
     Serial.println("Loop1");
     recData = Serial.read();
    if(rxstate1 == 0 && recData == 'A')
  {
    rxstate1 = 1;
    RxBuffer2[Rxcounter2++] = recData;

  }
  else if(rxstate1 == 1 && recData == 'B')
  {
    rxstate1 = 2;
    RxBuffer2[Rxcounter2++] = recData;
  }
  
  else if (rxstate1 == 2)
  {
    RxBuffer2[Rxcounter2++] = recData;
    if(recData == 'C')
    {
    rxstate1= 3;
    }
  }
    else
    {
      rxstate1 = 0;
      Rxcounter2 = 0;
    }
    if (rxstate1 == 3)
    {
      if(RxBuffer2[Rxcounter2-1]=='C')
      {
        Rx1 = RxBuffer2[2];
        Rx2 = RxBuffer2[3];
        Rx3 = RxBuffer2[4];
        Rx4 = RxBuffer2[5];
        Rx5 = RxBuffer2[6];
        //收到的是字符型的所以要用对应ascII操作一下换算成对应时间
        //笨办法 
        Rt = (int(Rx1)-48)*10 +  (int(Rx2)-48);
        Gt = (int(Rx3)-48)*10 +  (int(Rx4)-48);    
        Em = (int(Rx5)-48);
        //Serial.print(Rt);
        R_flag = 1;
        rxstate1 = 0;
        Rxcounter2 = 0;
        //关键点 接受完要清除缓存
        while(Serial.read() >= 0){}
        //然后关掉串口
        Serial.end();

      }
      else
      {
        rxstate1 = 0;
        Rxcounter2 = 0;
      }
    }
        }
    
      state_1 = 1;
      }

    //
    if (state_2 == 1)
    {
    //倒数环节 随便写的
      while(Rt!=0)
      {
        Serial.println("Loop2");
        Rt--;
        display.clearDisplay();
        display.setTextColor(WHITE);
        display.setTextSize(1);
        display.setCursor(0,0);
        display.print(Rt);
        display.display();
        delay(1000);
        }
      state_1 = 0;
      R_flag = 0;
      }
}


  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值