jueves, 27 de julio de 2023

Usar 2.4" TFT LCD con ESP32 (conexión paralela)

 Si necesitamos utilizar la pantalla de 2.4" que tiene los siguientes pines LCD_RST, LCD_CS, LCD_RS, LCD_WR, LCD_RD, GND, 5V, 3V3, LCD_D0, LCD_D1, LCD_D2, LCD_D3, LCD_D4, LCD_D5, LCD_D6, LCD_D7 la conexión es de paralela. A continuación, dejo en enlace de una publicación donde se explica detalladamente como realizar la conexión con el ESP32 y que librería utilizar.

ILI9341 + ESP32 (Parallel) (pangodream.es)



Algunos de los puntos importantes son conectar bien los pines en TX2 y RX2 ya que podríamos confundirnos y tomar TX0 y RX0. Para que se vea bien la pantalla es mejor conectarla alimentación de 5V en lugar de la de 3.3V.

Podríamos tomar de ejemplo la siguiente conexión:



El archivo User_setup.h nos quedaría de la siguiente manera:

// See SetupX_Template.h for all options available

 

#define ESP32_PARALLEL

 #define ILI9341_DRIVER

 // ESP32 pins used for the parallel interface TFT

#define TFT_CS   27  // Chip select control pin

#define TFT_DC   14  // Data Command control pin - must use a pin in the range 0-31

#define TFT_RST  26  // Reset pin

 #define TFT_WR   12  // Write strobe control pin - must use a pin in the range 0-31

#define TFT_RD   13

 #define TFT_D0   16  // Must use pins in the range 0-31 for the data bus

#define TFT_D1   4  // so a single register write sets/clears all bits

#define TFT_D2   23

//#define TFT_D3   22

#define TFT_D3   15

//#define TFT_D4   21

#define TFT_D4   5

#define TFT_D5   19

#define TFT_D6   18

#define TFT_D7   17

 #define LOAD_GLCD   // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH

#define LOAD_FONT2  // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters

#define LOAD_FONT4  // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters

#define LOAD_FONT6  // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm

#define LOAD_FONT7  // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:.

#define LOAD_FONT8  // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.

#define LOAD_GFXFF  // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts

 #define SMOOTH_FONT

 

Enlaces útiles:

ESP32-DevKit.png (2292×967) (pangodream.es)

2.4inch Arduino Display - LCD wiki

domingo, 9 de octubre de 2022

Máquina de refrescos con LabVIEW

 Este programa consiste en una máquina de refrescos donde a partir del dinero ingresado en el numeric_control llamado Dinero un comparador decidirá si es suficiente para comprar cualquiera de los tres refrescos disponible al momento de presionar el botón correspondiente a cada refresco. Si la cantidad es suficiente comenzará a llenarse el tank llamado Barra de llenado  y en el string_indicator llamado Mensajes aparecerá un mensaje que dice "Gracias, se está sirviendo " mas el nombre del refresco seleccionado, si el dinero es insuficiente mostrará un mensaje que indica "Dinero insuficiente". Si la cantidad ingresada es mayor al costo del refresco en el numeric_indicator llamdo Cambio mostrará el dinero restante de la operación. Una vez que se llena la barra de carga se detiene el programa pues se cumple una condición de paro de un ciclo while.


Como se puede ver en la imagen anterior, se usa un ciclo while que anida 3 estructuras case, que a su vez, anidan otro case cada una, y éste, un ciclo for.



Dentro del while, se utilizó unbundle by name para poder usar los botones del cluster individualmente. Estos tres botones se conectaron a una estructura case cada uno.

El mensaje de bienvenida no debe estar dentro de ningún case, ya que este se debe mostrar al momento de ejecutar el programa. Se usa un Select conectado a cualquiera de los tres botones, en este caso, el primero, si el botón se activa, no se muestra el mensaje, si no se activa, se muestra el mensaje de bienvenida. Esto es algo lógico, ya que se sabe que no se puede presionar ningún botón antes de correr el programa, entonces, obviamente se mostrará el mensaje antes que nada.

Todos los Case de los tres botones tienen lo mismo, solo cambia el costo de la bebida. En el primer case, estando en true, se evalúa si el dinero ingresado es igual o mayor que 15 (costo de la bebida). Si esto es verdadero, en un case anidado se hace la operación para mostrar el cambio.



También se muestra un mensaje que dice que ya se está preparando su bebida y se usa una variable local del indicador de texto.

Con un ciclo for se hace la simulación del llenado del vaso. Como se vio anteriormente, se usa un shift register como contador para ir llenando el vaso, empezando de cero y llenándose de 5 en 5 cada 200 milisegundos.

Después, si el valor del tanque es igual a 100, se manda la instrucción de detener el programa.

Si el valor del dinero ingresado es menor que 15, entonces el programa muestra un mensaje emergente que le indica al usuario que no le alcanza para esa compra.

Los siguientes dos case indican lo mismo, sólo cambia el valor del dinero y que se usan variable locales de los controles e indicadores.


Se utiliza un compound OR de tres casillas para detener el programa cuando el tanque de cualquiera de los tres botones llegue a 100.

Los case externos en su caso false no llevan nada,  hay que dar clic derecho al tunel del ciclo FOR, y en " Tunnel Mode" ---> Cambiarlo de "Indexing" (que es el valor por default) a "Last Value". Se repite el proceso  otras 2 veces (por los otros 2 ciclos FOR que hay). Los elementos cambio y barra de llenado se usan en el primer case directamente y en los otros dos como variable local.

Se agregan algunas imágenes del proceso de elaboración:




Este programa está basado en un ejemplo presentado en el video Simulador de Despachador de refrescos en LabVIEW - YouTube de la página Máquina de llenado de refrescos con LabVIEW - Masterhacks Blog

Se agrega el VI en el siguiente enlace:

https://drive.google.com/file/d/1Fwzkf5qjwchtmQBB9cxqmITGVHdIIpmE/view?usp=sharing

viernes, 14 de enero de 2022

Ejemplos de programas sencillos en python

 Hola mundo

print('hola mundo')


Pedir un número e imprimirlo

numero=input('Introduzca un número:')

print('Su número es:',numero)


Ciclo for

for i in range(21):

#print(i)

print(i,end=' ')

print('')


Ciclo for con texto

for i in 'Este es un mensaje':
print(i)

Comparar un número

num=int(input('Introduzca un número:'))
if num>0:
print('El número es postivo')
if num==0:
print('El número es igual a 0')
if num<0:
print('El número es negativo')

Ejemplo de función

def calc_max(n1,n2):
if n1<n2:
print(n2,' es el número más grande')
elif n2<n1:
print(n1,' es el número más grande')
else:
print('Los números son iguales')

n1=int(input('Inserte el primer número:'))
n2=int(input('Inserte el segundo número:'))
calc_max(n1,n2)

Ciclo while

i=1
while i<=25:
print(i)
i+=1


Media, mediana y moda en Python

 Podemos hacerlo de diferentes manera pero mostraré dos, la primera usando statistics y la segunda con código similar a bajo nivel. El código lee los valores desde un archivo de texto que tiene los datos a manera de columna, solo consideramos enteros y datos con una sola moda pues mas de una moda no podría ser calculada con el código dos.

Código uno:

import statistics as stats

archi=open('datos_nums.txt','r')

contnum=0

sumanums=0

numeros=[]

auxiliar=[]

for linea in archi:

numeros.append(int(linea))

auxiliar.append(0)

sumanums=sumanums+int(linea)

contnum=contnum+1

archi.close()


#ordenar la lista

numeros.sort()

print('Los números son:')

print(numeros)


#calcular la media

print('La media es: '+str(stats.mean(numeros)))

#calcular la mediana

print('La mediana es: '+str(stats.median(numeros)))

#calcular la moda

print('La moda es: '+str(stats.mode(numeros)))







Código dos:

archi=open('datos_nums.txt','r')

contnum=0

sumanums=0

numeros=[]

auxiliar=[]

for linea in archi:

numeros.append(int(linea))

auxiliar.append(0)

sumanums=sumanums+int(linea)

contnum=contnum+1

archi.close()


#ordenar la lista

numeros.sort()

print('Los números son:')

print(numeros)

#calcular la media

v_media=sumanums/contnum

print('La media es:' +str(v_media))

#calcular la mediana

if contnum % 2==0:

v_mediana=(numeros[int((contnum/2)-1)]+numeros[int((contnum/2))])/2

else:

v_mediana=numeros[((contnum-1)/2)]

print('La mediana es:' +str(v_mediana))


#Calcular la moda

for i in range(contnum):

numero=numeros[i]

posicion=i

for j in range(contnum):

if numero==numeros[j]:

auxiliar[j]=auxiliar[j]+1

print(auxiliar)


sábado, 4 de diciembre de 2021

Encender y apagar un LED con Arduino

Materiales:
  • Arduino UNO 
  • LED 
  • Resistencia de 330 o de 220 Ohms
  • Cable rojo y negro
De acuerdo con el diagrama de la Figura siguiente conectamos una terminal de tierra (GND) del Arduino hacia el cátodo del LED. El ánodo del led lo conectamos a una de las terminales de la resistencia. El otro extremo de la resistencia lo conectamos a una de los pines digitales del Arduino, en este caso al 13. Con esta conexión ya tendremos la alimentación del LED, solo nos falta el código para que encienda y apague. El circuito se puede simular en Thinkercad.
El código para encender y apagar el led es el siguiente:

//declaración de variables
int pin_salida = 13;//definimos cual es el número de nuestro pin de                     //salida
//configuración
void setup() {
    pinMode(pin_salida , OUTPUT);//definimos que nuestro pin 13 será                                 //de salida
}
//ciclo infinito
void loop() {
    digitalWrite(pin_salida , HIGH);//escribimos una salida digital,                     //ponemos en ALTO el pin 13 (se enciende el led)
    delay(1000);//retrasamos la continuación del ciclo un segundo (1                 //s=1000 milisegundos)
    digitalWrite(pin_salida , LOW);//escribimos una salida digital,                 //ponemos en BAJO el pin 13 (se apaga el led)
    delay(1000);//retrasamos la continuación del ciclo un segundo (1                 //s=1000 milisegundos)
 }

martes, 7 de septiembre de 2021

Método de selección en C++

 Consiste en lo siguiente:

  • Buscas el elemento más pequeño de la lista.
  • Lo intercambias con el elemento ubicado en la primera posición de la lista.
  • Buscas el segundo elemento más pequeño de la lista.
  • Lo intercambias con el elemento que ocupa la segunda posición en la lista.
  • Repites este proceso hasta que hayas ordenado toda la lista.

Pseudocódigo en C++


for (i=0; i<TAM - 1; i++)
pos_men = Menor(lista, i);
temp = lista[i];
lista[i] = lista [pos_men];
lista [pos_men] = temp;

Nota: Menor(lista, i) es una función que busca el menor elemento entre las posiciones i y TAM-1. 

Ejemplo:


Vamos a ordenar la siguiente lista (la misma del ejemplo anterior):
4 - 3 - 5 - 2 - 1
Comenzamos buscando el elemento menor entre la primera y última posición. Es el 1. Lo intercambiamos con el 4 y la lista queda así:
1 - 3 - 5 - 2 - 4
Ahora buscamos el menor elemento entre la segunda y la última posición. Es el 2. Lo intercambiamos con el elemento en la segunda posición, es decir el 3. La lista queda así:
1 - 2 - 5 - 3 - 4
Buscamos el menor elemento entre la tercera posición y la última. Es el 3, que intercambiamos con el 5:
1 - 2 - 3 - 5 - 4
El menor elemento entre la cuarta y quinta posición es el 4, que intercambiamos con el 5:
1 - 2 - 3 - 4 - 5


Código en C++


#include <iostream>

#include <time.h>//librería ara usar random

#define TAM 10 //se define una variable global

 

int main()

{

    //declaración de las variables a utilizar

    //  temp:para almacenar temporalmente un número

    //  lista:los elementos a ordenar

    //  TAM:tamaño de la lista

    // i, j:para usarse en los ciclos

    int temp, i, j;

    int lista[TAM];

    srand(time(NULL));

    //llenar vector con valores aleatorios

    for (i = 0; i < TAM; i++)

    {

        lista[i] = rand() % 100;//generación de números aleatorios

    }

 

    //imprimir arreglo desordenado, \n para el salto de línea

    printf("Vector desordenado\n");

    for (i = 0; i < TAM; i++)

    {

        printf("%d\t", lista[i]);//\t da la tabulación o con \n para salto de línea

    }

 

    //ciclos anidados para ordenar los elementos con inserción

    for (i = 1; i < TAM; i++)

    {

        temp = lista[i];//se almacena el número en temp

        j = i - 1;//asignamos a j el valor de i menos 1 para comparar con el elemento anterior

        while ((lista[j] > temp) && (j >= 0))//mientras los elementos sean mayores a temp y todavía tengamos elementos

        {

            lista[j + 1] = lista[j];//al ser mayor lo almacenamos en la posición j+1

            j--;//decrementamos j

            lista[j + 1] = temp;//almacenamos temporal en j+1

        }

    }

 

    //imprimir vector ordenado

    printf("\n");

    printf("Vector ordenado\n");

    for (int i = 0; i < TAM; i++)

    {

        printf("%d\t", lista[i]);//\t da la tabulación o con \n para salto de línea

 

    }

 

    //detener la pantalla pidiendo un caracter de entrada

    int flag = getchar();

}

 

Ventajas:

  • Fácil implementación.
  • Requerimientos mínimos de memoria.

Desventajas:

  • Lento.
  • Realiza numerosas comparaciones.

lunes, 6 de septiembre de 2021

Método burbuja en C++

 

Descripción

Consiste en ciclar repetidamente a través de la lista, comparando elementos adyacentes de dos en dos. Si un elemento es mayor que el que está en la siguiente posición se intercambian. 

Pseudocódigo en C++


for (i=1; i<TAM; i++)
    for j=0 ; j<TAM - 1; j++)
if (lista[j] > lista[j+1])
temp = lista[j];
lista[j] = lista[j+1];
lista[j+1] = temp;


Ejemplo

Tenemos la siguiente lista:
4 - 3 - 5 - 2 - 1
Tenemos 5 elementos. Es decir, TAM toma el valor 5. Comenzamos comparando el primero con el segundo elemento. 4 es mayor que 3, así que intercambiamos. Ahora tenemos:
3 - 4 - 5 - 2 - 1
Ahora comparamos el segundo con el tercero: 4 es menor que 5, así que no hacemos nada. Continuamos con el tercero y el cuarto: 5 es mayor que 2. Intercambiamos y obtenemos:
3 - 4 - 2 - 5 - 1
Comparamos el cuarto y el quinto: 5 es mayor que 1. Intercambiamos nuevamente:
3 - 4 - 2 - 1 - 5
Repitiendo este proceso vamos obteniendo los siguientes resultados:
3 - 2 - 1 - 4 - 5
2 - 1 - 3 - 4 - 5
1 - 2 - 3 - 4 - 5

Código


#include <iostream>

#include <time.h>//librería ara usar random

#define TAM 10 //se define una variable global

using namespace std;//para usar strings

 

int main()

{

    //declaración de las variables a utilizar

    //  temp:para almacenar temporalmente un número

    //  lista:los elementos a ordenar

    //  TAM:tamaño de la lista

    int temp;

    int lista[TAM];

    srand(time(NULL));

    //llenar vector con valores aleatorios

    for (int i = 0; i < TAM; i++)

    {

        lista[i]=rand()%100;//generación de números aleatorios

    }

 

    //imprimir arreglo desordenado, \n para el salto de línea

    printf("Vector desordenado\n");

    for (int i = 0; i < TAM; i++)

    {

        printf("%d\t", lista[i]);//\t da la tabulación o con \n para salto de línea

    }

 

    //ciclos anidados para ordenar los elementos con método burbuja

    for (int i = 1; i < TAM; i++)

    {

        for (int j = 0; j < TAM - 1; j++)

        {

            if (lista[j] > lista[j + 1])//se compara el elemento actual con el elemento siguiente

            {

                temp = lista[j];//se almacena temporalmente el elemento actual

                lista[j] = lista[j + 1];//al elemento actual lo reemplazamos por el siguiente

                lista[j + 1] = temp;//reemplazamos al elemento siguiente por el elemento almacenado en el valor temporal

            }

        }

    }

 

    //imprimir vector ordenado

    printf("\n");

    printf("Vector ordenado\n");

    for (int i = 0; i < TAM; i++)

    {

        printf("%d\t", lista[i]);//\t da la tabulación o con \n para salto de línea

 

    }

 

    //detener la pantalla pidiendo un caracter de entrada

    int flag = getchar();

}


Ventajas:

Fácil implementación.

No requiere memoria adicional.

Desventajas:

Muy lento.

Realiza numerosas comparaciones.

Realiza numerosos intercambios.