模拟键盘、自动填写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 数据采集器
很实用的技巧 想起来以前上学做社会科学实验,要录几百份问卷,要是做个图像识别的,加上自动翻页的,再加上自动记录到Excel中的功能,省事儿好多呀~
而且貌似很多兼职都是做这个的,这是要发了呀 其实有个技巧,在excel中,文本文件,如果用英文半角逗号结尾,保存为csv文件,就可以在excel中以表格形式表示。
大家可以试试。 好牛掰啊 的项目 每个都是精品 Ash 发表于 2016-5-30 17:51
想起来以前上学做社会科学实验,要录几百份问卷,要是做个图像识别的,加上自动翻页的,再加上自动记录到Ex ...
图像识别是瓶颈,貌似要强大的计算能力和算法。否则上海拍牌验证码分分钟被破解了。 楼主可以开2个Excel窗口,一个输入数据,一个画图表。图表的数据范围事先定义好(比如1到400链接到数据窗口),然后打开你这程序。就会看到图表随着数据输入,自动再画,更好玩! 感谢分享 Rockets 发表于 2016-5-30 19:54
其实有个技巧,在excel中,文本文件,如果用英文半角逗号结尾,保存为csv文件,就可以在excel中以表格形式 ...
这样数据记录到SD卡就好处理多了,谢谢Rockets分享{:5_180:}
Ash 发表于 2016-5-30 17:51
想起来以前上学做社会科学实验,要录几百份问卷,要是做个图像识别的,加上自动翻页的,再加上自动记录到Ex ...
批改试卷,扫描答题卡就是这样哒:lol svw 发表于 2016-6-1 07:05
楼主可以开2个Excel窗口,一个输入数据,一个画图表。图表的数据范围事先定义好(比如1到400链接到数据窗口 ...
对哦这样好玩:lol,我试试 DFRduino UNO R3也可以做这个实验吧 jqt 发表于 2016-6-4 17:14
DFRduino UNO R3也可以做这个实验吧
很遗憾,正常情况下UNO是不行的,因为模拟键盘用到了Leonardo芯片的USB通信这一功能,而UNO虽然有USB口,但是是转换成UART串口进行通信的。
当然如果你是高级玩家,手上有AVR ISP工具,而且使用的是正品DFRobot UNO,也是可以用特殊方法实现这一功能的。过段时间我会写个教程 virtualwiz 发表于 2016-6-4 20:42
很遗憾,正常情况下UNO是不行的,因为模拟键盘用到了Leonardo芯片的USB通信这一功能,而UNO虽然有USB口, ...
很期待楼主的教程 楼主,请问是有DFRobot Leonardo这块板就能自动收集数据了吗?还需不需要对其进行调试? 请问楼主代码是怎么用的?尴尬:(
页:
[1]