【萤火工场CEM5826-M11测评】OLED显示雷达数据 本文结合之前关于串口打印雷达监测数据的研究,进一步扩展至 OLED 屏幕显示。 该项目整体分为两部分: 一、框架显示; 二、数据采集与填充显示。 为了减小 MCU 负担,采用 局部刷新 的方案。 1. 显示框架 所需库函数 Wire.h 、 Adafruit_GFX.h 、 Adafruit_SSD1306.h . 代码 #include #include #include #include "logo_128x64.h" #include "logo_95x32.h" #define OLED_RESET 4 Adafruit_SSD1306display(128, 64, &Wire, OLED_RESET); voidsetup() { 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(); } voidloop() { } 效果 2. 显示数据 目标:实现雷达监测数据的对应填充显示,包括速度 v 和信号强度 str 代码 思路:将之前帖子中实现的串口打印数据与 OLED 显示框架结合,将 v 和 str 两数据分别填充至 OLED 屏预留位置处即可。 #include #include #include #include "logo_128x64.h" #include "logo_95x32.h" #define OLED_RESET 4 Adafruit_SSD1306display(128, 64, &Wire, OLED_RESET); Stringcomdata=""; voidsetup() { Serial.begin(115200); =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(); } voidloop() { 0) { chardata=Serial.read(); comdata+=data; if (data=='\n') {// type of comdata: v=1.0 km/h, str=10151 intseparatorIndex=comdata.indexOf(','); // 假设分隔符为逗号 if (separatorIndex!=-1) { Stringpart1=comdata.substring(0, separatorIndex); // 第一个部分 Stringpart2=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 ----------*/ intpart1separatorIndex=part1.indexOf('='); //index of '=' if (part1separatorIndex!=-1) { Stringvlc=part1.substring(part1separatorIndex+1); // index of velocity, type of vlc is 1.0 km/h // vlc: 1.0 km/h intVLCseparatorIndex=vlc.indexOf(' '); // index of ' ' Stringv=vlc.substring(0, VLCseparatorIndex);// v only include number floatVn=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 ------------------*/ intpart2separatorIndex=part2.indexOf('='); //index of '=' if (part2separatorIndex!=-1) { Stringstrng=part2.substring(part2separatorIndex+1); // strng only include number intSn=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 单位的完整填充,因此被数据覆盖住一部分,可根据实际需求调整字体大小。 同时支持串口绘图和串口数据打印。