LZ是物理实验迷。前段时间躺在床上开脑洞的时候,想到一个东西
https://mc.dfrobot.com.cn/thread-14877-1-1.html
观测各种物理现象的时候经常要测一些数据。用Arduino+传感器这一组合是个非常不错的方法。
- 比大多数商品Data Logger便宜很多
- 比仪表+手抄的方法方便很多
然而以前,如果需要记录数据,LZ常用两种方法
- 串口+Labview,用上位机程序记录数据
- 数据保存到SD卡中,测完后再读出处理
于是LZ就做了这么个东西,通过传感器测得数据,自动记录到Excel中,用的是Leonardo的模拟键盘协议。
材料清单
下面LZ做的这个实验超级简单,任务是研究一杯开水冷却至室温的温度变化曲线。
- 将Leonardo接好传感器。按照DS18B20手册上的说明,DS18B20的数据线是开漏输出的,需要与VCC之间接一个较强的上拉(2K欧姆)。
- 下载LZ提供的代码。
- 电脑上打开Excel,选中A1单元格(LZ实测Windows自带的记事本也可以~如果你想保存成纯文本的)
- USB连上板子,数据收集开始
大约20分钟后,水也基本上冷却啦~直接拔掉Leonardo停止收集数据
然后就可以画图咯~~Excel大家肯定都会用吧~
LZ没有购买微软的Excel,用的是开源免费的LibreOffice Calc代替。当然功能是类似的
曲线好像画得不太好,LZ正好没玩过瘾。重新采集了一次
还不错吧
送上代码,供大家参考~
-
- #include <Keyboard.h>
- #include <OneWire.h>
-
- #define NUMBER_OF_SENSORS 1
- #define PREHEAT_TIME 3000
-
- #define StatusLED 13
- OneWire ds(A0);
-
- unsigned int Sample_Number = 1;
- float Sample_Value[NUMBER_OF_SENSORS];
-
- void Sensor_Init()
- {
- pinMode(A0, INPUT);
- }
-
- void Take_Sample()
- {
- byte i;
- byte present = 0;
- byte type_s;
- byte data[12];
- byte addr[8];
- 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[i] = ds.read();
- }
-
- unsigned int raw = (data[1] << 8) | data[0];
- if (type_s) {
- raw = raw << 3; // 9 bit resolution default
- if (data[7] == 0x10) {
- // count remain gives full 12 bit resolution
- raw = (raw & 0xFFF0) + 12 - data[6];
- }
- } else {
- byte cfg = (data[4] & 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[0] = 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[cyc]);
- }
- Keyboard.print("\n");
- Sample_Number += 1;
- }
复制代码
还有一个版本,用来同时采集多路数据。程序中采集的是A0~A5通道模拟电压,编程的时候考虑了移植其他传感器,便于改写。
Data2Excel_v0_1.zip
效果如下
关键词:Arduino Leonardo 模拟键盘 DS18B20 数据采集器
|