No es un proyecto propiamente dicho porque no va a tener utilidad. Quizá se pregunten ¿porqué?, bueno la razón o razones son sencillas:
1) Tiene un alcance ridículamente limitado (en las publicación del ultrasonido pude ver que tenía un máximo de 2 metros aproximadamente)
2) Los tiempos van a ser cruciales, por lo que parecería que no se va a poder mostrar en tiempo real el objeto.
Pero a pesar de esas cosas voy a desarrollarlo por "amor al arte" y ver que sale, quizá se pueda conseguir algo interesante.
Entonces, para empezar, voy a reciclar código (como no podía ser de otra forma) de la publicación del servo, de la pantalla y del ultrasonido.
La idea sería mostrar en la pantalla los puntos que se consideran que bloqueen la "vista" del ultrasonido.
Sin más, les dejo el código:
//pantalla #include <Adafruit_GFX.h> // Core graphics library #include "SWTFT.h" // Hardware-specific library //algunos colores #define negro 0x0000 #define azul 0x001F #define rojo 0xF800 #define verde 0x07E0 #define cyan 0x07FF #define magenta 0xF81F #define amarillo 0xFFE0 #define blanco 0xFFFF //de la pantalla SWTFT tft; //para el touch #include <stdint.h> #include "TouchScreen.h" //declaraciones para el touch #define YP A1 // must be an analog pin, use "An" notation! #define XM A2 // must be an analog pin, use "An" notation! #define YM 7 // can be a digital pin #define XP 6 // can be a digital pin #define MINPRESSURE 10 #define MAXPRESSURE 1000 TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); //servo #include <SoftwareServo.h> SoftwareServo servo1; //ultrasonido #define trigPin 32 #define echoPin 34 int x = 0, y = 0, x1 = 0, y1 = 0, check = 1; long distancia; void setup() { servo1.attach(30); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); tft.reset(); tft.begin(); tft.fillScreen(negro); tft.setRotation(3); tft.fillCircle(50, 50, 10, blanco); Serial.begin(9800); } void loop() { tft.fillScreen(negro); for (int val = 0; val <= 180; val++) { servo1.write(val); ultrasonido(); //obtenemos la distancia hasta el objeto tft.fillCircle((160-(distancia*cos(val))), (240-((distancia*sin(val))/2)), 2, blanco); //ubicamos el cursor en el medio abajo SoftwareServo::refresh(); //y situamos el punto donde esté el objeto } tft.fillScreen(negro); for (int val = 180; val >= 0; val--) { servo1.write(val); ultrasonido(); //obtenemos la distancia hasta el objeto tft.fillCircle((160-(distancia*cos(val))), (240-((distancia*sin(val))/2)), 2, blanco); //ubicamos el cursor en el medio abajo SoftwareServo::refresh(); //y situamos el punto donde esté el objeto } } void ultrasonido() { long duracion; a:; digitalWrite(trigPin, LOW); delayMicroseconds(5); digitalWrite(trigPin, HIGH); delayMicroseconds(15); digitalWrite(trigPin, LOW); duracion = pulseIn(echoPin, HIGH); SoftwareServo::refresh(); distancia = (duracion/2) / 29.1; if (distancia > 450) { goto a; //si el objeto está muy lejos volvemos a } //buscar el valor Serial.println(distancia); }