Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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
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.
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 %
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.
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.
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.
5
Figura 5: Circuito para medir el nivel de agua de un tanque.
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.
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.
Cuadro 4: Tabla de costos para el prototipo para medir el nivel de agua de un tanque.
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.
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 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).
9
Figura 9: Circuito para el desplazamiento de texto.
encuentra en el Anexo J.
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]
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.
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.
[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
¿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
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 3: Código para comprobar el correcto funcionamiento del display lcd de 16columns x 2rows
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
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.
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 }
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 }
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