前些日子,玉溪同学为了试着打开快递大叔的内心世界(啧啧。。。详情请点击)而DIY了暴力快递测试设备,取得众多网友的热烈反响,遂在经过千万场内心戏之后,开始了下一次更完备的暴力测试计划。(截至发帖,玉溪同学已经远在美帝,这次把他都供出来了,希望美帝能确保他人身安全!( ´ ▽ ` )ノ ……至少小编我很安全,嗯!)
由于果壳实验室的小伙伴DFRobot对快递大叔内心世界也颇感兴趣(误,这句划掉),由于果壳实验室的小伙伴DFRobot对这项拯救人类世界的计划颇为感兴趣,决定与果壳试验一起进行项目,于是,我们这项搞机计划便轰轰烈烈开始啦! 本次测试区域仍选择在北京市内,快递路线大致为朝阳区到海淀区。因此我们的设备功能需求是:能够测量包裹撞击时加速度的强度,并将数值连同撞击时间记录在SD卡内。考虑到北京市内快递一般能实现次日达,因此我们将设备续航时间设定在24小时。 综合了功能和设备小型化的需求,我们最终选择的设备构成包括:DFRduino nano+BMA220加速度传感器+MiscroSD 模块+DS1307时间模块,同时采用一块3.7V 2000MA的锂电池+直流升压模块(输出5V)给设备供电。
DFRduino nano
BMA220加速度传感器
MiscroSD 模块
DS1307时间模块
3.7V 2000MA的锂电池与直流升压模块 选好器材之后,果壳实验室与@DFRobot 就开始愉快地撸起来了……ˊ_>ˋ 首先把这些器材用杜邦线连接起来。铛铛铛~瞬间就接好了……
喔喔,好像节奏快了一点点……再贴张连接图吧! 接着,给RTC设置时间。将DS1307RTC的例程SetTime烧写入Arduino中,打开串口监视器,看到Arduino返回的时间数据为当前时间,时间设置完成!
然后开始写代码,点击一下upload,哇,好了!(怎么可能一次就好!写代码……改代码……写代码……改代码……写代码……改代码……写代码……upload,再改……这个过程我们就略过吧!)
终于,设备调试完了(ˊ_>ˋ这回真的好了) 。
装上电池后用信封包起来,装进盒子里。
然后就愉快地让内心世界丰富的快递大叔来把快递取走了! 磕磕碰碰,中间遇到其他事情,好几天才完成了包裹寄出和回收任务,然后就开始处理数据了……(别说了,这是最痛苦难受地好不好),然后,就出结果啦……来看看快递大叔的心情……
其实快递的磕磕碰碰,汽车在快加速,或者急刹车的过程,产生的加速度也记录在设备上了。因此我们试着做一个比较好的比较,让同事带着设备走回家。 从公司到家,来回大约十三公里的路途,主要靠走路和地铁。我们获得的数据如下:
这个实验样本产生了11个数据点,对照时间,基本上是地铁加速减速产生的加速度,加速度大小主要在5~6m/s^2。 在我们试验的几个快递样本上,超过15m/s^2的加速度出现次数不少,也有几次超过20m/s^2,甚至达到27m/s^2。快递大叔的心情……啧啧…… 实验至此,快递大叔的心情大家也看了,想说的道理其实大家也都懂,易碎的该包严实,贵重的要买保险……喔不,公司的同事说了,如果万一快递大叔明天心情不好了,你们几个就去给同事收发快递吧……别说了,让我先去厕所哭会……
等等……要代码?再此之前记得先安装一下RTC的库喔!
- <font color="rgb(51, 51, 51)"><font face="Arial, Helvetica, sans-serif">#include <Wire.h>
- #include <math.h>
- #include <SD.h>
- #include <DS1307RTC.h>
- #include <Time.h>
- #include <Wire.h>
-
-
- byte Version[3];
- int8_t x_data;
- int8_t y_data;
- int8_t z_data;
- byte range=0x03;
- float divi=16;
- float x,y,z;
-
- File myFile;
-
- void setup()
- {
- Serial.begin(9600);
- Wire.begin();
- Wire.beginTransmission(0x0A); // address of the accelerometer
- // range settings
- Wire.write(0x22); //register address
- Wire.write(range); //can be set at"0x00""0x01""0x02""0x03", refer to Datashhet on wiki
- // low pass filter
- Wire.write(0x20); //register address
- Wire.write(0x05); //can be set at"0x05""0x04"......"0x01""0x00", refer to Datashhet on wiki
- Wire.endTransmission();
-
- Serial.println("Initialization SD card...");
- pinMode(10,OUTPUT);
-
- if (!SD.begin(4)) {
- Serial.println("initialization failed!");
- return;
- }
- Serial.println("initialization done.");
-
-
-
- }
-
- void AccelerometerInit()// get accelerated
- {
- Wire.beginTransmission(0x0A); // address of the accelerometer
- // reset the accelerometer
- Wire.write(0x04); // Y data
- Wire.endTransmission();
- Wire.requestFrom(0x0A,1); // request 6 bytes from slave device #2
- while(Wire.available()) // slave may send less than requested
- {
- Version[0] = Wire.read(); // receive a byte as characte
- }
- x_data=(int8_t)Version[0]>>2;
-
- Wire.beginTransmission(0x0A); // address of the accelerometer
- // reset the accelerometer
- Wire.write(0x06); // Y data
- Wire.endTransmission();
- Wire.requestFrom(0x0A,1); // request 6 bytes from slave device #2
- while(Wire.available()) // slave may send less than requested
- {
- Version[1] = Wire.read(); // receive a byte as characte
- }
- y_data=(int8_t)Version[1]>>2;
-
- Wire.beginTransmission(0x0A); // address of the accelerometer
- // reset the accelerometer
- Wire.write(0x08); // Y data
- Wire.endTransmission();
- Wire.requestFrom(0x0A,1); // request 6 bytes from slave device #2
- while(Wire.available()) // slave may send less than requested
- {
- Version[2] = Wire.read(); // receive a byte as characte
- }
- z_data=(int8_t)Version[2]>>2;
-
- x=(float)x_data/divi;
- y=(float)y_data/divi;
- z=(float)z_data/divi;
- Serial.print("X=");
- Serial.print(x); // print the character
- Serial.print(" ");
- Serial.print("Y=");
- Serial.print(y); // print the character
- Serial.print(" ");
- Serial.print("Z="); // print the character
- Serial.print(z);
- }
-
- void loop()
- { double accelerated_speed;
- switch(range) //change the data dealing method based on the range u've set
- {
- case 0x00:divi=16; break;
- case 0x01:divi=8; break;
- case 0x02:divi=4; break;
- case 0x03:divi=2; break;
- default: Serial.println("range setting is Wrong,range:from 0to 3.Please check!");while(1);
- }
- AccelerometerInit();
- accelerated_speed=sqrt(x*x+y*y+z*z);
- Serial.print("accelerated_speed=");
- Serial.println(accelerated_speed);
- if(accelerated_speed>=1)
- {
- //get time
- tmElements_t tm;
- RTC.read(tm);
- //write data
- myFile = SD.open("test.txt", FILE_WRITE);
- if (myFile) {
- Serial.print("Writing to test.txt...");
- //recoder time and data
- myFile.print("accelerated_speed=");
- myFile.print(accelerated_speed);
- myFile.print(" ");
- myFile.print("time=");
- myFile.print(tm.Hour);//
- myFile.print(':');
- myFile.print(tm.Minute);//
- myFile.print(':');
- myFile.print(tm.Second);//
- myFile.print(':');
- myFile.print(", Date (D/M/Y) = ");
- myFile.print(tm.Day);
- myFile.write('/');
- myFile.print(tm.Month);
- myFile.write('/');
- myFile.print(tmYear);
- // close the file:
- myFile.close();
-
- Serial.println("done.");
- } else {
- // if the file didn't open, print an error:
- Serial.println("error opening test.txt");
- }
-
- }
- delay(100);
-
- }
- void print2digits(int number) {
- if (number >= 0 && number < 10) {
- Serial.write('0');
- }
- Serial.print(number);
- }
- </font></font>
复制代码
|