14114浏览
查看: 14114|回复: 15

模拟键盘、自动填写Excel的数据记录仪

[复制链接]
LZ是物理实验迷。前段时间躺在床上开脑洞的时候,想到一个东西
https://mc.dfrobot.com.cn/thread-14877-1-1.html

观测各种物理现象的时候经常要测一些数据。用Arduino+传感器这一组合是个非常不错的方法。
  • 比大多数商品Data Logger便宜很多
  • 比仪表+手抄的方法方便很多

然而以前,如果需要记录数据,LZ常用两种方法
  • 串口+Labview,用上位机程序记录数据
  • 数据保存到SD卡中,测完后再读出处理



于是LZ就做了这么个东西,通过传感器测得数据,自动记录到Excel中,用的是Leonardo的模拟键盘协议。

模拟键盘、自动填写Excel的数据记录仪图2





材料清单


下面LZ做的这个实验超级简单,任务是研究一杯开水冷却至室温的温度变化曲线。



模拟键盘、自动填写Excel的数据记录仪图4模拟键盘、自动填写Excel的数据记录仪图10模拟键盘、自动填写Excel的数据记录仪图11



  • 将Leonardo接好传感器。按照DS18B20手册上的说明,DS18B20的数据线是开漏输出的,需要与VCC之间接一个较强的上拉(2K欧姆)。
  • 下载LZ提供的代码。
  • 电脑上打开Excel,选中A1单元格(LZ实测Windows自带的记事本也可以~如果你想保存成纯文本的)
  • USB连上板子,数据收集开始
模拟键盘、自动填写Excel的数据记录仪图3


大约20分钟后,水也基本上冷却啦~直接拔掉Leonardo停止收集数据

然后就可以画图咯~~Excel大家肯定都会用吧~
LZ没有购买微软的Excel,用的是开源免费的LibreOffice Calc代替。当然功能是类似的


模拟键盘、自动填写Excel的数据记录仪图7模拟键盘、自动填写Excel的数据记录仪图5模拟键盘、自动填写Excel的数据记录仪图6模拟键盘、自动填写Excel的数据记录仪图8

曲线好像画得不太好,LZ正好没玩过瘾。重新采集了一次

模拟键盘、自动填写Excel的数据记录仪图9

还不错吧






送上代码,供大家参考~
  1. #include <Keyboard.h>
  2. #include <OneWire.h>
  3. #define NUMBER_OF_SENSORS 1
  4. #define PREHEAT_TIME 3000
  5. #define StatusLED 13
  6. OneWire  ds(A0);
  7. unsigned int Sample_Number = 1;
  8. float Sample_Value[NUMBER_OF_SENSORS];
  9. void Sensor_Init()
  10. {
  11.   pinMode(A0, INPUT);
  12. }
  13. void Take_Sample()
  14. {
  15.   byte i;
  16.   byte present = 0;
  17.   byte type_s;
  18.   byte data[12];
  19.   byte addr[8];
  20.   float celsius, fahrenheit;
  21.   ds.search(addr);
  22.   type_s = 0;
  23.   ds.reset();
  24.   ds.select(addr);
  25.   ds.write(0x44, 1);        // start conversion, with parasite power on at the end
  26.   delay(1000);     // maybe 750ms is enough, maybe not
  27.   // we might do a ds.depower() here, but the reset will take care of it.
  28.   present = ds.reset();
  29.   ds.select(addr);
  30.   ds.write(0xBE);         // Read Scratchpad
  31.   for ( i = 0; i < 9; i++) {           // we need 9 bytes
  32.     data[i] = ds.read();
  33.   }
  34.   unsigned int raw = (data[1] << 8) | data[0];
  35.   if (type_s) {
  36.     raw = raw << 3; // 9 bit resolution default
  37.     if (data[7] == 0x10) {
  38.       // count remain gives full 12 bit resolution
  39.       raw = (raw & 0xFFF0) + 12 - data[6];
  40.     }
  41.   } else {
  42.     byte cfg = (data[4] & 0x60);
  43.     if (cfg == 0x00) raw = raw << 3;  // 9 bit resolution, 93.75 ms
  44.     else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
  45.     else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
  46.     // default is 12 bit resolution, 750 ms conversion time
  47.   }
  48.   celsius = (float)raw / 16.0;
  49.   fahrenheit = celsius * 1.8 + 32.0;
  50.   Sample_Value[0] = celsius;
  51. }
  52. void setup()
  53. {
  54.   Sensor_Init();
  55.   Keyboard.begin();
  56.   delay(PREHEAT_TIME);
  57. }
  58. void loop()
  59. {
  60.   digitalWrite(StatusLED, HIGH);
  61.   Take_Sample();
  62.   digitalWrite(StatusLED, LOW);
  63.   Keyboard.print(Sample_Number);
  64.   for (char cyc = 0; cyc < NUMBER_OF_SENSORS; cyc++)
  65.   {
  66.     Keyboard.print("\t");
  67.     Keyboard.print(Sample_Value[cyc]);
  68.   }
  69.   Keyboard.print("\n");
  70.   Sample_Number += 1;
  71. }
复制代码

还有一个版本,用来同时采集多路数据。程序中采集的是A0~A5通道模拟电压,编程的时候考虑了移植其他传感器,便于改写。
下载附件Data2Excel_v0_1.zip
效果如下
模拟键盘、自动填写Excel的数据记录仪图1


关键词:Arduino Leonardo 模拟键盘 DS18B20 数据采集器
IMG_20160529_140417.jpg

gada888  版主

发表于 2016-5-30 13:47:47

很实用的技巧
回复

使用道具 举报

Ash  管理员

发表于 2016-5-30 17:51:48

想起来以前上学做社会科学实验,要录几百份问卷,要是做个图像识别的,加上自动翻页的,再加上自动记录到Excel中的功能,省事儿好多呀~

而且貌似很多兼职都是做这个的,这是要发了呀
回复

使用道具 举报

Rockets  NPC

发表于 2016-5-30 19:54:55

其实有个技巧,在excel中,文本文件,如果用英文半角逗号结尾,保存为csv文件,就可以在excel中以表格形式表示。
大家可以试试。
回复

使用道具 举报

大连林海  初级技神

发表于 2016-5-31 08:47:57

好牛掰啊 的项目 每个都是精品
回复

使用道具 举报

svw  初级技匠

发表于 2016-6-1 06:58:41

Ash 发表于 2016-5-30 17:51
想起来以前上学做社会科学实验,要录几百份问卷,要是做个图像识别的,加上自动翻页的,再加上自动记录到Ex ...

图像识别是瓶颈,貌似要强大的计算能力和算法。否则上海拍牌验证码分分钟被破解了。
回复

使用道具 举报

svw  初级技匠

发表于 2016-6-1 07:05:57

楼主可以开2个Excel窗口,一个输入数据,一个画图表。图表的数据范围事先定义好(比如1到400链接到数据窗口),然后打开你这程序。就会看到图表随着数据输入,自动再画,更好玩!
回复

使用道具 举报

dsweiliang  初级技神

发表于 2016-6-3 09:18:35

感谢分享
回复

使用道具 举报

virtualwiz  中级技匠
 楼主|

发表于 2016-6-3 12:56:29

Rockets 发表于 2016-5-30 19:54
其实有个技巧,在excel中,文本文件,如果用英文半角逗号结尾,保存为csv文件,就可以在excel中以表格形式 ...


这样数据记录到SD卡就好处理多了,谢谢Rockets分享

捕获.PNG
回复

使用道具 举报

virtualwiz  中级技匠
 楼主|

发表于 2016-6-3 12:57:40

Ash 发表于 2016-5-30 17:51
想起来以前上学做社会科学实验,要录几百份问卷,要是做个图像识别的,加上自动翻页的,再加上自动记录到Ex ...

批改试卷,扫描答题卡就是这样哒:lol
回复

使用道具 举报

virtualwiz  中级技匠
 楼主|

发表于 2016-6-3 12:58:10

svw 发表于 2016-6-1 07:05
楼主可以开2个Excel窗口,一个输入数据,一个画图表。图表的数据范围事先定义好(比如1到400链接到数据窗口 ...

对哦这样好玩:lol,我试试
回复

使用道具 举报

jqt  见习技师

发表于 2016-6-4 17:14:46

DFRduino UNO R3也可以做这个实验吧
回复

使用道具 举报

virtualwiz  中级技匠
 楼主|

发表于 2016-6-4 20:42:03

jqt 发表于 2016-6-4 17:14
DFRduino UNO R3也可以做这个实验吧

很遗憾,正常情况下UNO是不行的,因为模拟键盘用到了Leonardo芯片的USB通信这一功能,而UNO虽然有USB口,但是是转换成UART串口进行通信的。

当然如果你是高级玩家,手上有AVR ISP工具,而且使用的是正品DFRobot UNO,也是可以用特殊方法实现这一功能的。过段时间我会写个教程
回复

使用道具 举报

jqt  见习技师

发表于 2016-6-5 17:05:30

virtualwiz 发表于 2016-6-4 20:42
很遗憾,正常情况下UNO是不行的,因为模拟键盘用到了Leonardo芯片的USB通信这一功能,而UNO虽然有USB口, ...

很期待楼主的教程
回复

使用道具 举报

极目楚天舒  见习技师

发表于 2017-4-11 15:09:17

楼主,请问是有DFRobot Leonardo这块板就能自动收集数据了吗?还需不需要对其进行调试?
回复

使用道具 举报

极目楚天舒  见习技师

发表于 2017-4-12 21:22:28

请问楼主代码是怎么用的?尴尬:(
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail