我的Arduino代码:
#include<EngduinoThermistor.h>
void setup()
{
Serial.begin(9600);
EngduinoThermistor.begin();
}void loop()
{
float temp;
temp = EngduinoThermistor.temperature();
Serial.println(temp);
delay(1000);
}
我的处理代码:
import processing.serial.*;
Serial port;
float x = 0;
void setup() {
size(500, 400);
println(Serial.list());
String portName = Serial.list()[0];
port = new Serial(this, "/dev/tty.usbmodem1411", 9600);
}
void draw() {
}
void serialEvent(Serial port) {
float inByte = port.read();
println(inByte);
stroke(90, 76, 99);
line(x, height, x, height - inByte);
if (x >=width) {
x=0;
background(200);
}
x++;
}
我已经尝试过很难理解处理但我仍然不了解如何根据arduino发送的数据绘制图表。我认为我的问题主要是线路部分。我不知道如何绘制连接前一点和新点的线。
但总的来说问题甚至不起作用......问题在哪里:(?
答案 0 :(得分:0)
很难回答一般问题&#34;我该怎么做?#34;输入问题。 Stack Overflow专为更具体的设计而设计#34;我尝试了X,期望Y,但得到了Z而不是#34;输入问题。话虽如此,我会尝试在一般意义上提供帮助:
将您的问题分解为更小的步骤。
暂时忘掉Arduino。你能创建一个小例子草图,它显示基于某些硬编码数据的图形吗?让它先工作。
当您开始工作时,请尝试将图表基于硬编码值以外的其他内容。也许尝试随机值,或基于鼠标位置等的值。关键是不要连接你的Arduino,而是让动态图形工作。
与此分开,获取另一个忽略图形的基本示例草图,并且只连接到Arduino。打印您从Arduino到控制台的值。
最后,当你让所有这些工作分开工作时,它会更容易连接它们以根据Arduino的数据创建图形。
如果您遇到其中一个步骤,可以发布MCVE以及特定问题。祝你好运。
答案 1 :(得分:0)
根据Engduino Thermistor Documentation(pdf链接),值为浮点数。
由于您使用println()
发送了该值,因此会有一个新的行字符('\n'
)与浮点值一起发送。这实际上可以与Processing Serial的bufferUntil()函数结合使用。
主要的缺失成分实际上是从收到的String中解析float
。
这是一个基本的转换示例:
String temperatureString = "37.5";
float temperatureFloat = float(temperatureString);
你可以使用Serial readString()获取字符串,然后trim()删除空格,最后将其转换为浮点数:
temperature = float(port.readString().trim());
检查转换是否成功也是一个好主意:
if(!Float.isNaN(temperature)){
println("read temperature",temperature);
x++;
}
总的来说,检查错误总是一个好主意,所以这里有一个版本可以执行上述操作并检查串口并注释:
import processing.serial.*;
//serial port
Serial port;
//x position of current value on graph
float x = 0;
//current temperature reading
float temperature;
void setup() {
size(500, 400);
background(200);
String[] portNames = Serial.list();
println(portNames);
String portName = "not found";
//loop through available serial ports and look for an Arduino (on OSX something like /dev/tty.usbmodem1411)
for(int i = 0 ; i < portNames.length; i++){
if(portNames[i].contains("tty.usbmodem")){
portName = portNames[i];
break;
}
}
//try to open the serial port
try{
port = new Serial(this, portName, 9600);
//buffer until new line character (since values are send via println() from Arduino)
port.bufferUntil('\n');
}catch(Exception e){
System.err.println("Arduino port " + portName);
e.printStackTrace();
}
}
void draw() {
//draw graph
stroke(90, 76, 99);
//you might want to map the temperature to sketch dimensions)
line(x, height, x, height - temperature);
if (x >=width) {
x=0;
background(200);
}
}
void serialEvent(Serial port) {
try{
//read the string, trim it (in case there's a '\n' character), then convert it to a float
temperature = float(port.readString().trim());
//check if the float conversion was successfull (didn't get a NaN value)
if(!Float.isNaN(temperature)){
println("read temperature",temperature);
x++;
}
}catch(Exception e){
System.err.println("error parsing value from serial port");
e.printStackTrace();
}
}