我希望从Arduino Uno板上的温度传感器获取数据并让matlab存储数据,同时还可以实时绘制图表上的数据以监控传感器变化。最终将使用不同的传感器实现这一点,这更像是一个概念验证。我有两个问题困扰着我:
1)我需要每秒1000x收集数据点(我目前的代码不能这样做)
2)经过几秒钟监测数据后,大量噪音进入系统
这是我的matlab代码
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;
这是我的arduino代码
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);
}
答案 0 :(得分:0)
根据我的尝试,38400bd的串行通信足以在1kHz发送一个int。你可以使用115200bds;你的速度不支持500000bds,即使它通常有效。
ADC在1000Hz时没有问题。 Arduino命令analogRead
的工作频率为10kHz;如果你直接访问atmel MCU的寄存器,你可以将analogRead加速到100kHz。
使用drawnow
减慢了您的代码速度。你不需要在1kHz刷新;如果你以10Hz刷新,那将是你眼睛的实时。
在arduino sketch中你应该放一个delay(1)
(1ms),所以你知道串口缓冲区不会满了。
答案 1 :(得分:0)
此外,为了加快传输速度,以二进制形式发送数据将大大有助于您使用Serial.println(tempreading);
以字符串形式发送数据。表示它将每次发送6个字符。 (5个字符+ CR)。以二进制形式发送仅需要2个字节。
;已经是3倍的速度增量。
要在arduino中以二进制形式发送数据,请使用
serial.write(data_to_send>>8); //send most significant byte
serial.write( data_to_send && f); //send least significant byte