import processing.serial.*; Serial arduinoport; int pressionado = 1; float x, y; //coordenadas dos vértices int raio = 350; int graus = 0; int w = 300; int valor = 0; int vaiVolta = 0; int[] novosValores = new int[181]; int[] velhosValores = new int[181]; PFont minhaFonte; int radarDist = 0; int firstRun = 0; void setup(){ size(750, 450); background (0); minhaFonte = createFont("verdana", 12); textFont(minhaFonte); arduinoport = new Serial(this, Serial.list()[0], 9600); } void draw(){ fill(0); noStroke(); ellipse(raio, raio, 750, 750); rectMode(CENTER); rect(350,402,800,100); if (graus >= 179) { //faz a animação seguir o caminho inverso vaiVolta = 1; } if (graus <= 1) { vaiVolta = 0; } strokeWeight(7); if(vaiVolta == 0){ for(int i = 0; i<=20; i++){ //cria o efeito de radar stroke(0, (10*i), 0); line(raio, raio, raio + cos(radians(graus+(180+i)))*w, raio + sin(radians(graus+(180+i)))*w); } }else{ for(int i = 20; i>=0; i--){ //cria o efeito de radar stroke(0, 200-(10*i), 0); line(raio, raio, raio + cos(radians(graus+(180+i)))*w, raio + sin(radians(graus+(180+i)))*w); } } noStroke(); fill(0,50,0); //primeira varredura beginShape(); //inicia o desenho do semicírculo for(int i = 0; i<180; i++){ x = raio + cos(radians((180+i)))*((velhosValores[i])); y = raio + sin(radians((180+i)))*((velhosValores[i])); vertex(x, y); } endShape(); //termina o desenho do semicírculo //segunda varredura fill(0,110,0); beginShape(); for(int i = 0; i<180; i++){ x = raio + cos(radians((180+i)))*((novosValores[i])); y = raio + sin(radians((180+i)))*((novosValores[i])); vertex(x, y); } endShape(); //media fill(0,170,0); beginShape(); for (int i = 0; i < 180; i++) { x = raio + cos(radians((180+i)))*((novosValores[i]+velhosValores[i])/2); y = raio + sin(radians((180+i)))*((novosValores[i]+velhosValores[i])/2); vertex(x, y); } endShape(); //anel vermelho após duas voltas if (firstRun >= 360) { stroke(150,0,0); strokeWeight(1); noFill(); for (int i = 0; i < 180; i++) { if (velhosValores[i] - novosValores[i] > 35 || novosValores[i] - velhosValores[i] > 35) { x = raio + cos(radians((180+i)))*(novosValores[i]); y = raio + sin(radians((180+i)))*(novosValores[i]); ellipse(x, y, 10, 10); } } } // distância entre os anéis do radar for(int i = 0; i<=6; i++){ noFill(); strokeWeight(1); stroke(0, 255-(30*i), 0); ellipse(raio, raio, (100*i), (100*i)); fill(0, 100, 0); noStroke(); text(Integer.toString(radarDist+50), 380, (305-radarDist), 50, 50); radarDist+=50; } radarDist = 0; //desenha as linhas da grade a cada 30 graus for(int i = 0; i <= 6; i++){ strokeWeight(1); stroke(0,55,0); line(raio, raio, raio + cos(radians(180+(30*i)))*w, raio + sin(radians(180+(30*i)))*w); fill(0, 55, 0); noStroke(); if (180+(30*i) >= 300) { text(Integer.toString(180+(30*i)), (raio+10) + cos(radians(180+(30*i)))*(w+10), (raio+10) + sin(radians(180+(30*i)))*(w+10), 25,50); } else { text(Integer.toString(180+(30*i)), raio + cos(radians(180+(30*i)))*w, raio + sin(radians(180+(30*i)))*w, 60,40); } } //escreve as informações na tela noStroke(); fill(0); rect(350,402,800,100); fill(0, 100, 0); text("Graus: "+Integer.toString(graus), 100, 380, 100, 50); text("Distância: "+Integer.toString(valor), 100, 400, 100, 50); text("Radar screen code ", 540, 380, 250, 50); fill(0); rect(70,60,150,100); fill(0, 100, 0); text("Legenda:", 100, 50, 150, 50); fill(0,50,0); rect(30,53,10,10); text("1º varredura:", 115, 70, 150, 50); fill(0,110,0); rect(30,73,10,10); text("2º varredura:", 115, 90, 150, 50); fill(0,170,0); rect(30,93,10,10); text("Média", 115, 110, 150, 50); noFill(); stroke(150,0,0); strokeWeight(1); ellipse(29, 113, 10, 10); fill(150,0,0); text("Movido", 115, 130, 150, 50); stroke(0, 0, 110); fill(0, 0, 110); rect(630, 53, 10, 10); text("start", 715, 70, 150, 50); fill(pressionado); } void mouseClicked(){ arduinoport.write(pressionado); } //recolhe dados do radar void serialEvent (Serial arduinoport) { String xString = arduinoport.readStringUntil('\n'); // lê uma linha por vez if (xString != null) { xString = trim(xString); //retira os espaços em branco String getX = xString.substring(1, xString.indexOf("V")); // pega a posição do servo String getV = xString.substring(xString.indexOf("V")+1, xString.length()); // pega a distância graus = Integer.parseInt(getX); valor = Integer.parseInt(getV); velhosValores[graus] = novosValores[graus]; novosValores[graus] = valor; //valor para duas voltas firstRun++; if (firstRun > 360) { firstRun = 360; } } }