Arduino与Proteus仿真实例-OLED绘制实时曲线仿真
OLED绘制实时曲线仿真
本文将演示如何使用OLED绘制实时曲线,为数据采集及显示打下基础。
在前面的文章中,对OLED的驱动及使用作了详细的介绍,请参考:
- Arduino网络编程实战-从SD卡加载图像数据并显示
- Arduino网络编程实战-OLED显示中文
- Arduino网络编程实战-从SD卡加载中文字模数据并显示
- Arduino网络编程实战-OLED显示天气信息
- Ardunio开发实例-OLED显示屏
- Arduino与Proteus仿真实例-OLED显示屏(SSD1306)I2C驱动仿真
1、仿真电器原理图

2、仿真代码实现
本次实例使用到如下开源库:
绘制单个曲线图表示例代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| #include <Arduino.h> #include <OLED\_SSD1306\_Chart.h> #include <Adafruit\_I2CDevice.h>
#define SCREEN\_WIDTH 128 #define SCREEN\_HEIGHT 64
#define OLED\_RESET -1
#define BAUDRATE 9600
#define SDA\_PIN D1 #define SCL\_PIN D2
// OLED绘制设备 OLED_SSD1306_Chart display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
char actualThickness;
void setup() {
Wire.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3c); display.clearDisplay(); display.setChartCoordinates(0, 60); // 图表坐标 display.setChartWidthAndHeight(123, 55); // 图表宽度 = 123 高度 = 60 display.setXIncrement(5); // 间隔 display.setYLimits(50, 100); // Y轴最大值和最小值 display.setYLimitLabels("50", "100"); // Y轴标签 display.setYLabelsVisible(true); display.setAxisDivisionsInc(12, 6); // 每 12 像素一个分区将在 X 轴上绘制,每个 6 像素在 Y 轴上绘制 display.setPlotMode(SINGLE_PLOT_MODE); // 单个图表模式 // display.setPointGeometry(POINT\_GEOMETRY\_CIRCLE); actualThickness = NORMAL_LINE; display.setLineThickness(actualThickness); display.drawChart(); // 绘制图表 display.display(); }
void loop() { // 生成随机数 auto value = random(50) + 50; if (!display.updateChart(value)) // 将最新数据添加到图表 { display.clearDisplay(); // 如果数据量达到最大,将重新绘制图表 if (actualThickness == NORMAL_LINE) { actualThickness = LIGHT_LINE; } else if (actualThickness == LIGHT_LINE) { actualThickness = NORMAL_LINE; } display.setLineThickness(actualThickness); display.drawChart(); } delay(100); }
|
绘制两个曲线图表代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| #include <Arduino.h> #include <OLED\_SSD1306\_Chart.h> #include <Adafruit\_I2CDevice.h>
#define SCREEN\_WIDTH 128 #define SCREEN\_HEIGHT 64
#define OLED\_RESET -1
#define BAUDRATE 9600
OLED_SSD1306_Chart display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
bool mid_line_visible = false;
void setup() { Wire.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3c); display.clearDisplay(); display.setChartCoordinates(0, 60); display.setChartWidthAndHeight(123, 60); display.setXIncrement(5); display.setYLimits(0, 100); display.setYLimits(0, 100, 1); display.setYLimitLabels("0", "100"); display.setYLimitLabels("0", "100", 1); display.setAxisDivisionsInc(12, 6); display.setYLabelsVisible(true); display.setPlotMode(DOUBLE_PLOT_MODE); // 设置双图表模式 display.setMidLineVisible(mid_line_visible); display.setLineThickness(LIGHT_LINE); display.setLineThickness(NORMAL_LINE, 1); display.drawChart(); //Update the buffer to draw the cartesian chart display.display(); }
void loop() { auto value0 = random(100); auto value1 = random(100); if (!display.updateChart(value0, value1)) { display.clearDisplay(); mid_line_visible = !mid_line_visible; display.setMidLineVisible(mid_line_visible); display.drawChart(); } delay(10); }
|
3、仿真结果
1)双图表模式

文章来源: https://iotsmart.blog.csdn.net/article/details/128465326
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!