scieee AI-readable full text Open interactive document viewer

Trazador de curvas I-V inalámbrico para paneles solares

James Siboco, Óscar

Abstract

Este proyecto se centra en diseñar e implementar un sistema para el monitoreo y la transmisión de datos de paneles fotovoltaicos con el propósito de trazar la curva corrientetensión. Se detalla el desarrollo del diseño de la PCB y los diferentes sistemas asociados necesarios para alcanzar este objetivo. El principal componente del circuito es la Raspberry Pi Pico, que será la encargada de realizar las lecturas y junto a un módulo LoRa lograr enviarlas, gracias al desarrollo de un programa en C. Se explica en detalle el proceso de programación de la Raspberry para lograrlo, también el proceso de configuración de los equipos y redes asociados al sistema entre ellos destacar una Raspberry Pi que funciona como Gateway LoRa gracias a un módulo Lora. Para el ecosistema de monitoreo se le integrado MQTT para que así los datos recibidos se publiquen ahí y que gracias a un programa desarrollado en Python podemos consultar los mensajes recibidos suscribiéndonos, también con el programa Python gestionamos los datos recibidos. Este proyecto ofrece una solución integral para el monitoreo remoto de paneles fotovoltaicos, aprovechando la potencia de la Raspberry Pi Pico, la eficiencia de la tecnología LoRaWAN y la versatilidad del protocolo MQTT. Además de proporcionar datos en tiempo real sobre el rendimiento de los paneles.

Full text

Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 1 TRABAJO FINAL DE GRADO APELLIDOS: JAMES SIBOCO NOMBRE: Óscar TITULACIÓN: GRADO EN INGENIERÍA ELECTRÓNICA INDUSTRIAL Y AUTOMÁTICA PLAN: 2009 DIRECTOR: Joaquín Olive Duran. TUTOR: Joaquín Del Rio Fernandez. DEPARTAMENTO: EEL - Departamento de Ingeniería Electrónica TÍTULO: Trazador de curvas I-V inalámbrico para paneles solares. AUTORES: JAMES SIBOCO, Óscar FECHA DE PRESENTACIÓN: Abril, 2024 Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 2 Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 3 Agradecimientos Quiero aprovechar este espacio para expresar mi más sincero agradecimiento a todas las personas e instituciones que han contribuido de manera significativa a la realización de este Trabajo de Fin de Grado. Sus esfuerzos y apoyo han sido fundamentales en cada etapa de este proyecto. En primer lugar, quiero agradecer de manera especial a mi tutor, Joaquín del Río. Su dedicación, paciencia y profundo conocimiento en el campo han sido pilares clave en el desarrollo de este trabajo. Sus orientaciones, sugerencias y motivación constante han enriquecido enormemente mi experiencia académica y profesional. Agradezco también al equipo de SARTI por brindarme la oportunidad de utilizar sus instalaciones y recursos. La colaboración con este equipo ha permitido llevar a cabo experimentos y análisis de manera efectiva, contribuyendo así al éxito de este proyecto. A mi querida novia, MIPAU, le debo un agradecimiento especial por su amor, comprensión y apoyo incondicional a lo largo de este proceso. Sus palabras de aliento, su paciencia y su presencia constante han sido un verdadero motor que me ha impulsado a superar obstáculos y mantenerme enfocado en mis metas académicas. Te quiero un montón y agradezco cada momento compartido juntos. No puedo dejar de mencionar el papel fundamental de mi familia en este logro. A mis padres, quienes han sido mi ejemplo de esfuerzo y dedicación, les agradezco por su constante apoyo emocional y por brindarme las herramientas necesarias para alcanzar mis sueños. A mi Tío Florencio, por su sabiduría y consejos oportunos, y a mis hermanos, por ser mi red de apoyo y motivación constante, les dedico un profundo agradecimiento. A todos mis amigos y seres queridos que han estado presentes durante este camino, gracias por comprender mis ausencias, por celebrar mis logros y por alentarme en los momentos difíciles. Este logro no sería posible sin el apoyo y la colaboración de cada una de estas personas e instituciones. A todos ustedes, mi más sincero reconocimiento y gratitud por formar parte de este importante capítulo en mi vida académica. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 4 Para Faustino James y Esther Siboco: Queridos mamá y papá, No puedo expresar con palabras la gratitud que siento hacia ustedes. Desde el momento en que nací, han sido mis guías, mis modelos a seguir y mis más grandes apoyos. Vuestra dedicación y amor incondicional han sido el faro que ha iluminado cada paso de mi camino. Vuestra filosofía de vida, la creencia inquebrantable de que puedo lograr cualquier cosa que me proponga, ha sido mi brújula en este viaje universitario en España. Vuestra confianza en mí me ha impulsado a superar desafíos, a crecer y a alcanzar mis metas y siempre seguiré los que dice Proverbios 1:8 y 1Timoteo 5:8. Gracias por sacrificar tanto para financiar mis estudios en un país extranjero. Vuestra generosidad y sacrificio no pasarán desapercibidos ni serán olvidados NUNCA. Cada euro invertido en mi educación ha sido una inversión en mi futuro, y prometo honrar esa inversión con cada logro que alcance. El lema de nuestra familia, "Cree en tu proyecto", no solo ha sido una frase inspiradora, sino la base misma de mi existencia en este país. Vuestra fe inquebrantable en mí me ha dado fuerzas para perseverar, para seguir adelante incluso cuando los desafíos parecían insuperables. Hoy, al culminar este proyecto de fin de estudios universitarios, quiero dedicar este logro a ustedes, mis queridos padres. Sois mi mayor orgullo, mi inspiración y mi razón de ser. Sin vuestro amor, apoyo y enseñanzas, nada de esto habría sido posible. Gracias por ser los pilares de mi vida, por estar siempre a mi lado en cada paso del camino. Os amo más de lo que las palabras pueden expresar. Con amor y gratitud infinitos. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 5 Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 6 Resumen: Castellano: Este proyecto se centra en diseñar e implementar un sistema para el monitoreo y la transmisión de datos de paneles fotovoltaicos con el propósito de trazar la curva corrientetensión. Se detalla el desarrollo del diseño de la PCB y los diferentes sistemas asociados necesarios para alcanzar este objetivo. El principal componente del circuito es la Raspberry Pi Pico, que será la encargada de realizar las lecturas y junto a un módulo LoRa lograr enviarlas, gracias al desarrollo de un programa en C. Se explica en detalle el proceso de programación de la Raspberry para lograrlo, también el proceso de configuración de los equipos y redes asociados al sistema entre ellos destacar una Raspberry Pi que funciona como Gateway LoRa gracias a un módulo Lora. Para el ecosistema de monitoreo se le integrado MQTT para que así los datos recibidos se publiquen ahí y que gracias a un programa desarrollado en Python podemos consultar los mensajes recibidos suscribiéndonos, también con el programa Python gestionamos los datos recibidos. Este proyecto ofrece una solución integral para el monitoreo remoto de paneles fotovoltaicos, aprovechando la potencia de la Raspberry Pi Pico, la eficiencia de la tecnología LoRaWAN y la versatilidad del protocolo MQTT. Además de proporcionar datos en tiempo real sobre el rendimiento de los paneles. Palabras clave: Panel fotovoltaico, Raspberry, PCB, LoRa, C, MQTT, Ubuntu, LoRaWAN, Python. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 7 Catalán: Aquest projecte se centra en el disseny i implantació d'un sistema que permet el monitoratge i transmissió de dades de panells fotovoltaics per a traçar la corba corrent-tensió. Es detalla el desenvolupament del disseny de la PCB i els diferents sistemes associats per a aconseguir l'objectiu. El principal component del circuit és la Raspberry Pi Pico, que serà l'encarregada de realitzar les lectures i al costat d'un mòdul LoRa aconseguir enviar-les, gràcies al desenvolupament d'un programa en C. S'explica amb detalls el procés de programar la Raspberry per a aconseguir-lo, també el procés de configuració dels equips i xarxes associats al sistema entre ells destacar una Raspberry Pi que funciona com Gateway LoRa gràcies a un mòdul Lora. Per a l'ecosistema de monitoratge se li integrat MQTT perquè així les dades rebudes es publiquin aquí i que gràcies a un programa desenvolupat en Python podem consultar els missatges rebuts subscrivint-nos, també amb el programa Python gestionem les dades rebudes. Aquest projecte ofereix una solució integral per al monitoratge remot de panells fotovoltaics, aprofitant la potència de la Raspberry Pi Pico, l'eficiència de la tecnologia LoRaWAN i la versatilitat del protocol MQTT. A més de proporcionar dades en temps real sobre el rendiment dels panells. Paraules clau: Panells fotovoltaics, Raspberry, PCB, LoRa, C, MQTT, Ubuntu, LoRaWAN, Python. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 8 Inglés: This project focuses on the design and implementation of a system that allows for the monitoring and transmission of data from photovoltaic panels to plot the current-voltage curve. The development of the PCB design and the different associated systems to achieve the goal are detailed. The main component of the circuit is the Raspberry Pi Pico, which will be responsible for taking readings and, together with a LoRa module, sending them thanks to the development of a program in C. The process of programming the Raspberry to achieve this is explained in detail, as well as the configuration process of the equipment and networks associated with the system, including highlighting a Raspberry Pi that acts as a LoRa Gateway thanks to a LoRa module. For the monitoring ecosystem, MQTT has been integrated so that the received data is published there, and thanks to a program developed in Python, we can subscribe to the received messages. Also, with the Python program, we manage the received data. This project offers a comprehensive solution for the remote monitoring of photovoltaic panels, taking advantage of the power of the Raspberry Pi Pico, the efficiency of LoRaWAN technology, and the versatility of the MQTT protocol. In addition to providing real-time data on the performance of the panels. Keywords: Photovoltaic panels, Raspberry, PCB, LoRa, C, MQTT, Ubuntu, LoRaWAN, Python. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 9 Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 16 INDICE DE TABLAS: Tabla 1. Tabla especificaciones Modulos SX1262. ....................................................................... 50 Tabla 2. Características Módulos LoRa. ....................................................................................... 54 Tabla 3. Caraterísticas Pico Lora SX1302. .................................................................................... 55 Tabla 4. Lista de Componentes. ................................................................................................... 67 INDICE DE GRÁFICAS: Gráfica. 1 Gráfica de la Intensidad. ............................................................................................. 99 Gráfica. 2 Gráfica de la Tensión. .................................................................................................. 99 Gráfica. 3. Tensión y Corriente. ................................................................................................. 100 Gráfica. 4 Gráfica I-V .................................................................................................................. 100 Gráfica. 5 Gráfica de tensión de varias lecturas. ....................................................................... 101 Gráfica. 6 Gráfica corriente de varias lecturas. ......................................................................... 101 Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 17 Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 18 1. Memoria. 1.1 Objetivo. Este Trabajo de Fin de Grado se centra en el desarrollo de un circuito electrónico destinado a la caracterización de paneles fotovoltaicos mediante la medición de la relación entre la tensión (V) y la corriente (I) en diferentes condiciones de operación. El circuito será diseñado y fabricado en una placa de circuito impreso (PCB) para garantizar una implementación eficiente y precisa. La adquisición de datos y la transmisión se llevarán a cabo utilizando una Raspberry Pico, que actuará como el núcleo del sistema. La tecnología de comunicación LoRa (LongRange) se utilizará para transmitir los datos recopilados de tensión y corriente a una estación base, permitiendo un monitoreo remoto y en tiempo real. Con un programa a aparte en Python suscribirnos a los mensajes MQTT que contendrán los datos y con este mismo programa gestionar los datos para trazar la curva. Este proyecto fusiona los campos de la electrónica, la adquisición de datos y las comunicaciones inalámbricas, promoviendo la utilización eficiente de la energía solar y el avance hacia un desarrollo sostenible en la generación de energía renovable. Las fases para conseguir estos objetos son las siguientes: - Diseño de los circuitos analógicos que realizarás las mediciones. - Simulación por partes de los circuitos y simulación del circuito general. - Programación de la pico: Adquisición de datos (V, I), Transmisión de datos. - Comunicación LORA. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 19 1.2. Estudio 1.2.1. Paneles Solares. Los paneles solares son dispositivos que aprovechan la energía del sol para generar electricidad de forma limpia y renovable. En el siglo XIX el francés Alexandre-Edmond Becquerel descubrió que ciertos materiales tenían la capacidad de producir una corriente eléctrica al ser iluminados, este fenómeno se denominó efecto fotovoltaico. El primer panel solar moderno se construyó en 1954, utilizando silicio como semiconductor, a día de hoy los paneles has experimentado un gran desarrollo tecnológico, gracias a esto se ha conseguidos diversificar sus aplicaciones, conseguir paneles con mayore rendimiento a un costo bajo, etc. Los paneles solares ya no solo se utilizan para generar energía en sistemas aislados. Los paneles solares son ampliamente utilizados en instalaciones residenciales, comerciales e industriales. Las instalaciones de energía solar flotante, los parques solares a gran escala y la incorporación de paneles solares en edificios y dispositivos móviles son solo algunos ejemplos de la versatilidad de esta tecnología. Los paneles solares también son una parte importante de la producción de energía renovable y la lucha contra el cambio climático. La adopción creciente de paneles solares ha tenido un impacto positivo en el medio ambiente porque ha disminuido las emisiones de gases de efecto invernadero y ha reducido la dependencia de fuentes de energía no renovables. La industria solar ha experimentado un auge económico, lo que ha generado empleo y fomentado la innovación. Sin embargo, problemas como la gestión de desechos electrónicos y la necesidad de mejorar la productividad de los procesos de fabricación siguen siendo un tema de preocupación.[1], [2], [3] Figura 1. Paneles Solares Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 20 Los paneles solares se pueden clasificar de la siguiente forma: 1. Según la tecnología de células solares[4]: • Paneles solares de silicio Monocristalino: Utilizan células solares hechas de un solo cristal de silicio, lo que los hace muy eficientes en términos de energía. • Paneles solares Policristalino: Están hechos de células solares de varios cristales de silicio. Su producción es más económica, aunque su eficiencia es ligeramente más baja. • Paneles solares de capa fina (Thin-Film): Estos paneles utilizan materiales semiconductores depositados en capas delgadas sobre un sustrato. Incluyen tecnologías como telururo de cadmio (CdTe), sulfuro de cadmio (CIS/CIGS) y silicio amorfo. Tienen ventajas en términos de flexibilidad y costos de producción, pero su eficiencia suele ser menor. 2. Según su aplicación[5]: • Paneles solares fotovoltaicos residenciales: Están diseñados para aplicaciones en hogares, suelen tener un tamaño más pequeño. • Paneles solares comerciales e industriales: Son los utilizados en instalaciones comerciales e industriales para satisfacer las demandas energéticas más grandes, el tamaño suele ser grande y tiene mayor capacidad. • Paneles solares flotantes: estos paneles funcionan sobre cuerpos de agua como lagos o embalses y utilizan la superficie del agua para generar energía. • Paneles solares portátiles: Son ideales para aplicaciones móviles como cargar dispositivos electrónicos en el exterior o en situaciones de emergencia porque son ligeros y adaptables. 3. Según la conexión eléctrica: • Paneles Solares Conectados a la Red (Grid-Tied)[6]: Estos paneles están conectados al sistema eléctrico convencional, lo que les permite inyectar energía en la red y utilizarla cuando los paneles no producen suficiente electricidad. • Paneles Solares Aislados (Off-Grid): También conocidos como paneles solares off-grid, funcionan de forma independiente y no están conectados a la red eléctrica. Se utilizan en sistemas de energía autónomos o en lugares remotos sin acceso a la red. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 21 1.2.2. Raspberry pi y Raspberry pi pico. La Raspberry Pi Pico es una placa de desarrollo basada en el microcontrolador RP2040, el primer chip diseñado por la fundación Raspberry Pi. A diferencia de las otras placas de la misma fundación, que son mini ordenadores con Linux, la Pico es una placa orientada a proyectos de bajo consumo y tamaño reducido, como aplicaciones embebidas, robótica o IoT. La Pico se puede programar en C/C++ o MicroPython, usando el SDK oficial o el IDE de Arduino. El RP2040 es un procesador ARM Cortex-M0+ de doble núcleo a 133MHz, con 264KB de RAM interna y 2MB de memoria flash externa. Dispone de 26 pines GPIO, 16 canales PWM, 3 entradas analógicas de 12 bits, 2 UART, 2 SPI y 2 I2C. Además, cuenta con 8 PIO (programable I/O), una circuitería configurable que permite implementar funciones personalizadas. El RP2040 no tiene conectividad inalámbrica, ni salidas DAC, ni conexión directa LCD o HDMI. La placa de desarrollo Raspberry Pi Pico tiene un tamaño de 21x51 mm y se puede alimentar por micro USB o por el pin VSYS (1.8 a 5.5V). Tiene un puerto debug (SWD), un led integrado y un RTC. La tensión de funcionamiento del RP2040 es 3V3, pero la placa tiene un SMPS (Switched Mode Power Supply) que permite adaptar la alimentación desde diferentes fuentes. La Raspberry Pi Pico tiene un precio de unos 4€ y se puede comprar en diferentes tiendas online[7] . 1.2.3. LoRa y LoRaWAN. Figura 2. Logo LoRaWAN La tecnología LoRa es una técnica de modulación inalámbrica que permite la comunicación de largo alcance y bajo consumo entre dispositivos del Internet de las Cosas (IoT). LoRa es un acrónimo de Long Range y se basa en la tecnología de espectro ensanchado de chirp (CSS). LoRa es una tecnología propietaria desarrollada por Semtech, que fabrica los chips transceptores que la implementan. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 22 LoRaWAN es una red de área amplia de baja potencia (LPWAN) que utiliza la tecnología LoRa como capa física. LoRaWAN es un protocolo de red que define la arquitectura, la seguridad y la gestión de los dispositivos LoRa que se comunican a través de gateways con un servidor de red. LoRaWAN es un estándar abierto mantenido por la LoRa Alliance, una asociación de más de 500 empresas que promueven el uso de esta tecnología. La tecnología LoRa y LoRaWAN tiene sus orígenes en el año 2009, cuando la empresa francesa Cycleo desarrolló el primer chip LoRa. En 2012, Cycleo fue adquirida por Semtech, que lanzó el primer chip comercial LoRa en 2013. En 2015, se fundó la LoRa Alliance y se publicó la primera especificación del protocolo LoRaWAN. Desde entonces, la tecnología LoRa y LoRaWAN ha experimentado un gran desarrollo y utilización en diversos sectores y aplicaciones, como la agricultura inteligente, el monitoreo ambiental, el seguimiento de activos, las ciudades inteligentes y la industria 4.0[8], [9]. Figura 3. Esquema LoRaLoRaWAN. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 23 1.2.4. Estado de arte. Hay varias formas de medir la tensión y la corriente de los paneles solares para así trazar la curva IV, desde equipos de medición portátil hasta electrónicas externas conectadas a los paneles. • IV500w: Se trata de un instrumento para el mantenimiento y la resolución de los problemas sobre instalaciones fotovoltaicas de 1500V / 10 A ó 1000V/15 A. Hace a medida de la caracteriza I-V de uno o más módulos o de un grupo de módulos[10]. Figura 4. IV500W. • IV Swinger I: Se trata de una caja/instrumento compuesta por una rapsberry pi model B, que junto a un convertidor ADC de 16 bits y otros elementos trazan la curva IV. [11]. Figura 5. IV Swinger I. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 24 • IV Swinger II: Es el modelo siguiente al IV swinger I, en este caso la caja es más pequeña ya que los componentes también lo son. En este caso se usa un Arduino Uno y no una raspberry pi, también se simplifican los circuitos de sensado[11], [12]. Figura 6. IV Swinger II. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 25 Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 32 Figura 13. Bloque relés 2 - Circuito de alimentación y protección: Con este circuito alimentamos los diferentes componentes de la placa. En la entrada hay un fusible de 2 A de protección seguido de varistor, los cuales protegen contra sobre corriente y sobre tensión respectivamente, después viene el convertidos de dc/dc con el filtro correspondiente según el fabricante. A la salida del convertidos va un supercondensador en paralelo que es quien hará que el sistema se mantenga alimentado cuando los relés conmuten, de esta forma el sistema se mantendrá alimentado cuando se esté realizando la lecturas ya que se desconectará durante el periodo de lectura, la salida del convertidos es de 3.3 V que alimentará a todos los componentes de la placa que se vayan a esta tensión, para generar una tensión de bipolar tenemos un el regulador de tensión ICL7660SCBAZ-T que se alimenta con la tensión de salida del convertidor (+3.3V) y genera una tensión de salide inversa a la de entrada (-3.3V) gracias a la configuración recomendada por el fabricante utilizando dos condensadores de 10µF. Figura 14. Circuito de alimentación y protección Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 33 - Circuito de medida de la tensión del panel: El circuito consta de un divisor de tensión, cuya salida va a un seguidor de tensión y la salida del seguidor a la entrada de la pico. Existe la opción de leer la tensión sin el seguidor gracias al jumper, eso permitiría hacer la lectura si el circuito del seguidor de tensión no estuviera montado. Vout = 𝑅2 𝑅2+ 𝑅1 ∗ 𝑉𝑖𝑛 Vout = 60.4𝑘Ω + 430Ω (60.4𝑘Ω + 430Ω)+953kΩ∗ 𝑉𝑖𝑛 Vout = 0.06 ∗ 𝑉𝑖𝑛 El valor de la tensión de entrada variará dependiendo del panel que se use, ya que la entrada del microcontrolador puede leer como máximo 3.3V, el valor máximo de salida del panel debe ser de 55V. - Circuito de medida de la corriente durante el proceso de captura de la curva I-V: El circuito de para medir la corriente consta de un condensador de 1000µF en serie con una resistencia de 2Ω, una vez hecha la lectura el relé se pone en NC(normalmente cerrado) para así realizar la descarga del condensador. En el siguiente bloque tenemos un divisor de cuya entrada es la salida del del circuito anterior, en la salida del divisor tenemos un Zener y un seguidor de tensión que va a una entrada de la pico. Entre estos dos circuitos tenemos el circuito opcional de un amplificador no inversor para amplificar la señal en el caso de que hiciera falta. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 34 Figura 15. Circuito medida I-V. - Conectores: Tenemos tres conectores los cuales son: La entrada del panel y dos que corresponden a la serie de paneles, que hace que se conecten las paneles entres si. Figura 16. Conectores Línea serie de paneles y conector panel DISEÑO DEL CIRCUITO IMPRESO (PCB) Para el diseño de la placa PCB se ha seguido los siguientes pasos: - Tener en cuenta el tamaño de placa, la placa se montaría dentro de una caja de conexión, la elegida para el proyecto es el HP 100L de Junction box que mide 113 x 113 x 58 mm. Figura 17. Cotas caja de conexión. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 35 - Los pines de los relés que estén conectados a los paneles recibirán una corriente de 10 A y es por eso deben ser más anchos para poder aguantar, para ello hemos usado una calculadora en el que pondremos las características de nuestra PCB para que así calcule el ancho de las pistas [13]. Para nuestro caso queda así: Figura 18. Tabla cálculo pista conexiones 10 A. - Para las otras pistas al no ser críticos las trazaremos con una anchura más pequeña. - Estableciendo estas reglas diseño en el Easyeda obtenemos la siguiente tabla: Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 36 Figura 19. Regla de diseño PCB. - Una vez hecha la regla de diseño trazamos las pistas y queda de esta forma: Figura 20. PCB con las pistas trazadas. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 37 - Con las pistas trazadas chequeamos que no haya ningún error de diseño DRC (Design Rule Check). Figura 21. Verificación de error DRC. - Trazamos una malla de masa por toda la placa. Figura 22. PCB con la malla de masa. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 38 - Con esto ya tenemos la PCB lista. Figura 23. PCB en 2D. Figura 24. PCB en 3D. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 39 • Visual Studio Code: Es un editor de código de varios lenguajes de programación desarrollado por Microsoft. Es multiplataforma y compatible con: Windows, macOS y Linux. Ofrece un editor de texto potente y con funciones muy versátiles y útiles como el autocompletado inteligente y otras funciones. También cuenta con un sistema de extensiones para diferentes lenguajes que permiten personalizar aún más la experiencia del usuario y ampliar sus funcionalidades. Cuenta con una comunidad muy extensa y activa que contribuye con las extensiones, proporciona soporte a través de foros y otros canales. • Tera Term: Es un programa gratis de emulación de terminar que nos permite comunicar de forma remota nuestro ordenador con dispositivo remoto a través de una conexión serie o TCP/IP. En este caso usaremos la comunicación serie para con la raspberry pi pico. Figura 25. Configuración Tera Term. Al seleccionar la opción de comunicación serie en programa debemos configura el puerto serie yendo a ajustespuerto serie, una vez ahí configuramos la velocidad en nuestro caso será de 115200 bits por segundos. Figura 26. Configuración puerto serie. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 40 Figura 27. Configuración velocidad puerto serie. En este proyecto vamos a usar un cable FTDI USB a TTL que conectado al UART1, donde RX es el pin 6 de la pico que corresponde a GP4, TX es el pin 7 que corresponde a GP7. La entrada RX de la pico se conecta al pin TX del cable FTDI y el pin TX de la pico va conectado al RX del cable FTDI, es importante unir los GND para un correcto funcionamiento. Figura 28. Pines UART1 de la pico. Figura 29. Pinout Cable FTDI USB a TTL. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 41 • Ubuntu: Es un sistema operativo de código abierto gratuito de Linux. Para el desarrollo de este trabajo tendremos que instalarlo en Window, ahí desarrollaremos toda la programación de la Pico en lenguaje C. A continuación, viene los pasos seguidos[14]: 1) Habilitar el subsistema de Windows para Linux: Esto permite la instalación de Ubuntu en el sistema operativo de Windows. Para ello: o Abre el "Panel de Control" desde el menú de inicio de Windows. o Selecciona "Programas" y luego "Programas y Características". o En la barra lateral izquierda, haz clic en "Activar o desactivar las características de Windows". Figura 30. Configuración Ubuntu. o Busca "Subsistema de Windows para Linux" en la lista y marca la casilla. Al marcar haz clic en "Aceptar" y espera a que Windows realice los cambios. Se tendrá que reiniciar el sistema. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 48 Figura 34. Pinout Raspberry Pi Pico. Para este proyecto se ha usado el lenguaje C, ya de esta forma tenemos acceso más bajo del control de hardware y así aprovechar al máximo los recursos y funcionalidades, permitiendo tener un proyecto más eficiente. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 49 2.2.2.2 LoRa Para la transmision de los datos leidos por los canales vamos a usar la tecnología LoRa (Long Range), es un protocolo de comunicación inalámbrica que está diseñado para operar a grandes distancias y es de bajo consumuno, destaca por su versatilidad y bajo costo. Con la tecnología LoRa se puede realizar comunicaciones entre dispositivos a una distancia de hasta 30 kilómetros en condiciones de campo abierto, y tolerando ruido. La tecnologia LoRa se ha revolucioado el desarrollo del en el campo de redes para el Internet de las Cosas (IoT), se aplica en una amplia variedad de sectores tales como[8], [9], [15]: 1. Agricultura e irrigación: LoRa se utiliza para la monitorización del clima, suelo y cultivos a larga distancia, lo que permite una gestión eficiente de la agricultura. Además, se emplea en la automatización de sistemas de riego y ventilación, así como en la predicción de cosechas y la planificación agraria. 2. Edificios inteligentes: En el ámbito de la construcción inteligente, LoRa se utiliza para la monitorización de consumos por zonas y usos, control de iluminación, ajuste remoto de temperaturas, gestión de sistemas de HVAC (Calefacción, Ventilación y Aire Acondicionado), y medición de energía. 3. Medida de energía y consumos: LoRa es esencial para la recopilación de datos de contadores de energía en grandes instalaciones y superficies, facilitando la medición y gestión de los consumos. 4. Generación de energía solar: Las instalaciones de paneles solares aprovechan LoRa para reducir costos de instalación, cableado y mantenimiento al permitir la monitorización eficiente de su rendimiento. 5. Monitoreo de agua y gas: La tecnología LoRa se utiliza para el monitoreo en tiempo real del consumo de agua y gas, lo que ayuda a las empresas de servicios públicos y a los consumidores a gestionar su uso y detectar posibles fugas. 6. Monitoreo de la contaminación del aire: Los sensores de calidad del aire equipados con LoRa pueden transmitir datos sobre la calidad del aire en tiempo real a las estaciones de monitoreo, lo que facilita la toma de medidas para mejorar la calidad del aire. 7. Seguimiento de flotas: En el seguimiento de flotas, LoRa proporciona actualizaciones en tiempo real sobre la ubicación y el estado de los vehículos, permitiendo a las empresas de logística optimizar sus operaciones. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 50 Hay varios módulos LoRa, a continuación, hablaremos de algunos: • SX1262 433MHz LoRa Node Module for Raspberry Pi Pico: se trata de una palca de expansión LoRa que permite enviar y recibir datos a través de las frecuencias 868 MHz, 433 MHz y 915 MHz, dependiendo de la normativa y la región en el que nos encontremos. Se basa en el chip SX1262 de Semtech que soporta los tres rangos de frecuencia LoRa ya mencionados. Se puede conectar a una antena externa con un conector SMA y con una antena interna con el conector IPEX. Se puede integrar con una red LoRaWAN. Figura 35. SX1262 433MHz LoRa Node Module for Raspberry Pi Pico Tabla 1. Tabla especificaciones Modulos SX1262. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 51 • Raspberry Pi Pico LoRa™ Expansion: Es una placa de expansión que se puede una Raspberry Pi Pico, la placa incluye un módulo LoRa basado en el chip SX1276 de Semtech. Cuenta con una pantalla de 1,14 pulgadas que ese puede usar para mostrar información, se puede conectar una antena externa a través del conector SMA E22-900T22S/E22-400T22S que viene integrado y también conectar una antena interna con un conector IPEX. Se puede conectar a una red LoRaWAN. Está diseñada para permitir la transferencia de datos hasta 5 Km. Figura 36. Raspberry Pi Pico LoRa™ Expansion [16]. • Dragino LoRa/GPS HAT: Se trata de un módulo LoRa de alta calidad, es compatible con la gama de placas Raspberry Pi, incluida la Raspberry Pi Pico. Viene con un receptor GPS que permite la ubicación y seguimiento GPS, este módulo GPS está basado en el chip MTK MT3339. Dispone de un conector SMA para una antena externa y un conector IPEX para una antena interna que se puede elegir según las necesidades y se integrar con la red LoRaWAN [17]. Figura 37. Dragino LoRa/GPS HAT. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 52 • Dorji DRF1278F LoRa Module: Este cuenta con el chipset SX1278 y aunque no esté diseñado específicamente para las placas Raspberry Pi Pico, opera en las tres frecuencias LoRa 433 MHz, 868 MHz y 915 MHz. El módulo se puede conectar a un microcontrolador, Arduino, Raspberry pico mediante la interfaz SPI estándar [18]. Figura 38. Dorji DRF1278F LoRa Module. • HopeRF RFM9X LoRa Transceiver Module: Este módulo es compatible con dispositivos que soporten la interfaz SPI, utiliza el chipset Semtech SX1276/ SX1277/ SX1278. Es capaz de realizar las siguientes modulaciones: FSK,GFSK, MSK,GMSK, LoRa y OOK. Es muy eficiente en cuanto a consumo de energía[19]. Figura 39. HopeRF RFM9X LoRa Transceiver Module. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 53 • Adafruit RFM95W LoRa Radio FeatherWing: Este módulo utiliza el chipset Semtech SX1276/SX1277/SX1278 para la comunicación LoRa, es compatible con las placas Raspberry Pi Pico u otras placas Raspberry Pi mediante la conexión de pines GPIO. Este está disponible en varias versiones que operan en diferentes bandas de frecuencia, como 433 MHz, 868 MHz y 915 MHz, dependiendo de la versión que elijas y las regulaciones de tu región. Es posible conectar una antena para mejorar el rendimiento de la comunicación [20]. Figura 40. Adafruit RFM95W LoRa Radio FeatherWing. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 54 Características Adafruit RFM95W LoRa Radio FeatherWing Raspberry Pi Pico LoRa™ Expansion Dragino LoRa/GPS HAT Dorji DRF1278F LoRa Module HopeRF RFM9X LoRa Transceiver Module Chipset LoRa Semtech (SX1276) Semtech (SX1276) Semtech (SX1276) Semtech (SX1278) Semtech (SX1276/ SX1277/ SX1278) Compatibilidad con Raspberry Pi Sí Sí Sí No No Compatibilidad con Raspberry Pi Pico Si Sí No No No Frecuencias Disponibles 868 MHz, 433 MHz, 915 MHz 868 MHz, 433 MHz, 915 MHz 868 MHz, 433 MHz, 915 MHz 868 MHz, 433 MHz, 915 MHz 868 MHz, 433 MHz, 915 MHz Conectividad Interfaz SPI Interfaz SPI Interfaz SPI Pines de datos y energía Pines de datos y energía GPS Integrado No No Sí No No Conector de Antena SMA o Cable Conector U.FL SMA Pines Pines Consumo de Energía Varía Varía Varía Varía Varía Software y Controladores Requiere controladores Requiere controladores Requiere controladores Requiere controladores Requiere controladores Aplicaciones Típicas Comunicación LoRa Comunicación LoRa Comunicación LoRa Comunicación LoRa Comunicación LoRa Disponibilidad Ampliamente disponible Ampliamente disponible Ampliamente disponible Ampliamente disponible Ampliamente disponible Flexibilidad de Uso Sí Sí Sí Sí Sí GPS Integrado No Sí Sí No No Consumo de Energía Eficiente Varía Varía Varía Varía Varía Regulaciones de Frecuencia Depende de la versión Depende de la versión Depende de la versión Depende de la versión Depende de la versión Tabla 2. Características Módulos LoRa. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 55 Para la comunicación usaremos también un Gateway, actúan como puente entre los dispositivos finales LoRa como los sensores o dispositivos IoT y la estructura de red creada. El Gateway recibe los datos transmitidos por los dispositivos y los envía a través de una conexión de red más amplia para su procesamiento y análisis. Son importantes para extender el alcance de las comunicaciones, para proporcionar cobertura a una amplia área y permitir la comunicación entre dispositivos LoRa dispersos. Hay varios modelos en el mercado, estos son algunos de ellos: • Pico LoRaSX1302: Este módulo se puede conectar a la pico mediante los pines GPIO, se basa en el chip SX1302 que es una nueva generación chips LoRa para gateway. Para la comunicación usa el bus SPI, I2C. Tabla 3. Caraterísticas Pico Lora SX1302. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 56 Figura 41. Pico LoRaWANSX1302. GESTIÓN DE LORAWAN Para la conexión de los dos dispositivos a la red Lorawan lo haremos en la web www.thethingsnetwork.org, en primer lugar, tendremos que darnos de alta en la web para así tener un perfil donde gestionar nuestros proyectos. Una vez dado creado el perfil tendremos que dar de alta nuestros dispositivos de la siguiente forma: - Dar de alta Gateway: Para instalar las librerías y saber las credencias de conexión a la red Lorawan hay que seguir los siguientes pasos[21], [22]: 1. En la raspberry pi debemos introducir los siguientes comandos: sudo apt update sudo apt install git cd ~/Documents/ git clone https://github.com/Lora-net/sx1302_hal.git cd sx1302_hal make clean all make all cp tools/reset_lgw.sh util_chip_id/ cp tools/reset_lgw.sh packet_forwarder/ 2. Una vez finalizado tendremos que obtener la credencial EUI de nuetro Gateway con el comando siguiente: # get sx1302 EUI cd ~/Documents/sx1302_hal/util_chip_id/ ./chip_id Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 57 3. Nos dirigimos a nuestro navegador para ir a nuestra cuenta creada en la web www.thethingsnetwork.org para dar de alta nuestro Gateway nos dirigimos al apartado de la imagen. Figura 42. Página principal config. LoRaWAN. 4. Después nos vamos al apartado de añadir nuevo Gateway. Figura 43. Añadir Gateway. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 64 2.2.2.3 Lista de componentes PCB Para el desarrollo del trazador contamos con varios componentes importantes que ayudan en al corrector funcionamiento de la placa, a continuación, describiremos la función de todos los componentes importantes de la PCB y una tabla donde se recogen todos y cada uno de los componentes de la placa. A la hora de elegir que componentes usar hemos tenido en cuenta que cumplan la normativa, entre ellas la ambiental RoHS. - Raspberry Pi Pico y Módulo LoRa: Los dos componentes van conectado uno encima del otro, la rapsberry pi es la que se encarga de leer mediante sus canales ADC y el módulo Lora es el encargado de realizar los envíos de las lecturas y encargado de conectarse a la red Lorawan. Figura 52. Raspberry Pi Pico y Hat Lora. - Tensión de referencia: Se encarga de proporcionar tensión de referencia al ADC de la raspberry pi pico. Es un dispositivo diseñado para proporcionar tensión de salida estable, es un componente de bajo consumo. El modelo es el LM4040AIM3-3.0 fabricado por Texas Instruments. Figura 53. LM4040AIM3-3.0 de Texas Instruments. - ULN2003A: Este componente es el encargado de accionar los cuatro relés. Figura 54. ULN2003A. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 65 - Relés: A la hora de realizar la lectura se accionan, para así permitir la lectura. El relé usado es el modelo G6RL-14-ASI-DC3 de la marca Omron, el voltaje de la bobina es de 3V y la corriente máxima es de 10 A características que son idóneos ya que estará conectado a los paneles y se accionara a través de la pico. Figura 55. Relé G6RL-14-ASI-DC3. - Regulador de tensión: Este componente también conocido como “Change pump voltaje inverter” o generador de voltaje negativo, es capaz de generar una tensión negativa a partir de una tensión de entrada, su rango de generación es de 1.5 V12 V. En este caso generará una tensión de -3.3 V a partir de una en tensión de positiva de 3.3 V. Figura 56. Generador de tensión negativa. - Convertidos dc/dc: Sirve para proporcionar una tensión de salida de 3.3 V a partir de la tensión recibida de los paneles. La tensión mínima de entrada es de 9 V y la máxima de 72 V, en este rango el convertidor da una tensión de salida de 3.3 V. Figura 57. Esquema del filtro recomendado por el fabricante [24]. Figura 58. TRACO POWER TSR 1-4833WI. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 66 - Amplificador operacional: El amplificador operacional utilizado es el TLV9164IPWR, es un operacional rail to rail, es decir, da proporciona salidas cercanas al voltaje de alimentación en nuestro caso al tener una alimentación bipolar y querer que la salida mínima se acerque al cero no viene bien, tiene cuatro operacionales por dentro. Figura 59. Amplificador TLV9164IPWR. Figura 60. A) Varistor V56MLA1206NH; B) Fusible 2 A; C) Supercondensador de 1F - Varistor: La función principal del varistor es de proteger el circuito contra sobretensiones, la característica principal del varistor es que disminuye abruptamente la resistencia cuando el voltaje aplicado entre sus terminales excede un umbral especifico. El varistor usado es V56MLA1206NH fabricado por LITTELFUSE, cuya tensión nominal en continua es 56 VDC. - Fusible: Es componente que protege el circuito contra sobre corrientes, es un fisible de 2 A, si al circuito le llegan más de 2 A el fusible abre el circuito. - Supercondensador: Es el encargado mantener energía a la hora de hacer la lectura ya que el al conmutar el relé se desconectará de la placa por un tiempo mientras se realiza la lectura de los canales ADC. El condensador empleado es de 1F con este valor nos aseguramos de que el condensador es capaz de almacenar la energía suficiente como para alimentar a los componentes el tiempo que dure la lectura. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 67 Item Nombre Esquemático Código de referencia web Web Unidades Precio Unidad Resistencia 953k R3 4148929 https://es.farnell.com/yageo/rc0805fr-07953kl/res-953k-1-0-125w-0805-peligruesa/dp/4148929 1 0,17 Resistencia 60.4k R4 4013913 https://es.farnell.com/yageo/rt0603dre0760k4l/res-60k4-0-5-0-1w-thin-film0603/dp/4013913 1 0,53 Resistencia 430 R5 3496344 https://es.farnell.com/yageo/rc1206jr-07430rl/res-430r-5-0-25w-1206-pel-cgruesa/dp/3496344 1 0,18 Resistencia 75K R11 1841791 https://es.farnell.com/panasonic/era8aeb753v/res-75k-0-1-0-25w-1206-pel-cmetal/dp/1841791 1 2,3 Resistencia 1K R7, R8, R9 y R6 1739014 https://es.farnell.com/vishay/crcw12061k20fkeahp/res-1k2-1-0-75w-1206-pel-cgruesa/dp/1739014 4 0,16 Resistencia 150k R12 3599233 https://es.farnell.com/panasonic/erjup6d1503v/res-150k-0-5-0-5w-0805/dp/3599233 1 1,18 Condensador 2,2nF(2200pF) C3 y C20 741-6840P https://es.rs-online.com/web/p/condensadores-ceramicos-multicapa/7416840P?gb=s 2 0,65 Condensador 1000 uF C4 228-6931 https://es.rs-online.com/web/p/condensadores-de-aluminio/2286931 1 4,18 Regulador de tensión U2 2983598 https://es.farnell.com/renesas/icl7660scbaz-t/bomba-carga-dc-dc-duplicadorinv/dp/2983598?st=icl7660scbaz-t 1 2,22 Relés K1, K2, K3 y K4 653-G6RL-14ASI-DC3 https://www.mouser.es/ProductDetail/Omron-Electronics/G6RL-14-ASIDC3?qs=iFguSMDVeX1TXlKGwpXAyw%3D%3D 4 4,63 Condensador 1F C6 2774918 https://es.farnell.com/vinatech/vec3r0-105qg/conden-1f-3v-double-layerradial/dp/2774918?st=condensador%201f 1 4,66 Resistencia Shunt 2ohm R10 186-6903P https://es.rs-online.com/web/p/resistencias-de-montaje-en-superficie/1866903P?gb=s 1 0,748 Convertidor DC-DC U3 3255312 https://es.farnell.com/tracopower/tsr-1-4833wi/convertidor-dc-dc-3-3v-1a/dp/3255312 1 17,9 Amplificador Operacional U4 595TLV9164IPWR https://www.mouser.es/ProductDetail/TexasInstruments/TLV9164IPWR?qs=doiCPypUmgGx6tSn%2FfxSMQ%3D%3D 1 1,72 Fusible 2A F2 1162751 https://es.farnell.com/schurter/7010709013/fusible-con-extremo-de-cable-2a/dp/1162751 1 1,62 Conector Hembra H1, H2, H3 y H4 790-1098 https://es.rs-online.com/web/p/bornes-para-pcb/7901098?searchId=ae349205-fec2-427ba38f-2fd250503d58&gb=s 3 0,604 Varistor (VDR) R1 2786552 https://es.farnell.com/littelfuse/v56mla1206nh/varistor-mlv-120v-1206/dp/2786552 1 0,48 Condensador 33uF C21 8767645 https://es.farnell.com/panasonic/eca2aam330x/conden-33-f-100v20/dp/8767645?ost=8767645 1 0,179 Condensador 4,7uF C22 915-5424 https://es.rs-online.com/web/p/condensadores-ceramicosmulticapa/9155424?searchId=87e777a0-dc95-4037-bfc6-cc31f0034498&gb=s 1 2,035 Condensador 10uF C1 y C2 3369357 https://es.farnell.com/yageo/cc1206kkx5r7bb106/condensador-10uf-16v-mlcc1206/dp/3369357?st=capacitor%2010u 2 0,251 Jumper para pines macho 571-28815452 https://www.mouser.es/ProductDetail/TE-Connectivity/2-8815452?qs=AplfTeSvkkDVEeqCIXK0eQ%3D%3D 4 0,21 Bobina 4,7uH L1 1187067 https://es.farnell.com/vishay/ihlp2525czer4r7m01/inductor-4-7uh-5-5asmd/dp/1187067?ost=1187067 1 0,834 Tira pines macho U6 y U8 251-8086 https://es.rs-online.com/web/p/conectores-macho-para-pcb/2518086 1 2,95 Resistencia 8k2 R17 3230370 https://es.farnell.com/cgs-te-connectivity/35028k2ft/res-8k2-1-2w-2010-thickfilm/dp/3230370?ost=3230370 1 0,276 Resistencia 1k5 R18 1717575 https://es.farnell.com/panasonic/era3arb152v/res-1k5-0-1-0-1w-0603-pel-cmetal/dp/1717575 1 0,4 ULN2003A Q1 1094421 https://es.farnell.com/stmicroelectronics/uln2003a/matriz-darlington-7npn-2003dip16/dp/1094421?st=uln2003A 1 0,808 Diodo Zener U5 163-2196 https://es.rs-online.com/web/p/diodos-zener/1632196?gb=s 1 0,27 Resistencia 10k R13, R14, R2, R15 y R16 1739174 https://es.farnell.com/vishay/crcw060310k0jneaif/res-10k-5-0-1w-0603-pel-cgruesa/dp/1739174 5 0,16 Referencia de tensión Vref 535-9521 https://es.rs-online.com/web/p/referencias-de-tension/5359521?searchId=9caebd30-54784be9-844b-4741dad207eb&gb=s 1 4,6 LoRa Node Module for Raspberry Pi Pico https://thepihut.com/products/sx1262-433mhz-lora-node-module-for-raspberry-pipico?variant=41804806553795 1 15 Raspberry pi U1 2525225 https://es.farnell.com/raspberry-pi/raspberrypi-modb-1gb/raspberry-pi-3-modelb/dp/2525225?src=raspberrypi 1 33,27 Raspberry pi pico 3643332 https://es.farnell.com/raspberry-pi/raspberry-pi-pico/raspberry-pi-32-bits-armcortex/dp/3643332 1 4,76 Caja PCB 531730 https://es.farnell.com/spelsberg/326-900/caja-terminal-113-x-113-x-58-mm/dp/531730 1 7,05 NTC 954-103AT-2 https://www.mouser.es/ProductDetail/Semitec/103AT2?qs=wgO0AD0o1vvcDzsKguD%252Bew%3D%3D 1 0,85 Tira pines zocalo https://es.rs-online.com/web/p/conectores-hembra-para-pcb/2677387?gb=s 4 4,9 Tabla 4. Lista de Componentes. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 68 Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 69 2.3. Modo de funcionamiento. El sistema cuenta con tres modos de funcionamiento: 2.3.1. Modo Reposo. El sistema entra en este modo cuando ya se han hecho los envíos de datos por LoRa, en este modo el sistema no hace nada más que esperar a que se haga una nueva lectura y se haga el envío. 2.3.2. Modo Lectura de datos. El sistema entra en este modo cuando el microcontrolador acciona los relés, de este modo el común del relé se conecta al normalmente abierto de este modo se puede realizar la lectura de los valores. Figura 61. Modo Lectura de datos Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 70 El sistema de alimentación se de alimentación con el convertidor se desconecta ya que el pin común que está conectado al normalmente cerrado pasa a unirse con el normalmente abierto. El sistema se mantiene alimentado gracias al Supercondensador que lo mantiene alimentado el tiempo que dure la lectura de datos. Figura 62. Alimentación en modo Lectura de datos 2.3.2. Modo Envío de datos. El sistema en este modo lo que hace es enviar los datos leídos por LoRa, el relé se vuelve a conectar al normalmente cerrado, en el caso del condensador en el normalmente cerrado va una resistencia para que se descargue mientras se hace el envío. Figura 63. Modo Envío de datos. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 71 Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 72 2.4. MQTT. MQTT (MQ Telemetry Transport), es un protocolo de mensajería, el más usado por los dispositivos IOT, básicamente los dispositivos pueden publicar y suscribirse a datos a treves de internet. Se utiliza para el intercambio de datos y mensajería entre dispositivos IOT e IIoT (Internet industrial de las cosas), como PLC, sensores, etc. Su protocolo utiliza el patrón publicar/suscribir (Pub/Sub) que es orientado a eventos, el emisor (publicador) y el receptor (suscriptor) se comunican a través de topics. La conexión entre ellos es manejada por un Broker MQTT, el cual filtra todos los mensajes entrantes y los distribuye correctamente a los suscriptores[25]. Las razones por las que muchos dispositivos IoT usan el protocolo MQTT son las siguientes: - Es ligero y eficaz. - La mensajería es bidireccional entre dispositivo y la nube. - Se pueden conectar millones de dispositivos. Existen varios softwares MQTT en el mercado, los hay tanto de uso general como de uso especifico alguno de ellos son: Ably MQTT Broker, Akiro MQTT, HiveMQ, Mosca, Mosquitto, etc. El que usaremos en este proyecto será MQTTExplorer que se ha descargado de la tienda de Microsoft. 2.4.1. Broker y Cliente MQTT. Los Broker MQTT son los que reciben los mensajes publicados y son los encargados de enviarlos a los clientes que estén suscritos a los temas (Topics) de dichos mensajes. Cada mensaje contiene un topic al que el cliente puede suscribirse. Los Broker determinan que clientes pueden recibir un mensaje dependiendo si está suscrito al tema o no[26]. Figura 64. MQTT Broker. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 73 Los Clientes MQTT suelen ser dispositivos como, actuadores, sensores, microcontroladores, aplicaciones web o de escritorio, etc. Estos son los que publican los mensajes en un broker para que sean vistos por otros clientes que se suscriban al mensaje. Figura 65. MQTT Cliente 2.4.2. MQTT Server para LoRaWAN. En este proyecto se fusiona LoRa y MQTT gracias a que la plataforma de IoT para LoRa que usamos permite integrar MQTT. La The things Stack, usa la versión estándar de MQTT (3.1.1) y QoS 0, esto quiere decir los mensajes se entregan sin garantía de recepción, ni confirmación del receptor, es una versión más simple que evita sobrecargas[27]. Para integrar MQTT a nuestra aplicación seguir los pasos que aparece en la imagen. Figura 66. Integracion MQTT-LoRa. Le damos clic en generar API Key, que será una clave para poder ver los mensajes, es importante guardar esta clave ya que es importante a la hora de conectarnos al broker. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 80 Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 81 4. Cálculos justificativos. 4.1. Circuito de tensión: Figura 70. Divisor de tensión para medir la tensión. El circuito está diseñado de tal manera que la tensión máxima del panel solar puede ser hasta de 55V, de esta manera la raspberry podría aguantar la tensión de salida del divisor de tensión ya que sería de 3.3V. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 82 4.2. Circuito de corriente: Figura 71. Circuito para medir corrientes y resistencia de descarga del condensador. En este caso debemos tener en cuenta que siempre trataremos de diseñar los circuitos considerando el peor caso por seguridad. En este caso nos sale que la resistencia shunt debe ser menor o igual a 3Ω. En el caso de la resistencia para descargar el condensador, hemos tenido en cuenta que la descarga la queremos hacer en 1 segundo: Donde τ es la constante de tiempo, R la resistencia de descarga y C el condensador. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 83 4.3. Divisor de tensión para circuito de corriente. Este circuito sirve para asegurarnos que en la entrada del canal ADC para medir la corriente lleguen 3.3 V que es la y tensión máximo admisible en la entrada ADC de la pico, ya que de no ponerlo tendríamos una tensión más grande. En la las pruebas y simulaciones nos salió que la entrada del divisor de tensión presenta picos máximos de 20 V, de ahí que se añada esta atapa, con esto tenemos que: Para el diseño fijamos el valor de la R18 a 1k5 y suponemos que la entrada sea ligeramente superior a la prevista nos queda así: R17= 8k2 . Figura 72. Divisor de tensión circuito corriente. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 84 4.4. Amplificador no inversor. Figura 73. Amplificador no inversor. El esquema dispone de un amplificador no inversor opcional que serviría para amplificar la señal de la corriente. El circuito no inversor tiene una ganancia de 3, para conseguir esto hemos tenido en cuenta la formula ( Calculadora de Ganancia Amplificador Operacional, n.d.): Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 85 Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 86 5. Fase experimental. 5.1 Simulaciones. En primer lugar, vamos a diseñar el primer concepto de circuito, esto constará de dos partes: Un circuito para medir la tensión y el otro para medir la corriente. Para el diseño y la simulación vamos a usar EasyEDA que es un programa de diseño, simulación y PCB. Para simular el panel fotovoltaico vamos a poner una fuente de alimentación DC, al ser una simulación la fuentes son ideales, eso quiere decir que no vienen limitadas, para hacerlo más realista vamos usar un método de limitar la corriente de la fuente con un diodo y la instrucción “.model currentlimiter D(Ron=1u Roff=1Meg Vfwd=0 ilimit=10) ”, con esto lo que estamos haciendo es limitar la corriente a 10 A. Para medir la tensión lo haremos en a través de un divisor de tensión, en este caso hemos puesto resistencias de 150kΩ y 7,5kΩ respectivamente esto hará que podamos medir el 5% de la tensión que proporciona la fuente, en este caso al ser una fuente de 45V en la salida del divisor de tensión tendremos 2,25V, el microcontrolador puede soportar como máximo 3,3V en la entrada, esta lectura se hará con un seguidor de tensión, en la entrada del seguidor tensión irá un filtro RC y la entrada del filtro será la salida del divisor de tensión. Para medir la corriente lo haremos con un condensador y una resistencia shunt, cuando el condensador se esté cargado la tensión subirá hasta alcanzar la tensión de alimentación y en el momento en el que esté cargado la corriente se irá decreciendo, para medirlo hemos puesto un circuito no inversor de ganancia 76 (esta la podremos ajustar conforme vayamos haciendo más pruebas) en la entrada pondremos el mismo filtro rc. Figura 74. Primer circuito de simulación para pruebas. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 87 Figura 75. Gráfica primer circuito simulado. Tras este primer diseño hemos podido observar cómo sería la lectura de los dos parámetros que se va a leer en los canales de ADC de la raspberry pico. PRUEBA LECTURA CANALES ADC: Antes de las pruebas debemos tener en cuenta que la raspberry pico tiene tres canales ADC, aunque se trate de tres canales es un mismo convertidor, así que las lecturas no se pueden hacer por al mismo tiempo, se hace una detrás de otra estableciendo un tiempo entre lectura y lectura, si dicho tiempo no se establece la lectura se hará lo más rápido que en nuestro casi es de 2µSeg o sea 500Ks/s. El convertidor ADC es de 12 bits o sea que lee valores 0-4095. La primera prueba que hicimos era la de comprobar la lectura de los dos canales ADC, para hacer la prueba pusimos una señal de 500Hz en forma de rampa con una tensión picopico de 3V generado por un generador de funciones. Con un programa en C conseguimos hacer 1500 lecturas en cada canal [33]: Figura 76. Gráfica prueba canales ADC Raspberry Pi Pico. 0 1000 2000 3000 4000 1 46 91 136 181 226 271 316 361 406 451 496 541 586 631 676 721 766 811 856 901 946 991 1036 1081 1126 1171 1216 1261 1306 1351 1396 1441 1486 Lectura señal 500Hz Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 88 Otra prueba que hecha es fue poner una señal de 50 Hz (20 milisegundos) en forma de onda cuadrada y con esto obtuvimos la siguiente gráfica: Figura 77. Gráfica Velocidad de lectura canal ADC. Con esto podemos ver que la pico tarda unos 60 milisegundos en captar 1000 muestras por los canales ADC. 0 500 1000 1500 2000 2500 3000 3500 4000 4500 1 37 73 109 145 181 217 253 289 325 361 397 433 469 505 541 577 613 649 685 721 757 793 829 865 901 937 973 Onda cuadrada de 50Hz (20milisegundos) Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 89 5.2 Primeras pruebas. El siguiente paso fue hacer una prueba física con los componentes, para el divisor de tensión usamos dos resistencias de 15kΩ en paralelo para hacer una equivalente de 7,3kΩ, esta irá en serie con una de 1KΩ, así en el divisor de tensión tendremos una tensión de 3V que es la que irá a un canal ADC de la pico, ya que usamos una tensión de entrada de 25V. Para la lectura de corriente tenemos un condensador de 1000µF, Al tener una corriente máxima de 1 A, para que la tensión máxima sea 3 V la resistencia debe ser inferior a 3 ohm, en nuestro caso usamos una resistencia de 2 ohm. Para hacer la descarga del condensador usaremos una resistencia de 1KΩ. Figura 78. Esquema de prueba en Proteus. Figura 79. Montaje del prototipo. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 96 Podemos observar que el condensador tiene una tensión final a la de alimentación (31,8 V) cuando se carga por completo, cuando esto pasa la corriente se va disminuyendo hasta llegar a cero. El condensador tardar a un poco más de 15 milisegundos en cargarse. 5.4. Prueba de lectura ADC con la PCB. Con las comprobaciones ya hechas, ahora toca probar la lectura de los valores ADC de la tensión y la corriente, para ello tenemos un programa en C. El programa hará un número de lecturas determinad, en nuestro caso 1600, y que cuando el usuario pulse el botón de “enter” se realizarán 1600 en cada canal y después se mostrarán todos los valores leídos por el puerto serie. Figura 89. Diagrama programa prueba de lectura ADC. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 97 5.4.1. Programa C prueba lectura ADC. #include <stdio.h> #include "pico/stdlib.h" #include "hardware/gpio.h" #include "hardware/adc.h" #include "hardware/uart.h" #define UART_ID uart1 #define BAUD_RATE 115200 #define TX_PIN 4 // TX1 #define RX_PIN 5 //RX1 int NUM_MUESTRAS = 1600; char buffer[10000]; int pos = 0; char c; #define OUTPUT_PIN1 8 // Definimos el rele en el pin 2 #define OUTPUT_PIN2 9 void wait_for_enter() { while (1) { if (uart_is_readable(uart1)) { char input = uart_getc(uart1); if (input == '\n' || input == '\r') { break; }}}} int main() { stdio_init_all(); // Configurar el UART uart_init(UART_ID, BAUD_RATE); gpio_set_function(TX_PIN, GPIO_FUNC_UART); gpio_set_function(RX_PIN, GPIO_FUNC_UART); //printf("LECTURA DOS CANALES ADC\n"); uart_puts(UART_ID, "LECTURA DOS CANALES ADC\n"); adc_init(); adc_gpio_init(28); // Canal 2 V(I) adc_gpio_init(27); // Canal 1 /*gpio_init(2); // Usamos el pin 2 gpio_set_dir(2, GPIO_IN); gpio_pull_up(2);*/ ////////// CONFIG RELE gpio_init(OUTPUT_PIN1); gpio_set_dir(OUTPUT_PIN1, GPIO_OUT); gpio_put(OUTPUT_PIN1, 0); // Establece la salida en bajo gpio_init(OUTPUT_PIN2); gpio_set_dir(OUTPUT_PIN2, GPIO_OUT); gpio_put(OUTPUT_PIN2, 0); // Establece la salida en bajo /////////////////////// while (true) { //printf("Se leera %d muestras\n", NUM_MUESTRAS); //printf("PULSA ENTER PARA LEER MUESTRAS\n"); uart_puts(UART_ID, "Se leerán "); char num_muestras_str[10]; snprintf(num_muestras_str, sizeof(num_muestras_str), "%d", NUM_MUESTRAS); uart_puts(UART_ID, num_muestras_str); uart_puts(UART_ID, " muestras\n"); uart_puts(UART_ID, "PULSA ENTER PARA LEER MUESTRAS\n"); //getchar(); wait_for_enter(); gpio_put(OUTPUT_PIN1, 1); gpio_put(OUTPUT_PIN2, 1); Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 98 uint16_t muestras_canal0[NUM_MUESTRAS]; uint16_t muestras_canal1[NUM_MUESTRAS]; for (int i = 0; i < NUM_MUESTRAS; i++) { //sleep_us(20);//espera entre muestreo adc_select_input(2); //V(I) muestras_canal0[i] = adc_read(); adc_select_input(1); //V(V) muestras_canal1[i] = adc_read(); sleep_us(30);//espera entre muestreo //sleep_ms(1); } // desactivar la salida gpio_put(OUTPUT_PIN1, 0); gpio_put(OUTPUT_PIN2, 0); //printf("Muestras del canal 0:\n"); uart_puts(UART_ID, "Muestras del canal 2 V(I):\n"); for (int i = 0; i < NUM_MUESTRAS; i++) { //printf("%d", muestras_canal0[i]); char muestra_str[1000]; snprintf(muestra_str, sizeof(muestra_str), "%d", muestras_canal0[i]); uart_puts(UART_ID, muestra_str); if (i != NUM_MUESTRAS - 1) { // printf(", "); uart_puts(UART_ID, ", "); } } // printf("\n"); uart_puts(UART_ID, "\n"); printf("Muestras del canal 1:\n"); uart_puts(UART_ID, "Muestras del canal 1 V(V):\n"); for (int i = 0; i < NUM_MUESTRAS; i++) { //printf("%d", muestras_canal1[i]); char muestra_str[1000]; snprintf(muestra_str, sizeof(muestra_str), "%d", muestras_canal1[i]); uart_puts(UART_ID, muestra_str); if (i != NUM_MUESTRAS - 1) { // printf(", "); uart_puts(UART_ID, ", "); }} // printf("\n"); uart_puts(UART_ID, "\n"); } } 5.4.2. Gráficas de las lecturas. Una vez hecho las lecturas, con los datos leídos procedemos a graficar los datos y salen asi: Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 99 Gráfica. 1 Gráfica de la Intensidad. Gráfica. 2 Gráfica de la Tensión. 0 0,2 0,4 0,6 0,8 1 1,2 1,4 1,6 1,8 2 0 100 200 300 400 500 600 700 800 900 1000 Amperios [A] Muestras Gráfica Intensidad 0 0,5 1 1,5 2 2,5 3 3,5 0 100 200 300 400 500 600 700 800 900 1000 Votios [V] Muestras Gráfica Tensión Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 100 Gráfica. 3. Tensión y Corriente. Gráfica. 4 Gráfica I-V 0 0,5 1 1,5 2 2,5 3 3,5 0 0,2 0,4 0,6 0,8 1 1,2 1,4 1,6 1,8 2 0 200 400 600 800 1000 Voltios [V] Amperios [A] Muestras Gráfica Tensión y Corriente Corriente Tensión 0,02 0,07 0,12 0,17 0,22 0,27 0,43 0,63 0,83 1,03 1,23 1,43 1,63 1,83 2,03 2,23 Corriente [A] Tensión [V] Gráfica I-V Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 101 Gráfica. 5 Gráfica de tensión de varias lecturas. Gráfica. 6 Gráfica corriente de varias lecturas. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 102 Vemos que a la salida del seguidor de tensión la lectura sale con muchas oscilaciones, esto es uno de posibles problemas a solucionar en futuras versión, en cambio si hacemos la lectura conectando el panel y leyendo antes del seguidor de tensión justo a la salida del filtro RC obtenemos los siguiente: Figura 90. Lectura Osciloscopio con el panel. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 103 5.5. Envío por Lora de los datos. Figura 91. Diagrama del envío por LoRa. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 104 El programa que se ejecuta para la lectura y envío de los datos por LoRa sigue la estructura del diagrama anterior. Es importante tener que a la hora de compilar el programa debemos aseguraros que dispositivo estamos configurando, es decir, fijarse en las credenciales es del dispositivo al que le cargamos del programa, esto lo hacemos entrando en el archivo confi.h. Figura 92. Configuración Config.h Es importante habilitar las líneas de código donde están las credenciales del dispositivo al que le queremos cargar el programa. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 105 5.6. Consulta de los datos por MQTT. Los datos LoRa también se pueden consultar por MQTT, los datos se envían en base64, desde el entorno de Ubuntu vamos a ejecutar un programa en Python que se suscribirá al canal MQTT, leerá los datos recibidos en base64 y lo decodificará a UTF-8. El programa crea un archivo .txt con el registro de los datos recibidos, este archivo se puede consultar en cualquier momento, se ubica en la misma carpeta donde esté el archivo del programa Python. El nombre del archivo txt es la fecha de ejecución, el programa también crea un archivo con todos los datos de fecha anteriores en los que se hayan ejecutado el programa. Figura 93. Archivos de registro de datos. Los datos lo podemos consultar si disponemos de cualquier programa MQTT, en nuestro caso disponemos de MQTT Explorer, en el que podamos suscribirnos con las credenciales: Figura 94. Conexión MQTT con MQTT Explorer. Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 112 Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 113 8. Anexos. 8.1 Programa Python consulta MQTT. #!/usr/bin/env python3 # -*- coding: utf-8 -*- import base64 import sys import os User = "girasol-app@ttn" Password = "NNSXS.R2QQVXUQ4SJ5JLR2NZF2R7B3NDQBLQO3BTRHFBI.GLEAMNM2HXQDR6EWXK4IFQ6B6OGV7ONATIABC2WJ2FQYCAFQI BUQ" theRegion = "EU1" # The region you are using VER = "2021-05-24 v1.2" import os, sys, logging, time print(os.path.basename(__file__) + " " + VER) print("Imports:") import paho.mqtt.client as mqtt import json import csv from datetime import datetime print("Functions:") # Write uplink to tab file def saveToFile(someJSON): end_device_ids = someJSON["end_device_ids"] device_id = end_device_ids["device_id"] application_id = end_device_ids["application_ids"]["application_id"] received_at = someJSON["received_at"] uplink_message = someJSON["uplink_message"] f_port = uplink_message["f_port"] f_cnt = uplink_message["f_cnt"] frm_payload = uplink_message["frm_payload"] rssi = uplink_message["rx_metadata"][0]["rssi"] snr = uplink_message["rx_metadata"][0]["snr"] data_rate_index = uplink_message["settings"]["data_rate_index"] consumed_airtime = uplink_message["consumed_airtime"]; # Daily log of uplinks now = datetime.now() Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 114 pathNFile = now.strftime("%Y%m%d") + ".txt" print(pathNFile) if (not os.path.isfile(pathNFile)): with open(pathNFile, 'a', newline='') as tabFile: fw = csv.writer(tabFile, dialect='excel-tab') fw.writerow(["received_at", "application_id", "device_id", "f_port", "f_cnt", "frm_payload", "rssi", "snr", "data_rate_index", "consumed_airtime"]) with open(pathNFile, 'a', newline='') as tabFile: fw = csv.writer(tabFile, dialect='excel-tab') fw.writerow([received_at, application_id, device_id, f_port, f_cnt, frm_payload, rssi, snr, data_rate_index, consumed_airtime]) # Application log pathNFile = application_id + ".txt" print(pathNFile) if (not os.path.isfile(pathNFile)): with open(pathNFile, 'a', newline='') as tabFile: fw = csv.writer(tabFile, dialect='excel-tab') fw.writerow(["received_at", "device_id", "f_port", "f_cnt", "frm_payload", "rssi", "snr", "data_rate_index", "consumed_airtime"]) with open(pathNFile, 'a', newline='') as tabFile: fw = csv.writer(tabFile, dialect='excel-tab') fw.writerow([received_at, device_id, f_port, f_cnt, frm_payload, rssi, snr, data_rate_index, consumed_airtime]) # Device log pathNFile = application_id + "__" + device_id + ".txt" print(pathNFile) if (not os.path.isfile(pathNFile)): with open(pathNFile, 'a', newline='') as tabFile: fw = csv.writer(tabFile, dialect='excel-tab') fw.writerow(["received_at", "f_port", "f_cnt", "frm_payload", "rssi", "snr", "data_rate_index", "consumed_airtime"]) with open(pathNFile, 'a', newline='') as tabFile: fw = csv.writer(tabFile, dialect='excel-tab') fw.writerow([received_at, f_port, f_cnt, frm_payload, rssi, snr, data_rate_index, consumed_airtime]) # Write uplink to tab file def saveToFile2(someJSON): try: end_device_ids = someJSON["end_device_ids"] device_id = end_device_ids["device_id"] application_id = end_device_ids["application_ids"]["application_id"] Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 115 received_at = someJSON["received_at"] uplink_message = someJSON["uplink_message"] f_port = uplink_message["f_port"] f_cnt = uplink_message["f_cnt"] frm_payload = uplink_message["frm_payload"] rssi = uplink_message["rx_metadata"][0]["rssi"] snr = uplink_message["rx_metadata"][0]["snr"] consumed_airtime = uplink_message["consumed_airtime"]; base64_message = frm_payload base64_bytes = base64_message.encode('ascii') message_bytes = base64.b64decode(base64_bytes) message = message_bytes.decode('ascii') # Daily log of uplinks now = datetime.now() pathNFile = now.strftime("%Y%m%d") + ".txt" print(pathNFile) if (not os.path.isfile(pathNFile)): with open(pathNFile, 'a', newline='') as tabFile: fw = csv.writer(tabFile, dialect='excel-tab') fw.writerow(["received_at", "device_id","f_cnt", "frm_payload", "frm_payload_r", "f_port", "rssi", "snr", "consumed_airtime", "application_id"]) with open(pathNFile, 'a', newline='') as tabFile: fw = csv.writer(tabFile, dialect='excel-tab') fw.writerow([received_at, device_id, f_cnt, message, frm_payload, f_port, rssi, snr, consumed_airtime, application_id]) # Application log pathNFile = application_id + ".txt" print(pathNFile) if (not os.path.isfile(pathNFile)): with open(pathNFile, 'a', newline='') as tabFile: fw = csv.writer(tabFile, dialect='excel-tab') fw.writerow(["received_at", "device_id","f_cnt", "frm_payload", "frm_payload_r", "f_port", "rssi", "snr", "consumed_airtime", "application_id"]) with open(pathNFile, 'a', newline='') as tabFile: fw = csv.writer(tabFile, dialect='excel-tab') fw.writerow([received_at, device_id, f_cnt, message, frm_payload, f_port, rssi, snr, consumed_airtime, application_id]) # Device log pathNFile = application_id + "__" + device_id + ".txt" print(pathNFile) if (not os.path.isfile(pathNFile)): Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 116 with open(pathNFile, 'a', newline='') as tabFile: fw = csv.writer(tabFile, dialect='excel-tab') fw.writerow(["received_at", "device_id","f_cnt", "frm_payload", "frm_payload_r", "f_port", "rssi", "snr", "consumed_airtime", "application_id"]) with open(pathNFile, 'a', newline='') as tabFile: fw = csv.writer(tabFile, dialect='excel-tab') fw.writerow([received_at, device_id, f_cnt, message, frm_payload, f_port, rssi, snr, consumed_airtime, application_id]) except Exception : print("error saveToFile2") # Write uplink to tab file def printto(someJSON): end_device_ids = someJSON["end_device_ids"] device_id = end_device_ids["device_id"] received_at = someJSON["received_at"] try: uplink_message = someJSON["uplink_message"] frm_payload = uplink_message["frm_payload"] print("device_id: " + device_id + " received_at: " + received_at) base64_message = frm_payload base64_bytes = base64_message.encode('ascii') message_bytes = base64.b64decode(base64_bytes) message = message_bytes.decode('ascii') print ("data: " + frm_payload) print (" ") print (" " + message) print (" " ) except Exception : print("error parsedJSON") # MQTT event functions def on_connect(mqttc, obj, flags, rc): print("\nConnect: rc = " + str(rc)) def on_message(mqttc, obj, msg): print("\nMessage: " + msg.topic + " " + str(msg.qos)) # + " " + str(msg.payload)) parsedJSON = json.loads(msg.payload) printto(parsedJSON) saveToFile2(parsedJSON) def on_subscribe(mqttc, obj, mid, granted_qos): print("\nSubscribe: " + str(mid) + " " + str(granted_qos)) def on_log(mqttc, obj, level, string): print("\nLog: "+ string) Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 117 logging_level = mqtt.LOGGING_LEVEL[level] logging.log(logging_level, string) print("Body of program:") print("Init mqtt client") mqttc = mqtt.Client() print("Assign callbacks") mqttc.on_connect = on_connect mqttc.on_subscribe = on_subscribe mqttc.on_message = on_message #mqttc.on_log = on_log # Logging for debugging OK, waste print("Connect") # Setup authentication from settings above mqttc.username_pw_set(User, Password) # IMPORTANT - this enables the encryption of messages mqttc.tls_set() # default certification authority of the system #mqttc.tls_set(ca_certs="mqtt-ca.pem") # Use this if you get security errors # It loads the TTI security certificate. Download it from their website from this page: # https://www.thethingsnetwork.org/docs/applications/mqtt/api/index.html # This is normally required if you are running the script on Windows mqttc.connect(theRegion.lower() + ".cloud.thethings.network", 8883, 60) print("Subscribe") mqttc.subscribe("#", 0) # all device uplinks print("And run forever") try: run = True while run: mqttc.loop(10) # seconds timeout / blocking time print(".", end="", flush=True) # feedback to the user that something is actually happening except KeyboardInterrupt: print("Exit") sys.exit(0) Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 118 8.2 Programa Envio y lectura LoRa. #include <stdio.h> #include <string.h> #include "hardware/gpio.h" #include "hardware/adc.h" #include "pico/stdlib.h" #include "pico/lorawan.h" #include <math.h> //#include "tusb.h" #include "config.h" #include "hardware/uart.h" // Definicion de numero de elementos por paquete y numero leectura por canal #define PACKAGE_SIZE 20 // elementos por paquete #define muestras 1700 // lecturas por canal // Definicion pines UART #define UART_ID uart1 #define BAUD_RATE 115200 // velocidad #define TX_PIN 4 // pin TX1 #define RX_PIN 5 // pin RX1 // Definicion de los reles #define rele1 6 #define rele2 7 #define rele3 8 #define rele4 9 // Variables NTC #define PIN_NTC 26 // Pin GPIO para conectar el NTC (ADC0) const float BETA = -3950; // Valor beta del NTC const float R0 = 10000; // Resistencia nominal del NTC a 25°C const float T0 = 25 + 273.15; // Temperatura nominal en Kelvin const float R_SERIE = 10000; // Valor de la resistencia serie del divisor de voltaje // pin configuration for SX1276 radio module const struct lorawan_sx12xx_settings sx12xx_settings = { .spi = { .inst = PICO_DEFAULT_SPI_INSTANCE, .mosi = PICO_DEFAULT_SPI_TX_PIN, .miso = PICO_DEFAULT_SPI_RX_PIN, .sck = PICO_DEFAULT_SPI_SCK_PIN, .nss = 8 }, .reset = 9, .dio0 = 7, .dio1 = 10 }; // OTAA settings const struct lorawan_otaa_settings otaa_settings = { .device_eui = LORAWAN_DEVICE_EUI, .app_eui = LORAWAN_APP_EUI, .app_key = LORAWAN_APP_KEY, .channel_mask = LORAWAN_CHANNEL_MASK }; void reles_on(){ // Config Rele como salidas gpio_init(rele1); gpio_set_dir(rele1, GPIO_OUT); gpio_init(rele2); gpio_set_dir(rele2, GPIO_OUT); gpio_init(rele3); gpio_set_dir(rele3, GPIO_OUT); gpio_init(rele4); gpio_set_dir(rele4, GPIO_OUT); // Activar reles //gpio_put(rele1, 1); //gpio_put(rele2, 1); gpio_put(rele3, 1); gpio_put(rele4, 1); } void reles_off(){ Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 119 //desactivar reles gpio_put(rele1, 0); gpio_put(rele2, 0); gpio_put(rele3, 0); gpio_put(rele4, 0); } void contador(int segundos) { // Funcion que realiza cuenta atras de espera for (int i = segundos; i > 0; i--) { printf("Esperando... %d segundos\r", i); sleep_ms(1000); // Esperar 1 segundo } printf("\n"); // Imprimir nueva línea al final } //Funcion para lectura de temperatura con NTC. float read_temperature() { // Configuración del ADC adc_init(); adc_gpio_init(PIN_NTC); adc_select_input(0); // Seleccionamos el canal de ADC0 // Lectura del valor crudo del ADC uint16_t raw_value = adc_read(); // Convertir la lectura a resistencia float voltage = (float)raw_value * (3.3f / 4095.0f); // Convertimos la lectura a voltaje float resistance = R_SERIE / ((3.3f / voltage) - 1); // Convertimos el voltaje a resistencia // Convertir resistencia a temperatura en grados Celsius float temp_celsius = 1.0f / ((1.0f / T0) + (1.0f / BETA) * logf(resistance / R0)) - 273.15f; return temp_celsius; } // variables for receiving data int receive_length = 0; uint8_t receive_buffer[242]; uint8_t receive_port = 2; int main( void ) { // initialize stdio and wait for USB CDC connect stdio_init_all(); // Inicializacion de la biblioteca STDIO adc_init(); // Inicializacion del ADC // Configurar el UART uart_init(UART_ID, BAUD_RATE); gpio_set_function(TX_PIN, GPIO_FUNC_UART); gpio_set_function(RX_PIN, GPIO_FUNC_UART); // Comentar si la palca NO irá conectada por USB /*while (!tud_cdc_connected()) { // Verificacion de si la placa está conectado a una entrada USB tight_loop_contents(); }*/ printf("Pico LoRaWAN - TRAZADOR CURVA I-V\n\n"); // initialize the LoRaWAN stack printf("Initilizating LoRaWAN ... "); if (lorawan_init_otaa(&sx12xx_settings, LORAWAN_REGION, &otaa_settings) < 0) { // printf("failed!!!\n"); while (1) { tight_loop_contents(); } } else { printf("success!\n"); } // Start the join process and wait printf("Joining LoRaWAN network ... "); lorawan_join(); Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 120 while (!lorawan_is_joined()) { lorawan_process(); } printf("joined successfully!\n"); uint32_t last_message_time = 0; // Variable para medir tiempo transcurrido entre cada envio //// Vectores de almacenamiento de lecturas uint16_t adc_values1[muestras]; // Valores canal 1 V(V) uint16_t adc_values2[muestras]; // Valores canal 2 V(I) uint16_t data_vector[2 * muestras]; // Vector que almecena la lectura de los dos canales //// Inicializar el vector con valores del 0 al 99 contador(5); // Cuenta atras antes de empezar reles_on(); // Funcion para activar los reles // Medir el tiempo de inicio lectura adc absolute_time_t adc_start_time = get_absolute_time(); // Inicio Ttemporizacion del tiempo lecturas ADC //VARIABLE TEMPERATURA float temperature = read_temperature(); for (int i = 0; i < muestras; i++) // Bucle de lectura ADC { adc_select_input(1); // Seleccion del canal1 para lectura adc_values1[i] = adc_read(); // Almacenamiento de las lecturas del canal1 adc_select_input(2); // Seleccion del canal2 para lectura adc_values2[i] = adc_read();// Almacenamiento de las lecturas del canal2 sleep_us(30); // Espera entre muestras // Concantenacion de las lecturas en un solo vector para el envio. data_vector[i] = adc_values1[i]; // Colocacion de las lecturas del canal1 en la primera mitad de vector data_vector[i + muestras] = adc_values2[i]; //Colocacion de las lecturas del canal2 en la segunda mitad de vector } // Medir el tiempo de fin lectura adc absolute_time_t adc_end_time = get_absolute_time(); // Final temp. lectura ADC uint32_t elapsed_time_adc = absolute_time_diff_us(adc_start_time, adc_end_time); // Calculo del tiempo transcurrido // Mostrar el tiempo de lectura printf("Tiempo de lectura ADC: %lu microsegundos\n", elapsed_time_adc); reles_off(); // Funcion para desactivas los reles despues de la lectura. ////////////////////////////////////////////////////////// /// VALORES VISTO UART uart_puts(UART_ID, "Muestras del canal 1:\n"); for (int i = 0; i < muestras; i++) { char muestra_str[10]; snprintf(muestra_str, sizeof(muestra_str), "%d", adc_values1[i]); uart_puts(UART_ID, muestra_str); if (i != muestras - 1) { uart_puts(UART_ID, ", "); } } uart_puts(UART_ID, "\n"); printf("Muestras del canal 1:\n"); uart_puts(UART_ID, "Muestras del canal 2:\n"); for (int i = 0; i < muestras; i++) { char muestra_str[10]; snprintf(muestra_str, sizeof(muestra_str), "%d", adc_values2[i]); uart_puts(UART_ID, muestra_str); if (i != muestras - 1) { uart_puts(UART_ID, ", "); } } uart_puts(UART_ID, "\n"); ////////////////////////////////////////////////////////////////// // Variable para realizar el seguimiento de la posición en el vector int vector_position = 0; // Contador de posicion del vector de envio int half_sent = 0; // Vector para verificar si se ha enviado la mitad de datos. int package_count = 0; // Contador de paquetes enviados Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 121 while (1) { // let the lorwan library process pending events lorawan_process(); // Verifica los eventos lora // get the current time and see if 9 seconds have passed // since the last message was sent uint32_t now = to_ms_since_boot(get_absolute_time()); // Calcula el tiempo desde el ultimo evento Lora // Medir el tiempo de inicio para el envío de los valores // absolute_time_t start_send_time = get_absolute_time(); if ((now - last_message_time) > 9000) { // Envia da 9 segundos printf("Paquete %d de %d\n", package_count + 1,(muestras*2)/PACKAGE_SIZE); // Calculo del numero de paquetes // Imprimir los valores del paquete antes de enviar printf("Valores leidos: "); for (int i = vector_position; i < vector_position + PACKAGE_SIZE; i++) { printf("%04d ", data_vector[i]); // Formato de impresión con 0 a la izquierda y 4 cifras } printf("\n"); // Crear el mensaje con los elementos del vector char message[PACKAGE_SIZE * 5 + 1]; // 5 caracteres por elemento + 1 para el terminador nulo for (int i = 0; i < PACKAGE_SIZE; i++) // Bucle creacion de paquetes de 20 elementos { // Convertir el número a una cadena de 4 dígitos snprintf(message + i * 5, 5, "%04d", data_vector[vector_position]); vector_position++; } char temp_message[50]; // Verificar si se ha enviado la mitad y enviar un mensaje especial if (!half_sent && vector_position >= muestras) { sleep_ms(10000); printf("MITAD ENVIADA\n"); printf("Temperatura: %.2f °C\n", temperature); snprintf(temp_message, sizeof(temp_message), "MITAD ENVIADA, Temp: %.2f", temperature); if (lorawan_send_unconfirmed(temp_message, strlen(temp_message), 2) < 0) { printf("failed!!!\n"); } else { printf("success!\n"); sleep_ms(10000); } half_sent = 1; // Marcar que la mitad se ha enviado } // Envio del paquete con las cadenas de texto. if (lorawan_send_unconfirmed(message, PACKAGE_SIZE * 5, 2) < 0) // Codigo del paquete 2 es para indicar que son datos normales El tercer parámetro es la prioridad del mensaje { printf("No Enviado!\n"); } else { printf("Enviado!\n"); } last_message_time = now; // Incrementar el contador de paquetes enviados package_count++; /* Trazador de curvas I-V inalámbrico para paneles solares. Óscar James Siboco 128