miércoles, 7 de agosto de 2024

Login failed for user. (Microsoft SQL Server, Error: 18456)

 En ocasiones se nos presentan los siguientes errores al querer iniciar sesión con un nuevo usuario que acabamos de crear:

TITLE: Connect to Server
 Cannot connect to SEVER

ADDITIONAL INFORMATION:

 A connection was successfully established with the server, but then an error occurred during the login process. (provider: SSL Provider, error: 0 - La cadena de certificación fue emitida por una entidad en la que no se confía.) (Microsoft SQL Server, Error: -2146893019)

For help, click: https://docs.microsoft.com/sql/relational-databases/errors-events/mssqlserver--2146893019-database-engine-error

La cadena de certificación fue emitida por una entidad en la que no se confía

BUTTONS:

OK


TITLE: Connect to Server
Cannot connect to SERVER

ADDITIONAL INFORMATION:

 A connection was successfully established with the server, but then an error occurred during the login process. (provider: Shared Memory Provider, error: 0 - No hay ningún proceso en el otro extremo de la canalización.) (Microsoft SQL Server, Error: 233)

 For help, click: https://docs.microsoft.com/sql/relational-databases/errors-events/mssqlserver-233-database-engine-error

 No hay ningún proceso en el otro extremo de la canalización

BUTTONS:

 OK


A connection was successfully established with the server, but then an error occurred during the login process. (provider: SSL Provider, error: 0 - La cadena de certificación fue emitida por una entidad en la que no se confía.) (Microsoft SQL Server, Error: -2146893019) La cadena de certificación fue emitida por una entidad en la que no se confía


TITLE: Connect to Server
Cannot connect to DESKTOP-R0MNCAP.

ADDITIONAL INFORMATION:

Login failed for user 'usr_aas'. (Microsoft SQL Server, Error: 18456)

 For help, click: https://docs.microsoft.com/sql/relational-databases/errors-events/mssqlserver-18456-database-engine-error

BUTTONS:

 OK


Las posibles soluciones son activar la opción Trust server certificate en la ventana de conexión o ver si está activa la opción de SQL Server and windows authentication mode para poder iniciar la conexión. En el video se explica muy bien.














jueves, 25 de julio de 2024

Generar dos señales de reloj con la ESP32

En los canales se usa el canal cero y el canal dos porque aparentemente los canales vienen en pares y si se usa el cero y el uno tendrán la misma frecuencia.

#define LEDC_TIMER_13_BIT 13
#define LEDC_BASE_FREQ_R1 40  
#define LEDC_BASE_FREQ_R2 80
#define LED_PIN_1 15 // pin for first signal
#define LED_PIN_2 26 // pin for second signal
#define LEDC_CHANNEL_0 0
#define LEDC_CHANNEL_1 2

void setup() {
    pinMode(LED_PIN_1, OUTPUT); // set pin as output
    pinMode(LED_PIN_2, OUTPUT); // set pin as output
   
    ledcAttachChannel(LED_PIN_1, LEDC_BASE_FREQ_R1, LEDC_TIMER_13_BIT, LEDC_CHANNEL_0 );
    ledcAttachChannel(LED_PIN_2, LEDC_BASE_FREQ_R2, LEDC_TIMER_13_BIT, LEDC_CHANNEL_1 );
    // Initiates PWM signals with a 50% duty cycle
    ledcWrite(LED_PIN_1, 4096); // 50% of 2^13 = 4096
    ledcWrite(LED_PIN_2, 4096); // 50% of 2^13 = 4096
}

void loop() {
  // The loop is kept empty or with other commands as needed
}




jueves, 18 de julio de 2024

Get the MAC address of the ESP32

 By using the following code you can obtain the MAC address of the ESP32. It is advisable to use a delay to prevent the obtained MAC address from being 00:00:00:00:00:00.

#include <WiFi.h>

 void setup(){

    Serial.begin(115200);

    WiFi.mode(WIFI_STA);

    delay(500);

    Serial.print("\nDefault ESP32 MAC Address: ");

    Serial.println(WiFi.macAddress());

}

 

void loop(){

  // Do Nothing

}



Result without using delay:



Result using delay:



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)