OLED 显示雷达数据

[复制链接]
查看1272 | 回复7 | 2024-12-10 13:56:05 | 显示全部楼层 |阅读模式
本帖最后由 无垠的广袤 于 2024-12-10 13:57 编辑

OLED 显示雷达数据
本文结合之前关于串口打印雷达监测数据的研究,进一步扩展至 OLED 屏幕显示。

该项目整体分为两部分:
  • 一、框架显示;
  • 二、数据采集与填充显示。

为了减小 MCU 负担,采用 局部刷新 的方案。

1. 显示框架
target_frame.jpg
所需库函数 Wire.h 、Adafruit_GFX.h 、Adafruit_SSD1306.h

代码

  1. #include <Wire.h>
  2. #include <Adafruit_GFX.h>
  3. #include <Adafruit_SSD1306.h>
  4. #include "logo_128x64.h"
  5. #include "logo_95x32.h"

  6. #define OLED_RESET 4
  7. Adafruit_SSD1306 display(128, 64, &Wire, OLED_RESET);

  8. void setup()
  9. {
  10.   Serial.begin(115200);
  11.   display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x64)
  12.   display.clearDisplay(); // 清屏
  13.   display.drawBitmap(0, 0, logo, 128, 64, 1); //画出字符对应点阵数据
  14.   display.display();
  15.   delay(1000);
  16.   display.clearDisplay();
  17.   /*-------------------- Display picture and text ---------------------------*/
  18.   display.drawBitmap(16, 0, logo_small, 95, 32, 1);
  19.   display.setTextColor(WHITE);  //设置字体颜色
  20.   display.setTextSize(2);  //设置字体大小 1 is default 6x8, 2 is 12x16, 3 is 18x24
  21.   display.setCursor(0,33); //设置起始光标
  22.   display.print("v=");
  23.   display.setCursor(72,33); //设置起始光标
  24.   display.print("km/h");
  25.   display.setCursor(0,49); //设置起始光标
  26.   display.print("str=");
  27.   display.display();
  28. }

  29. void loop()
  30. {
  31. }
复制代码


效果



OLED_frame.gif
2. 显示数据

目标:实现雷达监测数据的对应填充显示,包括速度 v 和信号强度 str

OLED_data.jpg

代码

思路:将之前帖子中实现的串口打印数据与 OLED 显示框架结合,将 v 和 str 两数据分别填充至 OLED 屏预留位置处即可。

  1. #include <Wire.h>
  2. #include <Adafruit_GFX.h>
  3. #include <Adafruit_SSD1306.h>
  4. #include "logo_128x64.h"
  5. #include "logo_95x32.h"

  6. #define OLED_RESET 4
  7. Adafruit_SSD1306 display(128, 64, &Wire, OLED_RESET);

  8. String comdata = "";

  9. void setup()
  10. {
  11.   Serial.begin(115200);
  12.   while (Serial.read() >= 0){}//clear serialbuffer
  13.   display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x64)
  14.   display.clearDisplay(); // 清屏
  15.   display.drawBitmap(0, 0, logo, 128, 64, 1); //画出字符对应点阵数据
  16.   display.display();
  17.   delay(1000);
  18.   display.clearDisplay();
  19.   /*-------------------- Display picture and text ---------------------------*/
  20.   display.drawBitmap(16, 0, logo_small, 95, 32, 1);
  21.   display.setTextColor(WHITE);  //设置字体颜色
  22.   display.setTextSize(2);  //设置字体大小 1 is default 6x8, 2 is 12x16, 3 is 18x24
  23.   display.setCursor(0,33); //设置起始光标
  24.   display.print("v=");
  25.   display.setCursor(80,33); //设置起始光标
  26.   display.print("km/h");
  27.   display.setCursor(0,49); //设置起始光标
  28.   display.print("str=");
  29.   display.display();
  30. }

  31. void loop()
  32. {
  33.   if (Serial.available() > 0)
  34.   {
  35.     char data = Serial.read();
  36.     comdata += data;
  37.     if (data == '\n')
  38.     {// type of comdata: v=1.0 km/h, str=10151
  39.       int separatorIndex = comdata.indexOf(','); // 假设分隔符为逗号
  40.       if (separatorIndex != -1)
  41.       {
  42.         String part1 = comdata.substring(0, separatorIndex); // 第一个部分
  43.         String part2 = comdata.substring(separatorIndex + 1); // 第二个部分
  44.         // 打印分割后的数据
  45.         //Serial.println(part1); // type of part1: v=1.0 km/h
  46.         //Serial.println(part2); // type of part2:  str=10151
  47.         /*------------ part1 : v=1.0 km/h ----------*/
  48.         int part1separatorIndex = part1.indexOf('='); //index of '='
  49.         if (part1separatorIndex != -1)
  50.         {
  51.           String vlc = part1.substring(part1separatorIndex + 1); // index of velocity, type of vlc is 1.0 km/h
  52.           // vlc: 1.0 km/h
  53.           int VLCseparatorIndex = vlc.indexOf(' '); // index of ' '
  54.           String v = vlc.substring(0, VLCseparatorIndex);// v only include number
  55.           float Vn = v.toFloat();
  56.           Serial.print(Vn); // print velocity number
  57.           Serial.print(',');
  58.           //display.setCursor(25,33); //设置起始光标
  59.           display.fillRect(25, 33, 60, 16, BLACK);
  60.           display.display();
  61.           display.setCursor(25,33); //设置起始光标
  62.           display.print(Vn);
  63.           display.display();
  64.         }
  65.         /*------------- part2 :  str=10151 ------------------*/
  66.         int part2separatorIndex = part2.indexOf('='); //index of '='
  67.         if (part2separatorIndex != -1)
  68.         {
  69.           String strng = part2.substring(part2separatorIndex + 1); // strng only include number
  70.           int Sn = strng.toInt();
  71.           Serial.print(Sn); // print strength number
  72.           Serial.println();
  73.           //display.setCursor(49,49); //设置起始光标
  74.           display.fillRect(49, 49, 79, 16, BLACK);
  75.           //display.setPixelColor();
  76.           display.display();
  77.           display.setCursor(49,49); //设置起始光标
  78.           display.print(Sn);
  79.           display.display();
  80.         }
  81.       }
  82.       comdata = "";
  83.     }
  84.   }
  85. }
复制代码



效果

OLED_data.gif

这里由于字体设置为 2 号,无法满足 km/h 单位的完整填充,因此被数据覆盖住一部分,可根据实际需求调整字体大小。

UART_plot.gif
同时支持串口绘图和串口数据打印。


Nano_CEM5826_OLED.zip

3.75 KB, 下载次数: 0

Project

MCU开发者和爱好者
回复

使用道具 举报

WildboarG | 2024-12-10 16:33:55 | 显示全部楼层
眨眨眼补帧
回复 支持 反对

使用道具 举报

干簧管 | 2024-12-10 18:55:47 | 显示全部楼层
试试局部刷新
回复 支持 反对

使用道具 举报

putin | 2024-12-11 14:58:19 | 显示全部楼层
可以加一个滤波算法数据会平滑一点
回复 支持 反对

使用道具 举报

无垠的广袤 | 2024-12-11 18:38:58 | 显示全部楼层
putin 发表于 2024-12-11 14:58
可以加一个滤波算法数据会平滑一点

求大佬指点
MCU开发者和爱好者
回复 支持 反对

使用道具 举报

小小鸟 | 2024-12-18 11:20:42 | 显示全部楼层
回复

使用道具 举报

这显示闪瞎眼用了阻塞延时吗,这么卡
回复 支持 反对

使用道具 举报

HaydenHu 发表于 2024-12-20 01:01
这显示闪瞎眼用了阻塞延时吗,这么卡

实际肉眼看是感觉不到屏幕刷新延时的,文中GIF图帧率限制……
但是我已经设置局部刷新了,不知道为什么还是全屏刷新,可能是Arduino的驱动包存在bug
MCU开发者和爱好者
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则