Arduino读取传感器数据存进Excel中

0. 简介

需要的工具:PLX-DAQ,其是一个带有宏定义的Excel表,通过适当的配置可以从Arduino直接读取并保存数据,功能十分的强大。

可能遇到的问题:无法运行,原因EXCEL中宏被禁用了

 解决方法:

1.单击 Excel 左上角“Office”图标,弹出菜单,单击 “Excel选项”跳转至操作页面;

2. “Excel 选项”操作页面,选择“信任中心”,然后点击“信任中心设置”;

3. “宏设置”选项下,点选 “启用 VBN 宏(不推荐;可能运行……)” ,设置完成,点击确定按钮,Excel 2010 宏 即可正常运行。

1.  编写传感器数据采集程序

采集12V锂电池电池电量,并采用冒泡排序法进行滤波处理。

简单的电池电量测量程序如下:

void setup() {
  Serial.begin(9600);
}

void loop() {
  int sensorValue = analogRead(A0);   // A0读取到的模拟量
  float battery_voltage = sensorValue*(1.0/1023.0)*12.37; 
  Serial.println(battery_voltage);
  delay(500);
}

2. 将数据传入上位机写入EXCEL中

 第1步,在void setup()中添加以下程序:

Serial.begin(9600);
Serial.println("CLEARDATA");
Serial.println("LABEL,TIMER,Gyro_x,Gyro_y,Gyro_z");

第二行:清楚数据

第三行:LABEL,让PLX-DAQ知道写的是表格

TIME:是当前时间,Timer是从启动后开始算时间,从0开始

//Label后面的就是要在excel中列的名字

后面这个几个参数都是表头

效果图

第2步: 修改void loop()中的程序

Serial.print("DATA, TIMER,");
Serial.print( gx );
Serial.print(",");
Serial.print( gy );
Serial.print(",");
Serial.println( gz );

第2行代表要输出的变量,第3行代表换一列存储下一个变量的值,接下来调整连接的端口和波特率即可正常使用了。

void setup() {
  Serial.begin(9600);
  Serial.println("CLEARDATA");
  Serial.println("LABEL,TIMER,BAT_V");
}

void loop() {
  int sensorValue = analogRead(A0);   // A0读取到的模拟量
  float battery_voltage = sensorValue*(1.0/1023.0)*12.37; 
  Serial.print("DATA, TIMER,");
  Serial.println(battery_voltage);
  delay(50);
}

 

3. 采用冒泡排序法进行滤波

const byte dataReadinglength = 10; //数组长度
int dataReading[dataReadinglength] = {0}; // 数组初始化

// 进行冒泡排序
void bubbleSort(int array[], int size) {
  //外循环 : 循环总次数为 (size -1) :  step = 0 to size -2
  for (int otter = 0; otter < size - 1; ++otter) {
    // 内循环 - 总次数为 (size-1-step) : i = 0 to size - 2 - step
    for (int inner = 0; inner < size - 1 - otter; ++inner) {
      // 比较数组中当前数值和下一个的数值
      // 如果当前数值大,则交换位置
      if (array[inner] > array[inner + 1]) {
        int temp = array[inner];
        array[inner] = array[inner + 1];
        array[inner + 1] = temp;
      }
    }
  }
}

//气泡排序,去掉最小的,去掉最大的,然后平均
int getValue(int array[], int size) {
  bubbleSort(array, size); //气泡排序
 
  //对于array size小于3个的数组,选择全部数据
  byte arrayBegin = 0;
  byte arrayEnd = size - 1;
  //对于array size 大于3个的数据,
  //去掉最小和最大,然后选择中间的30%数据
  if (size > 3) {
    arrayBegin = size * 0.3;
    arrayEnd = size * 0.7;
  }
  int readingSum = 0;
  for (int i = arrayBegin; i < arrayEnd; i++) {
    readingSum += dataReading[i];
  }
  int readingAvg = readingSum / (arrayEnd - arrayBegin);

  return readingAvg;
}

// 根据冒泡法计算电压
float Battery_V()
{
    for (int i = 0; i < dataReadinglength; i++)
    {
        // 将读数放入到数组中
        dataReading[i] = analogRead(A0);
        //   delay(50);
    }
    int sensorValue = getValue(dataReading, dataReadinglength); //A0读取到的模拟量
    float battery_voltage = sensorValue * (1.0 / 1023.0) * 12.37;      
    return battery_voltage;     // 电池电压
}

void setup() {
  Serial.begin(9600);
  Serial.println("CLEARDATA");
  Serial.println("LABEL,TIMER,BAT_V");
}

void loop() {
 
  float battery_voltage =  Battery_V();
  Serial.print("DATA, TIMER,");
  Serial.println(battery_voltage);
  delay(50);
}

 

猜你喜欢

转载自blog.csdn.net/qq_45355603/article/details/125868798