#include "U8glib.h" //LIBRERIA PARA OLED
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0); // SW SPI Com: SCK = 13, MOSI = 11
////******************************** PARAMETRIZACIÓN DE LA PANTALLA ********************************
int xmax = 128; // max ANCHO DEL DISPLAY
int ymax = 62; // max ALTURA DEL DISPLAY
int xcenter = xmax / 2; // CENTRO EJE X
int ycenter = ymax / 2 + 12; // CENTRO EJE Y
int arc = ymax / 2;
int angle = 0; // ÁNGULO
////*************************************** LETRERO DE ÁNGULO ***************************************
char* label[] = {"ANGULO"}; // IMPRIME TEXTO ÁNGULO
int labelXpos[] = {47, 45, 49, 53}; // PREDEFINE LA POSICIÓN X DEL INDICADOR DE LA ETIQUETA
#define potmeterPin A3 // SIMULA UN VALOR ANALÓGICO CON POTENCIÓMETRO
int w, m, a = 10; // POSICIÓN ANGULAR
int value = analogRead(A3);
u8g_uint_t xx = 0;
////******************************** CONEXIÓN DE ENCODER - ARDUINO **********************************
//int A = 3; // VARIABLE A CONECTADO A PIN DIGITAL 2 (DT EN MÓDULO)
//int B = 5; // VARIABLE B CONECTADO A PIN DIGITAL 4 (CLK EN MÓDULO)
//int ANTERIOR = 0; // ALMACENA VALOR ANTERIOR DE LA VARIABLE POSICIÓN
//volatile int POSICION = 0; // VARIABLE POSICIÓN CON VALOR INICIAL DE 50 Y DEFINIDA
//volatile int POSICION2 = 0; // VARIABLE POSICIÓN CON VALOR INICIAL DE 50 Y DEFINIDA
//// COMO GLOBAL AL SER USADA EN LOOP E ISR (ENCODER)
////**************************************** SEMICIRCULOS **********************************************************************
void gauge(uint8_t angle) {
// SEMICIRCULO GRANDE
u8g.drawCircle(xcenter, ycenter, arc + 2, U8G_DRAW_UPPER_RIGHT);
u8g.drawCircle(xcenter, ycenter, arc + 3, U8G_DRAW_UPPER_RIGHT);
u8g.drawCircle(xcenter, ycenter, arc + 2, U8G_DRAW_UPPER_LEFT);
u8g.drawCircle(xcenter, ycenter, arc + 3, U8G_DRAW_UPPER_LEFT);
//// DIBUJA EL DISPLAY
float x1 = sin(2*angle*2*3.14/360); // POSICION DE LA AGUJA
float y1 = cos(2*angle*2*3.14/360);
u8g.drawLine(xcenter, ycenter, xcenter + arc*x1, ycenter - arc*y1); // IMPRESIÓN DE LA AGUJA
////********** MINI DISCO INTERNO **************************************
u8g.drawDisc(xcenter, ycenter, 2, U8G_DRAW_UPPER_LEFT);
u8g.drawDisc(xcenter, ycenter, 2, U8G_DRAW_UPPER_RIGHT);
u8g.setFont(u8g_font_chikita);
////***************** POSICIONES DE 4 ANGULOS ****************************
u8g.drawStr(20, 42, "0 ");
u8g.drawStr(25, 21, "45 ");
u8g.drawStr(59, 7, "90");
u8g.drawStr(88, 21, " 135");
u8g.drawStr(100, 42, " 180");
//*********************VER INDICADOR DEL DIAPLAY************************
//u8g.setPrintPos (labelXpos[0], 58);
u8g.setPrintPos (labelXpos[0], 30);
u8g.print(label[0]);
////*********************VALOR DIGITAL DE LA POSICIÓN******************************
u8g.setFont(u8g_font_profont22);
u8g.setPrintPos(54, 60);
if (w < 10) {
u8g.print("0");
}
if (w > 90) {
u8g.setPrintPos(47, 60);
}
u8g.print(w);
}
//------------------------------- void setup () ------------------------------------
void setup(void) {
u8g.setFont(u8g_font_chikita);
u8g.setColorIndex(1); // Instrucción para que el Display dibuje con pixel activo
//asigna por defecto el valor del color
if (u8g.getMode() == U8G_MODE_R3G3B2) {
u8g.setColorIndex(255); //Blanco
}
else if (u8g.getMode() == U8G_MODE_GRAY2BIT) {
u8g.setColorIndex(1); //Máxima intensidad
}
else if (u8g.getMode() == U8G_MODE_BW) {
u8g.setColorIndex(1); // Pixel activado
}
else if (u8g.getMode() == U8G_MODE_HICOLOR) {
u8g.setHiColorByRGB(100, 100, 100);
}
Serial.begin(115200);
pinMode(A3, INPUT);
}
void loop(void) {
// Linealizaciónde la señal
value = analogRead(A3); // value = Señal del potenciómetro
Serial.println(value);
delay(420);
w = map(value,0,580,0,180); // Mapeo de la señal 0 a 180
m = map(value,0,580,0, 90); // Mapeo en el display
// Ver aguja y dial
xx = m; // Ajuste de la aguja en el display
if (xx<45) {
xx=xx+135;
}
else {
xx = xx-45;
}
// Imprime
{
u8g.firstPage();
do {
gauge (xx);
}
while(u8g.nextPage());
}
}