本帖最后由 无垠的广袤 于 2024-12-10 13:57 编辑
OLED 显示雷达数据
本文结合之前关于串口打印雷达监测数据的研究,进一步扩展至 OLED 屏幕显示。
该项目整体分为两部分:
为了减小 MCU 负担,采用 局部刷新 的方案。
1. 显示框架所需库函数 Wire.h 、Adafruit_GFX.h 、Adafruit_SSD1306.h
代码
- #include <Wire.h>
- #include <Adafruit_GFX.h>
- #include <Adafruit_SSD1306.h>
- #include "logo_128x64.h"
- #include "logo_95x32.h"
- #define OLED_RESET 4
- Adafruit_SSD1306 display(128, 64, &Wire, OLED_RESET);
- void setup()
- {
- Serial.begin(115200);
- display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x64)
- display.clearDisplay(); // 清屏
- display.drawBitmap(0, 0, logo, 128, 64, 1); //画出字符对应点阵数据
- display.display();
- delay(1000);
- display.clearDisplay();
- /*-------------------- Display picture and text ---------------------------*/
- display.drawBitmap(16, 0, logo_small, 95, 32, 1);
- display.setTextColor(WHITE); //设置字体颜色
- display.setTextSize(2); //设置字体大小 1 is default 6x8, 2 is 12x16, 3 is 18x24
- display.setCursor(0,33); //设置起始光标
- display.print("v=");
- display.setCursor(72,33); //设置起始光标
- display.print("km/h");
- display.setCursor(0,49); //设置起始光标
- display.print("str=");
- display.display();
- }
- void loop()
- {
- }
复制代码
效果
2. 显示数据
目标:实现雷达监测数据的对应填充显示,包括速度 v 和信号强度 str
代码
思路:将之前帖子中实现的串口打印数据与 OLED 显示框架结合,将 v 和 str 两数据分别填充至 OLED 屏预留位置处即可。
- #include <Wire.h>
- #include <Adafruit_GFX.h>
- #include <Adafruit_SSD1306.h>
- #include "logo_128x64.h"
- #include "logo_95x32.h"
-
- #define OLED_RESET 4
- Adafruit_SSD1306 display(128, 64, &Wire, OLED_RESET);
-
- String comdata = "";
-
- void setup()
- {
- Serial.begin(115200);
- while (Serial.read() >= 0){}//clear serialbuffer
- display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x64)
- display.clearDisplay(); // 清屏
- display.drawBitmap(0, 0, logo, 128, 64, 1); //画出字符对应点阵数据
- display.display();
- delay(1000);
- display.clearDisplay();
- /*-------------------- Display picture and text ---------------------------*/
- display.drawBitmap(16, 0, logo_small, 95, 32, 1);
- display.setTextColor(WHITE); //设置字体颜色
- display.setTextSize(2); //设置字体大小 1 is default 6x8, 2 is 12x16, 3 is 18x24
- display.setCursor(0,33); //设置起始光标
- display.print("v=");
- display.setCursor(80,33); //设置起始光标
- display.print("km/h");
- display.setCursor(0,49); //设置起始光标
- display.print("str=");
- display.display();
- }
-
- void loop()
- {
- if (Serial.available() > 0)
- {
- char data = Serial.read();
- comdata += data;
- if (data == '\n')
- {// type of comdata: v=1.0 km/h, str=10151
- int separatorIndex = comdata.indexOf(','); // 假设分隔符为逗号
- if (separatorIndex != -1)
- {
- String part1 = comdata.substring(0, separatorIndex); // 第一个部分
- String part2 = comdata.substring(separatorIndex + 1); // 第二个部分
- // 打印分割后的数据
- //Serial.println(part1); // type of part1: v=1.0 km/h
- //Serial.println(part2); // type of part2: str=10151
- /*------------ part1 : v=1.0 km/h ----------*/
- int part1separatorIndex = part1.indexOf('='); //index of '='
- if (part1separatorIndex != -1)
- {
- String vlc = part1.substring(part1separatorIndex + 1); // index of velocity, type of vlc is 1.0 km/h
- // vlc: 1.0 km/h
- int VLCseparatorIndex = vlc.indexOf(' '); // index of ' '
- String v = vlc.substring(0, VLCseparatorIndex);// v only include number
- float Vn = v.toFloat();
- Serial.print(Vn); // print velocity number
- Serial.print(',');
- //display.setCursor(25,33); //设置起始光标
- display.fillRect(25, 33, 60, 16, BLACK);
- display.display();
- display.setCursor(25,33); //设置起始光标
- display.print(Vn);
- display.display();
- }
- /*------------- part2 : str=10151 ------------------*/
- int part2separatorIndex = part2.indexOf('='); //index of '='
- if (part2separatorIndex != -1)
- {
- String strng = part2.substring(part2separatorIndex + 1); // strng only include number
- int Sn = strng.toInt();
- Serial.print(Sn); // print strength number
- Serial.println();
- //display.setCursor(49,49); //设置起始光标
- display.fillRect(49, 49, 79, 16, BLACK);
- //display.setPixelColor();
- display.display();
- display.setCursor(49,49); //设置起始光标
- display.print(Sn);
- display.display();
- }
- }
- comdata = "";
- }
- }
- }
复制代码
效果
这里由于字体设置为 2 号,无法满足 km/h 单位的完整填充,因此被数据覆盖住一部分,可根据实际需求调整字体大小。
同时支持串口绘图和串口数据打印。
|