Ivan Bellanco Bellanco PROGRAMA INFORMÁTICO PARA PROMOCIONAR LA INGENIERÍA ELÉCTRICA TRABAJO FIN DE GRADO dirigido por José Antonio Barrado Rodrigo Grado de Ingeniería Eléctrica Tarragona 2016 1.Índice 1. Índice 1. Índice .............................................................................................................................. 1 2. Introducción ................................................................................................................... 4 3. Antecedentes .................................................................................................................. 5 4. Objetivos ........................................................................................................................ 6 5. Comparativa de Posibles Soluciones.............................................................................. 7 6. 7. 5.1. LabView .................................................................................................................. 7 5.2. C# ............................................................................................................................ 8 5.3. Visual Basic ............................................................................................................ 8 5.4. Conclusiones ........................................................................................................... 9 Comparativa con Otras Aplicaciones ........................................................................... 10 6.1. WWF Switch’em off ............................................................................................. 10 6.2. CLMNTK .............................................................................................................. 10 6.3. Iberdrola Sustainability Game .............................................................................. 11 6.4. ElectroCity ............................................................................................................ 12 6.5. REE Controla tu energia ....................................................................................... 12 Introducción a Visual Basic ......................................................................................... 14 7.1. Plataforma de Desarrollo ...................................................................................... 14 7.1.1. Toolbox.......................................................................................................... 15 7.1.2. Formulario ..................................................................................................... 15 7.1.3. Properties ....................................................................................................... 15 7.1.4. Código ........................................................................................................... 16 7.2. Controles ............................................................................................................... 16 7.2.1. Button ............................................................................................................ 16 7.2.2. CheckBox ...................................................................................................... 16 7.2.3. Label .............................................................................................................. 16 7.2.4. PictureBox ..................................................................................................... 17 1 1.Índice 7.2.5. ProgressBar .................................................................................................... 17 7.2.6. TableLayoutPanel .......................................................................................... 17 7.2.7. Timer ............................................................................................................. 17 7.2.8. TrackBar ........................................................................................................ 17 8. Índice de Programación................................................................................................ 19 9. Código .......................................................................................................................... 22 9.1. Form 1 ................................................................................................................... 22 9.2. FInicio ....................................................................................................................... 35 9.3. FCicle ........................................................................................................................ 35 9.4. FEol ........................................................................................................................... 35 9.5. FHidro ....................................................................................................................... 36 9.6. FSol ........................................................................................................................... 37 9.7. FNuc .......................................................................................................................... 37 9.8. FSalir ......................................................................................................................... 37 9.9.FEventos .................................................................................................................... 38 9.10. FEventosImagenes .................................................................................................. 39 9.11. FEventosResp ......................................................................................................... 42 9.12. FInfo1 ...................................................................................................................... 44 9.13. Finfo2 ...................................................................................................................... 44 9.14. Final ........................................................................................................................ 45 10.Interfaz Gráfica ............................................................................................................... 46 10.1 . FInicio ................................................................................................................. 47 10.2. FSalir ................................................................................................................. 47 10.3. FInfo1 ................................................................................................................ 48 10.4. Finfo2 ................................................................................................................ 49 10.5. Form1 ................................................................................................................ 50 10.6. FCicle ............................................................................................................... 51 2 1.Índice 10.7. FEol ................................................................................................................... 52 10.8. FHidro .............................................................................................................. 53 10.9. FNuc .................................................................................................................. 54 10.10. FSol ................................................................................................................... 55 10.11. FEventos ............................................................................................................ 56 10.12. FeventosResp .................................................................................................... 56 10.13. FEventosImagenes ............................................................................................ 57 10.14. Final ................................................................................................................... 57 11. Modelo Matemático.................................................................................................. 58 11.1. Energia Consumida Programada............................................................................. 58 11.2. Cuotas de Generación ............................................................................................. 59 11.3. Generación Eólica ................................................................................................... 62 11.4. Velocidad del Viento .............................................................................................. 64 11.5. Generación Solar..................................................................................................... 67 11.6. Generación Hidráulica ............................................................................................ 70 11.7. Generación Nuclear ................................................................................................ 71 11.8. Generación Térmica ................................................................................................ 72 11.9. Funciones didacticas ............................................................................................... 72 11.10. Excepción.............................................................................................................. 75 11.11. Conclusiones ......................................................................................................... 76 12. Conclusiones............................................................................................................. 77 13. Bibliografía ............................................................................................................... 78 3 2. Introducción 2. Introducción En el presente trabajo de final de grado se detalla la creación de una aplicación informática, similar a un juego interactivo, para fomentar el interés de personas ajenas al mundo universitario en el área de la ingeniería eléctrica. Dedicado sobre todo a estudiantes de ESO, primaria o bachillerato que suelen asistir a jornadas de puertas abiertas o visitas de la universidad, ayudándoles a enfocar su trayectoria hacia la ingeniería eléctrica y mostrándoles algunos de los conocimientos que podrían adquirir. Se ha tomado como punto de partida un programa anterior, de la misma índole, con el objetivo de corregir las deficiencias que se observaron y mejorar el rendimiento global y la parte visual de la aplicación, así como hacerlo más dinámico y entretenido. 4 3. Antecedentes 3. Antecedentes Durante el curso 2014 – 2015 se me otorgó una beca de colaboración para dar soporte a proyectos de innovación docente del Instituto de Ciencias de la Educación, con una jornada laboral de 15 horas semanales, durante 6 meses. Durante ese tiempo se creó un programa basado en el lenguaje LabView que, a diferencia de los lenguajes tradicionales, presenta una programación gráfica. Además, se complementa con una tarjeta de adquisición para que el equipo pueda comunicarse con el mundo externo. Tras crear el programa, se puso a prueba con alumnos de educación primaria, secundaria y bachillerato, con la intención de detectar los posibles errores y las mejoras pertinentes. LabView presentaba restricciones severas, ya que, para poder ejecutar el programa se necesitaba instalar en el ordenador programas propios de LabView, no reajustaba el apartado gráfico a las diferentes resoluciones de pantalla y no disponía de documentación de soporte, ya sea impresa o digital, para consultar en caso de dudas sobre el lenguaje. A partir de toda la experiencia anterior, se decidió cambiar el lenguaje de programación a uno con mayor accesibilidad para los usuarios, y definir unos objetivos basados en la experiencia anterior (Descritos en el apartado 4. Objetivos). 5 4. Objetivos 4. Objetivos Llegados a este punto, se marcan los siguientes objetivos: Hacer el programa más interactivo Utilizar un lenguaje más accesible para los usuarios Implementar diferentes niveles de dificultad Adaptarse a diferentes resoluciones de pantalla No infringir derechos de imágenes Continuar con la divulgación de la ingeniería eléctrica 6 5. Comparativa de Posibles Soluciones 5. Comparativa de Posibles Soluciones En el siguiente apartado se comparan las diferentes soluciones que existen para cumplir los objetivos del apartado 4. 5.1. LabView LabVIEW (acrónimo de Laboratory Virtual Instrumentation Engineering Workbench) es una plataforma y entorno de desarrollo para diseñar sistemas, con un lenguaje de programación visual gráfico. Recomendado para sistemas de hardware y software de pruebas, control y diseño, ya que se complementa con una tarjeta de adquisición, conectada a los puertos del ordenador, permitiendo adquirir datos del exterior. El lenguaje que usa se llama lenguaje G, donde la G simboliza lenguaje Gráfico. Este programa fue creado por National Instruments (1976) para funcionar sobre máquinas MAC. Ahora está disponible para las plataformas Windows, UNIX, MAC y GNU/Linux. Su principal característica es la facilidad de uso, válido para programadores profesionales como para personas con pocos conocimientos en programación pueden hacer programas relativamente complejos. También es muy rápido hacer programas con LabVIEW y cualquier programador, por experimentado que sea, puede beneficiarse de él. Los programas en LabView son llamados instrumentos virtuales (VIs). El lenguaje G tiene una gran potencia de cálculo, típica de lenguajes orientados a operaciones matemáticas. Sin embargo el aspecto gráfico queda de un tono un tanto desfasado, en comparación con las posibilidades gráficas de otros lenguajes. En la figura 5.1.1. se puede ver un ejemplo del entorno gráfico de LabView. Figura 5.1.1. Entorno gráfico de LabView 7 5. Comparativa de Posibles Soluciones A demás este lenguaje necesita de un programa que lo interprete para poder ser ejecutado. Es decir, que el usuario tendría que descargar software de LabView, e instalarlo en el ordenador para poder ejecutar el programa. 5.2. C# C# (pronunciado si sharp en inglés) es un lenguaje de programación orientado a objetos desarrollado y estandarizado por Microsoft como parte de su plataforma .NET. C# es uno de los lenguajes de programación diseñados para la infraestructura de lenguaje común. Su sintaxis básica deriva de C/C++ y utiliza el modelo de objetos de la plataforma .NET, similar al de Java, aunque incluye mejoras derivadas de otros lenguajes. El nombre C Sharp fue inspirado por la notación musical, donde '#' (sostenido, en inglés sharp) indica que la nota (C es la nota do en inglés) es un semitono más alta, sugiriendo que C# es superior a C/C++. Además, el signo '#' se compone de cuatro signos '+' pegados. Aunque C# forma parte de la plataforma .NET, ésta es una API, mientras que C# es un lenguaje de programación independiente diseñado para generar programas sobre dicha plataforma. Ya existe un compilador implementado que provee el marco Mono - DotGNU, el cual genera programas para distintas plataformas como Windows, Unix, Android, iOS, Windows Phone, Mac OS y GNU/Linux. Este lenguaje esta principalmente orientado a objetos, con una potente capacidad gráfica, además de tener un amplio repositorio de información por parte de Microsoft y muchos libros para tomar referencia del lenguaje. Como puntos en contra destaca la necesidad de una buena base de programación y conocimientos de programación a objetos. 5.3.Visual Basic Visual Basic es un lenguaje de programación dirigido por eventos, desarrollado por Alan Cooper para Microsoft. Este lenguaje de programación es un dialecto de BASIC, con importantes agregados. Su primera versión fue presentada en 1991, con la intención de simplificar la programación utilizando un ambiente de desarrollo que facilitó en cierta medida la programación misma. 8 5. Comparativa de Posibles Soluciones Aunque Visual Basic es de propósito general, también provee facilidades para el desarrollo de aplicaciones de bases de datos usando Data Access Objects, Remote Data Objects o ActiveX Data Objects. Visual Basic contiene un entorno de desarrollo integrado o IDE que integra editor de textos para edición del código fuente, un depurador, un compilador (y enlazador) y un editor de interfaces gráficas o GUI. Visual Basic suele ser un lenguaje muy común en las escuelas de ingeniería, ya que resulta muy accesible para los usuarios con pocos conocimientos de programación, y permite crear interfaces gráficas con mucha rapidez. Además permite crear ejecutables para programas con sistema operativo Windows, que es uno de los más populares del mercado. 5.4. Conclusiones Tras todo lo anterior mostrado, se decidió elegir Visual Basic como lenguaje de programación por las siguientes razones: Fácil programación Riqueza de recursos gráficos Fácil implementación con Windows 9 6. Comparativa con Otras Aplicaciones 6. Comparativa con Otras Aplicaciones La idea de promocionar la ingeniería eléctrica no es nueva, ya que, en la red podemos encontrar diferentes programas o juegos que promueven el uso de las energías renovables con la intención de inculcar buenos hábitos al público infantil. A continuación se muestran algunos ejemplos: 6.1. WWF Switch’em off En este juego de la World Wildlife Fund, se debe desconectar las centrales contaminantes que van apareciendo a lo largo de las pantallas. Si se tarda mucho en desconectarlas, la contaminación del aire provocará que se pierda el juego. Ver figura 6.1. Figura 6.1. Juego WWF Switch’em off Pese a ser un juego entretenido, resulta injusto para las centrales térmicas, ya que las centrales de ciclo combinado pueden tener una elevada eficiencia. Además, en vez de enfatizar el uso de energía renovable la intención acaba siendo evitar el uso de energía contaminante. 6.2.CLMNTK Este juego de la asociación gallega Climantica es uno de los más completos. Se trata de construir una ciudad y tomar decisiones que la conduzcan a un crecimiento sostenible. A 10 6. Comparativa con Otras Aplicaciones lo largo del juego aparecen preguntas que comportaran un beneficio o una penalización. El único inconveniente del juego es su duración y complejidad, ya que pueden ser excesivas para algunos usuarios. Ver Figura 6.2. Figura 6.2. Juego CLMNTK 6.3. Iberdrola Sustainability Game Este juego de la compañía de energía eléctrica Iberdrola se asemeja a un juego de mesa tipo Trivial, en el que las casillas contienen preguntas, que al ser respondidas correctamente suman puntos al usuario, como se ve en la Figura 6.3. Las preguntas pueden tratar sobre: consejos para ahorrar factura eléctrica, preguntas sobre la energía eólica, cambio climático o información de las acciones que Iberdrola lleva a cabo a nivel mundial. Es un juego online y además tiene dos niveles de dificultad, uno para niños y otro para adultos, pudiendo jugar a la vez varias personas de una familia. 11 6. Comparativa con Otras Aplicaciones Figura 6.3. Juego Iberdrola Sustainability Game 6.4.ElectroCity Este juego en inglés se basa en crear una ciudad y aprovechar los recursos naturales, decidiendo entre respetar el medio ambiente o generar energía eléctrica a bajo coste. El desarrollo del juego es lento, pero posee un alto contenido educativo. Ver Figura 6.4. Figura 6.4. Juego ElectroCity 6.5. REE Controla tu energía Juego de Red Eléctrica de España que consiste en igualar la generación de energía eléctrica a la energía demandada a través de las diferentes centrales, como se ve en la Figura 6.5. Van sucediendo diferentes eventos como: líneas que fallan por robos o fenómenos meteorológicos, paradas de la central nuclear, países como Portugal, Marruecos o Francia 12 6. Comparativa con Otras Aplicaciones que necesitan energía. En mi opinión es un juego entretenido pero puede resultar difícil de seguir. Figura 6.5. Juego REE controla tu energia 13 7. Introducción a Visual Basic 7. Introducción a Visual Basic En este punto, se detallan las características propias del lenguaje de programación Visual Basic. No se especifica en detalle el funcionamiento de las características de código, ya que es recomendable que el lector posea ciertas bases en programación, como conocimiento de variables, asignaciones de valores o el uso de funciones. 7.1.Plataforma de Desarrollo La plataforma de desarrollo que se utilizó para este proyecto fue la aplicación de Microsoft Visual Studio 2015, que es gratuita para usuarios con cuenta Microsoft. En la figura 7.2.1. y 7.2.2. se puede ver el aspecto visual de Microsoft Visual Studio 2015. En el área de trabajo podemos destacar, a parte de las barras superiores de herramientas, cuatro secciones principales: la sección denominada Toolbox, la ventana nombrada Form [Design], que es la interfaz visual, la sección de Propierties y la ventana nombrada Form, que se corresponde con la ventana de código. Figura 7.2.1. Microsoft Visual Studio 2015 14 7. Introducción a Visual Basic Figura 7.2.2. Microsoft Visual Studio 2015 7.1.1. Toolbox Esta parte de la interfaz nos permite seleccionar los controles que podemos incluir en nuestra ventana, como pueden ser botones, imágenes o texto. Si el lector es usuario habitual del sistema operativo de Windows, podrá observar que todos estos controles son los más habituales de las ventanas de este sistema. Con simplemente arrastrar un control hasta el formulario, este se situara donde deseemos, y se incluirá en el código automáticamente, sin tener que escribir en código todo su funcionamiento. 7.1.2. Formulario Formulario (abreviado a Form) es como se denomina en Visual Basic a las ventanas que el usuario ve en un sistema Windows. Con lo cual el programador, puede ver en todo momento el resultado visual del programa, sin tener que ejecutar una y otra vez el programa. 7.1.3. Properties Esta pestaña permite al programador cambiar cualquier parámetro del Form o los controles incluidos en el Form. 15 7. Introducción a Visual Basic Desde la posición, si es visible o no para el usuario, tamaño, color y un número de propiedades aun mayor, el programador puede personalizar, con un número infinito de posibilidades, el aspecto del programa. 7.1.4. Código Cada Form tiene asociada una ventana de código, donde se puede generar eventos. Por ejemplo, si un Form tiene un botón, en la ventana de código podremos escribir, cuales son las acciones que el programa generará cuando el usuario haga un doble clic sobre el mismo. Esta es la ventana que el usuario final no podrá ver y que solo se usa durante la fase de programación. 7.2. Controles Por tal de que el lector pueda interpretar bien el código se explicará cuales son cada uno de los controles que han sido utilizados en el desarrollo del programa. En la imagen 7.3.1. mostrada al final de este punto, se puede observar el aspecto visual de cada uno de los controles, mostrados de izquierda a derecha en el mismo orden que son enumerados. El control Timer no tiene una interfaz visual, ya que es un cálculo del programa, por tanto no saldrá en la imagen nombrada. 7.2.1. Button El control Button permite al usuario hacer clic en él para llevar a cabo una acción. El control Button puede mostrar texto e imágenes. Al hacer clic en el botón, parece como si se hubiera presionado y soltado. 7.2.2. CheckBox El control CheckBox indica si una condición determinada está activada o desactivada. Normalmente se utiliza para presentar una selección Sí/No o Verdadero/Falso al usuario. Se puede utilizar de controles de casilla en grupos para mostrar múltiples opciones de entre las que el usuario puede seleccionar una o más. Es similar al control RadioButton, pero se puede seleccionar cualquier número de controles CheckBox agrupados. 7.2.3. Label Los controles Label de formularios se utilizan para mostrar texto o imágenes que el usuario no puede editar. Se utilizan para identificar objetos en un formulario; por ejemplo, 16 7. Introducción a Visual Basic para proporcionar una descripción de lo que hará cierto control si se hace clic en él o para mostrar información en respuesta a un evento o proceso en tiempo de ejecución de la aplicación. Dado que el control Label no puede recibir el foco, puede utilizarse también para crear teclas de acceso para otros controles. 7.2.4. PictureBox Representa un control de cuadro de imagen de Windows para mostrar una imagen. 7.2.5. ProgressBar Representa un control de barra de progreso de Windows, simulando procesos de carga de datos. 7.2.6. TableLayoutPanel Representa un panel que dispone dinámicamente su contenido en una cuadrícula que se compone de filas y columnas y permite ajustar la distancia entre ellas, permitiendo mantener una relación de aspecto entre los controles. Solo es visible durante la programación. 7.2.7. Timer Genera un evento después de un intervalo establecido, con la opción de generar eventos recurrentes. 7.2.8. TrackBar El control TrackBar (también denominado en ocasiones control "deslizante") se utiliza para navegar por grandes volúmenes de información o para ajustar visualmente una configuración numérica. El control TrackBar tiene dos partes: el control de posición, también conocido como control deslizante, y las marcas de paso. El control de posición es la parte que puede ajustarse. Su posición corresponde a la propiedad Value. Las marcas de paso son indicadores visuales espaciados a intervalos regulares. La barra de seguimiento se desplaza en los incrementos que se especifiquen y puede alinearse horizontal o verticalmente. Un ejemplo del uso de una barra de seguimiento sería el establecimiento de la velocidad de intermitencia del cursor o de la velocidad del mouse. 17 7. Introducción a Visual Basic Figura 7.3.1. Controles de Form 18 8. Índice de Programación 8. Índice de Programación Debido al alto número de variables del programa, puede resultar un tanto confuso, encontrar qué variable tiene determinada función, por tanto, en este punto se enumerarán todas las variables del programa y los controles con nombres específicos, ordenados alfabéticamente en la Tabla 8.1. Nombre Función AumentoEolica Aumento del tanto por ciento de energía Eólica. AumentoSolar Aumento del tanto por ciento de energía solar. AuxEol Variable global, que se utiliza como variable de apoyo en el proceso de cálculo de la velocidad del viento. AuxHidro Variable global, que se utiliza como variable de apoyo en el proceso de vaciado de la presa. Capacidad Variable global que indica el tanto por ciento de llenado de la presa hidráulica. Clima Variable global que se utiliza para calcular cual es el clima a mostrar (soleado o nubes). EnergiaAbs Variable global que indica cual es la energía absorbida, y que por tanto es la que el usuario tiene que generar. EnergiaBase Energía base siempre presente. Facil Variable que indica si el usuario a elegido la versión fácil. FCicle Form perteneciente al ciclo combinado. FEol Form perteneciente a la energía eólica. FEventos Form que se utiliza para mostrar preguntas y eventos al usuario. FHidro Form perteneciente a la energía hidroeléctrica. FInfo Form perteneciente a la información inicial para el usuario. FInicio Pantalla de carga inicial del programa. FNuc Form perteneciente a la energía nuclear. Form1 Form principal. Es la pantalla principal del juego. FSalir Form que se muestra al salir, por tal de asegurar de que el usuario realmente quiere salir. FSol Form que pertenece a la energía solar generada. GraficAbs(5) Guarda la energía absorbida. 19 8. Índice de Programación GraficEnergia(5) Guarda la energía producida. GraficHores(5) Guarda las horas para mostrarlas por un gráfico. Hora Variable global que indica la hora a mostrar en el reloj. HoraSiguiente La hora a la que se comprobara la energía. LluviaTim Para determinar si había lluvia al parar un timer. Minutos Variable global que indica que minutos mostrar en el reloj. Noche Variable global que indica si es o no de noche. NumPregunta Para determinar en qué número de pregunta nos encontramos. PBNuc Variable global que indica el valor de posición del ProgresBar de FNuc. PreguntasActivas Variable para determinar si se ha activado una pregunta. Probabilidad Para calcular la probabilidad de Velocidad de viento. ReduccionConsumo Reducción del consumo de energía. RepNucTim Para determinar si estábamos reparando al parar un timer. RespCorrecta Para determinar qué respuesta es la correcta. TBCicle Variable global que indica el valor de posición del TrackBar de FCicle. TBEol Variable global que indica el valor de posición del TrackBar de FEol. TBHidro Variable global que indica el valor de posición del TrackBar de FHidro. TBSol Variable global que indica el valor de posición del TrackBar de FSol UltimaHora Variable global que indica se utiliza para guardar la última hora del reloj, y poder hacer cálculos de comparación. VCicle Variable global que indica el valor de energía generada en el ciclo combinado. VEol Variable global que indica el valor de energía eólica generada. VHidro Variable global que indica el valor de energía hidroeléctrica generada. Viento Variable global que se utiliza para calcular cual es la velocidad del viento. VNuc Variable global que indica el valor de energía nuclear generada. 20 8. Índice de Programación VSol Variable global que indica el valor de energía solar generada. VTotal Variable global que indica el valor de toda la energía generada. Vuelta Para saber cuántas veces se ha pasado por la hora de revisión. Tabla 8.1. Índice de programación. 21 9. Código 9. Código En este apartado se muestra todo el código que forma la aplicación desarrollada. Se dividirá por los diferentes forms a los que pertenece. Recuérdese que las líneas que empiezan con el símbolo del apostrofe ( ‘ ) son anotaciones que solo sirven para aclarar información, y no son leídas por el compilador. Se ha seguido el mismo código de color que se utiliza en el programa Visual Studio, para facilitar su comprensión. 9.1. Form 1 10. Imports System.Threading 'Necesario para ejecutar programas en paralelo 11. 12. Module Variables 13. '///////////Variables de los valores de generacion///////// 14. Public VSol As Integer 'Variable global indica Valor energia generada por Sol 15. Public VEol As Integer 'Variable global indica Valor energia generada por Eol 16. Public VHidro As Integer 17. Public VCicle As Integer 18. Public VNuc As Integer 19. Public VTotal As Double 'Variable global que indica el valor de totes les energies 20. '/////Variables para guardar datos de los controles//////// 21. 'Para que el valor del trackbar no fuese 0 cada vez que se llama a un nuevo form, se definen 22. 'las variables TBXXXX, para almacenar el ultimo valor del TB. 23. Public TBSol As Integer 'Variable global indica Valor del trackbar de Sol 24. Public TBEol As Integer 'Variable global indica Valor del trackbar de Eol 25. Public TBHidro As Integer 26. Public TBCicle As Integer 27. Public PBNuc As Integer 'Variable que guarda el valor del progres bar nuc 28. Public Capacidad As Integer 'Variable global que indica el valor de llenado de la presa 29. Public NumPregunta As Integer ' Marca que pregunta se mostrará 30. Public RespCorrecta As String 'Indica si la respuesta es correcta o incorrecta 31. Public GraficHores(5) As Integer 'Guarda las horas para mostrarlas por un grafico 32. Public GraficEnergia(5) As Integer 'Guarda la energia producida 33. Public GraficAbs(5) As Integer 'Guarda la energia absorvida 34. Public Vuelta As Integer 'Para saber cuantas veces se ha pasado por la hora de revision 35. Public Hora As Integer 'hora actual 36. Public Minutos As Integer 'Minutos actuales 37. Public EnergiaAbs As Integer 'variable que indica la energia programada 38. Public Facil As Boolean 'Variable que indica si el usuario a elegido la versión fácil 39. Public EmpezadoCicle As Boolean 'Para saber si hemos mostrado ya un mensaje 40. Public Contaminacion As Integer 'Valor de la contaminacion 41. '////////Variables de procesos internos aleatorios ///// 22 9. Código 42. Public Clima As Integer 'Variable global que indica el clima que debemos mostrar 43. Public Estado As Boolean 'Variable global que indica si una funcion esta activa o desactivada 44. Public Viento As Integer 'Variable que indica el viento que hace 45. Public Probabilidad As Integer 'Para calcular la probabilidad de Velocidad de viento 46. Public AuxEol As Integer 'Variable que ayuda al calculo de saturacion del viento 47. Public Noche As Boolean 'Para determinar si la hora corresponde a la noche 48. Public HoraSiguiente As Integer 'La hora a la que se comprovara la energia 49. Public LluviaTim As Boolean 'Para determinar si habia lluvia al parar un timer 50. Public RepNucTim As Boolean 'Para determinar si estabamos reparando al parar un timer 51. '////Variables de proceso en paralelo///////// 52. Public Prueba As Thread 'Variable que permite el subproceso 53. Public AuxHidro As Integer 'Variable para ayudar a la reduccion de la presa 54. Public PreguntasActivas As Boolean ' Variable para determinar si se ha activado una pregunta 55. '//////Variables de las respuestas a las preguntas///// 56. Public ReduccionConsumo As Integer 'Reduccion del consumo de energia 57. Public EnergiaBase As Integer 'Energia base siempre presente 58. Public AumentoSolar As Integer 'Aumento del tanto porciento de energia solar 59. Public AumentoEolica As Integer 'Aumento del tanto porciento de energia Eolica 60. End Module 61. 62. Public Class Form1 63. '///Definicion de variables iniciales///// 64. Dim RespCorrecta = "Incorrecte" 65. Dim Capacidad = 93 66. Dim PBNuc = 100 67. Dim Minutos = 0 68. Dim VNuc = 4050 'Energia nuclear a máximo rendimiento 69. Dim Vuelta = 0 70. Dim EmpezadoCicle = False 71. '/////Variables propias de esta funcion///// 72. Private Aux As Boolean 73. Private LastClim As Integer 74. Private CallVAlertaCap = False 'Variable que define si hemos llamado o no a ValertaCAp 75. 'para no repetir el mensaje varias veces 76. Public Sub ThreadTask() 'Método que permite ir actualizando el valor de la capacidad de la presa 77. Control.CheckForIllegalCrossThreadCalls = False 'Orden por tal de que se puede cambiar los labels desde un subproceso 78. Estado = True 'Indicamos que la funcion esta activa 79. Do 80. If Capacidad <= 10 Then 'Mostramos un mensaje si la capacidad disminuye demasiado 81. VAlertaCap() 82. Else 83. Capacidad = Capacidad - AuxHidro 'Vamos restando valor a la capacidad con auxhidro, que es 0 en caso de 84. 'que no haya empezado el programa 85. ContPresa.Text = Capacidad & " %" 'Actualizamos los labels con cada vuelta 23 9. Código 86. 87. 88. 89. FHidro.ContPresa.Text = Capacidad & " %" RefCapacidad() If Facil Then Thread.Sleep(3000 - VHidro / 13) 'En funcion de lo que generen se reduce mas rapido 90. Else 91. Thread.Sleep(3000 - VHidro / 9) 'Esperamos 2 segundos entre vueltas 92. End If 93. 94. End If 95. Loop 96. End Sub 97. Sub RefCapacidad() 'Para refrescar la imagen de la capacidad de la presa 98. If Capacidad > 90 Then 99. PBCapacidad.Image = ControlE.My.Resources.Resources.Capacidad100 100. ElseIf Capacidad > 80 Then 101. PBCapacidad.Image = ControlE.My.Resources.Resources.Capacidad90 102. ElseIf Capacidad > 70 Then 103. PBCapacidad.Image = ControlE.My.Resources.Resources.Capacidad80 104. ElseIf Capacidad > 60 Then 105. PBCapacidad.Image = ControlE.My.Resources.Resources.Capacidad70 106. ElseIf Capacidad > 50 Then 107. PBCapacidad.Image = ControlE.My.Resources.Resources.Capacidad60 108. ElseIf Capacidad > 40 Then 109. PBCapacidad.Image = ControlE.My.Resources.Resources.Capacidad50 110. ElseIf Capacidad > 30 Then 111. PBCapacidad.Image = ControlE.My.Resources.Resources.Capacidad40 112. ElseIf Capacidad > 21 Then 113. PBCapacidad.Image = ControlE.My.Resources.Resources.Capacidad30 114. Else 115. PBCapacidad.Image = ControlE.My.Resources.Resources.Capacidad20 116. End If 117. End Sub 118. Public Sub SecuenciaInicial() 119. '///////////Parte de eólica///////// 120. VViento() 'Viento aleatorio 121. LabelVViento.Text = "Velocitat vent: " & Int(Viento) & " m/s" 122. FEol.ComprovarMaximo() 'Comprobamos la saturación 123. VEol = TBEol * 0.0074 * AuxEol ^ 3 'Calculamos la generación 124. '////////////Parte del reloj///////////// 125. Randomize() 'Para números realmente aleatorios 126. Hora = Int(Rnd() * 24) 'Numero aleatorio entre 0 y 24 127. If Hora = 24 Then 'Las 24 horas son las 00 128. Hora = 0 129. End If 130. LabelHora.Text = "Actual: " & Hora & ":00" 131. '////////////Parte climatica//////////// 132. Climatologia() 'Clima (sol) aleatorio 133. '///////////Parte de consumo//////////// 134. BaseDatos() 'Marcamos la energia a consumir 135. ContECons.Text = EnergiaAbs & " kWh" 136. '///////////Escribimos la hora de revision////////// 137. If Hora = 20 Then 24 9. Código 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. preguntas 151. 152. 153. 154. 155. 156. 157. 158. End 159. Sub energia 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. End 172. Sub 173. 174. variable Clima 175. 176. día 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. HoraSiguiente = 0 ElseIf Hora = 21 Then HoraSiguiente = 1 ElseIf Hora = 22 Then HoraSiguiente = 2 ElseIf Hora = 23 Then HoraSiguiente = 3 Else HoraSiguiente = Hora + 4 End If LabelHoraSeg.Text = "Revisió: " & HoraSiguiente & ":00" '//////////Iniciamos las preguntas///////////////// TimerEventos.Start() 'Iniciamos el temporizador de '///////Dificultad/////////////////// If Facil Then TimerNuc.Interval = 2000 Else TimerNuc.Interval = 1700 End If Sub Refrescar() 'Funcion que permite refrescar el valor total de VTotal = VSol + VEol + VHidro + VNuc + VCicle + EnergiaBase ContEGenSol.Text = VSol ContEGenEol.Text = VEol ContEGenNuc.Text = VNuc ContEGenCicle.Text = VCicle ContEGenTot.Text = VTotal & " kWh" FCicle.ContEGenTot.Text = VTotal & " kWh" FEol.ContEGenTot.Text = VTotal & " kWh" FHidro.ContEGenTot.Text = VTotal & " kWh" FNuc.ContEGenTot.Text = VTotal & " kWh" FSol.ContEGenTot.Text = VTotal & " kWh" Sub Climatologia() 'Funcion que permite dar un clima aleatorio Randomize() Clima = Rnd() * 100 'Le damos un valor aleatorio a la 'Según el valor aleatorio distinguimos entre dos situaciones If Hora >= 21 Or Hora < 7 Then 'Segun la hora sera de noche o Noche = True Else Noche = False End If If Noche Then LabelNubes.Visible = False PBClima.Image = ControlE.My.Resources.Resources.Noche TBSol = 0 VSol = 0 Refrescar() ContEGenSol.ForeColor = Color.Red LastClim = Clima Timerlluvia.Stop() ElseIf Clima < 77 Then 'Probabilidad de sol 77% ContEGenSol.ForeColor = Color.White PBClima.Image = ControlE.My.Resources.Resources.Sol LabelNubes.Visible = False If LastClim >= 77 Then 'Si el anterior clima fue nubes 25 9. Código 195. TBSol = TBSol + TBSol * 42.874 / 100 'Actualizamos el valor automaticamente 196. VSol = VSol + VSol * 42.874 / 100 197. Timerlluvia.Stop() 'Detenemos la lluvia 198. If VSol > 3150 Then 'Para evitar valores superiores al máximo 199. VSol = 3150 200. TBSol = 3150 201. End If 202. Refrescar() 203. End If 204. LastClim = Clima 205. Else 'Evento Nubes 206. ContEGenSol.ForeColor = Color.White 207. PBClima.Image = ControlE.My.Resources.Resources.nubes 208. If LastClim < 77 Then 'Si el anterior clima fue sol 209. TBSol = TBSol - TBSol * 30 / 100 210. VSol = VSol - VSol * 30 / 100 211. Refrescar() 212. End If 213. LabelNubes.Visible = True 'Mostramos informacion de que se ha reducido VSol 214. LastClim = Clima 215. Timerlluvia.Start() 'La lluvia rellena la presa 216. End If 217. 218. End Sub 219. Sub Climatologia_Sub() 'Para la subform 220. If Noche Then 221. FSol.PBClima.Image = ControlE.My.Resources.Resources.Noche 222. FSol.TrackBarSol.Enabled = False 223. FSol.LabelBloq.Visible = True 224. ElseIf Clima < 77 Then 'Clima con Sol 225. FSol.PBClima.Image = ControlE.My.Resources.Resources.Sol 226. FSol.TrackBarSol.Maximum = 3150 227. FSol.TrackBarSol.Enabled = True 228. FSol.LabelBloq.Visible = False 229. Else 'Clima con nubes 230. FSol.PBClima.Image = ControlE.My.Resources.Resources.nubes 231. FSol.TrackBarSol.Maximum = 2205 232. FSol.TrackBarSol.Enabled = True 233. FSol.LabelBloq.Visible = False 234. End If 235. End Sub 236. Sub RandomViento() 237. Randomize() 'Para que los numeros no sean los mismos cada vez que se inicia el programa 238. 'Sumaremos todas las probabilidades para que salga un numero 239. 'Probabilidad = (Rnd() * 1.1) + (Rnd() * 1.3) + (Rnd() * 2.4) + (Rnd() * 4.05) + (Rnd() * 5.2) + (Rnd() * 5.7) + (Rnd() * 6.2) + (Rnd() * 6.3) + (Rnd() * 6.2) + (Rnd() * 6.15) + (Rnd() * 6.25) + (Rnd() * 5.9) + (Rnd() * 5.5) + (Rnd() * 5.1) + (Rnd() * 4.5) + (Rnd() * 4.4) + (Rnd() * 3.9) + (Rnd() * 3.4) + (Rnd() * 2.8) + (Rnd() * 2.4) + (Rnd() * 1.7) + (Rnd() * 1.3) + (Rnd() * 1.2) + (Rnd() * 0.95) + (Rnd() * 0.7) + (Rnd() * 0.7) + (Rnd() * 0.5) + (Rnd() * 0.6) + (Rnd() * 0.5) + (Rnd() * 0.4) + (Rnd() * 0.4) + (Rnd() * 0.35) + (Rnd() * 0.3) + (Rnd() * 0.3) + (Rnd() * 0.3) + (Rnd() * 0.2) + (Rnd() * 0.2) + (Rnd() * 0.15) + (Rnd() * 0.01) + (Rnd() * 0.01) + (Rnd() * 0.075) + (Rnd() * 0.05) + (Rnd() * 0.05) + (Rnd() * 0.03) + (Rnd() * 0.03) + (Rnd() * 0.02) + (Rnd() * 0.01) + (Rnd() * 0.01) + (Rnd() * 0.005) + (Rnd() * 0.005) + (Rnd() * 0.005) + (Rnd() * 0.005) + (Rnd() * 0.005) 240. Probabilidad = (Rnd() * 100) 26 9. Código 241. Select Case Probabilidad 'Segun la probabilidad habrá una velocidad de viento 242. Case > 97.6 243. Viento = 1 244. Case > 91.15 245. Viento = 2 246. Case > 80.25 247. Viento = 3 248. Case > 67.75 249. Viento = 4 250. Case > 55.4 251. Viento = 5 252. Case > 43.25 253. Viento = 6 254. Case > 32.65 255. Viento = 7 256. Case > 23.75 257. Viento = 8 258. Case > 16.45 259. Viento = 9 260. Case > 11.25 261. Viento = 10 262. Case > 8.25 263. Viento = 11 264. Case > 6.1 265. Viento = 12 266. Case > 4.7 267. Viento = 13 268. Case > 3.6 269. Viento = 14 270. Case > 2.7 271. Viento = 15 272. Case > 1.95 273. Viento = 16 274. Case > 1.35 275. Viento = 17 276. Case > 0.85 277. Viento = 18 278. Case > 0.5 279. Viento = 19 280. Case > 0.3 281. Viento = 20 282. Case > 0.175 283. Viento = 21 284. Case > 0.095 285. Viento = 22 286. Case > 0.045 287. Viento = 23 288. Case > 0.025 289. Viento = 24 290. Case > 0.015 291. Viento = 25 292. Case > 0.005 293. Viento = 26 294. Case > 0 295. Viento = 27 296. End Select 297. End Sub 298. Sub VViento() 'Funcion que permite dar un viento aleatorio 299. RandomViento() 300. 'Según el valor aleatorio distinguimos entre diferentes situaciones 27 9. Código 301. If Viento < 4 Then 'Con ningun viento 302. PBViento.Image = ControlE.My.Resources.Resources.Viento0 303. LabelViento.Text = "Vent insuficient!" 304. ContEGenEol.ForeColor = Color.Red 305. VEol = 0 306. TBEol = 0 307. Refrescar() 308. ElseIf Viento < 10 Then 'Con poco viento 309. PBViento.Image = ControlE.My.Resources.Resources.Viento40 310. LabelViento.Text = "" 311. ContEGenEol.ForeColor = Color.White 312. ElseIf Viento < 25 Then 'Con viento 313. PBViento.Image = ControlE.My.Resources.Resources.Viento75 314. LabelViento.Text = "" 315. ContEGenEol.ForeColor = Color.White 316. Else 'Con mucho viento 317. PBViento.Image = ControlE.My.Resources.Resources.Viento100 318. LabelViento.Text = "Hi ha massa vent!" 319. VEol = 0 320. TBEol = 0 321. Refrescar() 322. ContEGenEol.ForeColor = Color.Red 323. End If 324. End Sub 325. Sub VViento_Sub() 326. If Viento < 4 Then 'Con ningun viento 327. FEol.PBViento.Image = ControlE.My.Resources.Resources.Viento0 'Cambiamos el gif 328. FEol.LabelAvisoEol.Text = " Molins parats" 329. FEol.TrackBarEol.Enabled = False 330. ElseIf Viento < 10 Then 'Con poco viento 331. FEol.PBViento.Image = ControlE.My.Resources.Resources.Viento40 'Cambiamos el gif 332. FEol.LabelAvisoEol.Text = "" 333. ElseIf Viento < 25 Then 'Con viento 334. FEol.PBViento.Image = ControlE.My.Resources.Resources.Viento75 'Cambiamos el gif 335. FEol.LabelAvisoEol.Text = "" 336. Else 'Con mucho viento 337. FEol.PBViento.Image = ControlE.My.Resources.Resources.Viento100 'Cambiamos el gif 338. FEol.LabelAvisoEol.Text = "Molins parats per seguretat" 339. FEol.TrackBarEol.Enabled = False 340. End If 341. End Sub 342. Sub VAlertaCap() 'Funcion que muesta un mensaje de que se acaba la capacidad 343. If Not CallVAlertaCap Then 'Si no se ha mostrado el mensaje antes lo mostramos 344. 345. If MessageBox.Show("Alerta, has esgotat la capacitat de la presa, ja no podras utilitzar la energia hidràulica!", "Alerta", 346. MessageBoxButtons.OK, 347. MessageBoxIcon.Exclamation) = DialogResult.OK Then 'Si pulsan ok entonces: 348. VHidro = 0 'La energia generada por Hidro es 0 349. CallVAlertaCap = True 'Indicamos que hemos ya hemos mostrado el mensaje 350. Refrescar() 351. ContEGenHidro.Text = VHidro 352. Prueba.Abort() 'paramos la ejecucion en paralelo 353. End If 28 9. Código 354. 355. End If 356. End Sub 357. Private Sub BEol_Click(sender As Object, e As EventArgs) Handles BEol.Click 358. 'Para evitar que cada vez que sellame a FEol, su label que indica el valor de energia 359. 'sea 0, se indica que LabelEol tome el ultimo valor del Valor de energia (VEol) 360. FEol.LabelEol.Text = VEol & " kWh" 361. FEol.TrackBarEol.Value = TBEol 'Cargamos el último valor del trackbar de FEol 362. FEol.LabelVViento.Text = Int(Viento) & " m/s" 363. VViento_Sub() 364. FEol.Show() 'Invocamos a FEol 365. End Sub 366. Private Sub BSolar_Click(sender As Object, e As EventArgs) Handles BSolar.Click 367. 'Para evitar que cada vez que sellame a FSol su label que indica el valor de energia 368. 'sea 0, se indica que LabelSol tome el ultimo valor del Valor de energia (VSol) 369. FSol.LabelSol.Text = VSol & " kWh" 370. FSol.TrackBarSol.Value = TBSol 'Cargamos el último valor del trackbar de FSol 371. Climatologia_Sub() 372. FSol.Show() 'Invocamos a FSol 373. End Sub 374. Private Sub BNuc_Click(sender As Object, e As EventArgs) Handles BNuc.Click 375. FNuc.ProgressBar1.Value = PBNuc 376. FNuc.LabelNuc.Text = VNuc & "kWh" 377. FNuc.Label2.Text = PBNuc 378. FNuc.ProgressBar1.Value = PBNuc 379. FNuc.Show() 'Invocamos a FNuc 380. End Sub 381. Private Sub BHidro_Click(sender As Object, e As EventArgs) Handles BHidro.Click 382. FHidro.ContPresa.Text = Capacidad & " %" 'Actualizamos el valor de la capcidad de la presa 383. FHidro.TrackBarHidro.Value = TBHidro 'Mantenemos el valor del TrackBar 384. FHidro.LabelHidro.Text = VHidro & " kWh" 'Mantenemos el valor en el label 385. If Estado Then 'Para evitar problemas a la hora del primer inicio del programa, ya que estariamos parando algo ya parado 386. Prueba.Abort() 387. End If 388. If Capacidad <= 10 Then 389. FHidro.TrackBarHidro.Value = 0 'Ponemos todos los valores a 0 390. FHidro.LabelHidro.Text = 0 391. FHidro.TrackBarHidro.Enabled = False 'Bloqueamos el control por falta de capacidad 392. FHidro.LabelBloq.Visible = True 393. End If 394. FHidro.Show() 'Invocamos a FHidro 395. End Sub 396. Private Sub BCicle_Click(sender As Object, e As EventArgs) Handles BCicle.Click 397. FCicle.LabelCicle.Text = VCicle & " kWh" 29 9. Código 398. FCicle.TrackBarCicle.Value = TBCicle 'Cargamos el último valor del trackbar de FEol 399. FCicle.Show() 'Invocamos a FEol 400. End Sub 401. Private Sub TimerNuc_Tick(sender As Object, e As EventArgs) Handles TimerNuc.Tick 402. If Not Facil Then 'Desactivado para el nivel Facil 403. If ((PBNuc Mod 10) = 0) And PBNuc <> 100 Then 'Si vajamos un 10% el mantenimiento penalizamos 404. VNuc = VNuc - 150 405. End If 406. End If 407. Refrescar() 'Vamos actualizando los labels 408. PBNuc = PBNuc - 1 'Reducimos el mantenimiento 409. If FNuc.Enabled = True Then 'En caso de que este activa la form, actualizamos sus valores 410. FNuc.Label2.Text = PBNuc & "%" 411. FNuc.ProgressBar1.Value = PBNuc 412. End If 413. Labeldesgastnuc.Text = PBNuc & "%" 414. ProgressBarNuc.Value = PBNuc 415. If PBNuc = 10 Then 416. TimerNuc.Stop() 417. TimerNucRep.Start() 418. 419. MessageBox.Show("La central nuclear no pot continuar aixi!! L'estat t'obliga a fer el manteniment de la cental.", "Alerta", 420. MessageBoxButtons.OK, 421. MessageBoxIcon.Exclamation) 422. End If 423. End Sub 424. Private Sub TimerNucRep_Tick(sender As Object, e As EventArgs) Handles TimerNucRep.Tick 425. VNuc = 0 'En reparaciones no se genera 426. PBNuc = PBNuc + 1 'Aumentamos el valor de fiabilidad 427. ProgressBarNuc.Value = PBNuc 428. Refrescar() 429. Labeldesgastnuc.Text = PBNuc & "%" 430. RepNucTim = True 431. If FNuc.Enabled = True Then 432. FNuc.Label2.Text = PBNuc & "%" 433. FNuc.ProgressBar1.Value = PBNuc 434. FNuc.LabelNuc.Text = VNuc & " kWh" 435. End If 436. If PBNuc = 100 Then 437. TimerNuc.Start() 438. FNuc.LabelNuc.Text = 4050 & " kWh" 439. VNuc = 4050 440. TimerNucRep.Stop() 441. RepNucTim = False 442. End If 443. End Sub 444. Private Sub TimerHora_Tick(sender As Object, e As EventArgs) Handles TimerHora.Tick 445. Minutos = Minutos + 15 'Aumentamos 15 minutos el temporizador 446. If Minutos = 60 Then 'Si ha pasado una hora 447. Minutos = "0" & 0 'Para que se vea 00 en minutos 448. Hora = Hora + 1 'Aumentamos una hora 449. If Hora = 24 Then 450. Hora = 0 451. End If 452. End If 30 9. Código 453. LabelHora.Text = "Actual: " & Hora & ":" & Minutos 454. If (Hora = 7 Or Hora = 21) And Minutos = 0 Then 'Sies la hora de anochecer (21) o la del amanecer(7) 455. Climatologia() 456. End If 457. 'Ya han pasado las 4 horas, comprobamos: 458. If Hora = HoraSiguiente And Minutos = 0 Then 459. Comprobar() 460. GraficHores(Vuelta) = Hora 'Añadimos la hora 461. Vuelta = Vuelta + 1 462. End If 463. If Vuelta > 2 Then 464. TimerHora.Interval = 1875 'Aumentamos la velocidad 465. ElseIf Vuelta > 0 Then 466. TimerHora.Interval = 2815 'Aumentamos la velocidad del juego 467. End If 468. If Vuelta = 6 Then 'Ya hemos hecho todo el ciclo 469. Final.Show() 470. Me.Close() 471. If FHidro.Enabled Then 472. FHidro.Close() 473. End If 474. If FNuc.Enabled Then 475. FNuc.Close() 476. End If 477. If FSol.Enabled Then 478. FSol.Close() 479. End If 480. If FCicle.Enabled Then 481. FCicle.Close() 482. End If 483. End If 484. 485. End Sub 486. Public Sub BaseDatos() 'La energia absorvida para cada hora 487. Select Case HoraSiguiente 488. Case 0 489. EnergiaAbs = 31896 490. Case 1 491. EnergiaAbs = 28405 492. Case 2 493. EnergiaAbs = 26890 494. Case 3 495. EnergiaAbs = 25902 496. Case 4 497. EnergiaAbs = 25020 498. Case 5 499. EnergiaAbs = 24500 500. Case 6 501. EnergiaAbs = 25020 502. Case 7 503. EnergiaAbs = 26908 504. Case 8 505. EnergiaAbs = 28701 506. Case 9 507. EnergiaAbs = 29910 508. Case 10 509. EnergiaAbs = 32000 510. Case 11 511. EnergiaAbs = 34700 512. Case 12 31 9. Código 513. EnergiaAbs = 35631 514. Case 13 515. EnergiaAbs = 36082 516. Case 14 517. EnergiaAbs = 37152 518. Case 15 519. EnergiaAbs = 36290 520. Case 16 521. EnergiaAbs = 36286 522. Case 17 523. EnergiaAbs = 35900 524. Case 18 525. EnergiaAbs = 35480 526. Case 19 527. EnergiaAbs = 34800 528. Case 20 529. EnergiaAbs = 34100 530. Case 21 531. EnergiaAbs = 33684 532. Case 22 533. EnergiaAbs = 32800 534. Case 23 535. EnergiaAbs = 30820 536. End Select 537. EnergiaAbs = EnergiaAbs - (ReduccionConsumo / 100) * (EnergiaAbs) 538. GraficAbs(Vuelta) = EnergiaAbs 539. End Sub 540. Public Sub Comprobar() 541. '/////Comprobacion de energia total///////////// 542. Dim total As Integer 543. If Noche Then 544. If Viento > 25 Then 545. total = (FCicle.TrackBarCicle.Maximum) + (FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc) 546. ElseIf Viento > 12 Then 547. total = (FCicle.TrackBarCicle.Maximum) + (FEol.TrackBarEol.Maximum * 0.005 * AuxEol ^ 3 + (AumentoEolica / 100) * (FEol.TrackBarEol.Maximum * 0.0036 * AuxEol ^ 3)) + (FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc) 548. ElseIf Viento > 4 Then 549. total = (FCicle.TrackBarCicle.Maximum) + (FEol.TrackBarEol.Maximum * 0.0036 * AuxEol ^ 3 + (AumentoEolica / 100) * (FEol.TrackBarEol.Maximum * 0.0036 * AuxEol ^ 3)) + (FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc) 550. Else 551. total = (FCicle.TrackBarCicle.Maximum) + (FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc) 552. End If 553. Else 554. If Viento > 25 Then 555. total = (FCicle.TrackBarCicle.Maximum) + (FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc) 556. ElseIf Viento > 12 Then 557. total = (FCicle.TrackBarCicle.Maximum) + (FEol.TrackBarEol.Maximum * 0.005 * AuxEol ^ 3 + (AumentoEolica / 100) * (FEol.TrackBarEol.Maximum * 0.0036 * AuxEol ^ 3)) + (FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc) + (FSol.TrackBarSol.Maximum + (AumentoSolar / 100) * (FSol.TrackBarSol.Maximum)) 558. ElseIf Viento > 4 Then 559. total = (FCicle.TrackBarCicle.Maximum) + (FEol.TrackBarEol.Maximum * 0.0036 * AuxEol ^ 3 + (AumentoEolica / 100) * 32 9. Código (FEol.TrackBarEol.Maximum * 0.0036 * AuxEol ^ 3)) + (FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc) + (FSol.TrackBarSol.Maximum + (AumentoSolar / 100) * (FSol.TrackBarSol.Maximum)) 560. Else 561. total = (FCicle.TrackBarCicle.Maximum) + (FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc) + (FSol.TrackBarSol.Maximum + (AumentoSolar / 100) * (FSol.TrackBarSol.Maximum)) 562. End If 563. End If 564. 565. If total < EnergiaAbs Then 566. MessageBox.Show("Sembla que no pots arribar. Però tranquil els veïns estan per això. La ciutat veïna et deixa elèctricitat.", "Oh oh", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) 567. GraficEnergia(Vuelta) = EnergiaAbs 568. Else 569. If VTotal > (EnergiaAbs - (EnergiaAbs * 5 / 100)) And VTotal < (EnergiaAbs + (EnergiaAbs * 5 / 100)) Then 570. MsgBox("Quina precisió !!!") 571. ElseIf VTotal > (EnergiaAbs - (EnergiaAbs * 10 / 100)) And VTotal < (EnergiaAbs + (EnergiaAbs * 10 / 100)) Then 572. MsgBox("Perfecte, continua !") 573. ElseIf VTotal > (EnergiaAbs - (EnergiaAbs * 15 / 100)) And VTotal < (EnergiaAbs + (EnergiaAbs * 15 / 100)) Then 574. MsgBox("Molt bé, continua aixi!") 575. ElseIf VTotal > (EnergiaAbs - (EnergiaAbs * 20 / 100)) And VTotal < (EnergiaAbs + (EnergiaAbs * 20 / 100)) Then 576. MsgBox("Pots ajustar una mica més, però no et desanimis!") 577. Else 578. MsgBox("Intenta-ho amb més ganes!") 579. End If 580. GraficEnergia(Vuelta) = VTotal 581. End If 582. 'Volvemos a generar los valores aleatorios 583. VViento() 'Cambiamos el viento 584. LabelVViento.Text = "Velocitat vent: " & Int(Viento) & " m/s" 585. FEol.ComprovarMaximo() 'comprovamos si esta en saturacion 586. '////Generacion dependiendo de la velocidad del viento 587. If Viento < 12 Then 'Velocidades lentas 588. VEol = TBEol * 0.005 * AuxEol ^ 3 + (AumentoEolica / 100) * (TBEol * 0.005 * AuxEol ^ 3) 'Multiplicamos el valor del trackbar por una constante y por 589. 'la razón cúbica de la velocidad del viento 590. Else 'Velocidad rápida 591. VEol = TBEol * 0.0036 * AuxEol ^ 3 + (AumentoEolica / 100) * (TBEol * 0.0036 * AuxEol ^ 3) 'Multiplicamos el valor del trackbar por una constante y por 592. 'la razón cúbica de la velocidad del viento 593. End If 594. Climatologia() 'Tiempo aleatorio 595. 'Ajustamos la hora 596. If Hora = 20 Then 597. HoraSiguiente = 0 598. ElseIf Hora = 21 Then 599. HoraSiguiente = 1 600. ElseIf Hora = 22 Then 601. HoraSiguiente = 2 602. ElseIf Hora = 23 Then 603. HoraSiguiente = 3 604. Else 605. HoraSiguiente = Hora + 4 33 9. Código 606. End If 607. LabelHoraSeg.Text = "Revisió: " & HoraSiguiente & ":00" 608. BaseDatos() 'Miramos que energia absorve para esa hora 609. ContECons.Text = EnergiaAbs & " kWh" 610. 611. 612. End Sub 613. Private Sub TimerEventos_Tick(sender As Object, e As EventArgs) Handles TimerEventos.Tick 614. NumPregunta = NumPregunta + 1 615. PreguntasActivas = True 616. If NumPregunta < 8 Then 'Total de 7 preguntas 617. 'Si la siguiente pregunta es la 3 tendremos que llamar a otra funcion 618. If NumPregunta = 3 Then 619. FEventosImagenes.Show() 620. ElseIf NumPregunta = 6 And Facil Then 621. FEventosImagenes.Show() 622. Else 623. FEventos.Show() 624. End If 625. '//////Detenemos todas las rutinas/////// 626. If RepNucTim Then 627. TimerNucRep.Stop() 628. Else 629. TimerNuc.Stop() 630. End If 631. If LluviaTim Then 632. Timerlluvia.Stop() 633. Else 634. If Estado Then 635. Prueba.Abort() 636. End If 637. End If 638. TimerHora.Stop() 639. TimerEventos.Stop() 640. 'Cerramos todos los subforms 641. If FHidro.Enabled Then 642. FHidro.Close() 643. End If 644. If FNuc.Enabled Then 645. FNuc.Close() 646. End If 647. If FSol.Enabled Then 648. FSol.Close() 649. End If 650. If FCicle.Enabled Then 651. FCicle.Close() 652. End If 653. Else 654. TimerEventos.Stop() 'Si hemos hecho todas las preguntas paramos 655. End If 656. End Sub 657. Private Sub Form1_Closing(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing 658. If Vuelta <> 6 Then 659. If FSalir.ShowDialog() = System.Windows.Forms.DialogResult.Abort Then 660. e.Cancel = True 661. End If 662. End If 34 9. Código 663. End Sub 664. Private Sub Timerlluvia_Tick(sender As Object, e As EventArgs) Handles Timerlluvia.Tick 665. If Capacidad = 98 Then 666. Timerlluvia.Stop() 'paramos la lluvia 667. LluviaTim = False 668. Else 669. LluviaTim = True 670. Capacidad = Capacidad + 1 'Aumentamos las reservas de agua a causa de la lluvia 671. End If 672. 673. 674. End Sub 675. End Class 9.2. FInicio Public Class FInicio Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick ProgressBar1.Value = ProgressBar1.Value + 2 If ProgressBar1.Value = 100 Then Timer1.Stop() ProgressBar1.Visible = False FInfo1.Show() Me.Close() End If End Sub End Class 9.3. FCicle Public Class FCicle Private Sub BSCicle_Click(sender As Object, e As EventArgs) Handles BSCicle.Click Me.Close() End Sub Private Sub TrackBarCicle_Scroll(sender As Object, e As EventArgs) Handles TrackBarCicle.Scroll VCicle = TrackBarCicle.Value TBCicle = TrackBarCicle.Value 'Guardamos el valor del trackbar LabelCicle.Text = VCicle & " kWh" Form1.Refrescar() End Sub End Class 9.4. FEol Public Class FEol Public Sub ComprovarMaximo() AuxEol = Viento If Viento > 15 Then AuxEol = 15 'Con viento de 15m/s se satura la produccion End If End Sub Private Sub BSEol_Click(sender As Object, e As EventArgs) Handles BSEol.Click Me.Close() 'Volvemos al principal End Sub 35 9. Código Private Sub TrackBarEol_Scroll(sender As Object, e As EventArgs) Handles TrackBarEol.Scroll ComprovarMaximo() '////Generacion dependiendo de la velocidad del viento If Viento < 12 Then 'Velocidades lentas VEol = TrackBarEol.Value * 0.005 * AuxEol ^ 3 + (AumentoEolica / 100) * (TrackBarEol.Value * 0.005 * AuxEol ^ 3) 'Multiplicamos el valor del trackbar por una constante y por 'la razón cúbica de la velocidad del viento Else 'Velocidad rápida VEol = TrackBarEol.Value * 0.0036 * AuxEol ^ 3 + (AumentoEolica / 100) * (TrackBarEol.Value * 0.0036 * AuxEol ^ 3) 'Multiplicamos el valor del trackbar por una constante y por 'la razón cúbica de la velocidad del viento End If LabelEol.Text = VEol & " kWh" 'Indicamos que Label tome el valor de VEol Form1.ContEGenEol.Text = VEol 'Indicamos que el label que muestra el valor de energia de Eol ' en el programa principal, se actualice al que ahora le estamos dando Form1.Refrescar() TBEol = TrackBarEol.Value 'Guardamos el valor del trackbar End Sub End Class 9.5. FHidro Imports System.Threading 'Importem les preferencies per poder executar en paral·lel Public Class FHidro Public Sub EndThread() 'Para poder parar la subrutina que resta la capacidad Prueba.Abort() 'Paramos la subrutina End Sub Private Sub BSHidro_Click(sender As Object, e As EventArgs) Handles BSHidro.Click Me.Close() 'Cerramos FHidro End Sub Private Sub FHidro_FormClosing(sender As Object, e As EventArgs) Handles Me.FormClosing 'If (FEventosResp.Enabled = False) Or (FEventosImagenes.Enabled = False) Then If Not PreguntasActivas Then Prueba = New Thread(AddressOf Form1.ThreadTask) 'Definimos prueba como una variable Thread '(para ejecutar en paralelo)' Prueba.IsBackground = True 'Ralizacion de fondo Prueba.Start() 'llamamos al procedimiento End If End Sub Private Sub TrackBarHidro_Scroll(sender As Object, e As EventArgs) Handles TrackBarHidro.Scroll If TrackBarHidro.Value = 0 Then 'Por tal de que restemos la capacidad de la presa solo cuando 'la hemos activado AuxHidro = 0 'Si el valor del trackbar es 0, no restaremos Else AuxHidro = 1 'Si es diferente de 0 restaremos 1 End If TBHidro = TrackBarHidro.Value 'Guardamos el valor del trackbar VHidro = TrackBarHidro.Value * 10.35 'Multiplicamos el valor del trackbar por 10.35 para adecuarlo a 'la energia que generaria un sistema hidráulico LabelHidro.Text = VHidro 'Indicamos que Label tome el valor de VHidro 36 9. Código Form1.ContEGenHidro.Text = VHidro 'Indicamos que el label que muestra el valor de energia de Hidro ' en el programa principal, se actualice al que ahora le estamos dando Form1.Refrescar() End Sub End Class 9.6. FSol Public Class FSol Private Sub BSSol_Click(sender As Object, e As EventArgs) Handles BSSol.Click Me.Close() 'Volvemos al principal End Sub Private Sub TrackBarSol_Scroll(sender As Object, e As EventArgs) Handles TrackBarSol.Scroll VSol = TrackBarSol.Value + (AumentoSolar / 100) * (TrackBarSol.Value) 'Multiplicamos el valor del trackbar por 16 para adecuarlo a 'la energia que generaria un sistema fotovoltaico LabelSol.Text = VSol & " kWh" 'Indicamos que Label tome el valor de VSol Form1.ContEGenSol.Text = VSol 'Indicamos que el label que muestra el valor de energia de Sol ' en el programa principal, se actualice al que ahora le estamos dando Form1.Refrescar() TBSol = TrackBarSol.Value 'Guardamos el valor del trackbar End Sub End Class 9.7. FNuc Public Class FNuc Private Sub BSNuc_Click(sender As Object, e As EventArgs) Handles BSNuc.Click Me.Close() End Sub Private Sub BNucRep_Click(sender As Object, e As EventArgs) Handles BNucRep.Click PBNuc = ProgressBar1.Value Form1.TimerNuc.Stop() Form1.TimerNucRep.Start() LabelNuc.Text = VNuc End Sub End Class 9.8. FSalir Public Class FSalir Private Sub BSi_Click(sender As Object, e As EventArgs) Handles BSi.Click If Estado Then Prueba.Abort() End If Me.Close() End Sub Private Sub BNo_Click(sender As Object, e As EventArgs) Handles BNo.Click Me.Close() DialogResult = DialogResult.Abort End Sub End Class 37 9. Código 9.9.FEventos Public Class FEventos Public Sub CargaPreguntas() Select Case NumPregunta 'Seleccionamos en que pregunta estamos Case 1 LabelPregunta.Text = "D'on s'obté principalment la biomassa?" RadioButton1.Text = "Dels Iogurs amb bífidus" RadioButton2.Text = "De les restes de plàstic de la brossa" RadioButton3.Text = "De les restes de residus forestals i agrícoles" Case 2 LabelPregunta.Text = "Les xarxes intel·ligents (smart grids) són..." RadioButton1.Text = "xarxes que milloraran l'eficiència elèctrica" RadioButton2.Text = "xarxes formadess per smartphones" RadioButton3.Text = "tecnologies que encara no han arribat a Europa" Case 4 LabelPregunta.Text = "Quin creus que és el nom correcte d'una central elèctrica marina? (Bouy significa boia)." RadioButton1.Text = "Power Buoy" RadioButton2.Text = "Turbo Buoy" RadioButton3.Text = "Electrical-Marine Buoy" Case 5 LabelPregunta.Text = "En quina orientació col·locaries unes plaques solars per aprofitar al màxim el sol?" RadioButton1.Text = "Orientació Nord" RadioButton2.Text = "Orientació Sud" RadioButton3.Text = "És indiferent" Case 6 LabelPregunta.Text = "Què creus que és una central de cicle combinat?" RadioButton1.Text = "Una central on es crema les restes de residus urbans" RadioButton2.Text = "Una combinació d'una central tèrmica i una nuclear" RadioButton3.Text = "Una central tèrmica que aprofita al màxim el combustible" Case 7 LabelPregunta.Text = "En què es basa l'energia geotèrmica?" RadioButton1.Text = "En aprofitar l'energia de les fonts termals" RadioButton2.Text = "En aprofitar l'escalfor dels raigs solars" RadioButton3.Text = "En aprofitar l'energia tèrmica de la Terra" End Select End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles ButtonComprova.Click '///////Diferenciamos entre todas las posibles respuestas///// If NumPregunta = 1 Or NumPregunta = 6 Or NumPregunta = 7 Then If RadioButton3.Checked = True Then RespCorrecta = "Correcte" Else RespCorrecta = "Incorrerte" End If FEventosResp.CargarRespuestas() FEventosResp.Show() ElseIf NumPregunta = 2 Or NumPregunta = 4 Then If RadioButton1.Checked = True Then RespCorrecta = "Correcte" Else 38 9. Código RespCorrecta = "Incorrerte" End If FEventosResp.CargarRespuestas() FEventosResp.Show() Else If RadioButton2.Checked = True Then RespCorrecta = "Correcte" Else RespCorrecta = "Incorrerte" End If FEventosResp.CargarRespuestas() FEventosResp.Show() End If Me.Close() End Sub Private Sub FEventos_Load(sender As Object, e As EventArgs) Handles MyBase.Load CargaPreguntas() End Sub End Class 9.10. FEventosImagenes Imports System.Threading Public Class FEventosImagenes Dim respuesta = 0 '/////Cargamos la pregunta//////////// Private Sub FEventosImagenes_Load(sender As Object, e As EventArgs) Handles MyBase.Load CargarPreguntas() End Sub Public Sub CargarPreguntas() If NumPregunta = 6 Then RadioButton1.Visible = False RadioButton2.Visible = False RadioButton3.Visible = False PictureBox1.BackgroundImage = ControlE.My.Resources._450px_Centrale_Eolica_Frigento PictureBox2.BackgroundImage = ControlE.My.Resources._800px_Ciclo_combinado_Plana_del_Vent PictureBox3.BackgroundImage = ControlE.My.Resources._800px_Placas_solares_en_Vilalba Label1.Text = "Quina de les següents imatges correspon a una central eòlica?" Label2.Text = "Central eòlica" Label3.Text = "Central de Cicle Combinat" Label3.ForeColor = Color.Red Label4.Text = "Central Solar" Label4.ForeColor = Color.Red ElseIf NumPregunta = 3 Then Label1.Text = "Quin tipus de molí eòlic és d'eix horitzontal?" RadioButton1.Visible = True RadioButton2.Visible = True RadioButton3.Visible = True TableLayoutPanel1.Controls.Remove(TableLayoutPanel2) TableLayoutPanel1.Controls.Add(PictureBox1, 1, 2) PictureBox1.BackgroundImage = Nothing PictureBox1.Image = My.Resources.Molinos PictureBox1.SizeMode = PictureBoxSizeMode.Zoom PictureBox1.Dock = DockStyle.Fill End If End Sub 39 9. Código Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click PreguntasActivas = False If NumPregunta = 6 Then If respuesta = 1 Then MsgBox("Correcte! +10 % de generació eòlica!!") AumentoEolica = AumentoEolica + 10 If Viento < 12 Then 'Velocidades lentas VEol = TBEol * 0.005 * AuxEol ^ 3 + (AumentoEolica / 100) * (TBEol * 0.0036 * AuxEol ^ 3) 'Multiplicamos el valor del trackbar por una constante y por 'la razón cúbica de la velocidad del viento Else 'Velocidad rápida VEol = TBEol * 0.0036 * AuxEol ^ 3 + (AumentoEolica / 100) * (TBEol * 0.0036 * AuxEol ^ 3) 'Multiplicamos el valor del trackbar por una constante y por 'la razón cúbica de la velocidad del viento End If Else MsgBox("Incorrecte!") End If Label2.Visible = True Label3.Visible = True Label4.Visible = True End If If NumPregunta = 3 Then If respuesta = 2 Then MsgBox("Correcte! HAWT = Horitzontal Axis Wind Turbine +10 % de generació eòlica!!") AumentoEolica = AumentoEolica + 10 If Viento < 12 Then 'Velocidades lentas VEol = TBEol * 0.005 * AuxEol ^ 3 + (AumentoEolica / 100) * (TBEol * 0.0036 * AuxEol ^ 3) 'Multiplicamos el valor del trackbar por una constante y por 'la razón cúbica de la velocidad del viento Else 'Velocidad rápida VEol = TBEol * 0.0036 * AuxEol ^ 3 + (AumentoEolica / 100) * (TBEol * 0.0036 * AuxEol ^ 3) 'Multiplicamos el valor del trackbar por una constante y por 'la razón cúbica de la velocidad del viento End If Else MsgBox("Incorrecte! VAWT = Vertical Axis Wind Turbine, podràs veure una en l'edifici de laboratoris de la universitat a prop de l'escola d'art.") End If End If Me.Enabled = False TimerClose.Start() End Sub '/////////Para la pregunta numero 6//////////////////// Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click If NumPregunta = 6 Then respuesta = 1 '/////Resaltamos el color del fondo/////// If PictureBox2.BackColor = Color.Silver Then PictureBox2.BackColor = Color.Transparent End If If PictureBox3.BackColor = Color.Silver Then PictureBox3.BackColor = Color.Transparent End If 40 9. Código PictureBox1.BackColor = Color.Silver End If End Sub Private Sub PictureBox2_Click(sender As Object, e As EventArgs) Handles PictureBox2.Click respuesta = 2 If PictureBox1.BackColor = Color.Silver Then PictureBox1.BackColor = Color.Transparent End If If PictureBox3.BackColor = Color.Silver Then PictureBox3.BackColor = Color.Transparent End If PictureBox2.BackColor = Color.Silver End Sub Private Sub PictureBox3_Click(sender As Object, e As EventArgs) Handles PictureBox3.Click respuesta = 3 If PictureBox1.BackColor = Color.Silver Then PictureBox1.BackColor = Color.Transparent End If If PictureBox2.BackColor = Color.Silver Then PictureBox2.BackColor = Color.Transparent End If PictureBox3.BackColor = Color.Silver End Sub '////////Para la pregunta 3/////////////////////// Private Sub RadioButton2_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton2.CheckedChanged respuesta = 2 End Sub Private Sub RadioButton1_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton1.CheckedChanged respuesta = 1 End Sub Private Sub RadioButton3_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton3.CheckedChanged respuesta = 3 End Sub Private Sub FEventosImagenes_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing '////////Reactivamos todos los temporizadores///////// If RepNucTim Then Form1.TimerNucRep.Start() Else Form1.TimerNuc.Start() End If If LluviaTim Then Form1.Timerlluvia.Start() End If Prueba = New Thread(AddressOf Form1.ThreadTask) 'Definimos prueba como una variable Thread '(para ejecutar en paralelo)' Prueba.IsBackground = True 'Ralizacion de fondo Prueba.Start() 'llamamos al procedimiento Form1.TimerHora.Start() Form1.TimerEventos.Start() End Sub Private Sub TimerClose_Tick(sender As Object, e As EventArgs) Handles TimerClose.Tick TimerClose.Stop() 41 9. Código Me.Close() End Sub End Class 9.11. FEventosResp Imports System.Threading Public Class FEventosResp Public Sub CargarRespuestas() Select Case NumPregunta Case 1 If RespCorrecta = "Correcte" Then Label1.Text = RespCorrecta & ", tota resta orgànica es pot transformar en biomassa, per després utilitzar-la com a combustible sent una molt bona opció com a energia renovable. Es Es redueix el consum de la teva ciutat un 2%!!" ReduccionConsumo = ReduccionConsumo + 2 Else Label1.Text = RespCorrecta & ", tota resta orgànica es pot transformar en biomassa, per després utilitzar-la com a combustible sent una molt bona opció com a energia renovable." End If PictureBox1.BackgroundImage = ControlE.My.Resources.Pellets Case 2 If RespCorrecta = "Correcte" Then Label1.Text = RespCorrecta & ", les Smart Grids permeten que els habitatges i els negocis puguin convertir-se en generadors fent que ja no es depengui tant de grans centrals Es redueix el consum de la teva ciutat un 2%!!" ReduccionConsumo = ReduccionConsumo + 2 Else Label1.Text = RespCorrecta & ", les Smart Grids permeten que els habitatges i els negocis puguin convertir-se en generadors fent que ja no es depengui tant de grans centrals" End If PictureBox1.BackgroundImage = ControlE.My.Resources.Smartcity Case 4 If RespCorrecta = "Correcte" Then Label1.Text = RespCorrecta & ", la POWER BUOY aprofita el moviment de les ones, per generar electricitat en el seu eix vertical, com si d'una manxa de bici es tractés. Tindràs una generació extra de 1500 kWh per aquest descobriment!!" EnergiaBase = EnergiaBase + 1500 Else Label1.Text = RespCorrecta & ", la POWER BUOY aprofita el moviment de les ones, per generar electricitat en el seu eix vertical, com si d'una manxa de bici es tractés." End If PictureBox1.BackgroundImage = ControlE.My.Resources.powerbuoy Case 5 If RespCorrecta = "Correcte" Then Label1.Text = RespCorrecta & ", en orientació SUD s'aprofita millor les hores de sol. Les cases orientades al sud necessiten menys energia per escalfar-se. Tindràs un augment d'un 10 % en la generació solar" AumentoSolar = 10 VSol = TBSol + (AumentoSolar / 100) * (TBSol) Else 42 9. Código Label1.Text = RespCorrecta & ", en orientació SUD s'aprofita millor les hores de sol. Les cases orientades al sud necessiten menys energia per escalfar-se." End If PictureBox1.BackgroundImage = ControlE.My.Resources.rosewind Case 6 If RespCorrecta = "Correcte" Then Label1.Text = RespCorrecta & ", hi ha un primer cicle de combustió, i amb els gasos d'aquesta, es fa una segona combustió. Com si aprofitessis els gasos d'escapament del cotxe per extreure més energia. La central de la imatge està a prop de Vandellòs. Tindràs una generació extra de 1500 kWh per aquest descobriment!!" Else Label1.Text = RespCorrecta & ", hi ha un primer cicle de combustió, i amb els gasos d'aquesta, es fa una segona combustió. Com si aprofitessis els gasos d'escapament del cotxe per extreure més energia. La central de la imatge està a prop de Vandellòs." End If PictureBox1.BackgroundImage = ControlE.My.Resources._800px_Ciclo_combinado_Plana_del_Vent Case Else If RespCorrecta = "Correcte" Then Label1.Text = RespCorrecta & ", el nucli de la Terra es troba a prop dels 6700ºC, una part d'aquesta calor es pot aprofitar per generar electricitat, però només en llocs especials (amb activitat volcànica). Tindràs una generació extra de 1500 kWh per aquest descobriment!!" EnergiaBase = EnergiaBase + 1500 Else Label1.Text = RespCorrecta & ", el nucli de la Terra es troba a prop dels 6700ºC, una part d'aquesta calor es pot aprofitar per generar electricitat, però només en llocs especials (amb activitat volcànica)." End If PictureBox1.BackgroundImage = ControlE.My.Resources._800px_GeysirEruptionNear End Select End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click PreguntasActivas = False Me.Close() '////////Reactivamos todos los temporizadores///////// If RepNucTim Then Form1.TimerNucRep.Start() Else Form1.TimerNuc.Start() End If If LluviaTim Then Form1.Timerlluvia.Start() End If Prueba = New Thread(AddressOf Form1.ThreadTask) 'Definimos prueba como una variable Thread '(para ejecutar en paralelo)' Prueba.IsBackground = True 'Ralizacion de fondo Prueba.Start() 'llamamos al procedimiento Form1.TimerHora.Start() Form1.TimerEventos.Start() End Sub End Class 43 9. Código 9.12. FInfo1 Public Class FInfo1 Private Sub ButtonMig_Click(sender As Object, e As EventArgs) Handles ButtonMig.Click Facil = False 'Ha escogido el nivel dificil FInfo2.Show() Me.Close() End Sub Private Sub ButtonFacil_Click(sender As Object, e As EventArgs) Handles ButtonFacil.Click Facil = True 'Ha escogido el nivel facil FInfo2.Show() Me.Close() End Sub End Class 9.13. Finfo2 Public Class FInfo2 Dim cops = 0 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Select Case cops Case 0 TableLayoutPanel1.BackgroundImage = ControlE.My.Resources._2 Label1.Visible = False Label2.Visible = True Case 1 TableLayoutPanel1.BackgroundImage = ControlE.My.Resources._3 Label2.Visible = False Label1.Text = "Aquest és el rellotge. Quan arribi l'hora de revisió es comprovarà quina és l'energia que es genera s'assembli amb la que es gasta. Intenta ajustar-te el màxim possible!" Label1.Visible = True Case 2 TableLayoutPanel1.BackgroundImage = ControlE.My.Resources._4 Label3.Visible = True Label1.Visible = False Case 3 TableLayoutPanel1.BackgroundImage = ControlE.My.Resources._5 Label3.Visible = False Label5.Visible = True Case 4 TableLayoutPanel1.BackgroundImage = ControlE.My.Resources._6 Label4.Text = "El vent et limitarà la producció d'energia eòlica. Si fa massa, o massa poc vent, no podràs produir." Label4.Visible = True Label5.Visible = False Case 5 TableLayoutPanel1.BackgroundImage = ControlE.My.Resources._7 Label4.Text = "El pantà té una quantitat limitada d'aigua. Tindràs que RESERVAR un 10% per què la gent pugui tenir aigua a les seves cases. La pluja omplirà el pantà. Troba l'equilibri entre la producció i el consum d'aigua!" Case 6 TableLayoutPanel1.BackgroundImage = ControlE.My.Resources._8 Label4.Visible = False Label6.Visible = True If Facil Then 44 9. Código Label6.Text = "La central nuclear produirà contínuament, però hauràs de fer revisions per assegurar-te que funcioni correctament. En reparacions no generarà RES." End If Case 7 TableLayoutPanel1.BackgroundImage = ControlE.My.Resources._9 Button1.Text = "COMENÇAR" Label6.Visible = False TableLayoutPanel1.Controls.Remove(Label2) Label3.Text = "¡¡¡¡¡¡¡El joc ara comença!!!!!!!" TableLayoutPanel1.Controls.Remove(Label4) TableLayoutPanel1.Controls.Remove(Label5) TableLayoutPanel1.Controls.Remove(Label6) TableLayoutPanel1.ColumnStyles.RemoveAt(0) Label1.Text = "Intenta utilitzar al màxim les centrals renovables, ja que són les que no et generaran cap perjudici. Se't faran preguntes durant el joc, si contestes bé tindràs beneficis, però tranquil mentre et pregunti es pararà el temps." Label1.Visible = True Label3.Visible = True Case Else Form1.TimerHora.Start() Form1.TimerNuc.Start() Form1.SecuenciaInicial() Form1.Show() Me.Close() End Select cops = cops + 1 End Sub End Class 9.14. Final Public Class Final Private Sub Label1_Click(sender As Object, e As EventArgs) Handles Label1.Click Chart1.Series.Clear() InicializaLeyenda() End Sub Private Sub InicializaLeyenda() Chart1.Series.Add("Energia Abs") Chart1.Series.Add("Energia Gen") Chart1.Series("Energia Abs").ChartType = DataVisualization.Charting.SeriesChartType.Spline Chart1.Series("Energia Gen").ChartType = DataVisualization.Charting.SeriesChartType.Spline 'System.Windows.Forms. For counter = 0 To 6 Chart1.Series("Energia Gen").Points.AddXY(GraficHores(counter).ToString(), GraficEnergia(counter)) Chart1.Series("Energia Abs").Points.AddXY(GraficHores(counter).ToString(), GraficAbs(counter)) Next End Sub Private Sub Final_Load(sender As Object, e As EventArgs) Handles MyBase.Load Chart1.Series.Clear() InicializaLeyenda() End Sub End Class 45 10. Interfaz Gráfica 10. Interfaz Gráfica Seguidamente, se muestra cual es la interfaz visual que podrá ver el usuario en las diferentes etapas del juego. En la figura 10.0. se puede ver el diagrama de flujo que sigue el programa Finicio Figura 10.1 FInfo1 Figura 10.3 FInfo2 Figura 10.4 FEventos Figura 10.11 Se cierra el programa FSalir Figura 10.2 FEventosResp Figura 10.12 Form1 Figura 10.5 Evento temporizado FEventosImagenes Figura 10.13 Elección usuario Pasadas 24 horas FSol Figura 10.10 FNuc Figura 10.9 FHidro Figura 10.8 FEol Figura 10.7 Final Figura 10.14 Figura 10.0. Diagrama de flujo 46 FCicle Figura 10.6 10. Interfaz Gráfica 10.1. FInicio Figura 10.1. FInicio 10.2. FSalir Figura 10.2. FSalir 47 10. Interfaz Gráfica 10.3.FInfo1 Figura 10.3. FInfo1 48 10. Interfaz Gráfica 10.4.Finfo2 Figura 10.4. FInfo2 49 10. Interfaz Gráfica 10.5. Form1 Figura 10.5. Form1 50 10. Interfaz Gráfica 10.6. FCicle Figura 10.6. FCicle 51 10. Interfaz Gráfica 10.7. FEol Figura 10.7. FEol 52 10. Interfaz Gráfica 10.8. FHidro Figura 10.8. FHidro 53 10. Interfaz Gráfica 10.9. FNuc Figura 10.9. FNuc 54 10. Interfaz Gráfica 10.10. FSol Figura 10.10. FSol 55 10. Interfaz Gráfica 10.11. FEventos Figura 10.11. FEventos 10.12. FeventosResp Figura 10.12. FEventosResp 56 10. Interfaz Gráfica 10.13. FEventosImagenes Figura 10.13. FEventosImagenes 10.14. Final Figura 10.14. Final 57 11. Modelo Matemático 11. Modelo Matemático Pese a ser un trabajo de programación, eso no significa que no tenga un modelo matemático en el cual se base. Se ha intentado basar el comportamiento de ciertas variables como la velocidad del viento en modelos probabilísticos reales. 11.1. Energia Consumida Programada La energía consumida, es decir, la que el usuario tiene que conseguir igualar, se basa en la demanda real de todo el sistema eléctrico español. A partir de la información obtenida en la página web de Red Eléctrica de España (REE) y eligiendo un día cualquiera del año, que en este caso fue el día 18 de abril de 2016, se guardan los valores de la energía consumida durante ese día, y se asignan a su hora correspondiente. Esto queda reflejado en la función BaseDatos() en el Form1, como se puede ver en el código 1: Public Sub BaseDatos() Select Case Hora Case 0 EnergiaAbs Case 1 EnergiaAbs Case 2 EnergiaAbs Case 3 EnergiaAbs Case 4 EnergiaAbs Case 5 EnergiaAbs Case 6 EnergiaAbs Case 7 EnergiaAbs Case 8 EnergiaAbs Case 9 EnergiaAbs Case 10 EnergiaAbs Case 11 EnergiaAbs Case 12 EnergiaAbs Case 13 EnergiaAbs Case 14 EnergiaAbs = 31896 = 28405 = 26890 = 25902 = 25020 = 24500 = 25020 = 26908 = 28701 = 29910 = 32000 = 34700 = 35631 = 36082 = 37152 58 11. Modelo Matemático Case 15 EnergiaAbs Case 16 EnergiaAbs Case 17 EnergiaAbs Case 18 EnergiaAbs Case 19 EnergiaAbs Case 20 EnergiaAbs Case 21 EnergiaAbs Case 22 EnergiaAbs Case 23 EnergiaAbs End Select End Sub = 36290 = 36286 = 35900 = 35480 = 34800 = 34100 = 33684 = 32800 = 30820 Código 1. Código de la función BaseDatos() En este caso, se usó la función Select Case, donde cada hora tiene su valor concreto de energía. 11.2. Cuotas de Generación En cuanto a la capacidad de cada fuente de energía se basó en el Informe del Sistema Eléctrico Español de 2014 de REE[1]. Si nos fijamos en la Figura 11.1. podemos ver cómo se reparte la potencia instalada del sistema eléctrico peninsular. [1] http://www.ree.es/es/estadisticas-del-sistema-electrico-espanol/informe-anual/informe-del-sistemaelectrico-espanol-2014 59 11. Modelo Matemático Figura 11.1. Potencia instalada en la península. Para simplificar, se redujo a las siguientes fuentes de energía: Ciclo combinado Nuclear Hidráulica Eólica Solar (sin distinguir entre fotovoltaica o térmica) 60 11. Modelo Matemático Con el siguiente reparto: GENERACIÓN (%) Solar 7% Ciclo Combinado 34% Eólica 27% Nuclear 9% Hidráulica 23% Figura 11.2. Potencia instalada en el juego. Si se observa el apartado 11.1. se puede ver que en ningún momento se pasa de 40000 kWh, pero para que el usuario le sea más fácil, el total de la generación será de 50000 kWh, con el siguiente reparto: Ciclo combinado .................................................................................... 17000 kWh Nuclear ..................................................................................................... 4500 kWh Hidráulica ............................................................................................... 11500 kWh Eólica ...................................................................................................... 13500 kWh Solar (sin distinguir entre fotovoltaica o térmica) .................................... 3500 kWh Teniendo en cuenta que hay fenómenos como las nubes, la variación de la velocidad del viento, o los beneficios de responder bien a las preguntas, que harán variar estos números. 61 11. Modelo Matemático 11.3. Generación Eólica La generación eólica sigue una razón cúbica, de acuerdo a la expresión: 1 𝑃𝑇 = 𝐶𝑝 2 𝜌𝐴𝑣 3 (1) Siendo: PT: potencia mecánica transformada por la turbina en W. Cp: coeficiente de potencia de la turbina. ρ: densidad del aire en kg/m3. A: Área abarcada por las aspas en m2. v: velocidad del viento en m/s. Para implementar esta fórmula en el software, se consideró una única variable: la velocidad del viento, por ser la que presenta más variabilidad y ser más fácil de plasmar visualmente. Dado que estadísticamente, (ver apartado 11.4.) las velocidades del viento suelen ser inferiores a 9 m/s, se decide diferenciar entre dos situaciones. La primera, se trata de velocidades inferiores a 9 m/s y la segunda para velocidades mayores. La razón de diferenciar entre estas dos situaciones, se debe a que, al tratarse de una multiplicación al cubo, para velocidades bajas, solo se genera unos cientos de kWh, haciendo difícil que el usuario llegue a los valores requeridos. La forma de implementación, se puede ver en el código 2: If Viento < 9 Then 'Velocidades lentas VEol = TrackBarEol.Value * 0.0123456 * AuxEol ^ 3 + (AumentoEolica / 100) * (TrackBarEol.Value * 0.0123456 * AuxEol ^ 3) Else 'Velocidad rápida VEol = TrackBarEol.Value * 0.0078125 * AuxEol ^ 3 + (AumentoEolica / 100) * (TrackBarEol.Value * 0.0078125 * AuxEol ^ 3) End If Código2. Cálculo de la energía eólica. Siendo: VEol: el valor de energía generada (PT en (1)). TrackBarEol.Value: el valor que el usuario quiere utilizar siendo un tanto por mil. 0.0123456/ 0.0078125: una constante para que el valor máximo sea de 13500 kWh. 62 11. Modelo Matemático AuxEol: la velocidad del viento. También se ha tenido en cuenta que los aerogeneradores no pueden generar a cualquier velocidad de viento, tienen un mínimo y un máximo, tal y como se puede ver en la Figura 11.3. Figura 11.3. Rango de funcionamiento de un aerogenerador. Este rango queda reflejado en el código 3 y el código 4: Sub VViento_Sub() If Viento < 4 Then 'Con ningun viento FEol.PBViento.Image = ControlE.My.Resources.Resources.Viento0 'Cambiamos el gif FEol.LabelAvisoEol.Text = " Molins parats" FEol.TrackBarEol.Enabled = False ElseIf Viento < 10 Then 'Con poco viento FEol.PBViento.Image = ControlE.My.Resources.Resources.Viento40 'Cambiamos el gif FEol.LabelAvisoEol.Text = "" ElseIf Viento < 25 Then 'Con viento FEol.PBViento.Image = ControlE.My.Resources.Resources.Viento75 'Cambiamos el gif FEol.LabelAvisoEol.Text = "" Else 'Con mucho viento FEol.PBViento.Image = ControlE.My.Resources.Resources.Viento100 'Cambiamos el gif FEol.LabelAvisoEol.Text = "Molins parats per seguretat" FEol.TrackBarEol.Enabled = False End If End Sub Código3. Limitación de la generación eólica. AuxEol = Viento If Viento > 15 Then AuxEol = 15 'Con viento de 15m/s se satura la produccion 63 11. Modelo Matemático End If Código4. Saturación de la generación eólica. En el código 3 se limita la generación a una velocidad de viento de 4 m/s y una máxima de 25 m/s, mostrando mensajes de aviso al usuario de que la energía eólica está en desuso por superar estos límites. El código 4 intenta imitar el comportamiento de la saturación de la curva que podíamos ver en la figura 11.3. donde a partir de los 13 m/s se satura la generación. 11.4. Velocidad del Viento La velocidad del viento, como cualquier otro fenómeno meteorológico, tiene una cierta probabilidad difícil de predecir, pero que con datos históricos, se puede determinar cuál es la probabilidad de una determinada velocidad de viento, tal y como se ve en la figura 11.4. Figura 11.4. Histograma de frecuencias relativas de las velocidades del viento A partir de la Figura 11.4. se genera la Tabla 11.4. donde se entrelazan los valores de probabilidad para cada velocidad de viento: Velocidad viento (m/s) Probabilidad (%) 0 1,1 0,5 1,3 1 2,4 1,5 4,05 64 11. Modelo Matemático 2 5,2 2,5 5,7 3 6,2 3,5 6,3 4 6,2 4,5 6,15 5 6,25 5,5 5,9 6 5,5 6,5 5,1 7 4,5 7,5 4,4 8 3,9 8,5 3,4 9 2,8 9,5 2,4 10 1,7 10,5 1,3 11 1,2 11,5 0,95 12 0,7 12,5 0,7 13 0,5 13,5 0,6 14 0,5 14,5 0,4 15 0,4 15,5 0,35 16 0,3 16,5 0,3 17 0,3 17,5 0,2 18 0,2 65 11. Modelo Matemático 18,5 0,15 19 0,1 19,5 0,1 20 0,075 20,5 0,05 21 0,05 21,5 0,03 22 0,03 22,5 0,02 23 0,01 23,5 0,01 24 0,005 24,5 0,005 25 0,005 25,5 0,005 26 0,005 Tabla 11.4. Probabilidad de velocidad del viento. Para trasladar estos valores de velocidad de viento al programa, se crea una variable aleatoria llamada Probabilidad, que toma un valor entre 0 y 100. En función de este valor se le asigna una velocidad de viento ponderada por su peso probabilístico, tal y como se puede ver en el código 5: Sub RandomViento() Randomize() 'Para que los numeros no sean los mismos cada vez que se inicia el programa 'Sumaremos todas las probabilidades para que salga un numero Probabilidad = (Rnd() * 100) Select Case Probabilidad 'Segun la probabilidad habrá una velocidad de viento Case > 97.6 Viento = 1 Case > 91.15 Viento = 2 Case > 80.25 Viento = 3 Case > 67.75 Viento = 4 Case > 55.4 Viento = 5 Case > 43.25 66 11. Modelo Matemático Viento = Case > 32.65 Viento = Case > 23.75 Viento = Case > 16.45 Viento = Case > 11.25 Viento = Case > 8.25 Viento = Case > 6.1 Viento = Case > 4.7 Viento = Case > 3.6 Viento = Case > 2.7 Viento = Case > 1.95 Viento = Case > 1.35 Viento = Case > 0.85 Viento = Case > 0.5 Viento = Case > 0.3 Viento = Case > 0.175 Viento = Case > 0.095 Viento = Case > 0.045 Viento = Case > 0.025 Viento = Case > 0.015 Viento = Case > 0.005 Viento = Case > 0 Viento = End Select 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 End Sub Código 5. Probabilidad de velocidad 11.5. Generación Solar Para simplificar la aplicación, se dejaron al margen los factores que determinan la eficiencia de la generación solar y no se distingue entre los diferentes tipos de generación de 67 11. Modelo Matemático energía eléctrica con energía solar. Se distinguieron tres casos: si había sol y cielo despejado, si había sol con cielo nublado o si era de noche. Para distinguir entre noche y día se utiliza la hora, siendo de día de las 7:00 a las 21:00. En cambio, para determinar cuál es la probabilidad real de que haya nubosidad que puedan afectar a la producción de energía solar, se utilizan los datos de la Agencia Estatal de Meteorología de España, en concreto, los valores climatológicos normales del Aeropuerto de Reus, datos reflejados en la Tabla 11.5. Mes Enero Febrero Marzo Abril Mayo Junio Julio Agosto Septiembre Octubre Noviembre Diciembre Año T 9.0 9.7 11.9 13.8 17.2 21.2 24.2 24.6 21.5 17.5 12.6 9.7 16.1 TM 14.1 14.9 17.1 19.0 22.2 26.3 29.3 29.4 26.3 22.3 17.5 14.6 21.1 Tm R 3.9 29 4.5 28 6.6 28 8.6 37 12.1 54 16.1 25 19.1 15 19.7 42 16.6 77 12.7 75 7.6 53 4.7 36 11.1 500 H 70 68 67 66 66 63 63 66 70 73 72 72 68 DR 4.0 3.5 3.8 5.0 5.4 3.1 2.0 3.6 5.1 6.0 4.4 4.1 49.8 DN 0.2 0.1 0.1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.4 DT 0.2 0.1 0.3 0.5 1.5 1.4 1.3 2.6 3.1 1.9 0.6 0.3 13.9 DF 0.3 1.3 1.9 0.8 0.4 0.2 0.1 0.2 0.2 0.4 0.3 0.7 6.7 DH 5.7 2.9 0.8 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.3 3.6 12.5 DD 7.2 5.4 6.0 3.9 4.2 6.3 9.4 6.2 4.8 3.9 5.4 5.7 68.3 I 157 162 197 222 251 274 306 265 209 182 157 145 - Tabla 11.5. Probabilidades meteorológicas [2] Siendo: T Temperatura media mensual/anual (°C) TM Media mensual/anual de las temperaturas máximas diarias (°C) Tm Media mensual/anual de las temperaturas mínimas diarias (°C) R Precipitación mensual/anual media (mm) H Humedad relativa media (%) DR Número medio mensual/anual de días de precipitación superior o igual a 1 mm [2] DN Número medio mensual/anual de días de nieve DT Número medio mensual/anual de días de tormenta DF Número medio mensual/anual de días de niebla http://www.aemet.es/es/serviciosclimaticos/datosclimatologicos/valoresclimatologicos?l=0016A&k=cat 68 11. Modelo Matemático DH Número medio mensual/anual de días de helada DD Número medio mensual/anual de días despejados I Número medio mensual/anual de horas de sol A partir de estos datos, se suman todos los días que no se consideran despejados, es decir DR, DN, DT,DF y DH, que en total suman 83,3 días al año de media. Lo cual hace una probabilidad del 22,82 % de que un día no tenga las condiciones de máxima radiación solar. Teniendo en cuenta lo anterior, se establece una probabilidad del 23 % de que cuando el programa realice la serie climatológica, el usuario se vea afectado por el evento “Nubes”, con lo cual se reduce la producción de energía solar un 30 % , tal y como se ve en el código 6: Sub Climatologia() 'Funcion que permite dar un clima aleatorio Randomize() Clima = Rnd() * 100 'Le damos un valor aleatorio a la variable Clima 'Según el valor aleatorio distinguimos entre dos situaciones If Hora >= 21 Or Hora < 7 Then 'Segun la hora sera de noche o día Noche = True Else Noche = False End If If Noche Then LabelNubes.Visible = False PBClima.Image = ControlE.My.Resources.Resources.Noche TBSol = 0 VSol = 0 Refrescar() ContEGenSol.ForeColor = Color.Red LastClim = Clima Timerlluvia.Stop() ElseIf Clima < 77 Then 'Probabilidad de sol 77% ContEGenSol.ForeColor = Color.White PBClima.Image = ControlE.My.Resources.Resources.Sol LabelNubes.Visible = False If LastClim >= 77 Then 'Si el anterior clima fue nubes TBSol = TBSol + TBSol * 42.874 / 100 'Actualizamos el valor automaticamente VSol = VSol + VSol * 42.874 / 100 Timerlluvia.Stop() 'Detenemos la lluvia If VSol > 3150 Then 'Para evitar valores superiores al máximo VSol = 3150 TBSol = 3150 End If Refrescar() 69 11. Modelo Matemático End If LastClim = Clima Else 'Evento Nubes ContEGenSol.ForeColor = Color.White PBClima.Image = ControlE.My.Resources.Resources.nubes If LastClim < 77 Then 'Si el anterior clima fue sol TBSol = TBSol - TBSol * 30 / 100 VSol = VSol - VSol * 30 / 100 Refrescar() End If LabelNubes.Visible = True 'Mostramos informacion de que se ha reducido VSol LastClim = Clima Timerlluvia.Start() 'La lluvia rellena la presa End If End Sub Código 6. Probabilidad de nubes 11.6. Generación Hidráulica Para agilizar la aplicación, la generación hidráulica solo depende de lo que el usuario decida. Para ello se incluye un control deslizante, que tiene un valor entre uno y mil. Cuanto mayor sea el valor, de forma lineal, más alta es la generación. Sin embargo, no es un recurso ilimitado, ya que el usuario empieza con una determinada cantidad de agua, siendo un tanto por ciento del pantano, en concreto el 93%. Mediante código, se crea una ejecución en paralelo que disminuye la capacidad la presa en función del valor del control deslizante. No obstante, para facilitar el transcurso de la aplicación, en el caso de que surja el evento climatológico “Nubes”, se llenara el pantano, dando a entender al usuario que la energía hidráulica es una fuente renovable, pero a la vez dependiente de diferentes factores. En el Código 7 se puede ver cómo funciona la ejecución en paralelo: Private Sub TimerHidro_Tick(sender As Object, e As EventArgs) Handles TimerHidro.Tick If Capacidad <= 10 Then 'Mostramos un mensaje si la capacidad disminuye demasiado VAlertaCap() Else Capacidad = Capacidad - AuxHidro 'Vamos restando valor a la capacidad con auxhidro, que es 0 en caso de 'que no haya empezado el programa 70 11. Modelo Matemático ContPresa.Text = Capacidad & " %" con cada vuelta 'Actualizamos los labels FHidro.ContPresa.Text = Capacidad & " %" RefCapacidad() If Facil Then TimerHidro.Interval = (3000 - VHidro / 13) de lo que generen se reduce mas rapido 'En funcion Else TimerHidro.Interval = (3000 - VHidro / 10) End If End If End Sub Código 7. Ejecución en paralelo 11.7. Generación Nuclear Para mostrar que la energía nuclear es una central de base que tiene una generación más o menos constante, la central está siempre activa. El usuario no puedo controlar su generación, sin embargo, el usuario tendrá que realizar un “mantenimiento” cada cierto tiempo, para asegurar ese valor de generación. Cuando se realiza el mantenimiento de la central, su generación será 0. Ver Código 8. Por tanto el usuario tendrá que anticiparse, ya que si el valor de mantenimiento de la central llega al 10 %, se reparará sola, pudiendo afectar a su partida. Private Sub TimerNuc_Tick(sender As Object, e As EventArgs) Handles TimerNuc.Tick If Not Facil Then 'Desactivado para el nivel Facil If ((PBNuc Mod 10) = 0) And PBNuc <> 100 Then 'Si vajamos un 10% el mantenimiento penalizamos VNuc = VNuc - 150 End If End If Refrescar() 'Vamos actualizando los labels PBNuc = PBNuc - 1 'Reducimos el mantenimiento If FNuc.Enabled = True Then 'En caso de que este activa la form, actualizamos sus valores FNuc.Label2.Text = PBNuc & "%" FNuc.ProgressBar1.Value = PBNuc End If Labeldesgastnuc.Text = PBNuc & "%" ProgressBarNuc.Value = PBNuc 71 11. Modelo Matemático If PBNuc = 10 Then TimerNuc.Stop() TimerNucRep.Start() MessageBox.Show("La central nuclear no pot continuar aixi!! L'estat t'obliga a fer el manteniment de la cental.", "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) End If End Sub Código 8. Reducción del mantenimiento de la central nuclear. 11.8. Generación Térmica En este caso, solo se tiene en cuenta las centrales de ciclo combinado, por ser más eficientes que los otros tipos de centrales térmicas. Para mostrar que las centrales térmicas pueden ser utilizadas como centrales de rápida entrada y salida del sistema de generación, la energía generada se determina por un control deslizante sobre el cual actúa el usuario. 11.9. Funciones didácticas Para no saturar al usuario con información, en esta aplicación se realizan preguntas relacionadas con las energías renovables cada cierto tiempo. Las preguntas son de tipo multirespuesta. Si el usuario acierta, obtendrá importantes beneficios que le ayudarán en el transcurso de la aplicación, si se equivoca no recibirá ningún efecto negativo. La intención es que el usuario reciba información de una forma más discreta, intentando crear un dialogo entre el usuario y el programa. En el Código 9, se puede ver un extracto de las diferentes preguntas y en el Código 10, sus respectivas respuestas. Public Sub CargaPreguntas() Select Case NumPregunta 'Seleccionamos en que pregunta estamos Case 1 LabelPregunta.Text = "D'on s'obté principalment la biomassa?" RadioButton1.Text = "Dels Iogurs amb bífidus" RadioButton2.Text = "De les restes de plàstic de la brossa" RadioButton3.Text = "De les restes de residus forestals i agrícoles" Case 2 LabelPregunta.Text = "Les xarxes intel·ligents (smart grids) són..." RadioButton1.Text = "xarxes que milloraran l'eficiència elèctrica" 72 11. Modelo Matemático RadioButton2.Text = "xarxes formadess per smartphones" RadioButton3.Text = "tecnologies que encara no han arribat a Europa" Case 4 LabelPregunta.Text = "Quin creus que és el nom correcte d'una central elèctrica marina? (Bouy significa boia)." RadioButton1.Text = "Power Buoy" RadioButton2.Text = "Turbo Buoy" RadioButton3.Text = "Electrical-Marine Buoy" Case 5 LabelPregunta.Text = "En quina orientació col·locaries unes plaques solars per aprofitar al màxim el sol?" RadioButton1.Text = "Orientació Nord" RadioButton2.Text = "Orientació Sud" RadioButton3.Text = "És indiferent" Case 6 LabelPregunta.Text = "Què creus que és una central de cicle combinat?" RadioButton1.Text = "Una central on es crema les restes de residus urbans" RadioButton2.Text = "Una combinació d'una central tèrmica i una nuclear" RadioButton3.Text = "Una central tèrmica que aprofita al màxim el combustible" Case 7 LabelPregunta.Text = "En què es basa l'energia geotèrmica?" RadioButton1.Text = "En aprofitar l'energia de les fonts termals" RadioButton2.Text = "En aprofitar l'escalfor dels raigs solars" RadioButton3.Text = "En aprofitar l'energia tèrmica de la Terra" End Select End Sub Código 9. Preguntas Public Sub CargarRespuestas() Select Case NumPregunta Case 1 If RespCorrecta = "Correcte" Then Label1.Text = RespCorrecta & ", tota resta orgànica es pot transformar en biomassa, per després utilitzar-la com a combustible sent una molt bona opció com a energia renovable. Es Es redueix el consum de la teva ciutat un 2%!!" ReduccionConsumo = ReduccionConsumo + 2 Else Label1.Text = RespCorrecta & ", tota resta orgànica es pot transformar en biomassa, per després utilitzar-la com a combustible sent una molt bona opció com a energia renovable." End If 73 11. Modelo Matemático PictureBox1.BackgroundImage = ControlE.My.Resources.Pellets Case 2 If RespCorrecta = "Correcte" Then Label1.Text = RespCorrecta & ", les Smart Grids permeten que els habitatges i els negocis puguin convertir-se en generadors fent que ja no es depengui tant de grans centrals Es redueix el consum de la teva ciutat un 2%!!" ReduccionConsumo = ReduccionConsumo + 2 Else Label1.Text = RespCorrecta & ", les Smart Grids permeten que els habitatges i els negocis puguin convertir-se en generadors fent que ja no es depengui tant de grans centrals" End If PictureBox1.BackgroundImage = ControlE.My.Resources.Smartcity Case 4 If RespCorrecta = "Correcte" Then Label1.Text = RespCorrecta & ", la POWER BUOY aprofita el moviment de les ones, per generar electricitat en el seu eix vertical, com si d'una manxa de bici es tractés. Tindràs una generació extra de 1500 kWh per aquest descobriment!!" EnergiaBase = EnergiaBase + 1500 Else Label1.Text = RespCorrecta & ", la POWER BUOY aprofita el moviment de les ones, per generar electricitat en el seu eix vertical, com si d'una manxa de bici es tractés." End If PictureBox1.BackgroundImage = ControlE.My.Resources.powerbuoy Case 5 If RespCorrecta = "Correcte" Then Label1.Text = RespCorrecta & ", en orientació SUD s'aprofita millor les hores de sol. Les cases orientades al sud necessiten menys energia per escalfar-se. Tindràs un augment d'un 10 % en la generació solar" AumentoSolar = 10 VSol = TBSol + (AumentoSolar / 100) * (TBSol) Else Label1.Text = RespCorrecta & ", en orientació SUD s'aprofita millor les hores de sol. Les cases orientades al sud necessiten menys energia per escalfar-se." End If PictureBox1.BackgroundImage = ControlE.My.Resources.rosewind Case 6 If RespCorrecta = "Correcte" Then Label1.Text = RespCorrecta & ", hi ha un primer cicle de combustió, i amb els gasos d'aquesta, es fa una segona combustió. Com si aprofitessis els gasos d'escapament del cotxe per extreure més energia. La central de la imatge està a prop de Vandellòs. Tindràs una generació extra de 1500 kWh per aquest descobriment!!" Else Label1.Text = RespCorrecta & ", hi ha un primer cicle de combustió, i amb els gasos d'aquesta, es fa una segona combustió. Com 74 11. Modelo Matemático si aprofitessis els gasos d'escapament del cotxe per extreure més energia. La central de la imatge està a prop de Vandellòs." End If PictureBox1.BackgroundImage = ControlE.My.Resources._800px_Ciclo_combinado_Plana_del_Vent Case Else If RespCorrecta = "Correcte" Then Label1.Text = RespCorrecta & ", el nucli de la Terra es troba a prop dels 6700ºC, una part d'aquesta calor es pot aprofitar per generar electricitat, però només en llocs especials (amb activitat volcànica). Tindràs una generació extra de 1500 kWh per aquest descobriment!!" EnergiaBase = EnergiaBase + 1500 Else Label1.Text = RespCorrecta & ", el nucli de la Terra es troba a prop dels 6700ºC, una part d'aquesta calor es pot aprofitar per generar electricitat, però només en llocs especials (amb activitat volcànica)." End If PictureBox1.BackgroundImage = ControlE.My.Resources._800px_GeysirEruptionNear End Select End Sub Código 10. Respuestas 11.10. Excepción Debido a que los factores climatológicos pueden provocar que el usuario no pueda llegar a la energía demandada, en el programa se genera una excepción. Cuando surge esa excepción, se muestra un mensaje al usuario, alertándole de que no se puede llegar a la energía demandada, y se avisa de que la ciudad vecina le prestará energía, intentando hacer un símil a la interconexión eléctrica que existe entre España y los países colindantes. Esta excepción se puede ver en el Código 11. '/////Comprobacion de energia total///////////// Dim total As Integer If Noche Then If Viento > 25 Then total = (FCicle.TrackBarCicle.Maximum) + (FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc) ElseIf Viento > 12 Then total = (FCicle.TrackBarCicle.Maximum) + (FEol.TrackBarEol.Maximum * 0.005 * AuxEol ^ 3 + (AumentoEolica / 100) * (FEol.TrackBarEol.Maximum * 0.0036 * AuxEol ^ 3)) + (FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc) ElseIf Viento > 4 Then total = (FCicle.TrackBarCicle.Maximum) + (FEol.TrackBarEol.Maximum * 0.0036 * AuxEol ^ 3 + (AumentoEolica / 100) * (FEol.TrackBarEol.Maximum * 0.0036 * AuxEol ^ 3)) + (FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc) Else 75 11. Modelo Matemático total = (FCicle.TrackBarCicle.Maximum) + (FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc) End If Else If Viento > 25 Then total = (FCicle.TrackBarCicle.Maximum) + (FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc) ElseIf Viento > 12 Then total = (FCicle.TrackBarCicle.Maximum) + (FEol.TrackBarEol.Maximum * 0.005 * AuxEol ^ 3 + (AumentoEolica / 100) * (FEol.TrackBarEol.Maximum * 0.0036 * AuxEol ^ 3)) + (FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc) + (FSol.TrackBarSol.Maximum + (AumentoSolar / 100) * (FSol.TrackBarSol.Maximum)) ElseIf Viento > 4 Then total = (FCicle.TrackBarCicle.Maximum) + (FEol.TrackBarEol.Maximum * 0.0036 * AuxEol ^ 3 + (AumentoEolica / 100) * (FEol.TrackBarEol.Maximum * 0.0036 * AuxEol ^ 3)) + (FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc) + (FSol.TrackBarSol.Maximum + (AumentoSolar / 100) * (FSol.TrackBarSol.Maximum)) Else total = (FCicle.TrackBarCicle.Maximum) + (FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc) + (FSol.TrackBarSol.Maximum + (AumentoSolar / 100) * (FSol.TrackBarSol.Maximum)) End If End If If total < EnergiaAbs Then MessageBox.Show("Sembla que no pots arribar. Però tranquil els veïns estan per això. La ciutat veïna et deixa electricitat.", "Oh oh", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) GraficEnergia(Vuelta) = EnergiaAbs Código 11. Control de excepción 11.11. Finalización Programa En cuanto han pasado 6 ciclos de programa (24 horas), se cierra el programa principal, y el usuario puede ver los valores de generación y los de consumo en función de la hora del día. La finalidad es la de establecer una relación entre las curvas de energía programada y energía generada, para que el usuario pueda ver como la energía va fluctuando a lo largo de un día, y que pueda intuir las denominadas horas pico y horas valle. 76 12. Conclusiones 12. Conclusiones Para finalizar, es necesario revisar el cumplimiento de los objetivos marcados: Hacer el programa más interactivo: el programa es mucho más intuitivo, dinámico y ameno. Utilizar un lenguaje más accesible para los usuarios: Visual Basic permite que todo usuario de Windows puede acceder a este programa y la modificación del código del mismo sea más fácil. Implementar diferentes niveles de dificultad: los diferentes niveles aseguran que el juego sea ameno para diferentes niveles de conocimientos. Adaptarse a diferentes resoluciones de pantalla: el programa funciona con resoluciones de pantalla a partir de 800x600 píxeles en adelante. No infringir derechos de imágenes: en todo el programa solo se han usado imágenes con derechos Creative Commons o hechas por mí, por tanto, no infringen ningún derecho, asegurando que el programa pueda distribuirse libremente, ya que los derechos de este trabajo pertenecen a la universidad. Continuar con la divulgación de la ingeniería eléctrica: al final se consigue que usuarios sin conocimientos en ingeniería, aprendan datos curiosos acerca de la misma. Por tanto, se han cumplido todos los objetivos marcados al principio de este proyecto. En mi opinión, la única carencia es la de un equipo externo para mejorar el atractivo del juego, parecido a una maqueta con diferentes dispositivos de entrada y salida, como pueden ser leds o botones. Finalmente me gustaría concluir este trabajo diciendo que ha sido uno de los más completos que he tenido ocasión de realizar. He podido llevar a la práctica muchas de las enseñanzas adquiridas a lo largo de la carrera. 77 13. Bibliografía 13. Bibliografía J.A. Barrado, Apuntes de la Asignatura Energías Renovables 2014-2015. Aprenda Microsoft Visual Basic 6.0 ya ,Michael Halvorson, McGrawHill, 1998. Microsoft Visual Basic 2010: step by step, Michael Halvorson, , Microsoft Press, 2010. http://www.ni.com/labview/esa/. [Info LabView] 2016 https://es.wikipedia.org/wiki/LabVIEW [Info LabView] 29/04/2016 https://msdn.microsoft.com/es-es/library/zkxk2fwf(v=vs.90).aspx. [Info C#] 11/2007 https://es.wikipedia.org/wiki/C_Sharp.[Info C#] 21/06/2016 https://msdn.microsoft.com/es-es/library/2x7h1hfk.asp.[Info Visual Basic] 2015 https://es.wikipedia.org/wiki/Visual_Basic [Info visual Basic] 08/07/2016 https://msdn.microsoft.com/es-es/library/3xdhey7w(v=vs.100).aspx[Controles Visual Basic] 2010 http://wwf.moccu.com/game.php?lang=es. [Juego WWF] http://proyectoislarenovable.iter.es/recursos/juegos/.[Información Juegos] http://xogo.climantica.org/es/index.html.[Juego CLMTK] http://www.sustainabilitygame.iberdrola.com/index.php.[Juego Iberdrola] 2013 http://www.electrocity.co.nz/Game/game.aspx[Juego ElectroCity] 2016 http://wwww.ree.es/educacion/controla/. [Juego REE] https://demanda.ree.es/demanda.html[Demanda REE] https://commons.wikimedia.org/wiki/File:Sarnia_Solar-06.JPG [Imagen Solar] https://commons.wikimedia.org/wiki/File:Weather-m-clear.svg [Icono Sol] https://commons.wikimedia.org/wiki/File:Weather-sun-unsettled.svg [Icono Sol y Nubes] https://commons.wikimedia.org/wiki/File:Gnome-weather-clear-night.svg[Icono Luna] https://commons.wikimedia.org/wiki/File:Asc%C3%B3_nuclear_power_plant__smokestack.JPG[Imagen central nuclear] 78 13. Bibliografía https://commons.wikimedia.org/wiki/File:Ciclo_combinado_Plana_del_Vent.jpg[Ciclo Combinado] https://commons.wikimedia.org/wiki/File:Icon_tools.svg[Icono Herramienta] https://commons.wikimedia.org/wiki/File:Flecha_arriba.svg[Icono Flecha] https://commons.wikimedia.org/wiki/File:IoTnabled_Smart_City_Framework_White_Paper_Image _2.png [Imagen Smart City] https://commons.wikimedia.org/wiki/File:Biomass_Pellets_from_India_-_White_coal..jpg[Imagen pellets] https://commons.wikimedia.org/wiki/File:Optbuoy.jpg[Imagen Power Buoy] https://commons.wikimedia.org/wiki/File:Jorge_Aguiar_Wind_rose.jpg[Imagen Vientos] https://commons.wikimedia.org/wiki/File:GeysirEruptionNear.jpg[Imagen Geiser] 79 Rosa de los