我希望从Arduino Uno板上的温度传感器获取数据,并让matlab存储数据,同时还可以实时绘制图表上的数据以监控传感器的变化 . 最终将使用不同的传感器实现这一点,这更像是一个概念验证 . 我目前有两个问题困扰我:
1)我需要每秒1000x收集数据点(我目前的代码不能这样做)
2)在监测数据几秒钟后,大量噪声进入系统
Here is my matlab code
SerialPort = 'com6';
s = serial(SerialPort, 'BaudRate', 250000, 'DataBits', 8);
fopen(s);
voltage = 0;
t = 0;
y = 1;
voltage = fscanf(s);
VoltageValue(y,1)=str2double(voltage);
h = animatedline(t,VoltageValue(y,1));
xlim([0 1000]);
ylim([100 200]);
tic
while t <= 1000
voltage = fscanf(s);
VoltageValue(y,1)=str2double(voltage);
addpoints(h, t, VoltageValue(y,1));
t= t+1;
y= y+1;
drawnow
end
toc
fclose(s);
delete(s);
clear s;
Here is my arduino code
int tmppin = 0;
void setup() {
// put your setup code here, to run once:
Serial.begin(250000);
pinMode(tmppin, INPUT);
}
void loop() {
// put your main code here, to run repeatedly:
int tempreading = analogRead(tmppin);
Serial.println(tempreading);
}
2 回答
根据我的尝试,38400bd的串行通信足以在1kHz下传输一个int . 你可以使用115200bds;你的速度不支持500000bds,即使它通常有效 .
ADC在1000Hz时没有问题 . Arduino命令
analogRead
工作在10kHz;如果你直接访问atmel MCU的寄存器,你可以将analogRead加速到100kHz .使用
drawnow
减慢了代码速度 . 你不需要在1kHz刷新;如果你以10Hz刷新,那将是你眼睛的实时 .在arduino sketch中你应该放一个
delay(1)
(1ms),所以你知道串口缓冲区不会满 .另外,为了加快传输速度,以二进制形式发送数据将有助于您使用的
Serial.println(tempreading);
以字符串形式发送数据 . 这意味着它每次会发送6个字符 . (CR为5个字符) . 以二进制形式发送只需要2个字节 . ;已经是3倍的速度增量 .要在arduino中以二进制形式发送数据,请使用