PLX-DAQ:Excel從com port取得資料並即時繪圖


實驗需求,用Arduino做了個溫溼度計。畢竟是做實驗總要收集和紀錄DATA,如果能用Excel就能一氣呵成收資料兼畫圖多美好 ~
這時候要使用PLX-DAQ來達成這個目的。

溫溼度計是用Arduino nano(atmega328)、I2C LCM、sensirion sht10做的,USB供電。
這篇的重點是紀錄PLX-DAQ這個軟體的使用。

下載安裝PLX-DAQ,這是個免費軟體,要說是軟體的話又好像不是,安裝完以後C:\Program Files (x86)\Parallax Inc\PLX-DAQ裡面有Examples資料夾、1個Help檔案和PLX-DAQ這個Excel檔案,只把這個檔案放到沒安裝過PLX-DAQ的電腦裡是無法使用這些功能的。

開啟PLX-DAQ這個Excel檔案,會有安全提示請選確定。
浮動視窗Data Acquisition for Excel裡面,port指定好(可以去裝置管理員裡面看),Baud就是傳輸速度也要指定。按下Connect按鈕連接成功的話右邊3小方塊的C會從紅變綠,是接收資料的話R的小方塊會變紅或是紅綠閃爍,左方表格也會看到資料開始出現往下增加。

開啟Excel檔案按按鈕當然簡單...
真的麻煩的是Arduino程式碼這邊要怎麼修改,肯定不會是直接輸出資料PLX-DAQ就吃進來自動對位填入,沒這麼有腦。PLX-DAQ收到的資料要符合它認定的方法,資料才會對號入座。

先講重點:
Arduino程式碼裡面void setup() 迴圈底下要添加  Serial.println("LABEL,A,B"); ,當PLX-DAQ收到這串字串的時候,會把LABEL後面的項目名稱(依照你的需求填入名稱)填入每行第一列,項目名稱可以很多個,要用逗點隔開,像這裡的Excel裡面表格A1是A,B1是B。
void loop()迴圈裏面要有相對應的資料輸出排列,要加上Serial.print("DATA");在其他Serial.print();之前,隨著void loop()重複執行,PLX-DAQ每次收到DATA字串(有分大小寫,這裡DATA要大寫)的時候會把後面的資料(一樣是用逗號隔開)分別放入各行,這裡要注意的是DATA是字串,但是資料通常是數值,所以應該這麼做,先Serial.print(","); 一個逗號,後面再Serial.print();數值 ,看有幾個數值依序類推。
這裡示範的程式碼:
int a = 0 ;
int b = 0 ;
void setup() {
   Serial.begin(9600);
   Serial.println("LABEL,A,B");
}
void loop() {
  Serial.print("DATA");
  Serial.print(",");
  Serial.print(a);
  Serial.print(",");
  Serial.println(b);
  a++;
  b=b+2;
  delay(1000);
}
上面這段的重點有搞懂的話,基本上就很夠用了。

接下來講其他的細節:
1. 上面那段程式碼使用時可能會遇到的第一個狀況是第一行的資料都會顯示成00:00:00,請右鍵把第一行的儲存格格式從自訂改為數值。2. 要做圖就把要做圖的資料那行點起來插入想要的圖表,像我這裡是AB用散布圖,在上面的程式碼裡面a是逐次加1,delay是1000,也就是1000ms=1sec,這樣的散布圖剛好就會是每點資料和時間(秒)的關係。
按下Connect按鈕以後,圖表隨著資料的增加即時改變。
3.把現在做好設定的另存新檔,以後開這個檔就做這件事,不用再改來改去,另存新檔的時候要選啟用巨集的活頁簿。
4. 仔細看PLX-DAQ這個Excel檔案底下是有3個分頁,第2頁和第3頁是有圖表的,要使用的話要把第2頁或第3頁拉到最左邊,Connect按鈕按下以後只有最左邊第1頁會匯入資料,但是這圖表不一定符合你的需求,而且要搭配TIMER這個功能,還不如像上面寫的示範碼,依照自己搞得懂的方式把資料分配好。

5. 每次按下Connect資料都會被重新蓋過,勾選浮動視窗的Clear Stroed Data只是每次按下Connect按鈕的時候會先清空原先的行列,要避免被下次的資料蓋過,就是要有好習慣把資料放到新的分頁去。

6. Excel檔案先天就有65535行和255列限制,就是往下的資料只能到65535個,往右只能到255個,所以請不要挑戰這個極限,傻掉壞掉還是自己倒楣,請留意現實上的資料個數。

7.在void loop()迴圈裏面設定輸出資料的時候,還有2個字串可以使用TIME和TIMER(大寫),PLX-DAQ收到TIME字串的時候會自動改成時:分:秒的資料填入欄位;TIMER字串的時候會自動改成時間差的計數,時間的間隔就是2次資料收到的時間差。

18 comments

Unknown | 2014年2月2日 凌晨12:06

你好,我也正在做溫濕度計,但是我開啟PLX-DAQ的Excel檔案卻顯示 無法載入物件,因為它並不存在。接著按確定出現 執行階段錯誤'424' 此處需要物件 接著我按偵錯 程式碼就以黃色顯示這段Stamp.Disconnect
請大大幫忙

蛤仔 | 2014年11月30日 下午5:46

我自己也遇到同一個問題,爬了國外的文章後發現原因出在PLX-DAQ引用的核心selmadaq_ver2.ocx檔案64bit作業系統並不支援,你可以試試32bit的作業系統,應該就能用了,或者你也可以試試Arduino + Processing的組合

Unknown | 2015年3月9日 晚上10:16

您好:
可以嘗試把office的版本降為2007就可以使用了

joseph chan | 2015年7月22日 上午11:30

您好:
我打開plx daq 的 excel檔後 ,卻沒跳出浮動視窗 data acquisition for excel 請問要從哪邊打開呢

Unknown | 2016年5月20日 下午3:25

可以跟您要您的程式碼嗎?謝謝您
a24756555@gmail.com

Unknown | 2016年11月14日 凌晨1:49

小弟最近實驗後發現,目前為止的PLX只能在32位元的office執行(會出現無法載入物件,因為它並不存在且),然後有些人可能好不容易載入物件了,卻跑不出資料,是因為目前還不支援win10(win8我不知道),只能在win7的系統下執行這支程式

LIN SHEN MAO | 2017年2月7日 上午11:14

請改用 KST,可能會更好用

LIN SHEN MAO | 2017年2月7日 上午11:15

請改用 KST,可能會更好用

Unknown | 2017年2月13日 上午9:54

SHEN MAO LIN
麻煩你,請問 KST是? 可以指引參考方向嗎? 謝謝

Unknown | 2017年7月18日 晚上11:01

想問程式上,該怎麼加程式
#include //Chama o Servo
#include //Chama o controlador PID_v1 para arduino

const int echoPin = 11; //Pino Echo do sensor de posição ultrassônico
const int trigPin = 12; //Pino Trig do sensor de posição ultrassônico
const int servoPin = 9; //Pino do Servo

double Setpoint, Input, Output, ServoOutput;

float Kp = 2.000; //Ganho Proporcional
float Ki = 0.075; //Ganho Integral
float Kd = 1.325; //Ganho Derivativo
float Tr = 0.501; //Filtro N

float readPosition() {
delay(10); //O delay deve ser maior que o echo para não haver interferência

long duration, cm;

const int trigPin = 11;
const int echoPin = 12; //Define o pino Trig como saída
unsigned long now = millis();
pinMode(trigPin, OUTPUT);
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
pinMode( echoPin, INPUT);
duration = pulseIn(echoPin, HIGH);
cm = duration/(29*2);
if(cm > 50) //34 cm é fim do curso da haste
{cm=50;}

Serial.println(cm);
return cm;
}

PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT); //Inicializa o programa do PID do arduino
Servo myServo; //Inicializa o programa do Servo

void setup() {
Serial.begin(9600);
myServo.attach(servoPin);

Input = readPosition(); //Input para o PID

myPID.SetMode(AUTOMATIC); //Ativa modo automático do PID_v1
myPID.SetOutputLimits(-40,40); //Estipula os limites de angulação do servo
}

void loop() {
Setpoint = 20;
Input = readPosition();

myPID.Compute(); //Calcula a saída no range de -35 a 35 degrees

ServoOutput=105+Output; //120° no servo é a posição horizontal da barra
myServo.write(ServoOutput); //Escreve valor de saída para o Servo
}

Unknown | 2017年11月20日 晚上8:14

請問我在連接excel後,arduino就連不上了,無法讀取溫度,該如何排除?

謝謝。

Unknown | 2018年1月6日 下午2:20
作者已經移除這則留言。
Unknown | 2018年1月6日 下午2:36

抱歉,請看這網頁,我已將PLX-DAQ v2.11在Win7 64bit環境,以Excel 2013執行成功(主安裝程式不用變更)

http://forum.arduino.cc/index.php?topic=437398.msg3251256#msg3251256

PON | 2018年1月11日 下午6:02

感激不盡...

Unknown | 2018年6月22日 晚上11:53

你好 ,我在做溫度監控實驗遇到以下問題
excel 按下connect 後 ardunio的序列埠監控視窗不能開
會顯示 port is busy

還有我不管有沒有開序列埠監控視窗 按下connect 都沒有數據輸入excel

Unknown | 2018年6月23日 凌晨12:14

樓上問題已解決
序列埠監控視窗的數據排列必須換行
DATA,VALUE1,VALUE2
DATA,VALUE1,VALUE2
DATA,VALUE1,VALUE2
DATA,VALUE1,VALUE2
不能是
DATA,VALUE1,VALUE2DATA,VALUE1,VALUE2DATA,VALUE1,VALUE2
connect 時 序列埠監控視窗必須關閉

uiui | 2019年6月15日 下午3:04

不好意思,為甚麼他會出現COM Error:Error(5):CommOpen(Createfile)-存取被拒

Aborting

匿名 | 2022年1月25日 下午3:26

Thanks!

張貼留言