Skip to content

Commit af3c0a8

Browse files
committed
Widgets funtionality was included. Only osciloscope widget was developped
2 parents f4a732c + 487013e commit af3c0a8

File tree

9 files changed

+425
-41
lines changed

9 files changed

+425
-41
lines changed

library.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
name=EasyOledUI
2-
version=0.9.0
2+
version=0.9.5
33
author=Victor Julio Monge Rojas
44
maintainer=Victor Julio Monge Rojas
55
sentence=Arduino ESP32 - Simple UI generator with manus and messages
66
paragraph=This library enables to make an UI made of simple menus and messages. It was tested with an OLED I2C of 128x64 pixels. It was made for ESP32, but can be used on other platforms.
77
category=User interfase
8-
url=https://github.com/julio220115838
8+
url=https://github.com/julio22011/EasyOledUI/tree/main
99
architectures=esp32

src/EasyOledUI.h

Lines changed: 67 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,20 @@
33
* crear una interfaz de usuario en la pantalla OLED
44
*/
55

6-
#if !defined(librericaPreferenciasIncluida)
7-
#define librericaPreferenciasIncluida
6+
#if !defined(libreriaPreferenciasIncluida)
7+
#define libreriaPreferenciasIncluida
88
#include <Preferences.h> // incluir libreria que permite guardar Ajustes en la memoria
99
#endif
1010

1111

1212

1313
#if !defined(claseUI_OLEDIncluida) // if para evitar ejecutar el mismo codigo dos veces
1414
#define claseUI_OLEDIncluida
15+
16+
1517

1618
//=====================================================================
17-
// Parametros generales de la pantalla
19+
// Parametros generales de la pantalla y ajustes
1820
//=====================================================================
1921

2022
// Definicion del tamaño de la pantalla:
@@ -25,6 +27,11 @@
2527
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
2628
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
2729
#define duracionMensajeMS 1000 // Tiempo de espera para mostrar mensajes de error en milisegundos
30+
31+
// Activar/desacitvar widgets
32+
#define EasyOledUI_osciloscopeWidget // activar el widget de osciloscopio
33+
//...
34+
2835
//=====================================================================
2936

3037
#include <Adafruit_SSD1306.h> // se requiere la clase de la pantalla
@@ -45,26 +52,44 @@ bool callBackEjecutarAccion(int menuActual, int opcionActual){
4552
*/
4653

4754

55+
//=====================================================================
56+
// Incorporacion de los widgets
57+
//=====================================================================
58+
59+
#include "widgets/widget.h" // Clase de los widgets
60+
61+
#ifdef EasyOledUI_osciloscopeWidget
62+
#include "widgets/osciloscopeWidget.h" // Matriz con la imagen del logo y el tamaño
63+
#endif
64+
65+
//=====================================================================
66+
67+
4868
class UI_OLED {
4969
//
5070
private:
5171

5272
public:
73+
74+
// Clases asociadas
75+
//class Widget; // Clase para crear widgets
5376

5477
// Varibles
55-
Adafruit_SSD1306 display; // permite almacenar la clase de la pantalla asociada
78+
Adafruit_SSD1306 * display; // permite almacenar la clase de la pantalla asociada
5679
uint16_t menuActual = 0;
5780
int numeroMenus = 0; // guarda la cantidad de menus existentes
5881
menu *menusGuardados = NULL; // Puntero hacia los objetos de tipo menu
59-
botones botonesUI;
82+
botones * botonesUI;
6083
bool cambioPendiente = true; // Permite indicar desde el exterior de la clase si se debe refrescar los menus
6184
bool mensajePendiente = false; // Permite indicar desde el exterior si de debe mostrar un mensaje
6285
String mensajeEsporadico = "None";
86+
Widget * widgets = NULL; // Puntero hacia los objetos de tipo widget
87+
int numeroWidgets = 0; // Cantidad de widgets existentes
6388

6489
// Funciones
6590
bool mostrarMenuEnOLED(menu menuPorMostrar);
66-
bool asociarPantalla(Adafruit_SSD1306 displayPorAsociar);
67-
bool asociarBotones(botones _botones);
91+
bool asociarPantalla(Adafruit_SSD1306 * displayPorAsociar);
92+
bool asociarBotones(botones * _botones);
6893
void handleInterruptUI();
6994
bool asociarMenu(int numMenus, menu *menusPorAsociar);
7095
bool imprimirTitulosDeMenusSerial();
@@ -94,12 +119,12 @@ bool UI_OLED::asociarMenu(int numMenus, menu *menusPorAsociar){
94119
return 1;
95120
}
96121

97-
bool UI_OLED::asociarPantalla(Adafruit_SSD1306 displayPorAsociar){
122+
bool UI_OLED::asociarPantalla(Adafruit_SSD1306 * displayPorAsociar){
98123
// Esta funcion vincula el UI con la pantalla OLED
99124
display = displayPorAsociar;
100125
}
101126

102-
bool UI_OLED::asociarBotones(botones _botones){
127+
bool UI_OLED::asociarBotones(botones * _botones){
103128
// Esta funcion vincula los botones con la UI
104129
botonesUI = _botones;
105130
}
@@ -120,7 +145,7 @@ bool UI_OLED::imprimirTitulosDeMenusSerial(){
120145
// Funcion para iniciar la pantalla
121146
bool UI_OLED::setupPantallaOled(int I2C_SDA, int I2C_SCL){
122147
Wire.begin(I2C_SDA, I2C_SCL); // iniciar I2C con los pines definidos
123-
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
148+
if(!display->begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
124149
Serial.println(F("SSD1306 allocation failed"));
125150
//for(;;); // Don't proceed, loop forever
126151
}
@@ -129,57 +154,57 @@ bool UI_OLED::setupPantallaOled(int I2C_SDA, int I2C_SCL){
129154
//display.display();
130155
testdrawbitmap(); // Muestra un logo en la pantalla
131156
vTaskDelay(pdMS_TO_TICKS(4000)); // Pause for 4 seconds
132-
display.clearDisplay();
157+
display->clearDisplay();
133158

134159
// Show the display buffer on the screen. You MUST call display() after
135160
// drawing commands to make them visible on screen!
136-
display.display();
161+
display->display();
137162
}
138163

139164
// Logo inicial
140165
// --------------------------------------
141166
#include "logoInicial.h" // Matriz con la imagen del logo y el tamaño
142167
void UI_OLED::testdrawbitmap(void) {
143-
display.clearDisplay();
168+
display->clearDisplay();
144169

145-
display.drawBitmap(
146-
(display.width() - LOGO_WIDTH ) / 2,
147-
(display.height() - LOGO_HEIGHT) / 2,
170+
display->drawBitmap(
171+
(display->width() - LOGO_WIDTH ) / 2,
172+
(display->height() - LOGO_HEIGHT) / 2,
148173
LogoWaveSense, LOGO_WIDTH, LOGO_HEIGHT, 1);
149-
display.display();
174+
display->display();
150175
}
151176
// --------------------------------------
152177

153178
bool UI_OLED::mostrarMenuEnOLED(menu menuPorMostrar){
154179
// Funcion para desplagar un menu en la pantalla
155-
display.clearDisplay();
156-
display.setTextSize(1); // Normal 1:1 pixel scale
157-
display.setTextColor(SSD1306_WHITE); // Draw white text
158-
display.drawLine(1, 15, display.width()-15, 15, SSD1306_WHITE);
159-
display.setCursor(0,6);
160-
display.println(menuPorMostrar.titulo); // mostrar el titulo
161-
display.setCursor(0,17);
180+
display->clearDisplay();
181+
display->setTextSize(1); // Normal 1:1 pixel scale
182+
display->setTextColor(SSD1306_WHITE); // Draw white text
183+
display->drawLine(1, 15, display->width()-15, 15, SSD1306_WHITE);
184+
display->setCursor(0,6);
185+
display->println(menuPorMostrar.titulo); // mostrar el titulo
186+
display->setCursor(0,17);
162187
for (int i = 0; i < menuPorMostrar.numOpc; i++)
163188
{
164189
if(i==menuPorMostrar.opcionSelecionada){ // verifica cual es la opcion en pantalla y le pone una marca
165-
display.println("> " + menuPorMostrar.opciones[i]);
190+
display->println("> " + menuPorMostrar.opciones[i]);
166191
} else{
167-
display.println(" " + menuPorMostrar.opciones[i]);
192+
display->println(" " + menuPorMostrar.opciones[i]);
168193
}
169194
}
170-
display.display();
195+
display->display();
171196
}
172197

173198

174199
// Funcion para mostrar un mensaje de aviso
175200
bool UI_OLED::mostrarMensaje(String mensaje, int duracion = duracionMensajeMS){
176-
display.clearDisplay(); // Borra el buffer de la pantalla
177-
display.setTextSize(1); // Normal 1:1 pixel scale
178-
display.setTextColor(SSD1306_WHITE); // Draw white text
179-
display.setCursor(5,32);
201+
display->clearDisplay(); // Borra el buffer de la pantalla
202+
display->setTextSize(1); // Normal 1:1 pixel scale
203+
display->setTextColor(SSD1306_WHITE); // Draw white text
204+
display->setCursor(5,32);
180205

181-
display.println(mensaje); // probando si devuelve valor
182-
display.display();
206+
display->println(mensaje); // probando si devuelve valor
207+
display->display();
183208
vTaskDelay(pdMS_TO_TICKS(duracion)); // Pausa para mostrar el mensaje
184209
}
185210

@@ -198,7 +223,7 @@ bool UI_OLED::callBackEjecutarAccionMenu(int menuActual, int opcionActual){
198223

199224
// if algo cambia, actualizar pantalla
200225
bool IRAM_ATTR UI_OLED::update(){
201-
char botonPresionado = botonesUI.botonPresionado(); // Varible para recibir el boton presionado
226+
char botonPresionado = botonesUI->botonPresionado(); // Varible para recibir el boton presionado
202227
if (botonPresionado != '0'){ // si se presiona un boton, verifica cual fue
203228
if(botonPresionado == '1'){
204229
menusGuardados[menuActual].dismimuirOpcionSelecionada(1);
@@ -217,7 +242,6 @@ bool IRAM_ATTR UI_OLED::update(){
217242
}
218243
mostrarMenuEnOLED(menusGuardados[menuActual]); // actualiza el menu
219244
}
220-
221245
if(mensajePendiente){
222246
// Permite activar mensaje esporadico
223247
mostrarMensaje(mensajeEsporadico);
@@ -228,6 +252,14 @@ bool IRAM_ATTR UI_OLED::update(){
228252
mostrarMenuEnOLED(menusGuardados[menuActual]); // actualiza el menu
229253
cambioPendiente = false;
230254
}
255+
256+
// Actualizar el widget activo
257+
for(int i=0; i < numeroWidgets; i++){
258+
while(widgets[i].getStatus()){
259+
widgets[i].update();
260+
cambioPendiente = true; // Volver a actualizar la pantalla con el menu correspondiente al salir del widget
261+
}
262+
}
231263
return 1;
232264
} // fin de funcion
233265

src/widgets/additionalDrawingFun.h

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
2+
// En este archivo se eencuentran funciones especiales para dibujar en la pantalla OLED
3+
// --------------------------------------------------------------------------------------------
4+
5+
6+
// Función para dibujar una línea discontinua
7+
void drawDashedLine2(int x0, int y0, int x1, int y1, int dashLength, Adafruit_SSD1306 * display) {
8+
bool draw = true; // Controla si dibujamos o no el segmento actual
9+
int deltaX = x1 - x0;
10+
int deltaY = y1 - y0;
11+
float distance = sqrt(deltaX * deltaX + deltaY * deltaY);
12+
float stepX = (float)deltaX / distance;
13+
float stepY = (float)deltaY / distance;
14+
15+
for (int i = 0; i < distance; i += dashLength) {
16+
if (draw) {
17+
for (int j = 0; j < dashLength && i + j < distance; j++) {
18+
int x = x0 + (i + j) * stepX;
19+
int y = y0 + (i + j) * stepY;
20+
display->drawPixel(x, y, SSD1306_WHITE);
21+
}
22+
}
23+
draw = !draw; // Alterna entre dibujar y no dibujar
24+
}
25+
//display.display(); // Actualiza la pantalla
26+
}
27+

src/widgets/externalCode/EasyElectricCalc/EasyElectricCalc.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
// Ajustes de funciones
22
//--------------------------------------------------------------------------
3+
4+
/*
35
const int NUM_MUESTRAS = 500; // Número de muestras (ajustable)
46
const int TIEMPO_LECTURA = 100; // Duración de la lectura en milisegundos
57
const int esperaUs = 100; // Espera entre cada medicion en microsegundos
68
79
float factorSensor = 30.0; // Factor del sensor (ajustable)
810
float valorMinLecturaRMS = 0.25; // Valor mas bajo que se puede registrar. Para eliminar ruido.
911
float factorAmplificador = 10; // Ajusta el valor según la amplificación del ccircuito de entrada
10-
12+
*/
1113

1214

1315
// Funcion para calcular la corriente RMS
@@ -17,7 +19,7 @@ float factorAmplificador = 10; // Ajusta el valor según la amplificación d
1719

1820
// Funcion 1: Toma una serie de lecturas mediante un ADC y devuelve el voltaje RMS. Tambien asigna el offset a la direccion de memoria indicada.
1921
//==================================================================
20-
float medirValorRMS(int pinSensor, float * voltajes, float &offset){
22+
float medirValorRMS(int pinSensor, float * voltajes, float &offset, float factorSensor = 30.0, float valorMinLecturaRMS = 0.25, int NUM_MUESTRAS = 500, int TIEMPO_LECTURA = 100, int esperaUs = 100){
2123
long tiempoInicial = millis();
2224

2325
// Paso 1: Leer y guardar voltajes durante un tiempo específico
@@ -50,7 +52,7 @@ float medirValorRMS(int pinSensor, float * voltajes, float &offset){
5052

5153
// Funcion 2: Utiliza la funcion 1 para adaptar el valor RMS a un valor de corriente equivalente segun el sensor
5254
//==================================================================
53-
float calcularCorrienteRMS(float &valorRMS, float &offset) {
55+
float calcularCorrienteRMS(float &valorRMS, float &offset, float factorSensor = 30.0, float factorAmplificador = 10.0){
5456
return valorRMS * (factorSensor/factorAmplificador); // convierte el valor de voltaje RMS medido a la corriente equivalente segun sensor
5557
}
5658

File renamed without changes.

0 commit comments

Comments
 (0)