Diseño e implementación de un circuito electrónico inteligente para la emisión de sonido para control de plagas
Full text
PROYECTO FINAL DE CARRERA Diseño e implementación de un circuito electrónico inteligente para la emisión de sonido para control de plagas ! ! ! ! Alumno:!Daniel!Marfil!Reguero! Ingeniería!Técnica!Informática!de!Sistemas! Director!del!PFC:!José!Vicente!Busquets!Mataix! 15/06/2011!
Palabras Clave: Microcontrolador, Arduino, ATmega, DuinOS.
! 2! ÍNDICE! 1. INTRODUCCIÓN AL PFC…………………………..………………..página 3 2. DESCRIPCIÓN DE COMPONENTES……………..…………....página 4 2.1. USO DEL ARDUINO UNO………………………….……..página 6 2.1.1. INTRODUCCIÓN A LA ProgramacióN…página 8 2.1.2. IMPLEMENTACIÓN CON DuinOS…..…….página 8 2.2. USO DEL RTC DS1302…………..………………..………página 9 3. ESPECIFICACIÓN DE REQUISITOS……………………..……página 10 4. DISEÑO E IMPLEMENTACIÓN…………………....….………..página 11 4.1. LECTURA DE SEÑALES…………………………..……página 12 4.2. EMISIÓN DEL SONIDO……………..…………..…..…..página 14 4.3. COMUNICACIÓN CON EL PUERTO SERIE...….página 16 4.4. CONSULTA DE LA HORA…………..………………….página 20 4.5. SETUP Y LOOP………………………..…………………….página 23 5. ESQUEMAS EXTERNOS…………………………..……………….página 25 5.1. MICRÓFONO……………………………………………..….página 25 5.2. RTC DS1302……………………………..……..…………..página 26 5.3. ESQUEMA FINAL……………………………..……….….página 27 6. CONCLUSIÓN PERSONAL……………………………………….página 28 7. AGRADECIMIENTOS………..…………………..………………….página 29 8. BIBLIOGRAFÍA………………………..……………………………….página 30 9. ANEXO I………………..………………………………………………….página 31! ! ! !
! 3! ! 1. INTRODUCCIÓN AL PFC: En!este!proyecto!de!final!de!carrera,!se!ha!marcado!el!objetivo!de!diseñar!e! implementar!un!prototipo!que!sea!capaz!de!detectar!umbrales!de!sonido!y!generar,! si!dicho!umbral!cumple!determinadas!condiciones,!un!sonido!como!respuesta!a! dicha!entrada.! Contaremos!con!un!micrófono!como!forma!de!obtener!los!cambios!en!el!ruido!del! lugar!en!el!que!nos!encontremos!y!un!tweeter!para!emitir!el!sonido.! Debemos!de!ser!capaces!de,!utilizando!un!microcontrolador,!poder!leer!el!ruido! que!detecta!el!micrófono,!decidir!si!éste!supera!el!umbral!definido!y! posteriormente!emitir!una!alarma!que!además!habremos!programado!nosotros.! Además!se!hará!uso!de!un!reloj,!para!que!en!todo!momento!se!sepa!en!qué!hora!del! día!nos!encontramos,!ya!que!dependiendo!del!momento!la!sensibilidad!del! micrófono!será!mayor!o!menor.! Haremos!uso!también!de!una!interfaz!para!la!comunicación!mediante!el!puerto! serie!con!el!ordenador.!De!esta!forma!visualizamos!información!como!la!hora!del! día,!cuántas!veces!ha!saltado!el!sonido!o!la!sensibilidad!en!ese!momento!del! micrófono.!Además!de!poder!cambiar!de!forma!manual!esta!última.! Finalmente!también!deberemos!configurar!un!pulsador!para!que!cuando!se!active,! salte!el!sonido.!
! 4! 2. DESCRIPCIÓN DE COMPONENTES:! Tras!acordar!hacer!uso!de!un!microcontrolador!ATMega!328!(integrado!en! Arduino!UNO,!que!explicaremos!posteriormente),!se!contempló!como!primera! opción!utilizar!el!entorno!de!desarrollo!en!C!AVRaCodeVision.!Más!tarde!el! proyecto!se!implementó!con!el!entorno!de!desarrollo!de!Arduino,!al!ser!un! software!openasource,!gratuito!y!muy!intuitivo.! ! El!microcontrolador!ATMega!328!sigue!la!arquitectura!AVR.!Los!AVR!son!una! familia!de!microcontroladores!RISC!de!Atmel.!! El!AVR!es!una!CPU!de!arquitectura!Harvard.!Tiene!32!registros!de!8!bits.!Algunas! instrucciones!sólo!operan!en!un!subconjunto!de!estos!registros.!La!concatenación! de!los!32!registros,!los!registros!de!entrada/salida!y!la!memoria!de!datos! conforman!un!espacio!de!direcciones!unificado,!al!cual!se!accede!a!través!de! operaciones!de!carga/almacenamiento.!A!diferencia!de!los!microcontroladores! PIC,!el!stack!se!ubica!en!este!espacio!de!memoria!unificado,!y!no!está!limitado!a!un! tamaño!fijo.! El!AVR!fue!diseñado!desde!un!comienzo!para!la!ejecución!eficiente!de!código!C! compilado.!Como!este!lenguaje!utiliza!profusamente!punteros!para!el!manejo!de! variables!en!memoria,!los!tres!últimos!pares!de!registros!internos!del!procesador,! son!usados!como!punteros!de!16!bit!al!espacio!de!memoria!externa,!bajo!los! nombres!X,!Y!y!Z.!Esto!es!un!compromiso!que!se!hace!en!arquitecturas!de!ocho!bit! desde!los!tiempos!de!Intel!8008,!ya!que!su!tamaño!de!palabra!nativo!de!8!bit!(256! localidades!accedidas)!es!pobre!para!direccionar.!Por!otro!lado,!hacer!que!todo!el! banco!superior!de!16!registros!de!8!bit!tenga!un!comportamiento!alterno!como!un! banco!de!8!registros!de!16!bit,!complicaría!mucho!el!diseño,!violando!la!premisa! original!de!su!simplicidad.! El!set!de!instrucciones!AVR!está!implementado!físicamente!y!disponible!en!el! mercado!en!diferentes!dispositivos,!que!comparten!el!mismo!núcleo!AVR!pero! tienen!distintos!periféricos!y!cantidades!de!RAM!y!ROM:!desde!el!microcontrolador! de!la!familia!Tiny!AVR!ATtiny11!con!1KB!de!memoria!flash!y!sin!RAM!(sólo!los!32! registros),!y!8!pines,!hasta!el!microcontrolador!de!la!famila!Mega!AVRATmega2560! con!256KB!de!memoria!flash,!8KB!de!memoria!RAM,!4KB!de!memoria!EEPROM,! conversor!análogo!digital!de!10!bits!y!16!canales,!temporizadores,!comparador! analógico,!JTAG,!etc.!La!compatibilidad!entre!los!distintos!modelos!es!preservada! en!un!grado!razonable.!
! 5! Los!microcontroladores!AVR!tiene!un!pipeline!con!dos!etapas!(cargar!y!ejecutar),! que!les!permite!ejecutar!la!mayoría!en!un!ciclo!de!reloj,!lo!que!los!hace! relativamente!rápidos!entre!los!microcontroladores!de!8abit.! El!set!de!instrucciones!de!los!AVR!es!más!regular!que!la!de!la!mayoría!de!los! microcontroladores!de!8abit!(por!ejemplo,!los!PIC).!Sin!embargo,!no!es! completamente!ortogonal:! aLos!registros!punteros!X,!Y!y!Z!tienen!capacidades!de!direccionamiento! diferentes!entre!sí.! aLos!registros!0!al!15!tienen!diferentes!capacidades!de!direccionamiento! que!los!registros!16!al!31.! aLas!registros!de!I/O!0!al!31!tienen!distintas!características!que!las! posiciones!32!al!63.! aLa!instrucción!CLR!afecta!los!'flag',!mientras!que!la!instrucción!SER!no!lo! hace,!a!pesar!de!que!parecen!ser!instrucciones!complementarias!(dejar! todos!los!bits!en!1,!y!dejar!todos!los!bits!en!0!respectivamente).! Como!los!PIC,!tiene!una!comunidad!de!seguidores!principalmente!debido!a!la! existencia!de!herramientas!de!desarrollo!gratuitas!o!de!bajo!coste.!Estos! microcontroladores!están!soportados!por!tarjetas!de!desarrollo!de!costo! razonable,!capaces!de!descargar!el!código!al!microcontrolador,!y!por!una!versión! de!las!herramientas!GNU.!Esto!último!es!posible!por!su!uniformidad!en!el!acceso!al! espacio!de!memoria,!propiedad!de!la!que!carecen!los!procesadores!de!memoria! segmentada!o!por!bancos,!como!el!PIC!o!el!8051!y!sus!derivados.! El!ATMega!328!cuenta!con!32KB!de!memoria!flash,!2KB!de!memoria!RAM!y!1KB!de! memoria!EEPROM!(el!doble!que!el!ATMega!168).! ! ! ! ! ! !
! 6! 2.1. USO DEL ARDUINO UNO: ! Arduino!es!una!plataforma!de!hardware!libre!basada!en!una!sencilla!placa!con!un! microcontrolador!y!un!entorno!de!desarrollo!que!implementa!el!lenguaje!de! programación!Processing/Wiring.!Arduino!se!puede!utilizar!para!desarrollar! objetos!interactivos!autónomos!o!puede!ser!conectado!a!software!del!ordenador! (por!ejemplo:!Macromedia!Flash,!Processing,!Max/MSP,!Pure!Data).!Las!placas!se! pueden!montar!a!mano!o!adquirirse.!El!entorno!de!desarrollo!integrado!libre!se! puede!descargar!gratuitamente.! Las!plataformas!Arduino!están!basadas!en!los!microcontroladores!Atmega168,! Atmega328,!Atmega1280,!ATmega8!y!otros!similares,!chips!sencillos!y!de!bajo! coste!que!permiten!el!desarrollo!de!múltiples!diseños.! Al!ser!openahardware,!tanto!su!diseño!como!su!distribución!es!libre.!Es!decir,! puede!utilizarse!libremente!para!el!desarrollo!de!cualquier!tipo!de!proyecto!sin! haber!adquirido!ninguna!licencia.! Arduino!UNO!es!una!placa!basada!en!el!microcontrolador!ATMega328.!Tiene!14! pines!de!E/S!digital!(6!de!los!cuales!pueden!ser!utilizados!como!salidas!PWM),!6! entradas!analógicas,!un!oscilador!de!cristal!de!16MHz,!conexión!USB,!un!botón!de! reset,!cabeceras!ICSP!y!una!entrada!de!alimentación.!Contiene!todo!lo!necesario! para!hacer!funcionar!el!microcontrolador,!simplemente!se!conecta!a!un!ordenador! mediante!un!cable!USB!o!se!alimenta!con!pilas!o!adaptadores!a!corriente!continua.! Arduino!UNO!se!diferencia!del!resto!de!placas!de!Arduino!en!que!no!hace!uso!del! driver!para!el!chip!USBaaaserial!FDTI.!En!lugar!de!esto,!utiliza!un!ATMega8U2! programado!para!comportarse!como!un!conversor!USB!a!serie.!
! 7! En!resumen!Arduino!UNO!consta!de!las!siguientes!características:! Microcontrolador ATmega328 Tensión operativa 5V Tensión de entrada (recomendada) 7-12V Tensión de entrada (límite) 6-20V Pines E/S digitales 14 (de los cuales 6 pueden generar PWM) Pines de entrada analógica 6 Corriente por pines E/S 40 mA Corriente para el pin de 3.3V 50 mA Memoria Flash 32 KB 0.5 KB utilizados para el bootloader SRAM 2 KB EEPROM 1 KB Velocidad del reloj 16 MHz ! El!mapeado!realizado!por!Arduino!para!el!microcontrolador!ATMega328!es!el! siguiente:! !
! 8! 2.1.1. INTRODUCCIÓN A LA PROGRAMACIÓN: El!lenguaje!de!programación!de!Arduino!es!el!“wiring”,!este!lenguaje!está!basado! en!el!lenguaje!“processing”.! Processing!es!un!lenguaje!de!programación!y!entorno!de!desarrollo!integrado!de! código!abierto!basado!en!Java,!de!fácil!utilización,!y!que!sirve!como!medio!para!la! enseñanza!y!producción!de!proyectos!multimedia!e!interactivos!de!diseño!digital.! Fue!iniciado!por!Ben!Fry!y!Casey!Reas!a!partir!de!reflexiones!en!el!Aesthetics!and! Computation!Group!del!MIT!Media!Lab.! Processing!es!desarrollado!por!artistas!y!diseñadores!como!una!herramienta! alternativa!al!software!propietario.!Puede!ser!utilizado!tanto!para!aplicaciones! locales!así!como!aplicaciones!para!la!web!(Applets).! Se!distribuye!bajo!la!licencia!GNU!GPL.! ! 2.1.2. IMPLEMENTACIÓN DE DuinOS: Debido!a!las!características!del!proyecto,!una!forma!de!optimizar!su! funcionamiento!es!dividiendo!el!trabajo!en!tareas!que!trabajen!de!forma!paralela.! Debido!a!esto,!se!ha!hecho!uso!del!sistema!operativo!DuinOS,!que!se!puede!integrar! fácilmente!en!el!entorno!de!desarrollo!de!Arduino!y!nos!permite!crear!tareas,! además!de!asignar!a!cada!una!tres!tipos!distintos!de!prioridad.! DuinOS!es!un!sistema!operativo!de!tiempo!real!desarrollado!por!RobotGroup.!Este! sistema!agrega!multitarea!preventiva!al!entorno!Arduino.!Está!basado!en!un! robusto!kernel!como!lo!es!FreeRTOS!y!es!completamente!de!código!abierto.! En!la!explicación!del!código!se!hará!más!claro!el!uso!y!la!necesidad!de!implementar! ese!sencillo!sistema!operativo.! ! ! !
! 15! ! Aquí!vemos!el!cuerpo!de!la!tarea!alarma.!Vemos!como!variando!la!variable!valor,! iremos!cambiando!la!frecuencia!de!la!señal!de!salida!para!el!tweeter,!todo!esto! mientras!cont!sea!menor!de!1000.!Este!límite!se!puede!aumentar!o!disminuir!para! cambiar!la!duración!del!sonido.!Una!vez!ha!dejado!de!sonar!el!sonido,!se! incremente!el!contador!nalarmas!(explicado!en!el!apartado!de!comunicación!con!el! puerto!serie).!Además!de!cambiar!a!falso!el!booleano!activado!(que!nos!indicaba! que!el!pulsador!habia!sido!pueso!a!HIGH).! Tras!esto,!la!tarea!alarma!queda!en!estado!de!suspensión!hasta!que!la!tarea!lectura! la!despierte!de!nuevo!bien!porque!se!ha!pulsado!el!botón,!bien!porque!se!haya! superado!el!umbral!de!sonido!determinado!por!la!sensibilidad!del!micrófono.! ! ! ! ! ! ! ! ! !
! 16! 4.3. COMUNICACIÓN CON EL PUERTO SERIE: ! En!esta!tarea,!no!será!necesario!declarar!variables!globales!propias,!aunque!sí!se! utilizarán!otras!variables!globales!ya!explicadas!o!que!se!explicarán!en!el!apartado! de!la!consulta!al!RTC!DS1302.! En!un!primer!momento,!se!vacía!el!buffer!del!puerto!serie,!para!evitar!que!haya! una!mala!comunicación!a!la!hora!de!transmitir!y!recibir!datos.! La!variable!input!constara!de!cuatro!caracteres!y!será!donde!almacenemos!la! entrada!del!puerto!serie,!previo!envío!del!carácter!‘!’,!utilizado!como!identificación! de!que!va!a!llegar!al!puerto!serie!una!órden!que!debe!ser!interpretada.! Se!han!definido!tres!órdenes:!info,!hora!y!mods.!La!forma!de!escribirlo!en!el! terminal!sera!anteponiendo!el!signo!de!exclamación!(p.ej.!!info).!Si!se!escribe! alguna!cadena!con!mas!de!cuatro!caracteres,!se!leerán!los!cuatro!primeros!y!el! resto!serán!ignorados.!Además!si!la!orden!es!desconocida!se!advertirá!mediante!un! mensaje!del!error.! Un!ejemplo!de!las!funciones!de!esta!tarea!es!la!siguiente!imagen:!
! 17! ! ! Tanto!la!órden!info!como!hora!son!solamente!a!modo!de!consulta.!En!cambio!la! órden!mods!(modificar!sensibilidad)!deberá!acompañarse!de!un!número!de!dos! dígitos,!por!ejemplo!!mods50,!con!lo!cual!cambiaría!la!sensibilidad!a!50!hasta!que! se!envía!la!órden!!mods00,!que!hace!volver!a!la!sensibilidad!establecida!según!la! hora!del!día.!Esto!es!así!porque!se!ha!programado!que!si!a!dicha!órden!se!le!envía! los!dígitos!00,!debe!volver!a!la!sensibilidad!por!defecto!dependiente!de!la!hora.! Veamos!ahora!el!código!implementado:! !
! 18! Hasta!aquí!lo!que!se!ha!escrito!son!las!variables!locales!utilizadas!para!registrar!los! datos!de!entrada!y!las!órdenes!que!hay!programadas.! ! Como!se!ha!explicado!antes,!si!recibimos!el!signo!de!exclamación!pasaremos!a! esperar!cuatro!caracteres!que!deberán!interpretarse!dando!una!respuesta! correspondiente.!Al!solo!poder!recibir/enviar!caracteres,!se!deberán!usar! funciones!como!atoi()!para!poder!interpretarlas!de!forma!correcta.!Por!ejemplo! hacemos!uso!de!esta!función!cuando!queremos!cambiar!manualmente!la! sensibilidad!del!micrófono.! Un!caso!concreto!es!la!órden!mods,!podemos!ver!que!tras!detectar!dicha!órden,! debemos!recibir!además!otros!dos!caracteres,!que!deberán!convertirse!en!enteros! para!actualizar!así!la!sensibilidad.!Para!volver!a!la!sensibilidad!por!defecto!(según! la!franja!del!día)!los!dos!caracteres!a!enviar!deberán!ser!00.!
! 19! ! En!esta!última!parte!vemos!que!al!enviar!la!órden!info!obtenemos!el!número!de! veces!que!ha!saltado!el!sonido!y!también!la!sensibilidad!a!la!que!está!configurado! el!micrófono!actualmente.! También!apreciamos!que!con!la!órden!hora!recibimos!como!respuesta!la!hora,! almacenada!en!la!variable!hhmm,!explicada!a!continuación.! ! ! ! ! ! ! ! ! ! ! ! !
! 20! 4.4. CONSULTA DE LA HORA: En!este!apartado!explicaremos!las!variables,!método!y!tarea!encargados!de! configurar!y!consultar!el!RTC!DS1302,!haciendo!uso!de!una!librería!openasource! obtenida!de!http://www.henningkarlsen.com/electronics/a_l_ds1302.php.! Para!ello,!tras!haber!instalado!la!librería!en!el!entorno!Arduino,!deberemos!incluir! al!principio!del!programa!la!línea!! #include!<DS1302.h>! Tras!esto!ya!podremos!declarar!una!variable!reloj,!indicando!los!pines!que!se! utilizarán,!como!podemos!ver!el!la!próxima!imagen.!Además!podemos!ver!las! distintas!sensibilidades!definidas!para!cada!franja!del!día.!Por!otro!lado!vemos!un! booleano!que!se!encargará!de!indicar!si!se!ha!cambiado!manualmente!la! sensibilidad,!por!lo!que!se!deberá!ignorar!la!franja!del!día!en!la!que!se!esté.! Podemos!observar!que!hemos!dividido!el!día!en!tres!franjas:!mañana!(6!a! 11:59:59),!tarde!(12!a!19:59:59)!y!noche!(20!a!5:59:59).! La!variable!nalarmas!de!encargará!de!contar!las!veces!que!ha!saltado!el!sonido,!en! la!tarea!con!el!mismo!nombre.!La!variable!hhmm!se!encargará!de!almacenar!la! hora!consultada!al!RTC!DS1302.!
! 21! Como!podemos!apreciar,!la!tarea!consultaRTC!es!muy!sencilla,!ya!que!solamente! debe!consultar!la!hora!al!reloj!mediante!getTimeStr(),!que!nos!devolverá!una! cadena!de!char.!Posteriormente!y!mediante!el!método!ecuentraRango,!que!tendrá! como!entrada!la!hora,!deberemos!obtener!la!sensibilidad!correspondiente!tras! haber!confirmado!la!hora!en!la!que!estamos.! El!siguiente!método!se!encarga!de!deducir!la!hora!en!la!que!nos!encontramos!y! devolver!la!sensibilidad!correspondiente:!
! 22! Puesto!que!solamente!nos!interesa!saber!la!hora!y!ni!siquiera!los!minutos,! debemos!comparar!los!dos!primeros!componentes!del!string!con!las!variables! finmanana,!fintarde!y!finnoche.!Mediante!una!serie!de!condiciones!podemos! obtener!la!sensibilidad!correspondiente!según!la!franja!del!día.! Por!otro!lado!vemos!que!todo!lo!dicho!se!ejecutará!únicamente!si!no!se!ha! cambiado!la!señal!manualmente,!es!decir,!si!la!variable!sensman!está!a!trae,! significará!que!la!hemos!modificado!personalmente!y!por!tanto,!no!se!deberá! comprobar!en!qué!hora!estamos!para!actualizar!la!sensibilidad.!Aunque!si! podremos!consultar!la!hora!a!través!del!puerto!serie.! ! !
! 23! 4.5. SETUP Y LOOP: ! Estas!tareas!son!propias!y!obligatorias!para!programar!con!Arduino.!! En!el!setup()!definimos!opciones!tales!como!declarar!si!ciertos!pines!son!de! entrada!o!salida,!como!por!ejemplo!speaker!debe!ser!de!salida!o!el!pulsador!de! entrada.! Además!al!hacer!uso!del!reloj!RTC!DS1302!se!deben!quitar!los!permisos!de! protección!de!escritura!y!ponerlo!en!runamode,!lo!cual!se!consigue!con!los!métodos! writeProtection()!y!halt()!utilizando!como!parámetros!de!entrada!el!booleano! false.!
! 24! Por!otra!parte!si!queremos!configurar!inicialmente!la!hora,!fecha!y!día!de!la! semana!del!reloj,!se!deberá!descomentar!los!comandos!setDOW,!setTime!y!setDate.! Lo!común!es!configurarlo!la!primera!vez!y!si!posteriormente!se!actualiza!parte!del! código,!comentarlo!para!que!no!se!desactualice!la!hora.! ! El!loop()!si!no!hicieramos!uso!de!tareas,!es!donde!debería!ir!todo!el!código.!Pero!al! hacer!uso!del!DuinOS,!este!queda!vacío!y!debemos!poner!en!él!la!órden!nextTask(),! esto!está!indicado!por!parte!del!propio!SO,!y!se!escribe!para!evitar!interbloqueos!y! no!se!llegue!a!colgar!el!SO.! ! Con!esto!está!explicado!todo!el!código!necesario!y!relevante!que!necesita!ser! explicado.!Adjunto!a!este!documento!está!el!código!completo!del!proyecto.!
! 31! 9. ANEXO I: CÓDIGO IMPLEMENTADO: #include)<DS1302.h>) ) ) //VARIABLES)PARA)LECTURA)DE)INFORMACION) const)int)buttonPin)=)5;//)pin)pulsador) int)estadoBoton;//variable)que)cambiara)segun)el)pulsador) boolean)activado)=)false;//comprobara)que)se)ha)pulsado)el)boton) const)int)sensorPin)=)A0;//pin)para)la)entrada)analogica)del)microfono) int)sensorValue)=)0;//)variable)para)almacenar)el)valor)de)entrada)analogica) int)oldSensorValue)=)sensorValue;//variable)utilizada)para)comparar) )))))))))))))))))))))))))))))))))//el)valor)de)entrada)anterior)con)el)actual) ) ) //VARIABLES)PARA)EL)SONIDO) int)cont)=)0;) const)int)speaker=7;//pin)que)emitira)señal)de)alarma) const)int)minimo)=)620;)//periodo)microseg)para)1'6kHz) const)int)maximo)=)50;)//periodo)microseg)para)20kHz) int)valor)=)minimo;//variable)utilizada)para)que)el)sonido)emitido)varie)de)tonalidad) ) ) //VARIABLES)PARA)LA)ACTUALIZACION)Y)COMUNICACION)CON)EL)RTC) DS1302)rtc(2,)3,)4);) //)DS1302:))CE)pin))))b>)Arduino)Digital)2) //))))))))))I/O)pin)))b>)Arduino)Digital)3) //))))))))))SCLK)pin))b>)Arduino)Digital)4) int)sensibilidadManana)=)40;)//...) int)sensibilidadTarde)=)60;)//...bbbbb>sensibilidades)segun)parte)del)dia) int)sensibilidadNoche)=)20;)//...) int)sensibilidad)=)90;)//inicialmente,)se)actualiza)de)inmediato)al)consultar)el)rtc)
! 32! boolean)sensman)=)false;//indicara)si)se)ha)cambiado)manualmente)la)sensibilidad)) char*)hhmm;//utilizado)en)la)tarea)de)consultar)al)rtc) int)finmanana)=12;//hora)en)la)que)acaba)la)mañana) int)fintarde=20;//hora)en)la)que)acaba)la)tarde) int)finnoche=06;//hora)en)la)que)acaba)la)noche) int)nalarmas)=)b1;//Inicialmente)a)b1)porque)al)encenderse)el)arduino,)salta)el)sonido) ))))))))))))))))))//contador)de)alarma) ) ) //DECLARACION)DE)TAREAS) declareTaskLoop(lectura);) declareTaskLoop(consultarRTC);) declareTaskLoop(alarma);) declareTaskLoop(comunicacionSerie);) ) ) /**METODO)OBTENER)SENSIBILIDAD)SEGUN)FRANJA)HORARIA) //metodo)encargado)de)obtener)la)franja)horaria)en)la)que)nos)encontramos) //y)modificar)la)sensibilidad)segun)dicha)franja) //recibe)un)char*)con)la)hora)del)rtc)en)formato)hh:mm) //devuelve)la)sensibilidad)con)la)que)se)debe)comprobar)la)entrada)del)microfono*/) int)encuentraRango(char*)hora){) ))if(!sensman){) ))))char)aux[2]={0,)0};) ))))int)horaint)=)0;) ))))for(int)i=0;i<2;i++){//solo)los)2)primeros)componentes)del)string)b>)hh:mm)queremos)hh) ))))))aux[i]=hora[i];) ))))}) ))))horaint)=)atoi(aux);) ))))if(horaint)>=)finnoche)&&)horaint)<)finmanana){return)sensibilidadManana;}) ))))if(horaint)>=)finmanana)&&)horaint)<)fintarde){return)sensibilidadTarde;}) ))))if(horaint)>=)fintarde)&&)horaint)<)finnoche){return)sensibilidadNoche;})
! 33! ))}) ))return)sensibilidad;) }) ) ) /**TAREA)LECTURA)DE)DATOS) //tarea)encargada)de)leer)tanto)el)microfono)como)el)pulsador) //si)se)pulsa)el)boton)se)debera)activar)el)sonido) //al)igual)que)si)se)supera)la)sensibilidad)limite*/) taskLoop(lectura){) ))estadoBoton)=)digitalRead(buttonPin);) ))oldSensorValue)=)sensorValue;) ))sensorValue)=)analogRead(sensorPin);) ))sensorValue=map(sensorValue,)0,)1023,)0,)100);) ))if(estadoBoton)==)HIGH){) ))))if(!activado))activado)=)true;) ))}) ))) ))if(sensorValue)b)oldSensorValue)>)sensibilidad)||)activado){) ))))resumeTask(alarma);) ))}) ))) ))resumeTask(consultarRTC);) }) ) ) /**TAREA)ALARMA) //tarea)encargada)en)hacer)saltar)el)sonido) //esta)se)activara)y)recorrera)una)franja)de) //frecuencias)molestas)durante)un)tiempo)determinado)por) //la)variable)interna)cont*/) taskLoop(alarma){)
! 34! ))do{) ))))for(int)i=0;i<5;i++){) ))))))digitalWrite(speaker,HIGH);) ))))))delayMicroseconds(valor/2);) ) ))))))digitalWrite(speaker,LOW);) ))))))delayMicroseconds(valor/2);) ))))}) ))))valor)=)valor)b)2;) ))))if(valor==maximo+2){valor=minimo;}) ))))cont++;) ))}while(valor>=maximo)&&)cont)<)1000);) ))nalarmas++;) ))valor)=)minimo;) ))cont=0;) ))if(activado){) ))))estadoBoton)=)digitalRead(buttonPin);) ))))if(activado))activado)=)false;) ))}) ))suspend();) }) ) ) /**TAREA)CONSULTAR)RTC) //tarea)encargada)de)consultar)el)rtc) //y)obtener)la)hora,)ademas)de)actualizar) //la)sensibilidad)llamando)al)metodo) //encuentraRango()*/) taskLoop(consultarRTC){) ))delay(1000);) ))hhmm)=)rtc.getTimeStr();) ))sensibilidad)=)encuentraRango(hhmm);)
! 35! }) ) ) /**TAREA)COMUNICACION) //Se)encarga,)segun)los)comandos)de)4)caracteres)propuestos,) //de)modificar)la)sensibilidad)del)microfono) //o)de)solicitar)informacion)sobre)la)configuracion) //de)la)sensibilidad)actual)y)el)numero)de)veces) //que)ha)saltado)el)sonido,)ademas)de)poder)consultar)la) //hora*/) taskLoop(comunicacionSerie){) ))Serial.flush();) ))char)input[5];) ))char)sens[5];) ))char)talarm[5];) ))char)modsens[4])=){'m',)'o',)'d',)'s'};) ))char)infor[4])=){'i',)'n',)'f',)'o'};) ))char)tiempo[4])=){'h',)'o',)'r',)'a'};) ))memset(input,'\0',5);) ))byte)inByte)=)'\0';) ))boolean)modifisens)=)false;) ))boolean)inform)=)false;) ))boolean)tmp)=)false;) ))int)nuevasens)=)0;) ))char)nsens[3];) ))memset(nsens,'\0',3);) ))) ))while(inByte)!=)'!'){inByte)=)Serial.read();}) ))) ))if(inByte)==)'!'){) ))))while(Serial.available())<)4)){;}) ))))for)(int)i=0;)i)<)4;)i++)){)
! 36! ))))))input[i])=)Serial.read();) ))))}) ))))) ))))delay(200);) ))))Serial.print("Recibo:)");) ))))Serial.println(input);) ))))) ))))if(input[0])==)modsens[0])&&)input[1])==)modsens[1])&&)input[2])==)modsens[2])&&)input[3])==) modsens[3]))modifisens)=)true;) ))))else)if(input[0])==)infor[0])&&)input[1])==)infor[1])&&)input[2])==)infor[2])&&)input[3])==)infor[3])) inform)=)true;) ))))else)if(input[0])==)tiempo[0])&&)input[1])==)tiempo[1])&&)input[2])==)tiempo[2])&&)input[3])==) tiempo[3]))tmp)=)true;) ))))else{delay(200);)Serial.println("Orden)no)existente");}) ))))) ))))if(modifisens){) ))))))while(Serial.available())<)2)){;}) ))))))for)(int)i=0;)i)<)2;)i++)){) ))))))))nsens[i])=)Serial.read();) ))))))}) ))))))nuevasens)=)atoi(nsens);) ))))))if(nuevasens)!=)0){sensman)=)true;)sensibilidad)=)nuevasens;}) ))))))else)sensman)=)false;) ))))))delay(200);) ))))))Serial.print("Nuevo)valor)para)sensibilidad(si)00b>valor)segun)franja)horaria):)");) ))))))Serial.println(nsens);) ))))))if(nuevasens)!=)0)sensman)=)true;) ))))))else)sensman)=)false;) ))))}) ))))) ))))if(inform){) ))))))delay(100);) ))))))Serial.print("Numero)de)veces)que)salta)la)alarma:)");) ))))))itoa(nalarmas,)talarm,)10);)
! 37! ))))))Serial.println(talarm);) ))))))delay(100);) ))))))Serial.print("Sensibilidad)del)microfono)(0)mucha)b)100)poca):)");) ))))))itoa(sensibilidad,)sens,)10);) ))))))Serial.println(sens);) ))))}) ))))))))) ))))if(tmp){) ))))))delay(100);) ))))))Serial.println(hhmm);) ))))}) ))}) }) ) ) /**SETUP) //aqui)se)inicializaran)las)tareas)indicando)su)prioridad,)determinar) //pines)de)entrada)y)salida,)inicializacion)del)puerto)serie) //ademas)de)programar)inicialmente)la)fecha)para)el)rtc) */) void)setup()){) ))pinMode(speaker,)OUTPUT);) ))pinMode(buttonPin,)INPUT);) ))) ))createTaskLoop(lectura,)NORMAL_PRIORITY);) ))createTaskLoop(consultarRTC,)NORMAL_PRIORITY);) ))createTaskLoop(alarma,)HIGH_PRIORITY);) ))createTaskLoop(comunicacionSerie,)NORMAL_PRIORITY);) ))) ))Serial.begin(9600);) ))) ))//)poner)reloj)en)runbmode)y)deshabilitar)proteccion)de)escritura)
! 38! ))rtc.halt(false);) ))rtc.writeProtect(false);) ))//Para)sobreescribir)valores)del)rtc,)descomentar)las)lineas)de)abajo) ))//rtc.setDOW(THURSDAY);))))))))//)Set)DaybofbWeek)to)FRIDAY) ))//rtc.setTime(18,)10,)0);)))))//)Set)the)time)to)12:00:00)(24hr)format)) ))//rtc.setDate(9,)6,)2011);)))//)Set)the)date)to)August)6th,)2010) }) ) ) /**TAREA)LOOP) //tarea)propia)del)entorno)arduino) //por)defecto)sera)de)prioridad)baja) //se)debe)poner)nextTask())para)evitar) //interbloqueos) */) void)loop()){) ))nextTask();) }) !