virtualwiz 发表于 2016-5-29 23:28:22

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

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

观测各种物理现象的时候经常要测一些数据。用Arduino+传感器这一组合是个非常不错的方法。

[*]比大多数商品Data Logger便宜很多
[*]比仪表+手抄的方法方便很多

然而以前,如果需要记录数据,LZ常用两种方法

[*]串口+Labview,用上位机程序记录数据
[*]数据保存到SD卡中,测完后再读出处理

{:5_196:}

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




static/image/hrline/2.gif


材料清单

[*]DFRobot Leonardohttps://www.dfrobot.com.cn/goods-648.html
[*]Screw shield V3 接线柱扩展板   https://www.dfrobot.com.cn/goods-687.html


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



[*]DS18B20数字温度传感器   https://www.dfrobot.com.cn/goods-726.html



{:5_184:}


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



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

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




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



还不错吧{:5_198:}


static/image/hrline/4.gif



送上代码,供大家参考~

#include <Keyboard.h>
#include <OneWire.h>

#define NUMBER_OF_SENSORS 1
#define PREHEAT_TIME 3000

#define StatusLED 13
OneWireds(A0);

unsigned int Sample_Number = 1;
float Sample_Value;

void Sensor_Init()
{
pinMode(A0, INPUT);
}

void Take_Sample()
{
byte i;
byte present = 0;
byte type_s;
byte data;
byte addr;
float celsius, fahrenheit;
ds.search(addr);
type_s = 0;
ds.reset();
ds.select(addr);
ds.write(0x44, 1);      // start conversion, with parasite power on at the end

delay(1000);   // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.

present = ds.reset();
ds.select(addr);
ds.write(0xBE);         // Read Scratchpad

for ( i = 0; i < 9; i++) {         // we need 9 bytes
    data = ds.read();
}

unsigned int raw = (data << 8) | data;
if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data == 0x10) {
      // count remain gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data;
    }
} else {
    byte cfg = (data & 0x60);
    if (cfg == 0x00) raw = raw << 3;// 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
    // default is 12 bit resolution, 750 ms conversion time
}
celsius = (float)raw / 16.0;
fahrenheit = celsius * 1.8 + 32.0;
Sample_Value = celsius;
}

void setup()
{
Sensor_Init();
Keyboard.begin();
delay(PREHEAT_TIME);
}

void loop()
{
digitalWrite(StatusLED, HIGH);
Take_Sample();
digitalWrite(StatusLED, LOW);
Keyboard.print(Sample_Number);
for (char cyc = 0; cyc < NUMBER_OF_SENSORS; cyc++)
{
    Keyboard.print("\t");
    Keyboard.print(Sample_Value);
}
Keyboard.print("\n");
Sample_Number += 1;
}

还有一个版本,用来同时采集多路数据。程序中采集的是A0~A5通道模拟电压,编程的时候考虑了移植其他传感器,便于改写。

效果如下



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

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

很实用的技巧

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

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

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

Rockets 发表于 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分享{:5_180:}

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

请问楼主代码是怎么用的?尴尬:(
页: [1]
查看完整版本: 模拟键盘、自动填写Excel的数据记录仪