You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Gnuplot绘制Arduino采集的433MHz高低时序数据波形图

绘制433MHz收发器高低电平波形的实现方法

要把你从433MHz收发器读取的高低电平时序数据转换成波形图,核心是先把时长数据转换成时间-电平坐标对,再用常规绘图工具生成阶梯状波形,具体步骤如下:

1. 数据预处理:将时长转换为时间序列点

原始数据是「总读数个数 + 高/低电平时长交替排列」,我们需要把这些时长数据转换成可绘图的坐标点:

  • 初始化时间起点为0,初始电平设为高电平(因为第一个数据是高电平时长)
  • 遍历每一段时长:
    1. 记录当前时间点和对应电平值(比如高电平用1,低电平用0)
    2. 计算下一个时间点:当前时间 + 当前时长
    3. 记录下一个时间点和相同的电平值(这段时长内电平保持不变)
    4. 切换电平状态,处理下一段时长
  • 举个简单例子:如果数据是[4, 2, 3, 1, 4](总读数4,高2ms、低3ms、高1ms、低4ms),转换后的坐标点就是:
    (0,1) → (2,1) → (2,0) → (5,0) → (5,1) → (6,1) → (6,0) → (10,0)

2. 工具实现方案

Python + Matplotlib 绘图(推荐,适合数据分析)

用Python的matplotlib可以快速生成清晰的波形图,关键是用drawstyle='steps-post'参数绘制阶梯状电平:

import matplotlib.pyplot as plt

# 替换成你的实际数据:总读数个数 + 交替的高低电平时长
raw_data = [250, 2, 3, 1, 4, 2, 2]  # 示例:125组高低,总读数250
total_readings = raw_data[0]
durations = raw_data[1:]

time_points = [0]
level_values = [1]  # 初始为高电平
current_time = 0
current_level = 1

for idx, duration in enumerate(durations):
    current_time += duration
    time_points.append(current_time)
    level_values.append(current_level)
    
    # 最后一个读数不需要切换电平
    if idx != total_readings - 1:
        current_level = 0 if current_level == 1 else 1
        time_points.append(current_time)
        level_values.append(current_level)

# 绘制波形
plt.plot(time_points, level_values, drawstyle='steps-post', linewidth=2)
plt.xlabel('时间 (ms)')
plt.ylabel('电平')
plt.yticks([0, 1], ['低电平', '高电平'])
plt.title('433MHz收发器电平波形')
plt.grid(True, linestyle='--', alpha=0.7)
plt.show()

Arduino 串口绘图器实时查看

如果你想直接在Arduino上查看波形,可以通过串口按时间间隔发送当前电平值,用Arduino IDE自带的串口绘图器显示:

// 假设durations数组已存储读取到的所有时长数据,total为总读数个数
unsigned long current_time = 0;
int current_level = HIGH;

void setup() {
  Serial.begin(9600);
}

void loop() {
  for (int i = 0; i < total; i++) {
    unsigned long start = millis();
    // 每1ms发送一次当前电平
    while (millis() - start < durations[i]) {
      Serial.println(current_level);
      delay(1);
    }
    // 切换电平
    current_level = (current_level == HIGH) ? LOW : HIGH;
  }
  // 循环结束后停止,或者按需修改
  while(1);
}

3. 注意事项

  • 如果总读数个数是奇数,最后一段时长对应的电平不会切换,绘图时要保留最后一个点的电平状态
  • 数据量较大(125组)时,Python的matplotlib可以轻松处理,无需担心性能问题
  • 调整绘图细节:比如增加线宽、设置y轴标签为「高/低电平」、添加网格线,让波形更易读

内容的提问来源于stack exchange,提问作者tim.roberts

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 00:09:23