import processing.serial.*;
Serial myPort;
String data = "";
int iAngle = 0;
int iDistance = 999;
int index1 = 0;
float pixsDistance;
String noObject = "";
int lastRxMs = 0; // en son veri geldiği zaman
void setup() {
size(1200, 700);
smooth();
background(0); // <<< İBREYİ GARANTİ GÖRÜNÜR YAPAR
println("Available serial ports:");
println(Serial.list());
myPort = new Serial(this, "COM3", 9600);
myPort.bufferUntil('.');
}
void draw() {
// Afterglow (iz bırakma)
noStroke();
fill(0, 8); // iz daha uzun kalsın: 4-10 arası güzel
rect(0, 0, width, height - height*0.065);
fill(98, 245, 31);
drawRadar();
drawLine();
drawObject();
drawText();
// Eğer 500ms'dir veri gelmiyorsa demo tarama (ibrenin çalıştığını gör)
if (millis() - lastRxMs > 500) {
iAngle = (iAngle + 2) % 181;
iDistance = 999;
}
}
void serialEvent(Serial p) {
String s = p.readStringUntil('.');
if (s == null) return;
s = trim(s);
if (s.length() < 3) return; // çok kısa/boş paketleri at
if (s.endsWith(".")) s = s.substring(0, s.length()-1);
index1 = s.indexOf(",");
if (index1 < 0) return;
String aStr = trim(s.substring(0, index1));
String dStr = trim(s.substring(index1+1));
try {
iAngle = constrain(Integer.parseInt(aStr), 0, 180);
iDistance = Integer.parseInt(dStr);
lastRxMs = millis(); // veri geldi
} catch (Exception e) {
// parse edilemeyen satırları at
}
}
void drawRadar() {
pushMatrix();
translate(width/2, height-height*0.074);
noFill();
strokeWeight(2);
stroke(98, 245, 31);
arc(0, 0, (width-width*0.0625), (width-width*0.0625), PI, TWO_PI);
arc(0, 0, (width-width*0.27), (width-width*0.27), PI, TWO_PI);
arc(0, 0, (width-width*0.479), (width-width*0.479), PI, TWO_PI);
arc(0, 0, (width-width*0.687), (width-width*0.687), PI, TWO_PI);
line(-width/2, 0, width/2, 0);
line(0, 0, (-width/2)*cos(radians(30)), (-width/2)*sin(radians(30)));
line(0, 0, (-width/2)*cos(radians(60)), (-width/2)*sin(radians(60)));
line(0, 0, (-width/2)*cos(radians(90)), (-width/2)*sin(radians(90)));
line(0, 0, (-width/2)*cos(radians(120)), (-width/2)*sin(radians(120)));
line(0, 0, (-width/2)*cos(radians(150)), (-width/2)*sin(radians(150)));
line((-width/2)*cos(radians(30)), 0, width/2, 0);
popMatrix();
}
void drawObject() {
pushMatrix();
translate(width/2, height-height*0.074);
strokeWeight(9);
stroke(255, 10, 10);
// eski ölçek: 40cm’e göre ayarlıydı
pixsDistance = iDistance * ((height-height*0.1666)*0.025);
if (iDistance > 0 && iDistance < 40) {
line(pixsDistance*cos(radians(iAngle)), -pixsDistance*sin(radians(iAngle)),
(width-width*0.505)*cos(radians(iAngle)), -(width-width*0.505)*sin(radians(iAngle)));
}
popMatrix();
}
void drawLine() {
pushMatrix();
strokeWeight(9);
stroke(30, 250, 60);
translate(width/2, height-height*0.074);
line(0, 0, (height-height*0.12)*cos(radians(iAngle)), -(height-height*0.12)*sin(radians(iAngle)));
popMatrix();
}
void drawText() {
pushMatrix();
if (iDistance > 40) noObject = "Out of Range";
else noObject = "In Range";
fill(0);
noStroke();
rect(0, height-height*0.0648, width, height);
fill(98, 245, 31);
textSize(25);
text("10cm", width-width*0.3854, height-height*0.0833);
text("20cm", width-width*0.281, height-height*0.0833);
text("30cm", width-width*0.177, height-height*0.0833);
text("40cm", width-width*0.0729, height-height*0.0833);
textSize(40);
text("ROBOVISION ACADEMY", width-width*0.875, height-height*0.0277);
text("Açı= " + iAngle + " ", width-width*0.48, height-height*0.0277);
text("Mesafe= ", width-width*0.26, height-height*0.0277);
if (iDistance < 40) text(" " + iDistance + " cm", width-width*0.225, height-height*0.0277);
else text(" --", width-width*0.225, height-height*0.0277);
popMatrix();
}