Indicador de precio de dólar con ESP32 y pantalla Nokia5110 "Cambio! Cambio!"


Si bien este puede parecer un dispositivo muy Argentino puesto que casi todo el planeta ha resuelto su dependencia del dólar y no andan constantemente viendo que valor tiene cada una de las doce o quince cotizaciones simultáneas de esta moneda lo cierto es que se puede acomodar o adaptar a los requisitos que cada uno tenga porque en sí no es mas que un cliente web conectado por el WIFI que "lee" datos de unas páginas alojadas en internet con el protocolo http (web tradicional sin seguridad). Tenemos como corazón del mismo el ESP32 que da nombre a esta sección del sitio, usamos de este componente su módulo WIFI interno para conectarnos a internet y una vez establecida la conexión a la red inalámbrica entablamos una conexión a un servidor alojado en internet el cual presta servicio de páginas web. Este servidor en sus páginas web contiene los datos del cambio actual y por ende el programa en el ESP solo tiene que "recibir" esas páginas web y "leerlas" para darnos dicha información. La configuración de la red WIFI no es compilada sino que se puede establecer por medio del terminal serie conectada al puerto USB del ESP32 y los datos se muestran en una pantalla gráfica Nokia5110 de 84 x 48 pixeles monocromática. Pueden hacer un repaso de la nota donde explico este tipo de pantallas haciendo clic acá, o bien pueden acceder a esta página en la que explico como usarlas en el ESP32 sin agregar pesadas e ineficientes librerías externas. También pueden leer esta nota sobre mi propia librería de WIFI configurable por terminal serie.

El conexionado es por demás simple, siete cables van del ESP32 a la pantalla Nokia y un único pulsador va conectado al D23 de dicho módulo de desarrollo. El sketch para cargar en este desarrollo está disponible para descarga en este enlace. Una vez cargado el sketch dejar conectado el vínculo USB del ESP32 a la PC y abrir el terminal serie asegurándose de estar a 115200 bps la velocidad de comunicación para una correcta sincronización entre los equipos. Reiniciar el ESP32 presionando el botón correspondiente tras lo cual aparecerá en la pantalla el logo del sitio. Durante el tiempo que dura el logo en pantalla, dos segundos, se puede presionar el pulsador del pin D23 para acceder a la configuración WIFI, nos mostrará la lista de redes dentro del alcance del módulo y podremos seleccionarla indicando su número correspondiente de lista. En caso de ser una red con nombre oculto o bien si estamos configurando el aparato para que funcione en otra parte y por ende no tenemos acceso en este momento a su red WIFI podemos ingresar el número 666 para que nos pida el nombre de red a usar (ingreso manual del nombre). Sea esa forma o seleccionándola por medio de su número de listado nos pedirá si corresponde la clave de acceso a dicha red y si queremos que obtenga la IP y demás parámetros automáticamente o bien si los queremos establecer a mano. Esto no requiere demasiada mas explicación puesto que cualquier usuario de dispositivos modernos conoce estos procedimientos. Una vez establecido todo el equipo quedará listo para ser utilizado. Los parámetros de conexión los almacena en memoria EEPROM interna por lo que no se pierden al cortar la alimentación y por consiguiente ya no es necesario tener la terminal conectada al puerto USB. En caso de dejar la terminal conectada podremos ver como cada media hora actualiza los valores del dolar blue y el dolar irreal del banco nación al cual nadie puede acceder a ese precio. Podemos ver en este video cómo es que funciona así como las tres capturas de pantalla abajo.

Nuevamente sin ánimo de politizar sino quizás escribir un poco de historia hoy 02/05/2020 estos son los valores principalmente contemplados del dolar en mi país, Argentina, veremos con el paso de unos años que ha acontecido...

Ahora una explicación del sketch de Arduino: Primeramente se incluyen las librerías necesarias para el uso del WIFI y la pantalla Nokia. Ambas de mi autoría y como les indiqué en líneas anteriores pueden acceder a explicaciones en detalle de las dos por medio de los enlaces provistos. Se define en que terminal se conecta el pulsador y en que terminal se conecta el LED, LED que únicamente enciende durante la actualización de datos y en este aparato usé el interno de la placa para minimizar aún mas los componentes externos. Se crea un arreglo de caracteres o char array donde almaceno el nombre del servidor al cual me voy a conectar, con servidor me refiero a la URL o nombre de dominio que apunta a la dirección IP del servidor. No confundir dirección del servidor con url de la página a consultar. Por ejemplo el servidor que aloja esta página es www.pablin.com.ar mientras que la página web Pablin! es pablin.com.ar/index.htm mas allá que uno esté acostumbrado a los navegadores web que desde fines del siglo pasado buscan abrir archivos con nombre index.htm o index.html y ahora también index.php no implica que cuando uno pone www.pablin.com.ar se esté abriendo un archivo sin nombre! Eso es algo que sucede tras bambalinas en el navegador web usado por el navegante de internet. Aclarado esto sigamos con el desguace del programa: se crea una instancia del objeto WiFiClient de la librería WIFI de Arduino a la cual yo hago inclusión en miWIFI.h y a dicha instancia la llamo clienteWEB para que quede bien bonito y fácil de entender. Luego declaro cinco posiciones de memoria que emplearé mas tarde para la división decimal de un valor puesto que si el dólar valiera 12345 pesos con 67 centavos yo tengo que enviar a la pantalla caracter por caracter o sea primero el 1 de decenas de miles, luego el 2 de miles, luego el 3 de centenas y así hasta completar todo y si en una posición de memoria tengo el valor completo 12345 tengo que dividirlo decimalmente. Para dicha división que llegado el punto explicaré en detalle es que existen estas cinco posiciones de memoria que únicamente contendrán valores enteros de 0 a 9.  Un nuevo array de caracteres o char array llamado linea ahora de 100 posiciones será el encargado de almacenar de a una por vez las líneas que componen el sitio web que quiero recibir para ir viendo durante este proceso que contiene cada una en busca del dato deseado. Aunque esto suena muy fácil tiene su gran complicación que llegado el caso veremos en detalle. La variable posicion precisamente almacena en que posición del array linea se debe guardar el caracter recibido de internet. Las variables mangos y chirolas se encargan de pasar de función en función los valores leídos de las páginas dependiendo desde donde se llamen las funciones es a donde se almacena cada valor, para hacer una función genérica de lectura de valores desde internet y poder almacenarlo en posiciones específicas se utilizan estas dos variables intermedias mangos para enteros y chirolas para decimales. Las ocho posiciones de memoria siguientes formadas por blueMangosCompra, blueMangosVenta, blueChirolasCompra, blueChirolasVenta, irrealMangosCompra, irrealMangosVenta, irrealChirolasCompra e irrealChirolasVenta almacenan enteros y centavos de los valores de compra y venta del dólar real (blue) y del dólar ficticio del gobierno (irreal) que nadie puede adquirir a ese valor siendo las partes enteras las que tienen la palabra Mangos en medio y las decimales o centavos las que dicen Chirolas. Estos son los registros de destino de los datos que pasan primeramente por las variables mangos y chirolas comentadas antes. Los siguientes cuatro flags o bits se usan para determinar cuando se ha encontrado cada valor de cotización buscado evitando así revisar todo innecesariamente y corriendo el riesgo de pisar incorrectamente un valor con otro de otra moneda.

En la función de configuración del sketch se configura el pin donde está conectado el pulsador como entrada con resistencia interna de puesta en alto para evitar tener que ponerla físicamente por fuera, se configura como salida el pin donde está conectado el LED on board del ESP32, se asegura dicho LED apagado, se inicializa la memoria interna de datos o EEPROM a su máxima capacidad, se configura la velocidad a la cual va a funcionar la comunicación serie con la PC y se inicia dicho módulo, se hace una demora de medio segundo esperando que todo se tranquilice luego de su inicialización, se procede a inicializar la pantalla LCD y se coloca el logo del sitio. Seguidamente se hace un bucle que repetirá o iterará por 20 veces y en cada una de estas veces hace una demora de una décima de segundo por lo que es simple deducir que este bucle demora dos segundos en terminar. Durante esos dos segundos y a razón de diez veces por segundo mira el estado del pin donde está conectado el pulsador y en caso de ver que se va a masa (nivel bajo) llama a la función de configuración del WIFI la cual se encuentra dentro del archivo miWIFI.h incluido al principio del sketch. Una vez superado esto se llama a otra función de esa librería esta vez la encargada de entablar la conexión con el WIFI y ya queda el módulo conectado a internet.

La función principal o bucle loop() se encarga de encender el LED indicando que está obteniendo los datos del dólar, llamar a la función que obtiene los datos del dólar blue, una vez obtenidos los muestra en pantalla de terminal, obtiene ahora los datos del dólar oficial por medio de la función dolarNacion() y luego de obtenerlos los muestra en pantalla de terminal serie tras lo cual apaga el LED en indicación que ya ha terminado de obtener los datos de internet. Ahora se crea un ciclo o bucle entorno a la variable vueltas el cual iterará 120 veces o escrito de otra forma lo que esté entre los corchetes de este for se ejecutará 120 veces. Se borra la pantalla, se escribe en la letra regular (mas pequeña, de 7 x 5 pixeles) el título DOLAR BLUE dejando un espacio adelante para que quede centrado (es sólo cosmético o de prolijidad), se llama a la rutina decimal()  pasándole el valor contenido en blueMangosCompra con lo que obtendremos a regreso de dicha función el valor contenido en dicha posición de memoria dividido en unidades, decenas, centenas, miles y diezmiles respectivamente. Si tomamos como ejemplo el valor presente en la pantalla vista arriba (108,00) el dato que le estamos pasando a la función de división decimal es la parte entera, los 108 y nos esta devolviendo diezmiles=0, miles=0, centenas=1, decenas=0 y unidades=8 datos que emplearemos a continuación para su visualización en la pantalla. Como siempre se empieza por el de mayor valor, diezmiles que sólo será mostrado si el valor presente en blueMangosCompra es superior a 9999 o sea, si es un valor significativo. Lo mismo se hace posteriormente con los dígitos de menor peso excepto el de unidades que siempre es mostrado aunque conociendo a mi hermoso y bendito país seguramente nunca vea únicamente ese dígito encendido... Estos valores se muestran empleando una fuente de doble tamaño la cual es utilizable únicamente de a una por vez e indicando puntualmente donde se quiere colocar cada caracter en el espacio de la pantalla. Terminada esta etapa se pasa por la función de división decimal ahora el valor presente en blueChirolasCompra devolviendo en los cinco registros mencionados anteriormente un cero ya que en este ejemplo el valor es 0. Para representar los decimales se emplea fuente regular o de tamaño mínimo quedando elevado por encima de la mitad de los caracteres usados en enteros dando la impresión de precio de pizarra. Aquí únicamente se muestran las variables unidades y decenas ya que los centavos solo van de 0 a 99. Se repite todo este proceso de muestreo ahora con el valor de venta del dólar blue siguiendo la misma metodología que antes pero dos líneas mas abajo y terminado el proceso de dibujado de la pantalla se hace una espera de cinco segundos. Luego se borra la pantalla y se repite todo el proceso antes descrito ahora con los valores presentes en los registros irrealMangosCompra, irrealChirolasCompra, irrealMangosVenta e irrealChirolasVenta respectivamente para mostrar el dólar oficial del banco nación. Se vuelve a esperar cinco segundos para que la imagen sea visible por un tiempo prudente y luego se muestra por mismo tiempo el logo del sitio. Aquí es donde el for itera y hace una vuelta mas y otra y otra mas hasta descontar las 120 pasadas momento en el cual deja de ejecutar lo contenido entre sus corchetes y sale. Cuanto tiempo representa 120 pasadas ? Simple: 120 vueltas x 5 segundos cada cartel x 3 carteles = 1.800 segundos / 60 segundos = 30 minutos. Cada media hora se actualiza el valor del dólar. Una vez excedido el ámbito del bucle for y no habiendo mas instrucciones debajo se vuelve a iterar dentro del bucle principal loop() con lo cual se vuelven a pedir las páginas web para obtener nuevamente los datos a mostrar y se vuelve a entrar por media hora al mismo for ahora con datos mas fresquitos. Y eso es todo lo que hace el programa principal, veamos ahora las funciones.

La primera que vemos debajo del bucle principal es dolarBlue() la misma no recibe dato alguno ni entrega resultado. Lo primero que hace es conectarse al servidor remoto cuya dirección URL está presente dentro del char array servidor a través del puerto de comunicación número 80 el cual es el puerto estándar para el tipo de petición que vamos a realizar a continuación. Como la función encargada de establecer la conexión con el servidor devuelve el estado de dicho proceso usamos dicho resultado para condicionar el if que en caso de ser una conexión exitosa enviará cuatro líneas de texto al servidor. Estas líneas deben respetar el protocolo de transporte de hipertexto o estándar HTTP que rige el funcionamiento de las páginas web alojadas en servidores a lo largo de internet. La primer línea le indica que quiere obtener (GET) la información contenida en la página alojada en la carpeta /cotizaciondolarblue bajo el estándar mas tradicional de principios de siglo, el 1.1. La segunda línea hace referencia a que servidor se refiere dentro del posible pool de servidores ubicados en dicha dirección a la cual nos conectamos primeramente, en esta caso la misma y la tercer línea le indica que debe hacer el servidor con la conexión luego de terminar el envío de datos, en nuestro programa le estamos indicando que cierre la conexión. La cuarta línea es de separación y debe ser intencionalmente dejada en blanco. Para la realización de este programa me sirvió mucho la publicación de Wikipedia a la cual pueden acceder haciendo clic acá. Con lo comentado hasta ahora la conexión entre el servidor WEB y el ESP32 queda establecida y por consiguiente al haberle indicado que queríamos recibir determinada página el servidor remoto comenzará de inmediato a enviarnos los caracteres que conforman dicha página. Mientras esto comienza a suceder nuestro programa ejecuta el while(clienteWEB.connected()) el cual funcionará en tanto la conexión entre el ESP32 y el servidor remoto siga abierta. Por ende en tanto el servidor remoto no disponga la desconexión lo que esté entre los corchetes de este bucle se ejecutará. Y dentro de este bucle tenemos un segundo bucle anidado que se ejecuta en tanto el clienteWEB tenga datos disponibles para ser leídos o levantados desde la memoria. Cada página web que existe en internet pasa a través de las distintas infraestructuras bit a bit, o sea en formas de ceros o unos por lo cual si bien podríamos decir que es muy tedioso para nosotros leer caracter por caracter cada línea de cada web lo cierto es que ya la tenemos ocho veces mas fácil! puesto que el ESP32 y su arquitectura interna y su librería WiFi se han encargado de reformularnos esos ceros y unos en bytes. Así que a agradecer porque pudo ser ocho veces peor! Cada ves que available nos indica tener algo por leer nosotros obtenemos un caracter y lo metemos precisamente en la variable llamada c y terminará formando parte del char array linea definido al comienzo del programa el cual es de alcance desde todo el sketch. La posición exacta que ocupará dentro de dicho array la determina el valor presente en el registro posicion que se va actualizando conforme se va ocupando el array. Aquí considero muy apropiado hacer una breve pausa y mostrarles la página donde se chequean los valores en cuestión:

Los valores que nosotros necesitamos tomar son los señalados muy a la rápida por las flechas y como se puede ver no es lo único que contiene la página. Por suerte para nuestro ESP32 y sus limitados recursos informáticos el fulano este que se toca la cabeza no es parte de la información a recibir como tampoco lo es el logotipo del DolarHoy ni la otra imagen debajo del fulano. Esas imágenes son almacenadas en archivos de medios individuales, tal como sucede con nuestras fotos en redes sociales y conforme el código html que compone la página web lo va solicitando el navegador web los va cargando desde donde la página lo vaya indicando. Veamos ahora la codificación de la página web que nos incumbe en esta nota:

Si quieren ver en forma completo el texto plano que conforma esta página pueden hacer clic aquí para abrir en una pestaña el archivo correspondiente. Los recuadros nos muestran las líneas 100 y 103 donde vemos los valores de compra y venta respectivamente. Cada una de estas líneas son recibidas byte a byte o de a una letra por vez hasta que uno de estos bytes recibidos es el 10 indicando que llegamos al final de la línea (el famoso enter o salto de carro). El código cargado en el ESP32 se encarga de armar estas líneas conforme van llegando los caracteres y las procesa a medida que se completa una línea por lo que no tenemos que dispensar cuantiosas cantidades de memoria RAM para almacenarlas, solo ocupa 100 bytes. Algunos trucos permiten ocupar aún menos como por ejemplo que evito almacenar tabulaciones y espacios quedando el fragmento mostrado antes memorizado de la siguiente forma:

<divclass="row">
<divclass="col-md-6compra">
<h4class="pull-left">Compra<spanclass="pull-right">$108,00</span></h4>
</div>
<divclass="col-md-6venta">
<h4class="pull-left">Venta<spanclass="pull-right">$118,00</span></h4>
</div>
</div>
<small><b>ltimaactualizacin:<span class="update">02/05/2017:33</span></b></small>
<hr>
<divclass="table-responsive">
<table>
<thead>
<tr>
<th>Moneda</th>
<thclass="number">Compra</th>
<thclass="number">Venta</th>

Nótese que no solo desaparecen tabulaciones y espacios sino que también letras con tildes quedando el texto original Última actualización convertido en ltimaactualizacin algo que ni importa ni afecta pero si ahorra espacio de buffer y agiliza procesamiento. Conforme vemos cómo una página de internet en nuestro monitor agradable a nuestra mente y vista acostumbrada a formatos agradables se convierte en una chorrera de letras todas iguales apropiadas para ser procesadas por un sistema como el presente en el ESP32 es que entenderemos el funcionamiento de este sketch puesto que aquí el valor de venta del dólar mostrado en $118,00 nada tiene que ver con esos blancos números sobre fondo verde claro tan agradable estéticamente hablando, ahora es un texto plano común y se lo puede obtener, procesar e interpretar como a cualquier dato corriente. De las 241 líneas que conforman el archivo html de la página web donde obtener el valor del dólar blue sólo nos interesan estas dos:

<h4class="pull-left">Compra<spanclass="pull-right">$108,00</span></h4>
<h4class="pull-left">Venta<spanclass="pull-right">$118,00</span></h4>

La forma de identificarlas es que al momento de ser leídas por el código encontremos "Compra" o "Venta", un signo de $, una coma y un signo < y sabiendo donde están cada uno de estos tres símbolos es que podremos obtener el valor deseado. TODO lo demas, es todo basura de relleno que de nada nos sirve. Podríamos ser un poco mas pretenciosos y buscar la siguiente línea para indicar de que fecha y hora es el dólar mostrado:

<small><b>ltimaactualizacin:<span class="update">02/05/2017:33</span></b></small>

Es mas que visible como hacerlo, si alguno lo hace y quiere colaborar mandando el sketch con gusto lo publicaremos. Sigamos ahora con el IDE de Arduino de un lado y este texto del otro ahora que comprendemos mejor como funciona la página web y que es lo que buscamos. Vimos que letra tras letra que se recibe siempre que sea un caracter comprendido entre el ASCII 33 (que es el signo es exclamación) y el ASCII 126 que es el signo de nubecita o ~. Las tabulaciones, los espacios, los símbolos de control y los ASCII extendidos por sobre el 127 son eliminados primero porque de seguro no tienen ninguna importancia y valor y segundo porque nos obligarían a dispensar mas espacio de memoria innecesariamente, buscamos procesar información con la mayor celeridad posible. Cada vez que se recibe el caracter 10 o de salto de línea, visto en la programación como \n un if nos ataja de ante mano y si la línea al menos no tiene 50 caracteres de largo no la toma en cuenta porque como ya vimos las que buscamos son bastante largas. Si, en cambio, son de al menos 50 caracteres de largo entonces dos nuevos if anidados con el anterior preguntan si no se han encontrado aún los datos buscados (compra y venta del dólar blue). En caso de estar en 0 estos flags es que vamos entrando a cada uno de estos if que a su vez por medio de otro if verifican el resultado devuelto por dos funciones encargadas de encontrar sendos valores de compra y venta llamadas chequeaCompra() y chequeaVenta() respectivamente. En el 99,9% de las veces que entre a esas funciones se volverá con un 0 como resultado o lo que implica que no se han encontrado los valores buscados. Pero la vez que se vuelva con 1 será la última que se entre a ellas gracias al empleo de los flags destinados para tal fin. Por supuesto que cada bloque luego de recibir el 1 como respuesta de función almacena en las variables correspondientes parte entera y centavos del valor en cuestión. Terminado el procesamiento de una línea recibida el buffer es limpiado para evitar problemas de datos residuales si antes de recibir una línea corta se recibió una larga y quedó algún caracter que no debía estar. En tanto se reciban datos el while amarrado a available funcionará y en tanto exista la conexión el while vingulado a connected estará operativo, en cuanto el servidor termine de enviarnos la página y cierre la conexión este último while dejará de iterar y pasará el foco mas allá de su corchete de cierre cayendo el programa al if que pregunta por el estado de desconexión cosa que es detectada de inmediata porque por eso salimos del while de conexión y por lógica entramos al if de desconexión y detenemos el clienteWEB.

La página de donde se obtiene el dólar oficial si bien está dentro del mismo servidor tiene un formato significativamente diferente y como era de esperarse refleja una forma de ser interpretada distinta. Dato cuiroso, para compra y venta los indicadores superiores indican el mismo valor! Pero los que a nosotros nos importan son los del banco nación visto en el recuadro rojo. Otra vez nos enfrentamos a una página que en su total extensión tiene 275 líneas de texto y como era de esperarse sólo una diminuta fracción de ella nos interesa, mas precisamente esta:

Recordemos que el programa está armado de tal forma de no recibir ni procesar espacios o tabulaciones por lo que el texto que en definitiva nos interesa va a terminar siendo el siguiente:

<td><ahref="#">BancoNacion</a></td>
<tdclass="number">$63,75</td>
<tdclass="number">$68,75</td>

El cambio mas significativo es que ahora con una restricción de al menos 50 caracteres recibidos seguramente no veamos nada! Así que bajamos esa limitación a 20 letras, eso hace que se entre a procesar mas líneas antes de dar con las que nos interesan pero también que tardemos menos en procesarla en gran parte debido a que ahora tenemos que buscar en una línea el texto Nacion (sin tilde) y encontrado eso apuntar que en la línea siguiente está el valor de compra y en la que le sigue a la siguiente el de venta. Entre otras palabras si Nacion aparece en la línea 130 en la 131 aparecerá el valor de compra y en la 132 el de venta. Aclarado esto y visto en el programa como se logra gracias a la variable lineaLeida que en todo momento determina cual es el número de línea en el que estamos trabajando, lineaCompra y lineaVenta serán cargadas al encontrar Nacion y determinar que lineaCompra es igual a lineaLeida + 1 y lineaVenta es igual a lineaLeida + 2 así de simple y fácil. Detectado esto ahora el programa espera que el contador de lineaLeida iguale el contenido de lineaCompra y lineaVenta y en ambos casos ejecuta la función leeValor() encargada de obtener mangos y chirolas que luego serán almacenados en las variables correspondientes. Al igual que la del dólar blue esta termina al recibir la desconexión del servidor tras lo cual se detiene el cliente web.

La función chequeaCompra() devuelve un bit que bien puede ser 0 cuando no encuentra en la línea de texto actual el valor de compra del dólar como 1 cuando si lo encuentra. Pero no termina allí, además devuelve en las variables mangos y chirolas el valor entero y decimales de dicha cotización. Básicamente lo hace recorriendo de principio a fin la línea recibida a través de un ciclo for que va de 0 al largo total de dicha línea y en caso de encontrar la palabra Compra armada dentro de esta línea busca los símbolos $ , < con los cuales determina en que parte está la parte entera del valor de compra y en que parte está la parte de centavos de dicho valor. Se ocupan las posiciones de memoria llamadas posPesitos, posComa y posMenorque para apuntar dichas posiciones pero no es necesario apuntar donde aparece Compra como texto puesto que no se lo necesita para nada, sólo basta con saber que está y para ello el valor booleano encontroCompra. Veamos un poco mas de cerca la línea que nos interesa:

<h4class="pull-left">Compra<spanclass="pull-right">$108,00</span></h4>

Ya nomás al arrancar el for valiendo 0 la variable ciclo emboca el < y apunta en posMenorque su posición, que como es 0 no la toma como válida. Las otras variables siguen también estando en cero y por ende tampoco superan la etapa de if donde se verifica si se han encontrado. Iteara unas 21 veces y lleva a detectar la palabra Compra por lo que el flag encontroCompra comienza a valer 1. Hay que tener presente que al no haber else en estos if no se vuelve el cero cuando se deja de "ver" un valor buscado. Encontrada la palabra Compra ahora se sigue iterando hasta la vuelta 52 encontrando en la posición 51 el signo $, en la posición 55 posteriormente encuentra la coma y por último en la posición 58 el tercer signo <. El primero lo encontró ni bien al arrancar como vimos en la posición cero, el segundo en la posición 27 al terminar la palabra Compra y el tercero y último, el que nos interesa al terminar el número de centavos. Cada nuevo símbolo encontrado suplanta en posición al anterior. Hay un pequeño array de caracteres al que llame trocito que contiene precisamente eso, un segmento de la cadena linea donde mete sólo números necesario para su posterior conversión a entero a través de la función del C atoi. El primer trocito formará los mangos y tomará valor desde la siguiente posición de donde está el signo pesos a la anterior posición donde esta la coma o sea desde posPesitos + 1 hasta posComa - 1 quedando en trocito 108 en tanto una vez pasado por atoi y limpiado el contenido de trocito se carga ahora con el texto comprendido entre posComa + 1 y posMenorque - 1 con lo cual queda cargado con 00. 

La función chequeaVenta() hace lo mismo que la explicada en detalle anteriormente con la salvedad de buscar la palabra Venta en la cadena en vez de Compra por lo que no reviste mas explicación.

La función leeValor() es llamada desde la función que lee el dólar oficial del banco nación y se encarga de cargar mangos y chirolas con el valor contenido en la el char array linea la cual de por si ya se sabe que lo contiene. Nuevamente ocupamos las mismas variables posPesitos, porComa y posMenorque dado que en sí la notación de la página es la misma tenemos el char array trocito para el mismo fin pero ya no tenemos un booleano dispuesto para memorizar el haber encontrado algún texto. Aquí no los hay! Veamos nuevamente el segmento de texto a procesar:

<tdclass="number">$63,75</td>

Tenemos el signo pesos en la posición 18, la coma en la posición 21 y el < en la posición 24 por lo que trocito se llenará con la el fragmento de linea comprendido entre 19 y 20 para mangos y entre 22 y 23 para chirolas.

Por último la función decimal(valor) recibe un entero el cual puede tener hasta decenas de miles y carga cinco posiciones de memoria llamadas unidades, decenas, centenas, miles y diezmiles con los correspondientes valores de 0 a 9 para su impresión individual sobre la pantalla de LCD. La forma en que trabaja es por demás simple, arranca con las decenas de miles siempre que valor sea superior a 9999 suma uno al contador de decenas de miles y resta 10000 a valor. Esto se repite hasta que valor quede por debajo de 10000 cuando ahora procesa las unidades de mil, incrementando el contador miles por cada unidad de mil sustraída a valor. Luego centenas, seguidamente decenas y por último unidades cae por descarte.

Esto es todo el programa, como ven no es ningún misterio. Por supuesto que se podría haber simplificado utilizando alguna que otra librería para alguna que otra función que yo realicé a mano. La librería no es mágica, hace lo mismo por detrás lo cual se denomina eficiencia en la programación pero para el entendimiento de todos me pareció mejor así. Para quienes pregunten porqué el "Cambio! Cambio!" en el nombre de la nota es porque en Argentina sucede que muy pocas cosas ilegales son castigadas por las fuerzas que deberían hacer efectivo el cumplimiento de la ley. Vender dólares por mercado paralelo y promover dicha actividad en la vía pública está prohibido sin embargo hay centenares de personajes en las calles céntricas de las ciudades principales del país anunciando dicha actividad a viva voz al grito de "Cambio! Cambio!" muchas veces junto a policías y por ello lo he llamado así. Después se quejan que a los policías se les burlan pero muchachos no hacen méritos ustedes tampoco! En fin, sin ánimos de polemizar. 

 

Pablo Canello, 02/05/2020