บทความนี้ คล้ายๆกับ 07.serial to graph 1 แต่เป็นการรับข้อมูลที่มีค่าเป็น Floating point แต่ส่งเข้ามาเป็นแบบ String
เมื่อรับค่า string เข้ามาแล้ว จะแปลงเป็นค่า Float โดยใช้คำสั่ง float(myString)
โปรแกรม
import processing.serial.*;
Serial myPort; // กำหนดตัวแปรสำหรับพอร์ทอนุกรม
float[] vals;
int zero_line;
int lf = 10; // Linefeed in ASCII
String myString = null;
void setup()
{
size(800,300); // ขนาดหน้าต่างแสดงผล
smooth();
println(Serial.list()); // แสดงพอร์ทที่มีอยู่
myPort = new Serial(this, Serial.list()[1], 9600); // เรียกใช้พอร์ทหมายเลข [1]
vals = new float[width]; // An array for store data, array size = width of windows (400)
zero_line = height/2; //Location for vals = 0;
for (int i = 0; i < vals.length; i++)
{
vals[i] = 0; //initial value
}
draw_line();
}
void draw()
{
while (myPort.available() > 0) //ตรวจสอบว่ามีข้อมูลใหม่หรือไม่ ถ้ามีรับข้อมูลและเขียนกราฟ
{
background(255);
get_data();
draw_line();
}
}
//-------------------------------------------------------
void get_data()
{
// Slide everything down in the array
for (int i = 0; i < vals.length-1; i++)
{
vals[i] = vals[i+1];
}
myString = myPort.readStringUntil(lf);
if (myString != null)
{
print(myString); // Prints String
vals[vals.length-1]=float(myString); // Converts to float
}
}
//-------------------------------------------------------
void draw_line()
{
// Draw lines connecting all points
for (int i = 0; i < vals.length-1; i++)
{
stroke(0);
strokeWeight(1);
line(i,zero_line -vals[i],i+1,zero_line -vals[i+1]);
}
}
//-------------------------------------------------------
สำหรับโปรแกรม Arduino ที่ใช้ส่งค่าเป็น เนื่องจากค่าที่ส่งออกเป็น Float จึงไม่สามารถใช้คำสั่ง serial.write(byte) ได้ เพราะว่าคำสั่งนี้ส่งได้เฉพาะเลขจำนวนเต็มบวกขนาด 1 ไบต์เท่านั้น (0 - 255) ดังนั้นต้องใช้วิธีส่งเป็นชุดตัวอักษร หรือสตริง (String) โดยการใช้คำสั่ง
println ดังนี้
/* RS232 print data*/
float val = 0;
float amplitude = 100;
float angle = 0;
const float pi = 3.14159265;
void setup()
{
Serial.begin(9600);
}
void loop()
{
val = amplitude*sin(pi*angle/180.0);
Serial.println(val);
angle++;
if(angle>=360) angle=0;
delay(50);
}
ผลการทำงาน
ไฟล์แนบเป็นการเขียนแบบเก่า