Sei sulla pagina 1di 27

Desarrollo de prototipos empleando arduino para la

enseñanza de los objetivos de desarrollo sostenible a


estudiantes de los grados 9◦, 10◦ y 11◦
Universidad Nacional de Colombia
Facultad de Ciencias - Departamento de Fı́sica
Diseño e innovación sostenible y apropiable

Sebastian Camilo Garcı́a Riales, Código: 1010144082 , segarciar@unal.edu.co;


Wendy Alejandra Garcı́a Rojas, Código: 1023003558 , weagarciaro@unal.edu.co;
Carolina Rosa Pulido Gómez, Código: 02262109, crpulidog@unal.edu.co.
13 de marzo de 2019

1. Descripción del Problema


Los ODS son objetivos planteados en 2012 durante la conferencia de Naciones Unidas sobre
el desarrollo sostenible y buscan con sus diecisiete puntos proteger el medioambiente, eliminar la
pobreza y garantizar que todas las personas gocen de paz y prosperidad. Los ODS conllevan un
espı́ritu de colaboración y pragmatismo para elegir las mejores opciones con el fin de mejorar la
vida, de manera sostenible, para las generaciones futuras. Proporcionan orientaciones y metas claras
para su adopción por todos los paı́ses en conformidad con sus propias prioridades y los desafı́os
ambientales del mundo en general. Por tanto es necesario un trabajo conjunto de los gobiernos, las
instituciones privadas y la ciudadanı́a en general. En el contexto local se requiere que las personas
se apropien de estas metas para dar solución a problemas de su entorno con propuestas innovadoras,
sostenibles y amigables con el planeta.[1]
Para resumir, el problema se centra en cómo lograr que estudiantes de básica secundaria (noveno,
décimo y once) se apropien de los objetivos de desarrollo sostenible para lograr un cambio positivo
en su entorno en beneficio de las personas y el planeta que vayan en concordancia con el interés
público a nivel global.
Dentro del marco del problema se pretenden utilizar herramientas tecnológicas como arduino
para desarrollar prototipos que faciliten el aprendizaje de los ODS en los estudiantes. Los principales
aspectos a considerar es que los estudiantes cuenten con un computador en sus casas o por defecto
que en la institución educativa cuenten con sala de informática en la que puedan trabajar los
estudiantes. Para el proyecto es necesario definir si se van a llevar tarjetas de desarrollo y los
componentes básicos de electrónica para que los estudiantes trabajen o ellos deben adquirirlos;
además, aún no se ha definido si ellos van a diseñar prototipos o si se les van a presentar armados
o si se van a diseñar con ellos. Otro factor importante es el espacio y la jornada en la que se va a
trabajar pues aún no se tiene seguridad de ello.

2. Contexto en Colombia
En cuanto a Colombia podemos ver que no hay una relación ya establecida entre la enseñanza
de los ODS y la implementación o aprendizaje de nuevas tecnologı́as, como lo son el ARDUINO,
las cuales permiten a los jóvenes tener una concepción más amplia y amigable de la tecnologı́a. Ası́
que es conveniente revisar los avances alcanzados en esta área por separado.
2.1. Juventud y ODS
Colombia al igual que muchos paı́ses, posee una agenda normativa o PNUD el cual plantea los
objetivos a largo plazo que deben conseguir todas las naciones en cuanto a la obtención de los ODS,
pero son pocas las estrategias que se están tomando para que las nuevas generaciones se apropien de
estos objetivos, pues los esfuerzos de Colombia en cuanto a educación están centrados en asegurar
una educación de calidad e indiscriminada para todos los jóvenes Colombianos independientemente
de su procedencia [2], más no a la apropiación de los mismos por parte de las jóvenes generaciones
de Colombia, las cuales son cruciales para el cumplimiento de dichos objetivos.
A pesar de eso, las nuevas generaciones no están desentendidas del tema, por ejemplo en Julio
del 2018 se realizó una reunión nacional de Coordinadores Municipales y Departamentales de la
Juventud, para el intercambio de estrategias de implementación de los ODS y ası́ asegurar su
correcta y pronta implementación en el territorio colombiano. [3]
Por otra parte el programa de Voluntariado de las Naciones Unidas (VNU), adelanto en Colom-
bia desde finales de 2016 capacitaciones y reuniones planteadas en el proyecto “JÓVENES POR
LOS ODS”, el cual capacitó cerca de 150 jóvenes sobre la Agenda de 2030, certificándolos como
capacitadores de los ODS.[4]
Como podemos ver, la juventud está comprometida en mayor o menor medida con los ODS,
pero es evidente que se puede fomentar de mejor manera la apropiación de estos objetivos por parte
de los jóvenes de Colombia.

2.2. Juventud y Tecnologı́a


La tecnologı́a está tomando terreno a pasos de gigante en la educación, ası́ como en la vida
en general y Colombia no se escapa de esto, no obstante no estamos avanzando de la manera en
la que deberı́amos con respecto a este apartado, pues la adaptación de nuevas tecnologı́as es muy
seccionada y escasa dentro de nuestro paı́s [5], por esto debemos buscar nuevas alternativas para
que la educación crezca de la mano de la tecnologı́a.
A pesar de esto podemos ver varios faroles de innovación dentro de la educación colombiana
como lo son:

Arduino para TODOS:


Evento realizado dentro de la Universidad autónoma de Occidente en Cali el 2016, liderado
por el programa de Ingenierı́a Electrónica. El cual fue un espacio multidisciplinario enfocado
en la divulgación de herramientas tecnológicas simples como el Arduino y de cómo estas
pueden ayudar a las personas a resolver problemas presentes en nuestro entorno común.
Dando también especial énfasis en temas importantes para el desarrollo de la sociedad de
cara al futuro, como lo son Inteligencia Artificial o Ciudades inteligentes.[6]

Robótica para Niños y Jóvenes:


Espacios generados por la Pontificia Universidad Javeriana, el cual busca a través de la
construcción y programación de robots enseñar y afianzar conocimientos relacionados con
las STEAM y a través de esto encontrar nuevas herramientas o estrategias para afrontar
problemas de la actualidad.[7]

3. Solución del Problema


Para dar una posible solución al problema se han escogido algunos prototipos que permiten
introducir, mediante juegos y proyectos a los estudiantes, en el aprendizaje y conceptualización de
los ODS. Los siguientes son los prototipos escogidos:

2
3.1. Medidor de la madurez de la fruta mediante su humedad interna
Este montaje está enmarcado dentro del segundo (Hambre cero) y el doceavo (Producción y
consumo responsable) objetivo de los ODS, y lo enfocamos hacia la educación diseñando una guı́a
de trabajo en la cual se explica cómo manejar el producto y se plantea una actividad la cual se
debe desarrollar con el producto.
La idea principal de este montaje es emplear el arduino y un sensor de humedad para determinar
la madurez de una fruta en relación con su porcentaje de humedad interna, para esto se empleó el
circuito que se muestra en la figura 1.

Figura 1: Circuito para medir la madurez de la fruta.

El funcionamiento del circuito es bastante sencillo, el sensor de humedad hace mediciones in-
directas calculando la conductividad de la tierra, esto debido a que el agua es un buen conductor
por tanto si la tierra está mojada su conductividad intrı́nseca aumenta y el sensor asigna un valor
análogo entre 0 y 1023 para dicho valor de conductividad. Este mismo principio lo empleamos para
medir la humedad interna de las frutas y hacer la relación de humedad con su nivel de madurez.
Para que el proyecto funcione adecuadamente primero se debe calibrar el sensor, para esto
debemos tomar dos medidas, una con el sensor al aire donde en teorı́a no hay humedad, y este
valor será nuestro cero, y la otra es sumergiendo el sensor en un vaso con agua, el valor obtenido
será nuestro 100 % de humedad, el código para esta calibración se puede ver en el Anexo B.
Una vez calibrado el sensor procedimos a medir la humedad interna de varias frutas y relacionar
el valor obtenido con su nivel de madurez, aunque durante el proceso se probó con varias frutas
(Tomate, fresa, banano, mora y plátano). Para la entrega final decidimos enfocarnos únicamente
en la fresa, para lo cual se presenta en el cuadro 5 que relaciona la humedad interna de la fresa con
su madurez, en la figura 2 algunas imágenes de las mediciones hechas y el Anexo C con el código
empleado para medir la humedad de la fruta.

Estado Humedad
Madura H > 75 %
En proceso de maduración 59 % < H < 74 %
Verde H < 58 %

Cuadro 1: Niveles de maduración para la fresa

Una vez comprobamos que el prototipo funciona pasamos a diseñar y construir su empaque
(ver figura 3), este debe ser resistente, debe tener los orificios para los cables de alimentación y del
sensor, además de poderse abrir para acceder al circuito en caso de necesitar cambiar el sensor o el
ARDUINO.

3
Figura 2: Medición de la humedad interna de las fresas.

Figura 3: Proceso de construcción del medidor de madurez de la fruta.

El material principal del empaque sera madera tipo triplex de 12mm, se escogió este tipo
de madera ya que es muy resistente a los golpes, y no se dañara con facilidad. La caja vendrá
completamente sellada, y solo se podrá abrir por una de sus caras desatornillando, esto con el fin
de proteger el circuito interno, y de que solo personas con el conocimiento necesario accedan a él.

Elemento Precio (COP)


ARDUINO $15,000,00
Sensor FC-28 $6,000,00
Madera $3,000,00
Tornillos $1,500,00
Total $25,500,00

Cuadro 2: Tabla de costos para el prototipo para medir la mduración de la fruta.

El costo de este prototipo se encuentra en el rango establecido en la lista de requerimientos(<

4
30000 COP), al igual que la resistencia, por otro lado la pieza que podrı́a necesitar cambio es el
sensor y este también se encuentra dentro del rango de precios(< 10000 COP).
Después de finalizado el proceso de diseño, experimentación y construcción final, se verificó que
este producto cumple con los requisitos de diseño propuestos en documentos anteriores y que puede
ser consultado en el Anexo A.

Figura 4: Prototipo completo del medidor de madurez de la fruta

3.2. Sensor de nivel de agua con servicio cliente-servidor


Este prototipo surge de la necesidad en algunos colegios de Bogotá por mantener abastecido el
tanque de suminsitro de agua. Dado que la entidad encargada del abastecimiento no cuenta con los
recursos necesarios para suplir esta necesidad se pretende ofrecer una solción que permita generar
alertas adecuadas para mantener un flujo contı́nuo de agua dentro de la IED. El problema descrito
se enmarca en el ODS número 6: Agua limpia y saneamiento. Dentro del manual de usuario se
explica el funcionamiento del sistema.
La idea principal de este montaje es emplear el arduino y un sensor de ultrasonido para deter-
minar el nivel de agua de un tanque, para esto se empleó el circuito que se muestra en la figura 5.
El funcionamiento del circuito se basa en medir con el sensor de ultrasonido la distancia de vacı́o
del tanque, es decir, el nivel de agua se calcula teniendo la distancia en la que el tanque está vacı́o y
en el que está lleno de tal manera que con una operación matemática simple se puede determinar el
nivel de agua. El sensor hc-sr04 emite una señal de ultrasonido por el pin de trigger (disparador) y
cuando ésta choca con un obstáculo, en este caso el agua, rebota y es detectada por el echo; con la
diferencia de tiempo desde que se emite la señal hasta que es detectada y conociendo la velocidad
del sonido en el medio (aire) se calcula la distancia a la que se encuentra el objeto. Para mejorar
la medición inicial del nivel se toman 100 medidas donde el punto inicial de distancia se fija en el
promedio de estas primeras 100 medidas.
Para la calibración del sensor se tiene en cuenta el comportamiento lineal del nivel de agua y su
relación con el volumen de agua dentro del tanque gracias a la geometrı́a regular del tanque. Para
estas pruebas no se tienen en cuenta las curvas de histéresis del sensor por lo que se trabaja con
la linealización mediante la ecuación de la recta teniendo puntos conocidos. Cuando el nivel llega
al 20 % se emite una alarma que es enviada a los bomberos, quienes se encargan de abastecer el
tanque.

5
Figura 5: Circuito para medir el nivel de agua de un tanque.

Conexión Dip 1 Dip 2 Dip 3 Dip 4 Dip 5 Dip 6 Dip 7 Dip 8


Atmega328 <–>ESP8266 ON ON OFF OFF OFF OFF OFF NOT
USB <–>Atmega328 OFF OFF ON ON OFF OFF OFF NOT
USB <–>ESP8266
(update firmware or OFF OFF OFF OFF ON ON OFF NOT
upload sketch)
USB <–>ESP8266
OFF OFF OFF OFF ON ON ON NOT
(communication)
Independientes OFF OFF OFF OFF OFF OFF OFF NOT

Cuadro 3: Estados posibles para el dipswitch que permiten trabajar con la placa Arduino Uno +
Wifi R3.

El sistema muestra por pantalla, en un lcd de 16 columnas por 2 filas, los datos del volumen
de agua contenida en el tanque y el porcentaje de llenado del mismo. Además, con el arduino
Uno+Wifi R3 se cuenta con un módulo ESP8266 integrado. Para el prototipo final se utilizó esta
referencia de Arduino para montar un sistema cliente-servidor.
De tal manera que en el navegador se muestra una página para interactuar con el cliente,
siendo el ESP8266 el responsable de montar un servidor y a su vez tener al microcontrolador
ATMEGA328P (Arduino Uno) como esclavo para todas las tareas sensores (hc-sr04) y actuadores
(lcd). Para poder programarlo se deben tener en cuenta los modos que se muestran en el cuadro 3.
Para subir el programa (sketch) al ESP8266 se debe utilizar la configuración para upload sketch
en el ESP desde USB. Además, se debe tener en cuenta que en el IDE ya se deben haber isntalados
las librerı́as necesarias para reconocer este módulo wifi. Para iniciar se abre el IDE de Arduino y
se hace click sobre File − > Preferences. Luego en la ventana que aparece in Additional Boards
Manager URLs ingresar el link para instalar en el IDE scripts adicionales que permitirán trabajar
con el módulo ESP8266, y luego click en OK.

http://arduino.esp8266.com/stable/package esp8266com index.json

6
Ahora hacer click en Tools− > Board− > Boards Manager buscar el script del esp8266 by
ESP8266 Community e instalar. De esta manera, nuestro entorno ya reconoce el módulo wifi
ESP8266.
El código utilizado para el prototipo final consta de dos partes: la primera el programa que se
carga en el Atmega 328 (ver Anexo F) y la segunda que es el programa que se carga en el ESP8266
se observa en el Anexo G.
Ya que se ha comprobado que el prototipo está funcionando completamente se procede a cons-
truir la carcaza. En la figura 6 se observa el diseño de la carcaza de este prototipo.

Figura 6: Diseño de carcaza para el prototipo de medidor de nivel de agua de un tanque.

La carcaza está hecha de mdf de 3 mm de grosor, en el cual utilizando cortadora láser se


obtuvieron las caras de la caja a esamblar. Estas caras se pegaron con pegamento superadesivo
y sólo se dejó sin pegar la tapa de arriba que es la que se requiere retirar cuando se pretende
programar el prototipo.
El costo de este prototipo se muestra en el cuadro 4, de tal manera que se observa que está
dentro del rango establecido en la lista de requerimientos (¡30.000 COP). ELl sensor que podrı́a
requerir cambio está en aproximadamente 6.000 COP, lo que se encuentra dentro de los rangos
requeridos.

Elemento Precio (COP)


ARDUINO $15,000,00
Sensor HC-SR04 $5,000,00
LCD 16x2 $6,500,00
Madera $2,500,00
Potenciómetro $1,000,00
Total $30,000,00

Cuadro 4: Tabla de costos para el prototipo para medir el nivel de agua de un tanque.

Finalmente, en la figura 7 se observa el prototipo funcionando perfectamente y la página en la


que se muestra la información.

3.3. Detector de nivel de radiación solar


La creación de este diseño se basa en la concientización educativa de los objetivos de desarrollo
sostenible. Especı́ficamente con el tercero (Salud y Bienestar) y el treceavo (Acción por el clima),

7
Figura 7: Prototipo completo del medidor de nivel de agua.

enfocado también al aprendizaje sobre la creación de este dispositivo, para los jóvenes en los cuales
nos queremos enfocar, a través de una guı́a la cual muestra la construcción y programación de este
dispositivo.
La idea principal es emplear arduino junto con un sensor de rayos ultravioleta, para detectar
en qué momentos las personas se exponen a cantidades nocivas de rayos UV, para lo cual se utilizó
el circuito mostrado en la figura 8.

Figura 8: Circuito del programa Final.

El funcionamiento del diseño es bastante simple, el sensor UV registra un rango de rayos UV


entre 390 nm y 280 nm, marcando la intensidad de radiación ultravioleta presente en estos mismos
entre 0 a 19,99 mW/cm2.
Para el correcto funcionamiento del dispositivo, debemos primero calibrar el sensor para que
identifique los rangos según los cuales la exposición a la luz solar empieza a ser nociva para la salud.
Para ello tomamos los dos rangos que mide el sensor, siendo un rango de 110 nm (Longitud de onda
que identifica los rayos UV) y de 19,83 mW/cm (Intensidad de los rayos UV), relacionados de una
manera inversamente proporcional, por lo tanto es fácil ver que por cada “nm” que disminuye la
longitud de onda de un rayo UV, la intensidad del mismo aumenta a razón de 0,1803 mW/cm2. Lo
cual nos deja ver la siguiente tabla de distinción entre rayos UV.
Cabe aclarar que el dispositivo enciende un led el cual muestra diversos colores en dependen-
cia de que tan nociva sea la intensidad de los rayos UV, siendo el “azul” una intensidad baja y
poco nociva, el “verde” una intensidad aún segura pero cercana a ser perjudicial, el “violeta” una

8
Tipos de Rayos UV Longitud de Onda nm Rango mW/cm2
UVA 390 − 320 0, 160 − 12, 781
UVB 320 − 280 12, 781 − 19, 993

Cuadro 5: Tabla de relación entre rango e intensidad de rayos UV.

Elemento Precio (COP)


ARDUINO $15,000,00
Sensor GYML8511 $6,000,00
Material $2,600,00
Led $150,00
Total $25,500,00

Cuadro 6: Tabla de costos para el prototipo para medir el nivel de rayos UV.

intensidad perjudicial para la salud, y el “rojo” un aviso para que las personas busquen cobertura.
Esta relación fue la que implementamos en el programa final, como lo podemos ver en el código
del Anexo H.
Una vez comprobamos que el prototipo funciona pasamos a diseñar y construir su empaque,
este debe ser resistente, debe además tener orificios para el paso de la luz, además de para que
sea visible la luz que indica la intensidad de la luz UV. También tiene un orificio para acoplar una
manilla de velcro, para poder adaptar el dispositivo de manera más sencilla.
El costo de este prototipo se encuentra en el rango establecido en la lista de requerimien-
tos(¡30000 COP), al igual que la resistencia, por otro lado la pieza que podrı́a necesitar cambio es
el sensor y este también se encuentra dentro del rango de precios(¡10000 COP).

3.4. Juego de preguntas sobre los ODS


Para la implementación de este modelo, se diseñó un pequeño manual, donde se encuentran
consignadas las 10 preguntas del juego, con sus respuestas y el modo de uso.
Este prototipo es el más interactivo de los propuestos en este trabajo, la idea principal es oprimir
un botón y aparecerá una pregunta aleatoria sobre los ODS que el jugador debe responder, si lo
hace de manera perfecta se le darán 2 puntos, si la respuesta es parcialmente correcta se le dará 1
punto y si la respuesta es errónea no se le otorgará ningún punto.
El proceso de construcción de este prototipo es muy sencillo ya que solo consta de una pantalla
led, un potenciómetro, un pulsador y el ARDUINO.
Por otro lado tenemos la parte de programación del ARDUINO, para que genere las preguntas
de manera aleatoria, al mismo tiempo que hace que la pregunta seleccionada se mueva hacia la
izquierda para poder visualizarla completamente.
Fue en la parte de programación donde más inconvenientes se tuvo, pues no habı́amos trabajado
este tipo código, lo primero que hicimos fue hacer la programación para el desplazamiento del texto,
para esto se implementó el código del Anexo I.
Para la generación de preguntas aleatorias cabe aclarar que ARDUINO no puede generar núme-
ros de manera completamente aleatoria, aunque se puede hacer un aproximado mezclando las fun-
ciones “randomSeed() y random (,)”. Una vez solucionado el problema de la generación aleatoria
de números, continuamos con nuestro código, se empleó la estructura if para asignar una pregunta
a cada uno de los posibles números en nuestro caso 10 preguntas. La estructura if permite com-
parar el valor de una variable establecida con sus posibles variantes, de tal forma que al cumplirse
la condición dada, se ejecuta una rutina.El código para la generación de preguntas aleatorias se

9
Figura 9: Circuito para el desplazamiento de texto.

encuentra en el Anexo J.

Figura 10: Preguntas aleatorias.

Por último debemos agregar la acción del pulsador para que se active el juego, y unir todo
nuestro código, el resultado se puede ver en el Anexo K.
Una vez nuestro código y circuito están funcionando procedemos a la construcción de la caja
donde vendrá el proyecto, elaboramos la caja en madera tipo triplex de 12mm, por su resistencia,
esta caja no tiene necesidad de abrirse, por lo que estara completamente sellada.
Como vemos el montaje se excedió 1900 COP del requisito de diseño establecido, pero los precios
podrı́an disminuir si el montaje se hace en masa y se compran los materiales al por mayor.
Al finalizar este montaje se verificó que cumple con todos los requisitos de diseño excepto uno,
el del valor total, ya que excede el presupuesto en 1900 COP.

10
[a] [b]

[c]

Figura 11: Proceso de construccion del juego sobre los ODS

Elemento Precio (COP)


ARDUINO $15,000,00
Display LCD 16x2 $10,850,00
Madera $3,000,00
Tornillos $31,900,00
Pulsador $1,500,00
Potenciómetro $1,500,00
Total $31,900,00

Cuadro 7: Tabla de costos para el juego sobre los ODS

4. ¿Cómo se puede seguir innovando desde la idea?


4.1. Medidor de la madurez de la fruta mediante su humedad interna
Este modelo se podrı́a mejorar empleando sensores de mayor precisión, de tal manera que las
mediciones sean más precisas, aunque los costos serı́an más elevados, por ejemplo si en lugar de
medir la humedad de la fruta medimos la cantidad de azúcar para determinar el grado de madurez
debemos utilizar un refractómetro, este se encuentra en el mercado en precios que oscilan entre los
100000 COP y los 600000 COP, dependiendo de la calidad del mismo.
Para disminuir costos sugerimos investigar en alternativas para la identificación del nivel de
madurez de las frutas dependiendo de otros factores como su color, dureza, olor, etc.

4.2. Sensor de nivel de agua con implementación de cliente-servidor


Para este caso se puede agregar un broquer de Mqtt para enviar mensajes y dar inicio a la
robótica colaborativa. Con esta implementación se puede puede ser posible que entre varios ar-
duinos que estén conectados al broquer puedan ejecutar procesos y dar órdenes a otras placas sin
intervención del ser humano como operario.

11
Otra posible innovación puede ser agregar un servicio IoT en la nube que permita ver el nivel de
agua de varios tanques en tiempo real y que a su vez grafique las curvas de comportamiento o exporte
datos a formatos compatibles con hojas de cálculo para un análisis posterior de comportamiento.

4.3. Detector de nivel de radiación solar


Este prototipo podrı́a ser mejorado a través de la implementación de sensores más precisos, para
que de esta manera las mediciones a cerca de la intensidad de la luz solar sean más precisas y más
rápidas las medidas que pueda tomar la persona con respecto a su salud, también se podrı́a utilizar
un sistema de alimentación por luz solar, aprovechando ası́ para generar una forma saludable de
auto sostener este invento en cuanto a alimentación se tratase.

4.4. Juego de preguntas sobre los ODS


Este prototipo tiene muchas cosas que se podrı́an mejorar, en especial en la parte del código,
se podrı́a extender para que llevara el conteo de puntos de manera automatica, tambien se podria
hacer que las preguntas no fueran respondidas en un orden, si no que pudiera responder la primera
persona en oprimir el boton, para lograr esto se debe profundizar en el manejo de tiempo por parte
del ARDUINO, ya que se debe sincronizar todas las subrutinas del programa para que funcionen
de manera adecuada y no se interrumpen mutuamente por errores de tiempo.

5. Otras posibles soluciones


En lugar de desarrollar prototipos empleando solo arduino se podria extender al uso de otras
tecnologias, como celulares o computadores, elaborando juegos que solo sean virtuales y que tambien
dinamicen el apredizaje, para que los jovenes se sientan mas motivados a aprender.

6. Planteamiento de negocio a partir de la solución


6.1. Unidades didácticas para la enseñanza
Todos los prototipos que se diseñaron para este trabajo se pueden enfocar hacia la enseñanza,
por tanto se propone elaborar unidades didácticas que permitan a los estudiantes experimentar
mientras aprenden, similares a las unidades didácticas de LEGO, pero enfocadas hacia los ODS,
estas unidades deben venir con sus respectivos manuales y guı́as de trabajo, aunque cada docente
puede decidir si usar la guı́a recomendada o diseñar una propia.

6.2. Masificación de la producción de los diseños mostrados


Los aparatos que hemos diseñado son necesarios en muchos escenarios dentro de la actualidad
colombiana, como por ejemplo el desabastecimiento de agua potable para las poblaciones más
vulnerables del paı́s , o la constante búsqueda del cuidado de la salud en un entorno de cambio
climático constante como el que vivimos hoy en dia. Por esto mismo se podrı́an buscar alianzas
con entidades relacionadas con estos menesteres para producir una masificación y expansión de los
productos que podemos ofrecer.

Referencias
[1] PNUD, Objetivos de Desarrollo Sostenible, 2018.

12
[2] Mineducación, Uno de nuestros retos es cerrar la brecha entre la educación urbana y rural:
ministra Giha, Cumbre Concordia Américas, 2017.

[3] Colombia Joven, Coordinadores de Juventud se encontrarán en Bogotá para apropiarse de los
ODS, 2018.

[4] PNUD, Agenda 2030: Jóvenes por los ODS, 2017.

[5] Granja S., ¿Están preparadas las aulas para las nuevas tecnologı́as?, El Tiempo, 2018.

[6] Universidad Autónoma de Occidente, Arduino para todos, Universidad Autónoma de Occidente,
Facultad de Ingenierı́a, Departamento de Ingenierı́a Electrónica, 2016.

[7] Pontificia Universidad Javeriana, Robótica para niños y jóvenes, Curso Presencial, Pontificia
Universidad Javeriana, Facultad de Ingenierı́a, Departamento de Ingenierı́a Electrónica, 2018.

13
Anexos

A. Cuadro de requisitos de diseño

¿Cómo medirlo?
Necesidad Usuario ¿Qué va a medir? Valor Bueno Mejor Valor
(Unidades)
Tiempo inicial de
accionamiento del minutos <15 min <5 min
De fácil uso producto
Tiempo para
minutos <30 min <15 min
mantenimiento
Claridad de las
cantidad de
instrucciones en el <5 preguntas ninguna
preguntas
manual de uso
Tiempo de uso
hasta que se
Resistencia horas >20 horas >40 horas
genere algún
desperfecto.
Valor extra pagado pesos
<5.000 pesos = pesos
por los padre colombianos
Costos
Valor total de la pesos
<30.000 pesos <15.000 pesos
unidad didáctica colombianos
Valor de los
pesos
accesorios de <20.000 pesos <10.000 pesos
colombianos
repuesto

Cuadro 8: Requisitos de diseño.

B. Calibración del sensor FC - 28


1 c o n s t i n t s e n s o r P i n = A0 ;
2 void setup ( ) {
3 S e r i a l . b e g i n ( 9600 ) ;
4 }
5 void loop ( )
6 {
7 i n t humedad = analogRead ( s e n s o r P i n ) ;
8 S e r i a l . p r i n t ( humedad ) ;
9 d e l a y ( 1000 ) ;
10 }

Listing 1: Código de Arduino para la calibración del sensor FC-28

C. Humedad de la Fruta
1 i n t s e n s o r = A0 ;
2 void setup ( ) {
3 pinMode ( s e n s o r , INPUT) ;
4 S e r i a l . b e g i n ( 9600 ) ;

14
5 }
6 void loop ( ) {
7 i n t valorHumedad = map( analogRead ( s e n s o r ) , 590 , 1023 , 100 , 0 ) ;
8 S e r i a l . p r i n t ( ”Humedad : ” ) ;
9 S e r i a l . p r i n t ( valorHumedad ) ;
10 S e r i a l . p r i n t l n ( ” %” ) ;
11 d e l a y ( 100 ) ;
12 }

Listing 2: Código de Arduino para medir la humedad de la Fruta

D. Prueba de lcd 16x2


1 // I n c l u m o s l a l i b r e r i a e x t e r n a para poder u t i l i z a r l a
2 #i n c l u d e <L i q u i d C r y s t a l . h> // Entre l o s s m b o l o s <> b u s c a r en l a c a r p e t a de
l i b r e r a s configurada
3
4 // Lo p r i m e r o i s i n i c i a l i z a r l a l i b r e r a i n d i c a n d o l o s p i n s de l a i n t e r f a z
5 L i q u i d C r y s t a l l c d ( 12 , 11 , 5 , 4 , 3 , 2 ) ;
6
7 // D e f i n i m o s l a s c o n s t a n t e s
8 #d e f i n e COLS 16 // Columnas d e l LCD
9 #d e f i n e ROWS 2 // F i l a s d e l LCD
10
11 void setup ( ) {
12 // Configuramos l a s f i l a s y l a s columnas d e l LCD en e s t e c a s o 16 columnas y 2
filas
13 l c d . b e g i n (COLS, ROWS) ;
14 }
15
16 void loop ( ) {
17
18 lcd . setCursor (0 ,0) ;
19 lcd . p r i n t ( ” Hola Mundo ! ! ! ! ! ! ” ) ;
20 lcd . setCursor (0 ,1) ;
21 lcd . p r i n t ( ” Probando e l LCD. ” ) ;
22 }

Listing 3: Código para comprobar el correcto funcionamiento del display lcd de 16columns x 2rows

E. Prueba del sensor HC-SR04, sensor de ultrasonido


1 // Configuramos l o s p i n e s d e l s e n s o r T r i g g e r y Echo
2 const i n t PinTrig = 7 ;
3 c o n s t i n t PinEcho = 6 ;
4
5 // Constante v e l o c i d a d s o n i d o en cm/ s
6 c o n s t f l o a t VelSon = 34000 .0 ;
7
8 float distancia ;
9
10 void setup ( )
11 {
12 // I n i c i a m o s e l monitor s e r i e para m o s t r a r e l r e s u l t a d o
13 S e r i a l . b e g i n ( 9600 ) ;
14 // Ponemos e l p i n T r i g en modo s a l i d a

15
15 pinMode ( PinTrig , OUTPUT) ;
16 // Ponemos e l p i n Echo en modo e n t r a d a
17 pinMode ( PinEcho , INPUT) ;
18 }
19 void loop ( )
20 {
21 iniciarTrigger () ;
22
23 // La f u n c i n p u l s e I n o b t i e n e e l tiempo que t a r d a en cambiar e n t r e e s t a d o s ,
en e s t e c a s o a HIGH
24 u n s i g n e d l o n g tiempo = p u l s e I n ( PinEcho , HIGH) ;
25
26 // Obtenemos l a d i s t a n c i a en cm , hay que c o n v e r t i r e l tiempo en s e g u d o s ya
que e s t en m i c r o s e g u n d o s
27 // por e s o s e m u l t i p l i c a por 0 . 0 0 0 0 0 1
28 d i s t a n c i a = tiempo ∗ 0 .0 00001 ∗ VelSon / 2 .0 ;
29 Serial . print ( d i s t a n c i a ) ;
30 S e r i a l . p r i n t ( ”cm” ) ;
31 Serial . p r i n t l n ( ) ;
32 d e l a y ( 500 ) ;
33 }
34
35 // M t o d o que i n i c i a l a s e c u e n c i a d e l T r i g g e r para comenzar a medir
36 void i n i c i a r T r i g g e r ( )
37 {
38 // Ponemos e l T r i i g e r en e s t a d o b a j o y esperamos 2 ms
39 d i g i t a l W r i t e ( PinTrig , LOW) ;
40 delayMicroseconds ( 2 ) ;
41
42 // Ponemos e l p i n T r i g g e r a e s t a d o a l t o y esperamos 10 ms
43 d i g i t a l W r i t e ( PinTrig , HIGH) ;
44 d e l a y M i c r o s e c o n d s ( 10 ) ;
45
46 // Comenzamos poniendo e l p i n T r i g g e r en e s t a d o b a j o
47 d i g i t a l W r i t e ( PinTrig , LOW) ;
48 }

Listing 4: Código para comprobar el correcto funcionamiento del sensor de ultrasonido hc-sr04

F. Código: Prototipo para medir el nivel de agua


1 // I n c l u m o s l a l i b r e r i a e x t e r n a para poder u t i l i z a r l a
2 #i n c l u d e <L i q u i d C r y s t a l . h> // Entre l o s s m b o l o s <> b u s c a r en l a c a r p e t a de
l i b r e r a s configurada
3
4 // Lo p r i m e r o i s i n i c i a l i z a r l a l i b r e r a i n d i c a n d o l o s p i n s de l a i n t e r f a z
5 L i q u i d C r y s t a l l c d ( 12 , 11 , 5 , 4 , 3 , 2 ) ;
6
7 // D e f i n i m o s l a s c o n s t a n t e s
8 #d e f i n e COLS 16 // Columnas d e l LCD
9 #d e f i n e ROWS 2 // F i l a s d e l LCD
10
11 // Configuramos l o s p i n e s d e l s e n s o r T r i g g e r y Echo
12 const i n t PinTrig = 7 ;
13 c o n s t i n t PinEcho = 6 ;
14
15 // Constante v e l o c i d a d s o n i d o en cm/ s
16 c o n s t f l o a t VelSon = 34000 .0 ;

16
17
18 // N m e r o de m u e s t r a s
19 c o n s t i n t numLecturas = 100 ;
20
21 // D i s t a n c i a a l o s 500 ml y v a c o
22 c o n s t f l o a t d i s t a n c i a 500 = 9 .0 3 ;
23 c o n s t f l o a t d i s t a n c i a V a c i o = 12 .4 7 ;
24 c o n s t f l o a t d i s t a n c i a T o d o L L e n o = 3 .4 6 ;
25
26 f l o a t l e c t u r a s [ numLecturas ] ; // Array para almacenar l e c t u r a s
27 i n t l e c t u r a A c t u a l = 0 ; // L e c t u r a por l a que vamos
28 f l o a t t o t a l = 0 ; // T o t a l de l a s que l l e v a m o s
29 f l o a t media = 0 ; // Media de l a s medidas
30 float distanciaLleno = 0 ;
31 f l o a t cantidadLiquido = 0 ;
32 float porcentaje = 0 ;
33 b o o l primeraMedia = f a l s e ; // Para s a b e r que ya hemos c a l c u l a d o por l o menos
una
34
35 c o n s t i n t LED = 13 ; // Led para c o n f i r m a r que f u n c i o n a e l s i s t e m a c l i e n t e −
servidor
36 bool status = 0 ;
37
38 S t r i n g i n p u t S t r i n g = ”” ; // un S t r i n g para g u a r d a r l o s d a t o s de e n t r a d a
39 bool stringComplete = f a l s e ; // s i e l S t r i n g e s completo
40
41 void setup ( )
42 {
43 pinMode (LED, OUTPUT) ;
44 // I n i c i a m o s e l monitor s e r i e para m o s t r a r e l r e s u l t a d o
45 S e r i a l . b e g i n ( 9600 ) ;
46 // r e s e r v e 200 b y t e s para e l i n p u t S t r i n g :
47 i n p u t S t r i n g . r e s e r v e ( 200 ) ;
48 // Ponemos e l p i n T r i g en modo s a l i d a
49 pinMode ( PinTrig , OUTPUT) ;
50 // Ponemos e l p i n Echo en modo e n t r a d a
51 pinMode ( PinEcho , INPUT) ;
52
53 // I n i c i a l i z a m o s e l a r r a y
54 f o r ( i n t i = 0 ; i < numLecturas ; i ++)
55 {
56 lecturas [ i ] = 0 ;
57 }
58
59 // Configuramos l a s f i l a s y l a s columnas d e l LCD en e s t e c a s o 16 columnas y 2
filas
60 l c d . b e g i n (COLS, ROWS) ;
61 }
62
63 void loop ( )
64 {
65 // Eliminamos l a ltima medida
66 total = total − lecturas [ lecturaActual ] ;
67
68 iniciarTrigger () ;
69
70 // La f u n c i n p u l s e I n o b t i e n e e l tiempo que t a r d a en cambiar e n t r e e s t a d o s ,
en e s t e c a s o a HIGH
71 u n s i g n e d l o n g tiempo = p u l s e I n ( PinEcho , HIGH) ;
72

17
73 // Obtenemos l a d i s t a n c i a en cm , hay que c o n v e r t i r e l tiempo en s e g u d o s ya
que e s t en m i c r o s e g u n d o s
74 // por e s o s e m u l t i p l i c a por 0 . 0 0 0 0 0 1
75 f l o a t d i s t a n c i a = tiempo ∗ 0 .0 00001 ∗ VelSon / 2 .0 ;
76
77 // Almacenamos l a d i s t a n c i a en e l a r r a y
78 lecturas [ lecturaActual ] = distancia ;
79
80 // A a d i m o s l a l e c t u r a a l t o t a l
81 total = total + lecturas [ lecturaActual ] ;
82
83 // Avanzamos a l a s i g u i e n t e p o s i c i n d e l a r r a y
84 lecturaActual = lecturaActual + 1 ;
85
86 // Comprobamos s i hemos l l e g a d o a l f i n a l d e l a r r a y
87 i f ( l e c t u r a A c t u a l >= numLecturas )
88 {
89 primeraMedia = t r u e ;
90 lecturaActual = 0 ;
91 }
92
93 // Calculamos l a media
94 media = t o t a l / numLecturas ;
95
96 // S o l o mostramos s i hemos c a l c u l a d o por l o menos una media
97 i f ( primeraMedia )
98 {
99 d i s t a n c i a L l e n o = d i s t a n c i a V a c i o − media ;
100 c a n t i d a d L i q u i d o = d i s t a n c i a L l e n o ∗ 500 / ( d i s t a n c i a V a c i o − d i s t a n c i a 500 ) ;
101 p o r c e n t a j e = d i s t a n c i a L l e n o ∗ 100 / ( d i s t a n c i a V a c i o − d i s t a n c i a T o d o L L e n o ) ;
102
103 // Mostramos en l a p a n t a l l a LCD
104 lcd . clear () ;
105 // Cantidada de l q u i d o
106 lcd . setCursor (0 , 0) ;
107 l c d . p r i n t ( S t r i n g ( c a n t i d a d L i q u i d o ) + ” ml” ) ;
108
109 // P o r c e n t a j e
110 lcd . setCursor (0 , 1) ;
111 l c d . p r i n t ( S t r i n g ( p o r c e n t a j e ) + ” %” ) ;
112 d e l a y ( 1000 ) ;
113 // S e r i a l . p r i n t ( media ) ;
114 // S e r i a l . p r i n t l n ( ” cm ”) ;
115
116 // S e r i a l . p r i n t ( c a n t i d a d L i q u i d o ) ;
117 // S e r i a l . p r i n t l n ( ” ml ” ) ;
118
119 // S e r i a l . p r i n t ( p o r c e n t a j e ) ;
120 // S e r i a l . p r i n t l n ( ” % ” ) ;
121 }
122 else
123 {
124 lcd . setCursor (0 , 0) ;
125 l c d . p r i n t ( ” Calculando : ” + S t r i n g ( l e c t u r a A c t u a l ) ) ;
126 }
127
128 // M e d i c i n d e l n i v e l de t u r b i d e z
129 i n t t u r b i d e z V a l u e = analogRead (A0 ) ; // r e a d t h e i n p u t on a n a l o g p i n 0 :
130 f l o a t v o l t a g e = t u r b i d e z V a l u e ∗ ( 5 .0 / 1024 .0 ) ; // Convert t h e a n a l o g r e a d i n g
( which g o e s from 0 − 1 0 2 3 ) t o a v o l t a g e ( 0 − 5V) :

18
131
132 // p r i n t t h e s t r i n g when a n e w l i n e a r r i v e s :
133 i f ( stringComplete ) {
134 i f ( i n p u t S t r i n g == ” on \ r \n” ) {
135 d i g i t a l W r i t e (LED, HIGH) ;
136 S e r i a l . p r i n t l n ( ” l e d i s on ” ) ;
137 } e l s e i f ( i n p u t S t r i n g == ” o f f \ r \n” ) {
138 d i g i t a l W r i t e (LED, LOW) ;
139 Serial . p r i n t l n ( ” led i s o f f ” ) ;
140 } e l s e i f ( i n p u t S t r i n g == ” l e v e l \ r \n” ) {
141 S t r i n g answer = ” ” ;
142 answer += ” N i v e l : ”+ ( S t r i n g ) media + ” cm ”+ ”Volumen : ” +
c a n t i d a d L i q u i d o + ” ml ” + ” Porcentaje : ” + porcentaje + ” % ” ;
143 S e r i a l . p r i n t l n ( answer ) ;
144 }
145 // c l e a r t h e s t r i n g :
146 i n p u t S t r i n g = ”” ;
147 stringComplete = f a l s e ;
148 }
149
150 }
151
152 // M t o d o que i n i c i a l a s e c u e n c i a d e l T r i g g e r para comenzar a medir
153 void i n i c i a r T r i g g e r ( )
154 {
155 // Ponemos e l T r i i g e r en e s t a d o b a j o y esperamos 2 ms
156 d i g i t a l W r i t e ( PinTrig , LOW) ;
157 delayMicroseconds ( 2 ) ;
158
159 // Ponemos e l p i n T r i g g e r a e s t a d o a l t o y esperamos 10 ms
160 d i g i t a l W r i t e ( PinTrig , HIGH) ;
161 d e l a y M i c r o s e c o n d s ( 10 ) ;
162
163 // Comenzamos poniendo e l p i n T r i g g e r en e s t a d o b a j o
164 d i g i t a l W r i t e ( PinTrig , LOW) ;
165 }
166
167 /∗
168 S e r i a l E v e n t o c c u r s whenever a new data comes i n t h e hardware s e r i a l RX. This
169 r o u t i n e i s run between each time l o o p ( ) runs , s o u s i n g d e l a y i n s i d e l o o p can
170 d e l a y r e s p o n s e . M u l t i p l e b y t e s o f data may be a v a i l a b l e .
171 ∗/
172 void s e r i a l E v e n t ( ) {
173 while ( Serial . a v a i l a b l e ( ) ) {
174 // g e t t h e new byte :
175 c h a r inChar = ( c h a r ) S e r i a l . r e a d ( ) ;
176 // add i t t o t h e i n p u t S t r i n g :
177 i n p u t S t r i n g += inChar ;
178 // i f t h e incoming c h a r a c t e r i s a n e w l i n e , s e t a f l a g s o t h e main l o o p can
179 // do something about i t :
180 i f ( inChar == ’ \n ’ ) { // c h a r t o s t o p o r c o m p l e t e
181 stringComplete = true ;
182 }
183 }
184 }

Listing 5: Codigo para el Atmega 328 del prototipo del tanque de medición de nivel de agua.

19
G. Código: Prototipo para medir el nivel de agua
1 /∗
2 ∗ ESP8266 NodeMCU LED C o n t r o l o v e r WiFi Demo
3 ∗
4 ∗ h t t p s : / / c i r c u i t s 4 y o u . com
5 ∗/
6 #i n c l u d e <ESP8266WiFi . h>
7 #i n c l u d e <W i F i C l i e n t . h>
8 #i n c l u d e <ESP8266 WebServer . h>
9 #i n c l u d e <ESP8266mDNS. h>
10
11 #i f n d e f APSSID
12 #d e f i n e APSSID ” D I S A w i f i ”
13 #d e f i n e APPSK ” 12345678 ”
14 #e n d i f
15
16 // SSID and Password o f your WiFi r o u t e r
17 c o n s t c h a r ∗ s s i d = APSSID ;
18 c o n s t c h a r ∗ password = APPSK;
19
20 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
21 //Our HTML webpage c o n t e n t s i n program memory
22 c o n s t c h a r MAIN page [ ] PROGMEM = R”=====(
23 <!DOCTYPE html>
24 <html>
25 <body>
26 <c e n t e r >
27 <h1>WiFi LED on o f f demo : 1</h1><br>
28 C i c l k t o t u r n <a h r e f=” ledOn ” t a r g e t=” myLevel ”>LED ON</a> <a h r e f=” l e d O f f ”
t a r g e t=” myLevel ”>LED OFF</a><br>
29 C i c l k t o r e f r e s h t h e water l e v e l <a h r e f=” r e f r e s h L e v e l ” t a r g e t=” myLevel ”>WATER
LEVEL</a><br>
30 L e v e l S t a t e :< i f r a m e name=” myLevel ” width=”100 %” h e i g h t=”50” frameBorder=”0”><br
>
31 <hr>
32 </ c e n t e r >
33 </body>
34 </html>
35 )=====” ;
36 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
37 //On board LED Connected t o GPIO2
38 #d e f i n e LED 2
39
40 // D e c l a r e a g l o b a l o b j e c t v a r i a b l e from t h e ESP8266WebServer c l a s s .
41 ESP8266 WebServer s e r v e r ( 80 ) ; // S e r v e r on p o r t 80
42
43 S t r i n g i n p u t S t r i n g = ”” ; // un S t r i n g para g u a r d a r l o s d a t o s de e n t r a d a
44 bool stringComplete = f a l s e ; // s i e l S t r i n g e s completo
45
46 //===============================================================
47 // This r o u t i n e i s e x e c u t e d when you open i t s IP i n b r o w s e r
48 //===============================================================
49 v o i d handleRoot ( ) {
50 S e r i a l . p r i n t l n ( ”You c a l l e d r o o t page ” ) ;
51 S t r i n g s = MAIN page ; // Read HTML c o n t e n t s
52 s e r v e r . send ( 200 , ” t e x t / html ” , s ) ; // Send web page
53 }
54
55 v o i d handleLEDon ( ) {

20
56 S e r i a l . p r i n t l n ( ” on ” ) ;
57 s e r v e r . send ( 200 , ” t e x t / html ” , i n p u t S t r i n g ) ; // Send ADC v a l u e o n l y t o c l i e n t
ajax request
58 i n p u t S t r i n g = ”” ;
59 stringComplete = f a l s e ;
60 }
61
62 v o i d handleLEDoff ( ) {
63 Serial . p r i n t l n ( ” o f f ” ) ;
64 s e r v e r . send ( 200 , ” t e x t / html ” , i n p u t S t r i n g ) ; // Send ADC v a l u e o n l y t o c l i e n t
ajax request
65 i n p u t S t r i n g = ”” ;
66 stringComplete = f a l s e ;
67 }
68
69 void handleRefreshLevel ( ) {
70 Serial . p r i n t l n ( ” l e v e l ” ) ;
71 i f ( stringComplete ) {
72 s e r v e r . send ( 200 , ” t e x t / html ” , i n p u t S t r i n g ) ; // Send ADC v a l u e o n l y t o c l i e n t
ajax request
73 }
74 i n p u t S t r i n g = ”” ;
75 stringComplete = f a l s e ;
76 }
77
78 //==============================================================
79 // SETUP
80 //==============================================================
81 void setup ( void ) {
82 d e l a y ( 1000 ) ;
83 S e r i a l . b e g i n ( 9600 ) ;
84 Serial . p r i n t l n ( ) ;
85
86 WiFi . softAP ( s s i d , password ) ; // C r e a t e AP
87 Serial . p r i n t l n ( ”” ) ;
88
89 // Onboard LED p o r t D i r e c t i o n output
90 pinMode (LED,OUTPUT) ;
91 // Power on LED s t a t e o f f
92 d i g i t a l W r i t e (LED, HIGH) ;
93
94 IPAddress myIP = WiFi . softAPIP ( ) ;
95 S e r i a l . p r i n t ( ”AP IP a d d r e s s : ” ) ;
96 S e r i a l . p r i n t l n ( myIP ) ;
97
98 s e r v e r . on ( ” / ” , handleRoot ) ; //Which r o u t i n e t o h a n d l e a t r o o t l o c a t i o n .
This i s d i s p l a y page
99 s e r v e r . on ( ” / ledOn ” , handleLEDon ) ; // a s Per <a h r e f =”ledOn ”>, S u b r o u t i n e t o
be c a l l e d
100 s e r v e r . on ( ” / l e d O f f ” , handleLEDoff ) ;
101 s e r v e r . on ( ” / r e f r e s h L e v e l ” , h a n d l e R e f r e s h L e v e l ) ;
102
103 server . begin () ; // S t a r t s e r v e r
104 S e r i a l . p r i n t l n ( ”HTTP s e r v e r s t a r t e d ” ) ;
105 }
106 //==============================================================
107 // LOOP
108 //==============================================================
109 void loop ( void ) {
110 server . handleClient () ; // Handle c l i e n t r e q u e s t s

21
111 while ( Serial . a v a i l a b l e ( ) )
112 {
113 c h a r inChar = ( c h a r ) S e r i a l . r e a d ( ) ;
114 i n p u t S t r i n g += inChar ;
115 i f ( inChar == ’ \n ’ ) {
116 stringComplete = true ;
117 }
118 }
119 }

Listing 6: Codigo para el ESP8266 del prototipo del tanque de medición de nivel de agua.

H. Código: Prototipo medidor de rayos UV


1
2 // Hardware p i n d e f i n i t i o n s
3 i n t UVOUT = A0 ; // Output from t h e s e n s o r
4 i n t REF 3V3 = A1 ; // 3 . 3V power on t h e Arduino board
5 i n t Azul = 9 ;
6 i n t Verde = 10 ;
7 i n t Rojo = 11 ;
8
9 void setup ( )
10 {
11 pinMode ( Rojo , OUTPUT) ;
12 pinMode ( Verde , OUTPUT) ;
13 pinMode ( Azul , OUTPUT) ;
14 S e r i a l . b e g i n ( 9600 ) ;
15 pinMode (UVOUT, INPUT) ;
16 pinMode ( REF 3V3 , INPUT) ;
17 S e r i a l . p r i n t l n ( ”ML8511 example ” ) ;
18 }
19
20 void loop ( )
21 {
22 i n t u v L e v e l = averageAnalogRead (UVOUT) ;
23 i n t r e f L e v e l = averageAnalogRead ( REF 3V3 ) ;
24
25 // Use t h e 3 . 3V power p i n a s a r e f e r e n c e t o g e t a v e r y a c c u r a t e output v a l u e
from s e n s o r
26 f l o a t o u t p u t V o l t a g e = 3 .3 / r e f L e v e l ∗ u v L e v e l ;
27
28 f l o a t u v I n t e n s i t y = m a p f l o a t ( o u t p u t V o l t a g e , 0 .9 9 , 2 .8 , 0 .0 , 15 .0 ) ; // Convert
t h e v o l t a g e t o a UV i n t e n s i t y l e v e l
29
30 S e r i a l . p r i n t ( ” / UV I n t e n s i t y (mW/cmˆ 2 ) : ” ) ;
31 Serial . print ( uvIntensity ) ;
32
33 i f ( u v I n t e n s i t y <= 12 , 781 ) {
34 S e r i a l . p r i n t ( ” / UVA − P a r c i a l m e n t e Seguro ” ) ;
35 }
36 else{
37 S e r i a l . p r i n t ( ” / UVB − Poco Seguro ” ) ;
38 }
39
40 MostrarIntensidad ( uvIntensity ) ;
41
42 Serial . p r i n t l n ( ) ;

22
43
44 d e l a y ( 500 ) ;
45 }
46
47 // Takes an a v e r a g e o f r e a d i n g s on a g i v e n p i n
48 // Returns t h e a v e r a g e
49 i n t averageAnalogRead ( i n t pinToRead )
50 {
51 by te numberOfReadings = 8 ;
52 unsigned i n t runningValue = 0 ;
53
54 f o r ( i n t x = 0 ; x < numberOfReadings ; x++)
55 r u n n i n g V a l u e += analogRead ( pinToRead ) ;
56 r u n n i n g V a l u e /= numberOfReadings ;
57
58 return ( runningValue ) ;
59 }
60 f l o a t m a p f l o a t ( f l o a t x , f l o a t in min , f l o a t in max , f l o a t out min , f l o a t
out max )
61 {
62 r e t u r n ( x − i n m i n ) ∗ ( out max − out min ) / ( in max − i n m i n ) + out min ;
63 }
64
65 void MostrarIntensidad ( f l o a t a ) {
66 i f ( a< 6 ) {
67 a n a l o g W r i t e ( Verde , 255 ) ;
68 a n a l o g W r i t e ( Rojo , 255 ) ;
69 a n a l o g W r i t e ( Azul , 0 ) ;
70 }
71 e l s e i f ( a >= 6 && a < 12 ) {
72 a n a l o g W r i t e ( Verde , 0 ) ;
73 a n a l o g W r i t e ( Rojo , 255 ) ;
74 a n a l o g W r i t e ( Azul , 255 ) ;
75 }
76 e l s e i f ( a >= 12 && a < 16 ) {
77 a n a l o g W r i t e ( Verde , 255 ) ;
78 a n a l o g W r i t e ( Rojo , 0 ) ;
79 a n a l o g W r i t e ( Azul , 0 ) ;
80 }
81 e l s e i f ( a >= 16 && a < 20 ) {
82 a n a l o g W r i t e ( Verde , 255 ) ;
83 a n a l o g W r i t e ( Rojo , 0 ) ;
84 a n a l o g W r i t e ( Azul , 255 ) ;
85 }
86 }

Listing 7: Codigo del prototipo de medición de rayos ultravioleta

I. Desplazamiento de texto en display LCD 16x2


1 #i n c l u d e <L i q u i d C r y s t a l . h>
2 LiquidCrystal lcd (1 ,2 ,4 ,5 ,6 ,7) ;
3 S t r i n g mensaje = ” a l g o e s t pasando por a q u i ” ;
4 i n t l o n g i t u d t e x t o = mensaje . l e n g t h ( ) ;
5 void setup ( ) {
6 l c d . b e g i n ( 16 , 2 ) ;
7 lcd . setCursor (0 , 0) ;
8 l c d . p r i n t ( mensaje ) ;

23
9 // d e l a y ( 1 5 0 0 ) ;
10 }
11 void loop ( ) {
12 //Mueve e l t e x t o a l a i z q u i e r d a t a n t a s v e c e s como su l o n g i t u d
13 f o r ( i n t p o s i c i o n = 0 ; p o s i c i o n < l o n g i t u d t e x t o ; p o s i c i o n ++)
14 {
15 lcd . scrollDisplayLeft () ;
16 d e l a y ( 300 ) ;
17 }
18 d e l a y ( 1000 ) ;
19 }

Listing 8: Código de Arduino para mostrar un texto en lcd 16x2 y desplazarlo

J. Selección de Preguntas Aleatorias


1 i n t randNumber ;
2 void setup ( )
3 {
4 S e r i a l . b e g i n ( 9600 ) ;
5 }
6 void loop ( )
7 {
8 randomSeed ( m i l l i s ( ) ) ;
9 randNumber = random ( 1 , 5 ) ;
10 i f ( randNumber == 1 )
11 {
12 S e r i a l . p r i n t l n ( ” Pregunta 1 ” ) ;
13 }
14 i f ( randNumber == 2 )
15 {
16 S e r i a l . p r i n t l n ( ” Pregunta 2 ” ) ;
17 }
18 i f ( randNumber == 3 )
19 {
20 S e r i a l . p r i n t l n ( ” Pregunta 3 ” ) ;
21 }
22 i f ( randNumber == 4 )
23 {
24 S e r i a l . p r i n t l n ( ” Pregunta 4 ” ) ;
25 }
26
27 i f ( randNumber == 5 )
28 {
29 S e r i a l . p r i n t l n ( ” Pregunta 5 ” ) ;
30 }
31 d e l a y ( 500 ) ;
32 }

Listing 9: Código de ARDUINO para la selección de preguntas aleatorias

K. Código: Juego de Preguntas de los ODS


1 #i n c l u d e <L i q u i d C r y s t a l . h>
2 i n t i n t e r r u p c i o n = 8 ; // Pin d i g i t a l para l a i n t e r r u p c i n ( INT0 ) t s l o v e
3 i n t randNumber ;

24
4 int p = 0 ;
5 S t r i n g mensaje 1 = ” Cuantos son l o s ODS ” ;
6 S t r i n g mensaje 2 = ” Quien s u p e r v i s a e l cumplimiento de l o s ODS” ;
7 S t r i n g mensaje 3 = ”Que son l o s ODS ” ;
8 S t r i n g mensaje 4 = ” D e s c r i b a e l ODS 4 ” ;
9 S t r i n g mensaje 5 = ”Que ODS e s t a l a s o b e r a n i a a l i m e n t a r i a ” ;
10 S t r i n g mensaje 6 = ”Que ODS e s t a r e l a c i o n a d o con e l ambiente ” ;
11 S t r i n g mensaje 7 = ” Mencione 4 ODS ” ;
12 S t r i n g mensaje 8 = ”Que e s e l PNUD ” ;
13 S t r i n g mensaje 9 = ” D e s c r i b a e l ODS 13 ” ;
14 S t r i n g mensaje 10 = ” D e s c r i b a e l ODS 1 ” ;
15 i n t l o n g i t u d t e x t o 1 = mensaje 1 . l e n g t h ( ) ;
16 i n t l o n g i t u d t e x t o 2 = mensaje 2 . l e n g t h ( ) ;
17 i n t l o n g i t u d t e x t o 3 = mensaje 3 . l e n g t h ( ) ;
18 i n t l o n g i t u d t e x t o 4 = mensaje 4 . l e n g t h ( ) ;
19 i n t l o n g i t u d t e x t o 5 = mensaje 5 . l e n g t h ( ) ;
20 i n t l o n g i t u d t e x t o 6 = mensaje 6 . l e n g t h ( ) ;
21 i n t l o n g i t u d t e x t o 7 = mensaje 7 . l e n g t h ( ) ;
22 i n t l o n g i t u d t e x t o 8 = mensaje 8 . l e n g t h ( ) ;
23 i n t l o n g i t u d t e x t o 9 = mensaje 8 . l e n g t h ( ) ;
24 i n t l o n g i t u d t e x t o 10 = mensaje 10 . l e n g t h ( ) ;
25 LiquidCrystal lcd (1 ,2 ,4 ,5 ,6 ,7) ;
26 void setup ( )
27 {
28 l c d . b e g i n ( 16 , 2 ) ; // s e t up t h e LCD ’ s number o f columns and rows
29 lcd . clear () ;
30 pinMode ( i n t e r r u p c i o n , INPUT) ;
31 }
32 void loop ( )
33 {
34 p = digitalRead ( interrupcion ) ;
35 i f ( p == 1 ) {
36 randomSeed ( m i l l i s ( ) ) ;
37 randNumber = random ( 1 , 10 ) ;
38 i f ( randNumber == 1 )
39 {
40 f o r ( i n t p o s i c i o n = 0 ; p o s i c i o n < l o n g i t u d t e x t o 1 ; p o s i c i o n ++)
41 {
42 lcd . setCursor (1 , 0) ;
43 l c d . p r i n t ( mensaje 1 ) ;
44 lcd . scrollDisplayLeft () ;
45 d e l a y ( 300 ) ;
46 }
47 }
48 i f ( randNumber == 2 )
49 {
50 f o r ( i n t p o s i c i o n = 0 ; p o s i c i o n < l o n g i t u d t e x t o 2 ; p o s i c i o n ++)
51 {
52 lcd . setCursor (1 , 0) ;
53 l c d . p r i n t ( mensaje 2 ) ;
54 lcd . scrollDisplayLeft () ;
55 d e l a y ( 300 ) ;
56 }
57 }
58 i f ( randNumber == 3 )
59 {
60 f o r ( i n t p o s i c i o n = 0 ; p o s i c i o n < l o n g i t u d t e x t o 3 ; p o s i c i o n ++)
61 {
62 lcd . setCursor (1 , 0) ;
63 l c d . p r i n t ( mensaje 3 ) ;

25
64 lcd . scrollDisplayLeft () ;
65 d e l a y ( 300 ) ;
66 }
67 }
68 i f ( randNumber == 4 )
69 {
70 f o r ( i n t p o s i c i o n = 0 ; p o s i c i o n < l o n g i t u d t e x t o 4 ; p o s i c i o n ++)
71 {
72 lcd . setCursor (1 , 0) ;
73 l c d . p r i n t ( mensaje 4 ) ;
74 lcd . scrollDisplayLeft () ;
75 d e l a y ( 300 ) ;
76 }
77 }
78
79 i f ( randNumber == 5 )
80 {
81 f o r ( i n t p o s i c i o n = 0 ; p o s i c i o n < l o n g i t u d t e x t o 5 ; p o s i c i o n ++)
82 {
83 lcd . setCursor (1 , 0) ;
84 l c d . p r i n t ( mensaje 5 ) ;
85 lcd . scrollDisplayLeft () ;
86 d e l a y ( 300 ) ;
87 }
88 }
89 i f ( randNumber == 6 )
90 {
91 for ( int posicion = 0 ; posicion < l o n g i t u d t e x t o 6 ; p o s i c i o n ++)
92 {
93 lcd . setCursor (1 , 0) ;
94 l c d . p r i n t ( mensaje 6 ) ;
95 lcd . scrollDisplayLeft () ;
96 d e l a y ( 300 ) ;
97 }
98 }
99 i f ( randNumber == 7 )
100 {
101 for ( int posicion = 0 ; posicion < l o n g i t u d t e x t o 7 ; p o s i c i o n ++)
102 {
103 lcd . setCursor (1 , 0) ;
104 l c d . p r i n t ( mensaje 7 ) ;
105 lcd . scrollDisplayLeft () ;
106 d e l a y ( 300 ) ;
107 }
108 }
109 i f ( randNumber == 8 )
110 {
111 for ( int posicion = 0 ; posicion < l o n g i t u d t e x t o 8 ; p o s i c i o n ++)
112 {
113 lcd . setCursor (1 , 0) ;
114 l c d . p r i n t ( mensaje 8 ) ;
115 lcd . scrollDisplayLeft () ;
116 d e l a y ( 300 ) ;
117 }
118 }
119 i f ( randNumber == 9 )
120 {
121 for ( int posicion = 0 ; posicion < l o n g i t u d t e x t o 9 ; p o s i c i o n ++)
122 {
123 lcd . setCursor (1 , 0) ;

26
124 l c d . p r i n t ( mensaje 9 ) ;
125 lcd . scrollDisplayLeft () ;
126 d e l a y ( 300 ) ;
127 }
128 }
129 i f ( randNumber == 10 )
130 {
131 f o r ( i n t p o s i c i o n = 0 ; p o s i c i o n < l o n g i t u d t e x t o 10 ; p o s i c i o n ++)
132 {
133 lcd . setCursor (1 , 0) ;
134 l c d . p r i n t ( mensaje 10 ) ;
135 lcd . scrollDisplayLeft () ;
136 d e l a y ( 300 ) ;
137 }
138 }
139 }
140 i f ( p == 0 )
141 {
142 lcd . clear () ;
143 lcd . setCursor (5 ,0) ;
144 lcd . print (” siguiente ”) ;
145 }
146
147 d e l a y ( 500 ) ;
148 }

Listing 10: Codigo de ARDUINO completo del juego de preguntas de los ODS

27

Potrebbero piacerti anche