import processing.serial.
*; // imports library for serial communication
import java.awt.event.KeyEvent; // imports library for reading the data from the serial port
import java.io.IOException;
Serial myPort; // defines Object Serial
String angle = "";
String distance = "";
String data = "";
String noObject;
float pixsDistance;
int iAngle = 0, iDistance = 0; // Initialize iAngle and iDistance globally
int index1 = 0;
int index2 = 0;
PFont orcFont;
void setup() {
fullScreen(); // Fullscreen mode
surface.setResizable(true); // Allow the window to be resizable
smooth();
myPort = new Serial(this, "COM5", 9600); // starts the serial communication
myPort.bufferUntil('.'); // reads the data from the serial port up to the character '.' (angle, distance).
}
void draw() {
fill(98, 245, 31);
noStroke();
fill(0, 4);
rect(0, 0, width, height - height * 0.065); // refresh background with transparency
fill(98, 245, 31); // green color
// calls the functions for drawing the radar
drawRadar();
drawLine(); // Draws the sweeping line according to the motor's angle
drawObject(); // Draw the detected object based on angle and distance
drawText(); // Display the current angle and distance information
// Read the serial data from Arduino (angle, distance)
void serialEvent(Serial myPort) {
data = myPort.readStringUntil('.'); // reads the data up to '.'
if (data != null) {
data = data.trim(); // remove leading/trailing whitespaces
index1 = data.indexOf(","); // find the character ',' and puts it into the variable "index1"
if (index1 > 0) {
angle = data.substring(0, index1); // extract angle
distance = data.substring(index1 + 1, data.length()); // extract distance
// converts the String variables into Integer
iAngle = int(angle);
iDistance = int(distance);
void drawRadar() {
pushMatrix();
translate(width / 2, height - height * 0.074); // moves the starting coordinates to new location
noFill();
strokeWeight(2);
stroke(98, 245, 31);
// draws the arc lines for radar's range
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);
// draws the angle lines at fixed positions (30, 60, 90, 120, 150 degrees)
line(-width / 2, 0, width / 2, 0); // 0 degree line
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)));
popMatrix();
// Draw the moving radar sweep line according to the motor's angle
void drawLine() {
pushMatrix();
strokeWeight(9);
stroke(30, 250, 60); // green color for radar sweep line
translate(width / 2, height - height * 0.074); // moves the starting coordinates to new location
// Draw the sweeping line according to the motor's angle
line(0, 0, (height - height * 0.12) * cos(radians(iAngle)), -(height - height * 0.12) * sin(radians(iAngle)));
popMatrix();
void drawObject() {
pushMatrix();
translate(width / 2, height - height * 0.074); // moves the starting coordinates to new location
strokeWeight(9);
stroke(255, 10, 10); // red color for detected object
pixsDistance = iDistance * ((height - height * 0.1666) * 0.025); // convert distance from cm to pixels
// limiting the range to 40 cm
if (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();
// Display angle and distance info and other text
void drawText() {
pushMatrix();
// Check if the object is in range or out of range
if (iDistance > 40) {
noObject = "Out of Range";
} else {
noObject = "In Range";
fill(0, 0, 0);
noStroke();
rect(0, 0, width, height * 0.0648); // Top black box for text
fill(98, 245, 31); // green text color
textSize(40);
// Display angle and distance at the top-left corner
text("Ultrasonic Radar System", 900, 50); // Moved to top-right
text("by Vania Zaheer", 900, 90); // Moved to top-right
text("Angle: " + iAngle + "°", 20, 50); // Moved to top-left
text("Distance: " + iDistance + " cm", 300, 50); // Moved to top-left with some space after angle
textSize(25);
fill(98, 245, 60);
// Angle markers remain unchanged
translate((width - width * 0.4994) + width / 2 * cos(radians(30)), (height - height * 0.0907) - width / 2 *
sin(radians(30)));
rotate(-radians(-60));
text("30°", 0, 0);
resetMatrix();
translate((width - width * 0.503) + width / 2 * cos(radians(60)), (height - height * 0.0888) - width / 2 *
sin(radians(60)));
rotate(-radians(-30));
text("60°", 0, 0);
resetMatrix();
translate((width - width * 0.507) + width / 2 * cos(radians(90)), (height - height * 0.0833) - width / 2 *
sin(radians(90)));
rotate(radians(0));
text("90°", 0, 0);
resetMatrix();
translate(width - width * 0.513 + width / 2 * cos(radians(120)), (height - height * 0.07129) - width / 2 *
sin(radians(120)));
rotate(radians(-30));
text("120°", 0, 0);
resetMatrix();
translate((width - width * 0.5104) + width / 2 * cos(radians(150)), (height - height * 0.0574) - width / 2
* sin(radians(150)));
rotate(radians(-60));
text("150°", 0, 0);
popMatrix();