风筝
发表于: 2020-10-23 10:39:59 | 显示全部楼层

在过去,我们在使用Arduino开发板进行数据可视化时,都必须使用第三方或自行开发的软件才能完成工作。因此,当Arduino团队决定改善这种情况时,确实是一件令人兴奋的事情。在本篇文章中,我们一起来看一下他们提供的解决方案,一个称为串口绘图仪(Serial Plotter)的工具。在最新版的Arduino IDE开发环境中都带有这个新工具。


串口绘图仪(Serial Plotter)提供了一种方法,通过它我们可以将实时打印到Arduino的串口的数据绘制成图表。在将此功能包含在Arduino IDE中之前,开发人员通常必须使用其他工具或编程语言(例如Python)编写代码,来以获取Arduino数据。由于这需要额外的工作和时间,因此使调试变得困难,特别是在基于波形的应用程序中,在串口监视器上查看数据是不够的。


串口绘图仪实际上是从预设的串口获取值并将其绘制在xy轴图。 Y轴代表来自串口的值,并随着该值的增加或减少自动进行调整。 X轴可以说是一个时间实例。 x轴上的每个点代表Arduino代码中println语句的执行。简而言之,每次执行println命令时,新的点/数据(对应于特定println语句的Y值)都会记录在图形上。在此版本的Arduino IDE中,串口绘图仪的局限性在于它仅支持500个数据样本,之后可能需要重新启动绘图仪。这可能会使绘图仪不适用于某些应用程序,但是我相信随着IDE的更新,这种情况将会改变。

Serial Plotter.png


将代码上传到Arduino开发板后,可以通过单击Tools -> Serial Plotter在下拉菜单中或按CTRL + SHIFT + L快捷键来打开串口绘图仪。

serial-plotter.jpg


在本篇文章中,我们将制作两个示例来演示串口绘图仪的用法。在第一个示例中,我们将使用串口绘图仪绘制光敏电阻的数据。这将使我们能够检查数据如何随发光强度变化而无需试图理解串口监视器上打印的数字。在第二个示例中,我们将使用DHT22温湿度传感器。该示例的目的是展示如何使用Arduino串口绘图仪绘制来自多个传感器的数据。


所需的组件

●    Arduino Uno开发板

●    DHT22传感器

●    光敏电阻

●    跳线

●    面包板


原理图

为简单起见,我们将为每个示例使用一个原理图。第一个示例主要绘制光敏电阻数据,该电路实质上是连接到Arduino上模拟引脚的分压器。分压器由一个部分的光敏电阻和另一部分的普通电阻组成。如下图所示连接组件。

Untitled-Sketch_bb.png


第二个示例中包含Arduino开发板和DHT22温湿度传感器,如下图所示。

Untitled-Sketch_bb2.png


代码

我们使用的这两个示例的代码非常简单。在这两个代码中,最重要的是println()函数。 Arduino函数Serial.println()将数据作为可读的ASCII文本打印到串口,后跟回车符(ASCII 13或'\ r')和换行符(ASCII 10或'\ n') 。该命令采用与Serial.print()语句相同的形式,唯一的区别是换行符不与serial.print()关联。正如在简介中提到的那样,每次调用serial.println()命令时,数据都会记录在串口绘图仪上,因此对本文来说非常重要。现在,让我们来看一下第一个示例的代码。


绘制光敏电阻数据的代码

为了简要说明该示例代码的工作方式,我们首先指出分频器输出连接到的Arduino引脚。

  1. //Written by Nick Koumaris
  2. // info@educ8s.tv

  3. int LDRpin = 0;
  4. int analogValue =0;
复制代码

接下来是void setup()函数,在该函数中初始化串行端口,将通信波特率设置为9600。

  1. void setup() {
  2.   Serial.begin(9600);
  3. }
复制代码

然后我们编写void loop()函数。在该函数中,我们使用analogRead()函数从分压器引脚获取数据,然后使用serial.println()命令将数据发送至串行端口。

  1. void loop() {
  2.   analogValue = analogRead(LDRpin);
  3.   Serial.println(analogValue);
  4.   delay(50);

  5. }
复制代码

完整的代码如下所示。

  1. //Written by Nick Koumaris
  2. // info@educ8s.tv
  3. int LDRpin = 0;
  4. int analogValue =0;

  5. void setup() {
  6.   Serial.begin(9600);
  7. }

  8. void loop() {
  9.   analogValue = analogRead(LDRpin);
  10.   Serial.println(analogValue);
  11.   delay(50);

  12. }
复制代码

绘制DHT22传感器数据的代码

如前所述,此示例的主要目的演示如何使用串口绘图仪绘制表示多个变量的多个数据。对于此示例,我们将同时从DHT22获取并绘制环境温度和湿度。为了简要说明代码,我们首先包含DHT.h头文件。

  1. //Written by Nick Koumaris
  2. // info@educ8s.tv

  3. #include "DHT.h"
复制代码

接下来,我们定义DHT传感器的信号引脚连接的Arduino引脚,并指定所用DHT的类型。

  1. #define DHTPIN 4  
  2. #define DHTTYPE DHT22
复制代码

我们还将初始化变量,这些变量将保存来自传感器的温度和湿度数据。此后,我们创建DHT库的实例。

  1. float temperature = 0.0;
  2. float humidity = 0.0;
  3. DHT dht(DHTPIN, DHTTYPE);
复制代码

接下来,我们编写void setup()函数。我们初始化串行端口,将其波特率设置为9600,然后初始化DHT传感器。

  1. void setup() {
  2. Serial.begin(9600);
  3. dht.begin();
  4. delay(100);
  5. }
复制代码

void loop()函数完成大部分工作。我们首先使用dht.readTemperature()dht.readHumidity()函数从传感器获取温度值和湿度值。之后,我们将它们打印出来。为了使用串口绘图仪区分两个变量,我们通过在变量之间(在第一个值之后,第二个值之前)打印一个空格来完成。如果数据之间没有空白,绘图仪将看到下一个println语句,作为对前一个语句的更新。

  1. void loop() {

  2. temperature = dht.readTemperature();
  3. humidity = dht.readHumidity();

  4. delay(500);
  5. Serial.print(temperature);
  6. Serial.print(" ");
  7. Serial.println(humidity);

  8. }
复制代码

该示例的完整代码如下所示。

  1. //Written by Nick Koumaris
  2. // info@educ8s.tv
  3. #include "DHT.h"
  4. #define DHTPIN 4  
  5. #define DHTTYPE DHT22

  6. float temperature = 0.0;
  7. float humidity = 0.0;
  8. DHT dht(DHTPIN, DHTTYPE);

  9. void setup() {
  10. Serial.begin(9600);
  11. dht.begin();
  12. delay(100);
  13. }

  14. void loop() {

  15. temperature = dht.readTemperature();
  16. humidity = dht.readHumidity();

  17. delay(500);
  18. Serial.print(temperature);
  19. Serial.print(" ");
  20. Serial.println(humidity);

  21. }
复制代码

效果演示

这个项目非常简单,如果出现问题,请确保您的连接符合原理图。对于每个示例,在仔细检查您的连接之后,将相应的代码上传到Arduino开发板,然后打开串口绘图仪。一段时间后,您应该会看到正在绘制的数据,如下图所示。

demo-1.jpg


example-2.jpg


以上就是本文的所有内容,感谢您的阅读。如果您有任何疑问,请随时在本帖下面进行回复。

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-19 22:52 , Processed in 0.133480 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表