#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Wire.h>
// definicion de pines
#define SDA D4
#define SCL D5
#define servo D9
#define potX D1
// Caracteristicas de la pantalla SSD1306
#define height 64
#define width 128
#define rst -1
// creación del objeto pantalla con la libreria SSD1306
Adafruit_SSD1306 display(width, height, &Wire, rst);
//Variables del proceso
int thita = 0;
int potValue = 0; // se inicializa en 0 para evitar lecturac sin valor.
int midPoint = 2046;//Valor inicial en ejes X=2222 del JoyStick
void setup() {
ledcAttach(servo, 50, 12);
Serial.begin(115200);
Wire.begin();
if(!display.begin(SSD1306_SWITCHCAPVCC, 0X3C)){
Serial.println("Oled Display NOT Found...");
for(;;);
}
displayTxtConfig(2, 15, 0);
display.clearDisplay();
display.println("Servo Motor");
displayTxtConfig(2, 40, 30);
display.println("Control");
display.display();
Serial.println("Servo Motor Control");
delay(3000);
}
void loop() {
//Leemos los valores de los potenciometros;
int value;
value = analogRead(potX);
//Se evalua el cambio de posicion con un umbral de 100 en binbario
if(value-midPoint > 100){thita += 1;}
if(value-midPoint <-100){thita -= 1;}
//Se limita el angulo entre 0 y 180
if(thita<0) {thita = 0;}
if(thita>180) {thita = 180;}
//llamamos al metodo para mover el servo
moveServo();
//llamamos al metodo para mostrar la posicion actual del servo
displayAngle();
}
void displayTxtConfig(int size, int x, int y){
//Pasos para imprimir
//1. Seleccionar tamaño de la letra
display.setTextSize(size);
//2. Color de la letra(Blanco/Negro)
display.setTextColor(WHITE);
//3. posicionar el cursor
display.setCursor(x, y);
}
void displayAngle() {
display.clearDisplay();
int cx = 64; // centro X
int cy = 63; // centro Y (abajo)
int r = 50; // radio
// --- Dibujar arco ---
for (int ang = 0; ang <= 180; ang += 2) {
float rad = ang * PI / 180.0;
int x = cx + r * cos(rad);
int y = cy - r * sin(rad);
display.drawPixel(x, y, WHITE);
}
// --- Marcas cada 30 grados ---
for (int ang = 30; ang <= 180; ang += 30) {
float rad = ang * PI / 180.0;
int x1 = cx + (r - 5) * cos(rad);
int y1 = cy - (r - 5) * sin(rad);
int x2 = cx + r * cos(rad);
int y2 = cy - r * sin(rad);
display.drawLine(x1, y1, x2, y2, WHITE);
}
// --- Aguja ---
float rad = thita * PI / 180.0;
int x = cx + (r - 10) * cos(rad);
int y = cy - (r - 10) * sin(rad);
display.drawLine(cx, cy, x, y, WHITE);
// --- Texto del ángulo ---
display.setTextSize(1);
display.setCursor(40, 0);
display.print("thita: ");
display.print(thita);
display.display();
Serial.print("Thita:");Serial.print(thita);Serial.print("°\n");
}
void moveServo(){
int duty = map(thita, 0,180, 102, 512);
ledcWrite(servo,duty);
}