scieee AI-readable full text Open interactive document viewer

Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V

García Monzonís, Marc

Abstract

Aquest projecte se centra en l'optimització d'un sistema electrònic dissenyat per caracteritzar el funcionament d'una placa solar fotovoltaica mitjançant l'anàlisi de la corba I-V. El microcontrolador Raspberry Pi Pico W actua com a nucli del sistema, encarregant-se de realitzar les lectures de corrent i tensió i transmetre-les via Wi-Fi a un dispositiu receptor. Aquestes dades es processen amb un programa en Python, que les emmagatzema i les representa gràficament per facilitar l'anàlisi de la corba I-V. El microcontrolador es programa utilitzant Python en lloc de C, i la comunicació entre el dispositiu transmissor i el receptor es realitza mitjançant Wi-Fi en comptes de LoRa. També, s’hi incorporen noves funcionalitats mitjançant la comunicació amb el port sèrie, que permeten un control més precís del sistema i un accés constant a informació actualitzada sobre el seu estat. A més, es substitueixen alguns components de la PCB per altres amb l’objectiu de millorar el rendiment del sistema. El resultat final és un sistema eficient i complet, capaç de gestionar les mesures, la transmissió, la recepció i la representació gràfica de la corba I-V, gràcies a les lectures de corrent i tensió, garantint un control total i una optimització en la caracterització de plaques solars fotovoltaiques.

Full text

TREBALL FINAL DE GRAU TÍTOL: Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V AUTORS: GARCÍA MONZONÍS, MARC DATA DE PRESENTACIÓ: Gener, 2025 Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 1 RESUM Aquest projecte se centra en l'optimització d'un sistema electrònic dissenyat per caracteritzar el funcionament d'una placa solar fotovoltaica mitjançant l'anàlisi de la corba I-V. El microcontrolador Raspberry Pi Pico W actua com a nucli del sistema, encarregant-se de realitzar les lectures de corrent i tensió i transmetre-les via WiFi a un dispositiu receptor. Aquestes dades es processen amb un programa en Python, que les emmagatzema i les representa gràficament per facilitar l'anàlisi de la corba I-V. El microcontrolador es programa utilitzant Python en lloc de C, i la comunicació entre el dispositiu transmissor i el receptor es realitza mitjançant Wi-Fi en comptes de LoRa. També, s’hi incorporen noves funcionalitats mitjançant la comunicació amb el port sèrie, que permeten un control més precís del sistema i un accés constant a informació actualitzada sobre el seu estat. A més, es substitueixen alguns components de la PCB per altres amb l’objectiu de millorar el rendiment del sistema. El resultat final és un sistema eficient i complet, capaç de gestionar les mesures, la transmissió, la recepció i la representació gràfica de la corba I-V, gràcies a les lectures de corrent i tensió, garantint un control total i una optimització en la caracterització de plaques solars fotovoltaiques. Paraules clau (màxim 10): Panell solar fotovoltaic Corba I-V Raspberry Pi Pico W Wi-Fi PCB Micropython Port sèrie Python PSPICE Schematics Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 2 RESUMEN Este proyecto se centra en la optimización de un sistema electrónico diseñado para caracterizar el funcionamiento de un panel solar fotovoltaico mediante el análisis de la curva I-V. El microcontrolador Raspberry Pi Pico W actúa como el núcleo del sistema, encargándose de realizar las lecturas de corriente y tensión y de transmitirlas vía Wi-Fi a un dispositivo receptor. Estos datos se procesan con un programa en Python, que los almacena y los representa gráficamente para facilitar el análisis de la curva I-V. El microcontrolador se programa utilizando Python en lugar de C, y la comunicación entre el dispositivo transmisor y el receptor se realiza mediante Wi-Fi en lugar de LoRa. Además, se incorporan nuevas funcionalidades a través de la comunicación con el puerto serie, lo que permite un control más preciso del sistema y un acceso constante a información actualizada sobre su estado. Asimismo, se sustituyen algunos componentes de la PCB por otros con el objetivo de mejorar el rendimiento del sistema. El resultado final es un sistema eficiente y completo, capaz de gestionar las mediciones, la transmisión, la recepción y la representación gráfica de la curva I-V. Esto garantiza un control total y una optimización en la caracterización de los paneles solares fotovoltaicos. Palabras clave (máximo 10): Panel solar fotovoltaico Curva I-V Raspberry Pi Pico W Wi-Fi PCB Micropython Puerto série Python PSPICE Schematics Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 3 ABSTRACT This project focuses on optimizing an electronic system designed to characterize the performance of a photovoltaic solar panel through the analysis of the I-V curve. The Raspberry Pi Pico W microcontroller serves as the core of the system, performing current and voltage readings and transmitting them via Wi-Fi to a receiving device. These data are processed using a Python program, which stores and graphically represents them to facilitate the analysis of the I-V curve. The microcontroller is programmed using Python instead of C, and communication between the transmitter and receiver devices is carried out via Wi-Fi instead of LoRa. Additionally, new functionalities are incorporated through serial port communication, enabling more precise system control and constant access to updated information about its status. Furthermore, some components of the PCB are replaced with others to enhance the system's performance. As a result, we obtain an efficient and comprehensive system capable of managing measurements, transmission, reception, and graphical representation of the I-V curve. This ensures complete control and optimization in the characterization of photovoltaic solar panels. Keywords (10 maximum): Photovoltaic solar panel I-V curve Raspberry Pi Pico W Wi-Fi PCB Micropython Serial port Python PSPICE Schematics Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 4 ÍNDEX DE CONTINGUT 1. INTRODUCCIÓ .............................................................................................................. 9 1.1. Antecedents .................................................................................................................. 9 1.2. Objectius ..................................................................................................................... 10 2. ESTUDI PREVI ............................................................................................................. 11 2.1. Panells solars ............................................................................................................... 11 2.2. Corba I-V ...................................................................................................................... 14 2.2.1. Desviacions de la corba I-V .................................................................................. 16 2.2.2. Equips de mesura de la corba I-V ........................................................................ 18 2.3. Wi-Fi ............................................................................................................................ 20 2.4. Diferencies entre Wi-Fi i LoRaWAN ............................................................................. 21 3. DESENVOLUPAMENT .................................................................................................. 23 3.1. Hardware ..................................................................................................................... 23 3.1.1. PCB ...................................................................................................................... 23 3.1.2. Raspberry Pi Pico W ............................................................................................ 30 3.1.3. Cable FTDI ............................................................................................................ 36 3.2. Software ...................................................................................................................... 38 3.2.1. Thonny ................................................................................................................. 38 3.2.2. Visual Studio Code ............................................................................................... 40 3.2.3. Tera Term ............................................................................................................ 42 3.2.4. PSPICE Schematics ............................................................................................... 44 4. CÀLCULS JUSTIFCATIUS ............................................................................................... 46 4.1. Lectura de corrent ....................................................................................................... 46 4.2. Lectura de tensió ......................................................................................................... 47 4.3. Freqüència de mostreig del microcontrolador ........................................................... 48 5. FASE EXPERIMENTAL .................................................................................................. 50 5.1. Programació ................................................................................................................ 50 5.1.1. Programa Raspberry Pi Pico W ............................................................................ 50 5.1.2. Programa receptor .............................................................................................. 69 5.1.3. Programa per representar gràficament .............................................................. 72 5.1.4. Programa combinat (recepció i representació gràfica) ....................................... 78 5.1.5. Programa per representar gràficament pel port sèrie ........................................ 84 Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 5 5.2. Ajustos en la PCB ......................................................................................................... 87 6. Anàlisi de sostenibilitat i implicacions ètiques ............................................................. 95 6.1. Anàlisi mediambiental ................................................................................................. 95 6.2. Anàlisi econòmic ......................................................................................................... 96 6.3. Anàlisi Social ................................................................................................................ 99 7. CONCLUSIONS .......................................................................................................... 100 8. AGRAÏMENTS ........................................................................................................... 102 9. REFERÈNCIES ............................................................................................................ 103 10. ANNEXOS ............................................................................................................. 105 10.1. Configuracions de software ...................................................................................... 105 10.1.1. Configuració Thonny ......................................................................................... 105 10.1.2. Configuracions Tera Term ................................................................................. 107 10.2. Esquemes .............................................................................................................. 109 10.2.1. Esquemes PCB ................................................................................................... 109 10.2.2. Esquemes MOSFET ............................................................................................ 110 10.3. Codis .......................................................................................................................... 112 10.3.1. Codi per la Raspberry Pi Pico W amb MicroPython .............................................. 112 10.4. Codi per la Raspberry Pi Pico amb ESP8285 amb MicroPython ............................ 119 Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 6 ÍNDEX DE FIGURES FIGURA 1. PCB INICIAL .................................................................................................................................. 9 FIGURA 2. PARTS D'UN PANELL SOLAR FOTOVOLTAIC ............................................................................... 12 FIGURA 3. CORBA I-V AMB ELS PUNTS RELLEVANTS .................................................................................. 14 FIGURA 4. CORBA I-V I CORBA P-V ............................................................................................................. 15 FIGURA 5. DESVIACIONS TÍPIQUES DE LA CORBA I-V ................................................................................. 16 FIGURA 6. ANALITZADOR DE CORBA I-V PORTÀTIL SEAWARD PV150 ....................................................... 18 FIGURA 7. ANALITZADOR DE CORBA I-V ESTACIONARI HT INSTRUMENTS IV400 ...................................... 19 FIGURA 8. DRON PER INSPECCIONAR DE PLAQUES SOLARS ...................................................................... 19 FIGURA 9. ESQUEMA PCB I ......................................................................................................................... 23 FIGURA 10. ESQUEMA PCB II ...................................................................................................................... 24 FIGURA 11. CIRCUIT DE CONTROL DELS RELÉS ........................................................................................... 24 FIGURA 12. FIGURA 12. CONNEXIONS DEL MICROCONTROLADOR ........................................................... 25 FIGURA 13. CIRCUIT DELS CONNECTORS .................................................................................................... 26 FIGURA 14. CIRCUIT DEL MÒDUL DELS RELÉS ............................................................................................ 26 FIGURA 15. CIRCUIT D’ALIMENTACIÓ I PROTECCIÓ ................................................................................... 27 FIGURA 16. CIRCUIT CONVERTIDOR ELEVADOR ......................................................................................... 27 FIGURA 17. CIRCUIT DE MESURA DE CORRENT .......................................................................................... 28 FIGURA 18. CIRCUIT DE MESURA DE TENSIÓ ............................................................................................. 28 FIGURA 19. PCB .......................................................................................................................................... 29 FIGURA 20. PART POSTERIOR DE LA PCB .................................................................................................... 29 FIGURA 21. RASPBERRY PI PICO W ............................................................................................................. 30 FIGURA 22. PORTS I CONNECTORS DE LA RASPBERRY PI PICO W .............................................................. 31 FIGURA 23. RASPBERRY PI PICO ................................................................................................................. 32 FIGURA 24. RASPBERRY PI PICO AMB MÒDUL ESP8285 ............................................................................ 33 FIGURA 25. CABLE FTDI CHIP TTL-232RG-VSW5V-WE ................................................................................ 36 FIGURA 26. LOGOTIP DE THONNY .............................................................................................................. 38 FIGURA 27. LOGOTIP DE VISUAL STUDIO CODE ......................................................................................... 40 FIGURA 28. LOGOTIP DE TERA TERM ......................................................................................................... 42 FIGURA 29. LOGOTIP DE PSPICE SCHEMATICS ........................................................................................... 44 FIGURA 30. CIRCUIT PER MESURAR EL CORRENT AMB L’ADC ................................................................... 46 FIGURA 31. DIVISOR DE TENSIÓ PER MESURAR LA TENSIÓ AMB L’ADC .................................................... 47 FIGURA 32. SENYAL QUADRAT CONTROLAT AMB FREQÜÈNCIA 115 HZ ................................................... 48 FIGURA 33. DETALL DE LES MOSTRES EN MIG PERÍODE DEL SENYAL QUADRAT ....................................... 48 FIGURA 34. ESTRUCTURA DEL PROGRAMA DE LA RASPBERRY PI PICO W ................................................. 50 FIGURA 35. REPRESENTACIÓ CORRENT, TENSIÓ I CORBA I-V AMB RETARD 0 ΜS ..................................... 61 FIGURA 36. REPRESENTACIÓ CORRENT, TENSIÓ I CORBA I-V AMB RETARD 10 ΜS ................................... 62 Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 7 FIGURA 37. REPRESENTACIÓ CORRENT, TENSIÓ I CORBA I-V AMB RETARD 20 ΜS ................................... 62 FIGURA 38. REPRESENTACIÓ CORRENT, TENSIÓ I CORBA I-V AMB RETARD 50 ΜS ................................... 63 FIGURA 39. EXEMPLE DE DOCUMENT GENERAT AMB LES DADES MESURADES........................................ 71 FIGURA 40. REPRESENTACIÓ CORRENT, TENSIÓ I CORBA I-V .................................................................... 77 FIGURA 41. REPRESENTACIÓ CORRENT, TENSIÓ I CORBA I-V FILTRADES .................................................. 77 FIGURA 42. REPRESENTACIÓ CORRENT, TENSIÓ I CORBA I-V, EXEMPLE DE DESVIACIÓ A CAUSA D’UNA OMBRA .............................................................................................................................................. 82 FIGURA 43. REPRESENTACIÓ DE LA CORBA I-V A LABVIEW ....................................................................... 83 FIGURA 44. CORBA I-V FILTRADA A LABVIEW ............................................................................................ 83 FIGURA 45. PCB (DETALL AL DÍODE D1 I ALS TIRAPINS SOLDATS) .............................................................. 87 FIGURA 46. PART POSTERIOR DE LA PCB (DETALL RESISTÈNCIA SHUNT I TALL CONDENSADOR C37) ....... 87 FIGURA 47. CIRCUIT DE COMMUTACIÓ AMB MOSFET .............................................................................. 88 FIGURA 48. CIRCUIT PER SUBSTITUIR EL RELÉ 1 ......................................................................................... 89 FIGURA 49. SIMULACIÓ DE TENSIÓ DE PLAQUES EN CADENA O AÏLLADA ................................................. 89 FIGURA 50. CIRCUIT PER SUBSTITUIR EL RELÉ 2 ......................................................................................... 90 FIGURA 51. SIMULACIÓ DE TENSIÓ DE PLAQUES EN CADENA O AÏLLADA ................................................. 90 FIGURA 52. CIRCUIT PER SUBSTITUIR EL RELÉ 3 ......................................................................................... 91 FIGURA 53. SIMULACIÓ DE CÀRREGA I DESCÀRREGA DEL CONDENSADOR PER FER LES MESURES .......... 91 FIGURA 54. MUNTATGE PER SUBSTITUIR EL RELÉ 3 ................................................................................... 92 FIGURA 55.CÀRREGA I DESCÀRREGA DEL CONDENSADOR AMB EL CIRCUIT EXPERIMENTAL ................... 92 FIGURA 56. CÀRREGA DEL CONDENSADOR I PIC DE CORRENT AMB EL CIRCUIT EXPERIMENTAL ............. 93 FIGURA 57. FONT D'ALIMENTACIÓ TRIPLE HEWLETT PACKARD E3631A ................................................... 93 FIGURA 58. OSCIL·LOSCOPI LECROY WAVESURFER WS432 2 CANALS 350MHZ ........................................ 94 FIGURA 59. SONDA DE CORRENT CPC-500-27-BP2 .................................................................................... 94 FIGURA 60. MAPA DE POSICIONAMENT DEL TRAÇADOR ........................................................................... 98 FIGURA 61. CONFIGURACIÓ DE L’INTÈRPRET ........................................................................................... 105 FIGURA 62. SELECCIÓ DE L’INTÈRPRET ..................................................................................................... 105 FIGURA 63. SELECCIÓ DEL PORT ............................................................................................................... 106 FIGURA 64. OPCIONS DE L’INTÈRPRET ..................................................................................................... 106 FIGURA 65. SELECCIÓ DEL PORT SÈRIE A TERA TERM .............................................................................. 107 FIGURA 66. ACCÉS A LA CONFIGURACIÓ DEL PORT SÈRIE ........................................................................ 107 FIGURA 67. CONFIGURACIÓ DEL PORT SÈRIE ........................................................................................... 108 FIGURA 68. PCB I ...................................................................................................................................... 109 FIGURA 69. PCB II ..................................................................................................................................... 109 FIGURA 70. CIRCUIT PER SUBSTITUIR EL RELÉ 1 ....................................................................................... 110 FIGURA 71. CIRCUIT PER SUBSTITUIR EL RELÉ 2 ....................................................................................... 110 FIGURA 72. CIRCUIT PER SUBSTITUIR EL RELÉ 3 ....................................................................................... 111 Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 8 ÍNDEX DE TAULES TAULA 1. COMPARATIVA ENTRE ELS TIPUS DE PLAQUES SOLARS FOTOVOLTAIQUES ............................... 13 TAULA 2. COMPARATIVA ENTRE LA RASPBERRY PI PICO I LA RASPBERRY PI PICO W ................................ 32 TAULA 3. COMPARATIVA ENTRE LA RASPBERRY PI PICO W I LA RASPBERRY PI PICO AMB ESP8285 ........ 33 TAULA 4. CABLEJAT DEL CABLE FTDI .......................................................................................................... 37 TAULA 5. COMANDES DELS RETARDS PROGRAMATS ENTRE MOSTRES .................................................... 59 Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 15 Factors que afecten la corba I-V: - Irradiància solar: Com més llum solar hi ha, més corrent genera la placa, elevant tota la corba. Si la irradiància disminueix, el corrent Isc i la potència Pmax també es redueixen. - Temperatura: A mesura que augmenta la temperatura, la tensió Voc disminueix, desplaçant la corba cap a l’esquerra i reduint la potència màxima. - Ombres o brutícia: Una obstrucció parcial o total afecta greument la corba, reduint tant el corrent com la potència generada. A partir de la corba I-V, es pot derivar una corba de potència (P) en funció de la tensió, la corba P-V. La potència és baixa al principi i al final de la corba, assolint un pic en el punt de màxima potència. Figura 4. Corba I-V i corba P-V. Font: AutoSolar Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 16 2.2.1. Desviacions de la corba I-V Per obtenir la corba I-V ideal, és necessari una referència que habitualment es basa en les dades proporcionades a la placa de característiques del mòdul o en mesures realitzades als circuits propers. Tanmateix, poden sorgir diversos tipus de desviacions a la corba, cadascuna provocada per diferents factors. A continuació, es presenten les principals desviacions i les seves possibles causes: [10] Figura 5. Desviacions típiques de la corba I-V. Font: Fluke 1. Corba I-V amb esglaons: Els esglaons presents en la corba I-V són conseqüència d'una discrepància de corrent dins del circuit de prova. Aquests esglaons es produeixen quan els díodes de derivació s’activen, permetent que el corrent flueixi al voltant de les cèl·lules més febles o aquelles exposades a menys llum. El nombre i l’amplada dels esglaons depenen de la densitat i l’abast de l’ombra que afecta el sistema. Diverses condicions poden generar aquesta discrepància de corrent, com ara brutícia no uniforme, ombra parcial, cèl·lules o cadenes de cèl·lules danyades, o díodes de derivació en curtcircuit. 2. Corrent de curtcircuit baixa (ISC): En una corba I-V normal, un valor de ISC inferior al previst pot ser degut un error de l’operador que pren la mesura, una mesura deficient de la irradiància, Ombres o brutícia o problemes de rendiment del mòdul. Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 17 3. Tensió en circuit obert baixa (VOC): Una mesura incorrecta de la temperatura de la cèl·lula podria ser responsable d’aquest valor. A més, l’ombra pot reduir el valor de la tensió en circuit obert (VOC) en determinades condicions de prova. També és possible que aquesta situació es degui a problemes de maquinari. Tanmateix, cal tenir en compte que la VOC és un dels paràmetres del mòdul fotovoltaic amb la taxa d’envelliment més baixa. Per aquest motiu, és important analitzar altres possibles causes abans d’atribuir directament un valor baix de VOC a la degradació de les cèl·lules. 4. Curvatura més arrodonida: De vegades, pot resultar complicat determinar si una regió amb el colze més arrodonit representa una alteració real de la corba o simplement és una il·lusió provocada per canvis en el pendent. L’arrodoniment del colze és probablement una manifestació de l’envelliment del sistema. Per confirmar-ho, és important tornar a analitzar i monitoritzar el circuit de manera periòdica per identificar i fer un seguiment adequat de les possibles tendències al llarg del temps. 5. Relació de baixa tensió (VMP ÷ VOC): Un pendent més suau del que s’esperava al tram vertical de la corba I-V caracteritza el cinquè tipus de desviació. Aquesta anomalia es pot identificar comparant visualment les corbes mesurades amb les previstes o analitzant els valors de la relació de tensió en les diverses mesures de les cadenes, sempre que les corbes no presentin esglaons provocats per discrepàncies. La relació de tensió és una eina especialment valuosa per detectar pendents inusuals en el tram vertical de la corba I-V. 6. Relació de corrent baixa (IMP ÷ ISC): Un pendent més alt del previst al tram horitzontal de la corba I-V es pot detectar de la mateixa manera que al punt anterior. La relació de corrent és molt útil per identificar pendents atípics al tram horitzontal de la corba I-V. Abans de buscar problemes de maquinari, cal descartar errors de mesura d’irradiància, ombra i brutícia. Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 18 2.2.2. Equips de mesura de la corba I-V Per mesurar la corba I-V d'un panell solar es fan servir dispositius especialitzats coneguts com a analitzadors de corba I-V o PV testers. Aquests equips estan dissenyats per realitzar mesures ràpides i precises en diferents condicions de treball, tant per a ús professional com per a aplicacions domèstiques. Aquests equips es connecten als terminals del panell solar mitjançant cables. Alguns dispositius inclouen pinces cocodril per una connexió fàcil i segura. L’analitzador varia la càrrega elèctrica del panell (simulant diferents condicions de treball) i registra simultàniament els valors de tensió i intensitat en múltiples punts, traçant automàticament la corba I-V. A més, calculen els paràmetres clau (Voc, Isc, Pmax, etc.) i l’eficiència i factor de forma del panell. La corba I-V es mostra en una pantalla integrada o es transmet a un ordinador o dispositiu mòbil per analitzarla amb programari específic. Alguns equips permeten guardar resultats per comparacions futures.[11][12] Existeixen diferents tipus d’analitzadors: - Portàtils: Lleugers i fàcils de transportar, pensats per a tècnics que fan mesures en camp. Tenen una gran mobilitat i senzillesa d'ús. Figura 6. Analitzador de corba I-V portàtil Seaward PV150. Font: Seaward Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 19 - Estacionaris o d'alt rendiment: Dissenyats per laboratoris o grans instal·lacions fotovoltaiques. Ofereixen major precisió i suport per a múltiples panells o “strings”. Figura 7. Analitzador de corba I-V estacionari HT Instruments IV400. Font: HT Instruments - Integrats amb drons o sistemes remots: Permeten mesurar grans camps fotovoltaics sense desplaçar-se físicament a cada panell. Utilitzen càmeres tèrmiques i sensors per combinar mesures I-V amb imatges tèrmiques. Figura 8. Dron per inspeccionar de plaques solars. Font: AeroScan Aquests equips tenen diversos avantatges, com la precisió, la rapidesa o els complements que es poden afegir (mesuradors d'irradiància, eines de diagnòstic, etc.), però també té alguns inconvenients significants. Els principals són el preu, especialment els models d'alt rendiment, i la dependència de l'usuari, cal que l'operador vagi a la instal·lació i ha de tindre coneixements mínims sobre el funcionament i els paràmetres fotovoltaics. Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 20 2.3. Wi-Fi El Wi-Fi (abreviatura de Wireless Fidelity) és una tecnologia de comunicació sense fil que permet connectar dispositius a una xarxa de dades, generalment per a accedir a internet o compartir recursos entre dispositius sense necessitat de cables. És una de les formes més comunes de connexió sense fil en llars, oficines, llocs públics i dispositius mòbils. Les xarxes Wi-Fi funcionen mitjançant la transmissió d'ones de ràdio en diverses freqüències, oferint connectivitat a diferents velocitats. Aquestes freqüències es classifiquen en els rangs de 2,4 GHz, 5 GHz i 6 GHz. En general, com més alta és la freqüència, més grans són les velocitats de transmissió. No obstant això, la millor freqüència depèn de les necessitats específiques: les freqüències més baixes, com els 2,4 GHz, ofereixen un abast més llarg però a velocitats menors, mentre que els 6 GHz proporcionen velocitats i rendiment més elevats però amb un abast més limitat. Per tal de garantir una connexió eficient i fiable, les xarxes Wi-Fi fan ús d’un dels diversos protocols IEEE 802.11, un conjunt d’estàndards desenvolupats per l’Institut d’Enginyers Elèctrics i Electrònics (IEEE) per establir les especificacions de les xarxes sense fil (WLAN). Entre els protocols més utilitzats es troben 802.11a, 802.11b, 802.11g, 802.11n i 802.11ac, cadascun amb característiques específiques com el rang de freqüències d’operació, la taxa màxima de dades i les tècniques de modulació utilitzades. Les xarxes Wi-Fi actuen com un sistema de comunicació bidireccional entre un dispositiu i l’encaminador. Quan un dispositiu intenta connectar-se a una xarxa Wi-Fi, envia un missatge conegut com a "sol·licitud de sondeig" per escanejar les xarxes disponibles properes. L’encaminador, també conegut com a punt d’accés Wi-Fi, rep aquesta sol·licitud i respon amb un missatge anomenat "balisa", que conté informació clau com el nom de la xarxa (SSID), el tipus de xifratge utilitzat (si n’hi ha) i la intensitat del senyal (RSSI). Quan un dispositiu rep la balisa del punt d’accés, procedeix a connectar-se enviant una “sol·licitud d’autenticació”. Tot seguit, el punt d’accés verifica les credencials del dispositiu i li assigna una adreça IP. En aquest moment, el dispositiu queda connectat oficialment a la xarxa Wi-Fi. Si la xarxa disposa de connexió a internet, el dispositiu hi podrà accedir, i si no, podrà comunicar-se amb altres dispositius dins de la mateixa xarxa. [13][14] Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 21 2.4. Diferencies entre Wi-Fi i LoRaWAN Treballar amb Wi-Fi o amb LoRaWAN en un projecte de comunicació sense fils depèn de diversos factors com la distància, el consum energètic, la capacitat de dades, el cost i la infraestructura. A continuació es comparen els avantatges de treballar amb Wi-Fi en lloc de LoRaWAN: [15][16] 1. Amplada de banda i velocitat de transmissió de dades Wi-Fi ofereix velocitats de transmissió de dades de desenes a centenars de Mbps (amb les versions modernes com Wi-Fi 5 i 6), mentre que LoRaWAN té una velocitat de transmissió molt baixa, típica d'uns pocs kilobits per segon (kbps). 2. Infraestructura més accessible i estandarditzada Les xarxes Wi-Fi són molt comunes i estan disponibles en molts llocs (llars, oficines, espais públics) i els seus encaminadors són econòmics i estan àmpliament distribuïts. En canvi, LoRaWAN requereix una infraestructura específica com una passarel·la LoRaWAN, que pot ser més costosa i menys comuna. 3. Suport a dispositius convencionals Wi-Fi és compatible amb molts dispositius estàndard com telèfons mòbils, tauletes, portàtils i molts dispositius IoT. LoRaWAN està pensat per a dispositius IoT específics que integren transceptors LoRa. 4. Facilitat de configuració i ús Configurar una xarxa Wi-Fi és relativament senzill amb eines i interfícies estàndard, mentre que LoRaWAN requereix coneixements més específics sobre configuració de xarxes LPWAN (Low Power Wide Area Network) i pot requerir permisos d'operació segons la regió. 5. Latència més baixa Wi-Fi té latències molt baixes (mil·lisegons), que el fan adequat per a aplicacions en temps real i LoRaWAN té una latència més alta, no sent adequat per a aplicacions en temps real. Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 22 6. Consum energètic dels encaminadors Els encaminadors Wi-Fi tenen accés constant a energia elèctrica, per la qual cosa poden manejar transmissions contínues i altes velocitats sense preocupar-se pel consum. En canvi, el nodes de LoRaWAN són de baix consum, però les passarel·les poden ser més exigents en termes de consum si han de cobrir grans àrees. 7. Capacitat de connectar múltiples dispositius Els encaminadors Wi-Fi poden manejar un gran nombre de dispositius simultàniament amb un bon rendiment. Contràriament, LoRaWAN té limitacions estrictes en la capacitat de connectar dispositius per passarel·la a causa de restriccions en el protocol. Tot i que Wi-Fi té molts avantatges, no és la millor solució per a totes les situacions, ja que té alguns inconvenients que poden fer que sigui millor optar per LoRraWAN: - Abast limitat: Wi-Fi cobreix una distància típica de 50-100 metres, mentre que LoRaWAN pot arribar a diversos quilòmetres. - Consum energètic dels dispositius: Els dispositius Wi-Fi són més exigents en termes d'energia que els de LoRaWAN, la qual cosa pot ser un problema per a sensors alimentats per bateria. - No apte per àrees remotes: En llocs sense infraestructura Wi-Fi, LoRaWAN és una millor opció gràcies al seu abast ampli. En conclusió, treballar amb Wi-Fi té clars avantatges en termes de velocitat, interoperabilitat, facilitat d'ús i accessibilitat en entorns amb infraestructura existent. Tot i això, si el projecte requereix un abast llarg, un consum ultra baix o operacions en àrees remotes, LoRaWAN pot ser més adequat. Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 23 3. DESENVOLUPAMENT 3.1. Hardware 3.1.1. PCB Es parteix de la PCB creada al projecte “Trazador de curvas I-V inalámbrico para paneles solares”. En total es compten amb 4 PCB iguals. Figura 9. Esquema PCB I. Font: Pròpia Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 24 Figura 10. Esquema PCB II. Font: Pròpia Accionament dels relés: Aquest circuit permet controlar els 4 relés mitjançant el microcontrolador. El ULN2003 actua com a interfície entre els senyals de control de baixa potència i els relés, oferint protecció contra pics de tensió i amplificant el corrent necessari per activar els relés. Figura 11. Circuit de control dels relés. Font: Pròpia Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 31 Figura 22. Ports i connectors de la Raspberry Pi Pico W. Font: Raspberry Alimentació: - Port micro-USB (5 V). - Pins GPIO (fins a 3,3 V regulats). - Consum energètic baix, ideal per a projectes portàtils. Mida compacta: - Dimensions: 51 mm × 21 mm. - Dissenyada per a projectes on l’espai és limitat. Programació i programari: - Compatible amb llenguatges de programació com ara: - MicroPython (molt popular per a principiants i projectes IoT). - C/C++ (ofereix més control i rendiment). - Admet eines com Thonny IDE per escriure i carregar codi. Els principals avantatges que mostra aquest microcontrolador respecte a altres microcontroladors semblants són: - Baix cost i mida compacta. - Connectivitat sense fils integrada. Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 32 - Comunitat i documentació àmplies. - Suport per a diversos llenguatges de programació. D’altra banda, té certes limitacions, com: - No és un ordinador complet com altres Raspberry Pi - Memòria limitada per a aplicacions avançades. - Requereix cert coneixement tècnic per aprofitar tot el seu potencial. Tenint en compte les característiques requerides per a l'aplicació del projecte, aquestes limitacions no resulten significatives. Per tant, el microcontrolador Raspberry Pi Pico es presenta com una opció ideal per satisfer les necessitats del sistema. Les principals diferències de la versió Wi-Fi respecte a la versió estàndard són les següents: Característica Raspberry Pi Pico Raspberry Pi Pico W Connectivitat sense fils No Wi-Fi i Bluetooth Xip de connectivitat N/A Infineon CYW43439 Preu Més baix Lleugerament més alt Taula 2. Comparativa entre la Raspberry Pi Pico i la Raspberry Pi Pico W Figura 23. Raspberry Pi Pico. Font: Raspberry Al mercat es pot trobar una rèplica de la Raspberry Pi Pico W. És una Pi Pico que integra un mòdul ESP8285 per proporcionar connectivitat Wi-Fi, en lloc del xip CYW43439 utilitzat a la versió oficial.[18] Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 33 Figura 24. Raspberry Pi Pico amb mòdul ESP8285. Font: AliExpress Les principals diferències entre els 2 models són les següents: Característica Raspberry Pi Pico W Raspberry Pi Pico amb ESP8285 Microcontrolador principal RP2040 (Dual-core ARM CortexM0+) RP2040 (Dual-core ARM CortexM0+) Mòdul Wi-Fi CYW43439 (Broadcom) integrat amb suport Wi-Fi 4 (802.11 b/g/n) ESP8285 (mòdul Wi-Fi extern, UART o SPI) Bluetooth Sí (BLE i clàssic, suport oficial) No Integració Wi-Fi Totalment integrada, suport natiu en MicroPython i C/C++ Wi-Fi gestionat externament, ús de comandes AT o biblioteques addicionals Suport oficial Compatible amb MicroPython, C/C++ i CircuitPython amb APIs oficials Requereix suport de tercers o personalització per gestionar l’ESP8285 Consum energètic Més eficient gràcies a la integració del CYW43439 Consum més elevat degut a l’ús separat del mòdul ESP8285 Facilitat de programació Alta: Wi-Fi i Bluetooth es gestionen amb APIs fàcils d’usar Moderada: Configuració manual del mòdul ESP8285 i ús de comandes AT Cost Lleugerament més alt (mòdul CYW43439 de qualitat superior) Generalment més econòmic Compatibilitat amb IoT Ideal per aplicacions IoT gràcies al baix consum i l’elevada integració Potencial per IoT, però menys optimitzat i més complex Utilització d’UART/SPI No necessari per al mòdul Wi-Fi o Bluetooth Necessari per comunicar-se amb el mòdul ESP8285 Taula 3. Comparativa entre la Raspberry Pi Pico W i la Raspberry Pi Pico amb ESP8285 Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 34 Inicialment, per disponibilitat, es comença a programar amb la Raspberry Pi Pico amb el xip ESP8285, però per motius d’eficiència i comoditat s’opta per utilitzar la versió oficial de la Raspberry Pi Pico W. Tot i les diferències entre ambdues plaques, es comprova que l'única diferència significativa a nivell de programació és la gestió de la connexió a Wi-Fi. La versió oficial compta amb una biblioteca específica que facilita aquesta tasca, mentre que la rèplica requereix l'ús de comandes AT per establir i gestionar la connexió. A continuació s’explica tot el que es necessita i com posar en marxa una Raspberry Pi Pico W des de zero: 1. Preparar l'entorn Material necessari: - Una Raspberry Pi Pico W. - Un cable USB. - Un ordinador. - Connexió a Internet. Instal·lar l'entorn de desenvolupament: - Decidir quin llenguatge i programari es farà servir. Els més comuns són: • MicroPython. • C/C++. En aquest projecte s’utilitza MicroPython. 2. Descarregar MicroPython - Visitar el lloc oficial de Raspberry Pi: https://www.raspberrypi.com/software/micropython - Descarregar l'arxiu UF2: Buscar l'arxiu per a la Pico W a la secció de MicroPython. El nom serà similar a rp2-pico-w-<versió>.uf2. 3. Connectar la Pico W a l'ordinador Mode d'emmagatzematge USB: - Mantenir premut el botó BOOTSEL de la Pico W. - Mentre es manté premut, connectar la Pico W a l'ordinador mitjançant el cable USB. - Alliberar el botó BOOTSEL després de connectar. La Pico W apareixerà com una unitat d'emmagatzematge a l’ordinador amb un nom com RPIRP2. Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 35 4. Flashejar el firmware de MicroPython Copiar l'arxiu UF2: - Arrossegar i deixar anar l'arxiu .uf2 que s’ha descarregat a la unitat RPI-RP2. - La Pico W es reiniciarà automàticament i estarà llesta per utilitzar-se amb MicroPython. En aquest moment la Raspberry està preparada per funcionar en l’entorn de programació que es desitgi, en aquest projecte es treballa amb Thonny. A l’apart Software s’explica com posar en marxa l’editor. Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 36 3.1.3. Cable FTDI Per a la comunicació sèrie s’utilitza el cable FTDI Chip TTL-232RG-VSW5V-WE és un convertidor USB a UART (TTL) que permet la comunicació sèrie entre dispositius USB i dispositius amb interfície UART (Universal Asynchronous Receiver-Transmitter). Aquest cable integra un xip FTDI FT232R, que s'encarrega de la conversió de senyals USB a UART. Les principals característiques d’aquest cable són:[19] Conversió USB a TTL: - Converteix el senyal USB a nivells lògics TTL (Transistor-Transistor Logic), cosa que permet la comunicació amb microcontroladors o altres dispositius electrònics. - Compatible amb nivells TTL de 5 V o ajustables a altres voltatges depenent de la versió del cable. Connectors: - Connector USB-A en un extrem per connectar-se a un ordinador o dispositiu USB. - A l'altre extrem, els cables tenen els fils pelats i identificats per colors, la qual cosa facilita la connexió als pins de l'equip UART. Xip FTDI FT232R: - És el nucli del cable, un xip reconegut per la seva fiabilitat i compatibilitat amb diversos sistemes operatius (Windows, macOS, Linux). - Proporciona control complet sobre la configuració sèrie, com ara la velocitat de transmissió (baud rate), bits de dades, bits de parada, i paritat. Compatibilitat: - Compatible amb sistemes operatius moderns, ja que utilitza drivers disponibles oficialment des de FTDI. - Compatible amb microcontroladors com Arduino, Raspberry Pi, i altres dispositius amb interfícies UART. Figura 25. Cable FTDI Chip TTL-232RG-VSW5V-WE. Font: RS Components Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 37 Cablejat: Color Nom Tipus Descripció Negre GND GND Pin de subministrament de terra del dispositiu. Marró CTS# Entrada Clear to Send (Lliure per enviar), senyal d'entrada / mànec. Vermell VCC Sortida o entrada Sortida d'alimentació. Taronja TXD Sortida Sortida de dades asíncrones transmeses. Groc RXD Entrada Entrada de dades asíncrones rebudes. Verd RTS# Sortida Request To Send (Sol·licitud per enviar), sortida de control / mànec. Taula 4. Cablejat del cable FTDI Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 38 3.2. Software Pel desenvolupament del projecte s’han utilitzat diversos softwares de programació, com els editors Thonny i Visual Studio Code; un emulador de port sèrie, Tera Term; i una eina de disseny de circuits electrònics, PSPICE Schematics. 3.2.1. Thonny Thonny és un entorn de desenvolupament integrat (IDE) intuïtiu i senzill, ideal per a principiants però amb funcionalitats útils per a usuaris avançats. Té una interfície neta i fàcil d’entendre, amb eines com un editor de codi, una consola d’execució i un depurador visual que permet seguir el flux d’execució i els valors de les variables en temps real. També inclou una eina per gestionar variables, ajudant a comprendre els conceptes de programació de manera pràctica. El seu disseny elimina configuracions complexes, permetent començar a utilitzar Python sense complicacions. A més, és compatible amb plaques de microcontroladors com la Raspberry Pi Pico gràcies al suport per a MicroPython i CircuitPython. Per a usuaris avançats, ofereix funcions opcionals com la gestió d’entorns virtuals, instal·lació de paquets Python i suport per a llibreries de PyPI. Finalment, facilita l’escriptura i execució interactiva de codi, mostrant errors amb explicacions detallades.[20] Figura 26. Logotip de Thonny. Font: Thonny A Thonny és on es realitzarà la programació del codi de la Raspberry Pi Pico W amb MicroPython, una implementació optimitzada del llenguatge de programació Python 3. Està dissenyat específicament per funcionar en microcontroladors i en entorns amb recursos limitats. Incorpora funcionalitats avançades com un terminal interactiu (REPL), comprensions de llistes, gestió d'excepcions, entre d'altres. Tot i això, és prou compacte per funcionar en només 256 kB d'espai de codi i 16 kB de RAM. L'objectiu de MicroPython és oferir la màxima compatibilitat amb Python estàndard, facilitant la transferència de codi des d'un entorn d'escriptori a un microcontrolador o sistema incrustat amb facilitat.[21] Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 39 Per poder treballar amb aquest editor s’han de seguir els següents passos: 1. Descarregar Thonny - Anar al lloc oficial de Thonny: https://thonny.org. - A la pàgina principal, buscar el botó de descàrrega. - L’arxiu descarregat serà un executable amb un nom com ara “thonny-<versió>.exe”. 2. Iniciar la instal·lació - Localitzar l’arxiu descarregat i fer doble clic sobre ell. - Si apareix una finestra de control d’usuari, fer clic a Sí. 3. Configurar la instal·lació - Triar l’idioma. - Acceptar els termes de la llicència i fer clic a Següent. - Per defecte, Thonny s’instal·larà en una carpeta dins de C:\Arxius de programa o similar. Si es vol canviar la ubicació, seleccionar una altra carpeta. 4. Completar la instal·lació - Fer clic a Instal·lar per començar el procés - Fer clic a Finalitza. 5. Configurar intèrpret per a Raspberry Pi Pico W - Seleccionar executar i a continuació Configurar Intèrpret. - A la pestanya Intèrpret, obrir el desplegable i seleccionar MicroPython(RP2040) - Obrir el desplegable de port i seleccionar el COM que aparegui. - Seleccionar totes les opcions que apareixen i fer clic a “Ok”. Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 40 3.2.2. Visual Studio Code Visual Studio Code és un editor de codi obert, gratuït i desenvolupat per Microsoft, optimitzat per ser lleuger i ràpid fins i tot en equips amb recursos limitats. És compatible amb múltiples llenguatges de programació, com Python, JavaScript, C++, Java, etc. Inclou un editor intel·ligent amb funcionalitats com l’autocompletat (IntelliSense), ressaltat de sintaxi, i eines de refactorització per millorar la productivitat. També ofereix eines avançades de depuració amb punts d’interrupció, visualització de variables en temps real i anàlisi de les piles de crides. VS Code integra de manera nativa el control de versions amb Git, permetent gestionar commits, branques i l'estat dels fitxers directament des de l'editor. La seva extensibilitat es potencia amb un Marketplace ric en extensions per afegir funcionalitats. A més, disposa d’un terminal integrat per executar scripts, suport per a múltiples plataformes (Windows, macOS i Linux) i eines de col·laboració en temps real com Live Share, que permet treballar conjuntament en el mateix codi.[22] Figura 27. Logotip de Visual Studio Code. Font: VSCode A VC Code es realitzarà la programació del codi receptor de la llista de les dades de corrent i tensió i la representació en gràfiques d’aquestes dades i de la corba I-V. El llenguatge utilitzat és Python, un llenguatge de programació d’alt nivell, orientat a objectes i amb una semàntica dinàmica integrada, ideal per al desenvolupament web i d’aplicacions. És especialment atractiu per al Desenvolupament Ràpid d’Aplicacions (RAD) gràcies a la seva tipificació i encadenament dinàmics. La seva senzillesa i sintaxi llegible el fan fàcil d’aprendre, cosa que permet als desenvolupadors col·laborar de manera efectiva i reduir costos de manteniment i desenvolupament. Suporta l’ús de mòduls i paquets, facilitant la reutilització del codi i l’escalabilitat en diversos projectes. Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 47 4.2. Lectura de tensió L’ADC mesura la tensió al punt indicat V(V). Figura 31. Divisor de tensió per mesurar la tensió amb l’ADC. Font: Pròpia Analitzant el divisor de tensió: 𝑉(𝑉)=𝑅31 𝑅26 + 𝑅31 ×𝑃𝑉+= 56𝑘 953𝑘 + 56𝑘×𝑃𝑉+= 0,0555 ×𝑃𝑉 + La tensió que es mesura és, aproximadament, un 5,55% de la tensió al panell. El circuit està dissenyat per garantir que la tensió màxima del panell sigui de 55 V, assegurant que al ADC només arribin 3 V, el valor de referència d’aquest. En aquest cas, la conversió es fa de la mateixa manera que amb el corrent, canviant el factor de conversió pel que produeix el divisor de tensió: 𝑉 = 𝑙𝑒𝑐𝑡𝑢𝑟𝑎 × 3𝑉 65335 × 0,0555 Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 48 4.3. Freqüència de mostreig del microcontrolador Tot i que a les especificacions del fabricant del microcontrolador apareix la freqüència de mostreig màxima de l’ADC, 500 kSps, per representar les gràfiques en temps real, es necessari saber la freqüència de mostreig real a la el microcontrolador realitza el mostreig executant el programa en Micropython. Per obtenir-ho, es genera un senyal quadrat controlat amb un generador de funcions i s’ajusta perquè quedin 100 mostres en mig període. A continuació, s’agafa la freqüència d’aquest senyal i es fan els càlculs necessaris: 𝑓 = 115 𝐻𝑧 𝑇 = 1 𝑓=1 115 = 0,00869 𝑠 Figura 32. Senyal quadrat controlat amb freqüència 115 Hz. Font: Pròpia Figura 33. Detall de les mostres en mig període del senyal quadrat. Font: Pròpia Com les 100 mostres es troben en mig període, es divideix entre 2: 𝑇 2= 0,00435 𝑠 Per tant, el temps que triga el microcontrolador a prendre 1 mostra és: 𝑇𝑚𝑜𝑠𝑡𝑟𝑎 =0,00435 100 = 0,0000435 𝑠 = 43,5 𝜇𝑠 Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 49 Tenint aquest resultat es pot calcular la freqüència de mostreig: 𝑓𝑚𝑜𝑠𝑡𝑟𝑒𝑖𝑔 =1 𝑇𝑚𝑜𝑠𝑡𝑟𝑎 =1 0,0000435 =23000 𝑆𝑝𝑠 Amb aquesta data es poden representar les gràfiques en temps real afegint la freqüència de mostreig real al codi. Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 50 5. FASE EXPERIMENTAL 5.1. Programació 5.1.1. Programa Raspberry Pi Pico W Un cop instal·lat Thonny i amb les configuracions inicials realitzades, es programa en Micropython el codi que controla la Raspberry Pi Pico W. Per comoditat i simplicitat, cada procés es defineix com una funció i es van cridant al bucle principal. El programa segueix la següent estructura: Figura 34. Estructura del programa de la Raspberry Pi Pico W. Font: Pròpia Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 51 A continuació, es presenten les configuracions i funcions que s’han programat: Llibreries El primer pas del programa consisteix a importar les llibreries necessàries per garantir el correcte funcionament de totes les funcionalitats implementades en el codi. Les llibreries utilitzades en aquest projecte són les següents: Machine: És el mòdul principal que proporciona accés al maquinari de la placa, com els pins GPIO, comunicació UART, ADC, etc. Dintre d’aquest mòdul importem les llibreries: - ADC: Serveix per llegir senyals analògics (de 0 a 3 V, depenent de la placa) i convertirlos a valors digitals. S'utilitza per connectar sensors analògics, com potenciòmetres, sensors de temperatura, etc. - Pin: Permet accedir i configurar els pins GPIO de la placa. Serveix per controlar dispositius com LED, botons, relés, etc., o per llegir estats d'entrada (0/1, digital). - UART : És una interfície de comunicació sèrie. S'utilitza per enviar i rebre dades entre la placa i altres dispositius (com sensors, altres plaques, o un ordinador). Time: Permet gestionar el temps. Les funcions que s’utilitzen són: - time.sleep(): Fa que el programa esperi durant un temps especificat (en segons). - time.time(): Retorna el temps actual en segons des del començament d'una referència (com l'inici del programa). Network: Proporciona suport per a connexió a xarxes Wi-Fi o Ethernet. La funció que es fa servir és: - network.WLAN(): Gestiona la connexió Wi-Fi, incloent-hi connectar-se a punts d'accés i establir adreces IP. Socket: Permet gestionar connexions de xarxa utilitzant sockets. Funciona per a comunicacions TCP/UDP i permet crear servidors i clients. Math: Inclou funcions avançades de càlcul. La funció que s’usarà és: - math.log(): Calcula el logaritme neperià d’un número. Utime: Llibreria similar a time, específica per a microcontroladors. Proporciona una precisió millor en temporitzacions curtes. La funció utilitzada és: - utime.sleep_ms(): Fa que el programa esperi un temps especificat en mil·lisegons. Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 52 Configuracions inicials A continuació, es defineixen els pins que s'utilitzaran al llarg de tot el programa. Tal com s'ha esmentat, en aquest projecte s'usen tres tipus de pins: GPIO, ADC i UART. GPIO: Estan connectats els relés i al led integrat de la Pi Pico W. Tots es defineixen com a sortides. rele1 = Pin(6, Pin.OUT) rele2 = Pin(7, Pin.OUT) rele3 = Pin(8, Pin.OUT) rele4 = Pin(9, Pin.OUT) led = Pin('LED', Pin.OUT) ADC: Hi ha 3 sensors connectats, el de corrent, el de tensió i el de temperatura. adc_voltaje = ADC(Pin(27)) adc_corriente = ADC(Pin(28)) adc_ntc = ADC(Pin(26)) UART: Es defineix el perifèric UART (en aquest cas el 0), la velocitat de transmissió de dades (115200 bps) i els pins GPIO de transmissió i recepció (0 i 1). Aquesta configuració és per la connexió al port sèrie mitjançant el cable FTDI. uart = UART(0, baudrate=115200, tx=Pin(0), rx=Pin(1)) A més, es configura la xarxa Wi-Fi a la que es connecta el dispositiu i per la que s’envien i es reben les dades. ssid = "QSARTI" password = "*********************" Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 53 Funcions parpelleig Per monitoritzar el funcionament del sistema sense necessitat de connexió constant, s’han implementat dues funcions de parpelleig utilitzant el LED integrat de la Raspberry Pi Pico W. La primera funció serveix per indicar que el programa s’executa correctament. El LED parpelleja a un ritme lent, encenent-se i apagant-se cada 0,2 segons. def blink_bien(): led.on() time.sleep(0.2) led.off() time.sleep(0.2) led.on() time.sleep(0.2) led.off() La segona funció indica la presència d'un problema durant l'execució del programa, amb un parpelleig més ràpid del LED, encenent-se i apagant-se cada 0,01 segons. def blink_mal(): led.on() time.sleep(0.01) led.off() time.sleep(0.01) led.on() time.sleep(0.01) led.off() Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 54 Funció de connexió a Wi-Fi Per gestionar la connexió a Wi-Fi, es defineix una funció que utilitza la llibreria network per establir i verificar la connexió amb la xarxa. Aquesta funció comprova inicialment si el sistema ja està connectat a una xarxa Wi-Fi. Si no hi ha cap connexió activa, s'inicia el procés de connexió utilitzant el SSID i la contrasenya configurats. Un cop completat l'intent de connexió, la funció verifica l'estat de la connexió. Si aquesta s'ha establert correctament, es mostra l'adreça IP assignada, tant al terminal com al port sèrie. En cas contrari, es mostra el missatge d'error " No se pudo establecer la conexión a Wi-Fi". Finalment, la funció retorna un valor booleà (True o False) que indica si la connexió s'ha realitzat amb èxit o no. def conectar_wifi(ssid, password): wlan = network.WLAN(network.STA_IF) wlan.active(True) # Intentar conectar si no está conectado if not wlan.isconnected(): print("Intentando conectar a la red Wi-Fi...") uart.write("Intentando conectar a la red Wi-Fi...\r\n") wlan.connect(ssid, password) # Inicia el intento de conexión time.sleep(1) # Espera breve para inicializar la conexión # Comprobar si se logró la conexión if wlan.isconnected(): print("Conectado a la red Wi-Fi") uart.write("Conectado a la red Wi-Fi\r\n") ip = wlan.ifconfig()[0] print("Dirección IP:", ip) uart.write(f"Dirección IP: {ip}\r\n") else: print("No se pudo establecer la conexión a Wi-Fi.") uart.write("No se pudo establecer la conexión a Wi-Fi.\r\n") # Retorna True si está conectado, False si no return wlan.isconnected() Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 55 Funció d’enviament de dades per TCP Per enviar les llistes de dades de corrent i tensió mitjançant un servidor TCP, es defineix una funció que utilitza la llibreria socket. Aquesta funció crea un socket TCP associat a la IP de la xarxa Wi-Fi a la qual està connectat el sistema i a un port predefinit que ha d’estar disponible. La funció comença intentant establir la connexió amb el servidor. Si la connexió és exitosa, es notifica tant al terminal com al port sèrie amb el missatge "Connexión TCP establecida". A continuació, les llistes de corrent i tensió es converteixen en cadenes de text, precedides per un identificador (c per a corrent i v per a tensió) i són enviades al servidor. En cas d’error, com ara la indisponibilitat del servidor o un problema amb la connexió, es genera un missatge d'error "Error en la connexión TCP o envio. Finalment, el socket es tanca per alliberar els recursos del sistema, i es notifica adequadament. def enviar_listas_tcp(corriente_final, voltaje_final): addr = ("10.5.159.155", 65432) # Cambiar la IP y el puerto según sea necesario sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: sock.connect(addr) print("Conexión TCP establecida") uart.write("Conexión TCP establecida\r\n") # Convertir las listas a cadenas con prefijos y enviarlas completas corriente_str = "c," + ",".join(map(str, corriente_final)) + ',' tension_str = "v," + ",".join(map(str, voltaje_final)) + ',' sock.send(corriente_str.encode('utf-8')) # Enviar la lista de corriente sock.send(tension_str.encode('utf-8')) # Enviar la lista de voltaje except Exception as e: print("Error en la conexión TCP o envío:", e) uart.write("Error en la conexión TCP o envío:\r\n") finally: sock.close() print("Conexión cerrada") uart.write("Conexión cerrada\r\n") Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 56 Funció d’enviament de dades pel port sèrie Per enviar la llista de dades de corrent i tensió mitjançant el port sèrie, es defineix una funció que organitza la informació amb l’estructura desitjada. Es comença escrivint una capçalera que inclou la data i l’hora en què s’han pres les mesures, obtingudes gràcies a la llibreria “utime”. Després, els valors mesurats de corrent i tensió es concatenen en cadenes de text. Cada llista s’identifica amb el prefix específic i s’envien pel port sèrie . Un cop completat l’enviament, es genera una notificació que informa de l’èxit de l’operació. def enviar_por_uart(corriente_final, voltaje_final, uart): try: # Obtener la fecha y hora actual fecha_hora_actual = utime.localtime() fecha_hora_str = "{:04d}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}".format( fecha_hora_actual[0], # Año fecha_hora_actual[1], # Mes fecha_hora_actual[2], # Día fecha_hora_actual[3], # Hora fecha_hora_actual[4], # Minuto fecha_hora_actual[5] # Segundo ) # Crear el encabezado con la fecha y hora encabezado = "$G2CV," + fecha_hora_str # Convertir las listas a cadenas con prefijos corriente_str = "c," + ",".join(map(str, corriente_final)) tension_str = "v," + ",".join(map(str, voltaje_final)) # Concatenar todo en una sola cadena mensaje_completo = encabezado + "," + corriente_str + "," + tension_str # Enviar el mensaje por UART uart.write((mensaje_completo + "\r\n").encode('utf-8')) print("Datos enviados por UART") except Exception as e: print("Error en el envío por UART:", e) Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 63 Figura 38. Representació corrent, tensió i corba I-V amb retard 50 μs. Font: Pròpia Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 64 Funció de lectura de corrent i tensió Per llegir les mesures de corrent i tensió, es defineix una funció que guarda els valors llegits per l'ADC de la Raspberry Pi Pico W. Primer, es defineix el retard amb el qual es pren cada mostra (com s'ha mencionat anteriorment, l'inicial és de 0 ms) i el nombre de mostres que es realitzaran (segons proves experimentals, es comprova que 600 mostres són suficients). A continuació, es defineixen dues llistes per emmagatzemar els valors en format binari (valors digitals directes de l'ADC abans de la conversió a unitats reals). El valor de corrent es llegeix mitjançant el mètode "read_u16()" de l'ADC, que retorna un valor de 16 bits (entre 0 i 65535), i aquest es guarda a la llista “lecturas_corriente_binario”. Després, es genera el retard controlat i es repeteix el procés per al voltatge, emmagatzemant el valor a “lecturas_voltaje_binario”. Finalment, els valors binaris es converteixen a unitats reals: amperes per al corrent i volts per a la tensió. La funció retorna les dues llistes amb els valors de corrent i tensió a les variables “lecturas_corriente” i “lecturas_voltaje”, respectivament. def leer_corriente_y_voltaje(retardo_us=0, num_lecturas=600): # Lista de valores sin procesar lecturas_corriente_binario = [] lecturas_voltaje_binario = [] for _ in range(num_lecturas): lectura_corriente = adc_corriente.read_u16() lecturas_corriente_binario.append(lectura_corriente) time.sleep_us(retardo_us) lectura_voltaje = adc_voltaje.read_u16() lecturas_voltaje_binario.append(lectura_voltaje) time.sleep_us(retardo_us) # Ajuste según los componentes lecturas_corriente = [ round(((((lectura)*3)*10)/65335), 2) for lectura in lecturas_corriente_binario ] lecturas_voltaje = [ round(((((lectura)*3)*41)/65335), 2) for lectura in lecturas_voltaje_binario ] return lecturas_corriente, lecturas_voltaje Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 65 Funció de comprovar connexió a Wi-Fi Per comprovar la connexió a la xarxa Wi-Fi, s'implementa una funció que verifica l'estat de la connexió i retorna “True” si hi ha connexió activa o “False” en cas contrari. Si la connexió està activa, es mostra un missatge al terminal i es transmet per UART indicant que el dispositiu està connectat, incloent-hi l’adreça IP assignada. Si no hi ha connexió, es mostra un missatge informant que no s'ha pogut establir cap connexió. def comprobar_wifi(): wlan = network.WLAN(network.STA_IF) # Verificar si el Wi-Fi está conectado if wlan.isconnected(): print("Wi-Fi está conectado.") uart.write("Wi-Fi está conectado.\r\n") ip = wlan.ifconfig()[0] print("Dirección IP:", ip) uart.write(f"Dirección IP: {ip}\r\n") return True else: print("Wi-Fi no está conectado.") uart.write("Wi-Fi no está conectado.\r\n") return False Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 66 Funció principal La funció principal del programa és l’encarregada d’executar cicles periòdics que comproven la connectivitat Wi-Fi, configuren un retard en microsegons basat en les instruccions rebudes per UART, mesuren dades (corrents i voltatges) i envien aquestes dades per Wi-Fi o UART, segons la disponibilitat. Per començar, es defineix un retard inicial de 0 ms i s’informa d'aquest valor a través del terminal i UART. Activa un indicador visual amb la funció “led.on()”, intenta connectar-se a una xarxa WiFi amb la funció “conectar_wifi” i desactiva l'indicador visual amb “led.off()”. A continuació, es genera un bucle infinit on es comprova si hi ha Wi-Fi disponible amb “comprobar_wifi” i s’emmagatzema el resultat. A més, s’inicia un temporitzador (start_time) per monitoritzar el pas del temps i s’informa del retard amb el que s’executarà. Seguidament, s’activen els relés per iniciar la mesura, es llegeixen les dades de corrent i voltatge amb la funció “leer_corriente_y_voltaje” i es tornen a desactivar els relés després de la mesura. A continuació, es realitza l’enviament de dades al dispositiu o dispositius enllaçats. En cas d’haver-hi connexió a Wi-Fi, s’envien per Wi-Fi i pel port sèrie. Si no hi ha Wi-Fi disponible només s’envien pel port sèrie. Finalment, es genera un altre bucle on es comprova si han passat 2 minuts o si es reben dades pel port sèrie. En cas de rebre qualsevol dada, es llegeix el comando i es configura un nou retard mitjançant la funció anteriorment definida “configurar_retardo_con_tiempo”. Quan succeeix alguna de les 2 opcions es surt del bucle i torna a començar el procés. def ejecutar_proceso(): retardo_actual = 0 # Valor inicial por defecto en microsegundos print(f"Retardo inicial: {retardo_actual} microsegundos") uart.write(f"Retardo inicial: {retardo_actual} microsegundos\r\n") blink_bien() led.on() conectar_wifi(ssid, password) led.off() while True: # Comprobar conexión Wi-Fi wifi_disponible = comprobar_wifi() Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 67 # Configurar el temporizador start_time = time.time() print(f"Iniciando proceso con retardo de {retardo_actual} microsegundos") uart.write(f"Iniciando proceso con retardo de {retardo_actual} microsegundos\r\n") blink_bien() reles_on() corriente_final, voltaje_final = leer_corriente_y_voltaje(retardo_us=retardo_actual, num_lecturas=600) reles_off() blink_bien() if wifi_disponible: print("Enviando datos por Wi-Fi y UART") uart.write("Enviando datos por Wi-Fi y UART\r\n") enviar_listas_tcp(corriente_final, voltaje_final) # Enviar por Wi-Fi else: print("Enviando datos solo por UART (Wi-Fi no disponible)") uart.write("Enviando datos solo por UART (Wi-Fi no disponible)\r\n") # Enviar por UART en ambos casos enviar_por_uart(corriente_final, voltaje_final, uart) blink_bien() while True: blink_bien() # Verificar si han pasado 10 segundos if time.time() - start_time >= 120: print("Ejecución automática por temporizador") uart.write("Ejecución automática por temporizador\r\n") break # Verificar si hay datos en el puerto serie Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 68 if uart.any(): # Si hay datos disponibles en el puerto serie print("Esperando comando de configuración de retardo...") uart.write("Esperando comando de configuración de retardo...\r\n") # Intentar configurar un nuevo retardo nuevo_retardo = configurar_retardo_con_tiempo(retardo_actual) if nuevo_retardo != retardo_actual: print(f"Retardo actualizado a {nuevo_retardo} microsegundos") uart.write(f"Retardo actualizado a {nuevo_retardo} microsegundos\r\n") retardo_actual = nuevo_retardo break # Salir del bucle si hay un comando recibido Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 69 5.1.2. Programa receptor Per rebre les dades via Wi-Fi es programa un codi Python a l’editor Visual Studio Code. El programa implementa un servidor TCP que rep les dades, les registra amb una capçalera de temps i les guarda en fitxers individuals. Inicialment, s’importen les llibreries necessàries per a la programació. Les llibreries utilitzades en aquest codi son part de la biblioteca estàndard de Python, per tant, no requereixen instal·lació addicional. Són les següents: - Socket: Crea i gestiona la connexió TCP del servidor. Escolta, accepta connexions i rep i envia dades. - Datetime: Obté la data i l’hora actuals per incloure-les en els registres i dona format a les dates per generar els noms dels fitxers. - Os: Manipula rutes, gestiona fitxers i assegura que els noms de fitxers i directoris siguin correctes segons el sistema operatiu. A continuació, es configura el servidor pel qual es rebran les dades. HOST='0.0.0.0' indica que el servidor escoltarà connexions a totes les interfícies de xarxa disponibles. PORT=65432 especifica el port TCP en què el servidor estarà escoltant. Seguidament, es crea el “socket” TCP (amb socket.SOCK_STREAM) i es configura lligant-lo a l'adreça i port especificats. Finalment, s’activa el mode d'escolta (listen), esperant connexions entrants. Després, es defineix la carpeta on es guardaran les dades rebudes. Aquesta es pot personalitzar segons les necessitats. Posteriorment, es gestiona la connexió. S’accepta una connexió entrant i s’obté la informació del client (adreça i port). La connexió es gestiona dins d’un bloc with, per assegurar que es tanca correctament. Tot seguit, es reben les dades. S’inicialitza una variable “full_data” per acumular els fragments de dades. S’utilitza un bucle per rebre fragments de fins a 8196 bytes per evitar problemes de dimensionament. Si no hi ha més dades, es surt del bucle. A continuació, es processen les dades rebudes. Es converteixen les dades rebudes de bytes a una cadena (amb la funció “decode('utf-8')”), s’obté la data i l’hora actual amb “datetime.now()” i es prepara un registre amb el format desitjat, incloent-hi l’indicador de temps. Seguidament, s’emmagatzemen les dades. Es genera un nom d’arxiu basat en la data i hora actual i es guarda el registre en un fitxer dins la carpeta especificada. Per acabar, s’envia una resposta al client confirmant que les dades s’han rebut correctament. Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 70 Aquest codi ha d’estar sempre en execució per rebre les dades quan siguin enviades. import socket from datetime import datetime import os # Configuración del servidor HOST = '0.0.0.0' # Escuchar en todas las interfaces PORT = 65432 # Puerto en el que escuchar # Crear un socket TCP with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind((HOST, PORT)) s.listen() # Poner el socket en modo de escucha print(f"Servidor escuchando en {HOST}:{PORT}") # Carpeta donde se guardan las lecturas carpeta_datos = r'C:\Users\marcg\OneDrive\Escritorio\UNI\TFG\codigo_python\Datos recibidos' while True: # Esperar por una conexión conn, addr = s.accept() with conn: print(f"Conectado por {addr}") full_data = b'' # Inicializar un contenedor para los datos completos while True: # Recibir datos (máx. 2048 bytes por fragmento) data = conn.recv(8196) if not data: break # Si no hay más datos, finalizar la recepción full_data += data # Acumular los datos recibidos # Convertir los datos recibidos a cadena y procesar las listas Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 71 received_message = full_data.decode('utf-8') # Obtener la hora actual fecha_actual = datetime.now() log_message = f"$G2CV,{fecha_actual},{received_message}\n" # Generar un nombre de archivo único basado en la fecha y hora actual nombre_archivo = os.path.join(carpeta_datos, f"{fecha_actual.strftime('%Y-%m- %d_%H-%M-%S')}.txt") # Imprimir y guardar en un archivo nuevo para cada recepción de datos print(log_message) with open(nombre_archivo, 'a') as file: file.write(log_message) # Responder al cliente confirmando la recepción conn.sendall(b'Datos recibidos correctamente') Les dades es guarden en un arxiu de text amb un nom de l’estil: 2024-09-30T071001Z. Figura 39. Exemple de document generat amb les dades mesurades. Font: Pròpia Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 72 5.1.3. Programa per representar gràficament Un cop rebudes i tractades les dades de corrent i tensió, interessa fer una representació gràfica per analitzar la corba I-V i veure el comportament de les plaques solars. Es programa un codi a Visual Studio Code que agafa l’arxiu creat amb el codi de recepció, processa les dades i fa la representació gràfica. Per començar, s’importen les llibreries necessàries per al desenvolupament del programa. En aquest cas són les següents: - Matplotlib.pyplot: llibreria de Python per generar gràfics i visualitzacions. És una eina molt versàtil per crear gràfics bidimensionals. - Numpy: llibreria per al càlcul numèric i la manipulació eficient de matrius i arrays. És especialment útil per treballar amb grans quantitats de dades gràcies a la seva optimització per a operacions vectoritzades. Seguidament, es defineix la ruta del fitxer que conté les dades i s'inicialitzen dues llistes: “corriente” i “tension” per emmagatzemar els valors de corrent i tensió. Es llegeix el fitxer línia a línia: Es busquen els índexs de "c" (corrent) i "v" (tensió) i es processen els valors numèrics associats a cada tipus i es guarden a les respectives llistes. A continuació, es verifica que les llistes de corrent i tensió tinguin la mateixa longitud, i en cas necessari, es retallen perquè estiguin alineades. Després, es filtren les dades. Es defineix la funció “filtrar_por_valor_minimo”, que filtra les dades a partir del valor mínim: Si es filtra per corrent, s'identifica el mínim de la llista “corriente” i es retallen tant “corriente” com “tension” des de la posició d'aquest mínim. Si es filtra per tensió, es fa el mateix, però utilitzant el mínim de la llista “tension”. En últim lloc, es generen dos conjunts de 3 gràfics cadascun: un per a les dades crues (sense filtrar) i un altre per a les dades filtrades. Les gràfiques crues es componen pel corrent i la tensió crus respecte als índexs i la corba I-V (corrent vs tensió). Els gràfics filtrats són els mateixos però descartant anomalies o “outliers”. El paràmetre “filtrar_por” (que pot ser 'corriente' o 'tension') determina quin tipus de valor mínim s'utilitza per filtrar les dades abans de generar els gràfics. import matplotlib.pyplot as plt import numpy as np # Ruta del archivo ruta_archivo = r'C:\Users\marcg\OneDrive\Escritorio\UNI\TFG\codigo_python\Datos recibidos\2024-12-03_13-16-12.txt' # Listas para almacenar corriente y tensión Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 79 s.bind((HOST, PORT)) s.listen() # Poner el socket en modo de escucha print(f"Servidor escuchando en {HOST}:{PORT}") # Carpeta donde se guardan las lecturas carpeta_datos = r'C:\Users\course\Documents\GIRASOL2\data' # Verificar si la carpeta existe, de lo contrario, crearla if not os.path.exists(carpeta_datos): os.makedirs(carpeta_datos) # Inicializar gráficos plt.ion() # Activar el modo interactivo de Matplotlib fig, axs = plt.subplots(3, 1, figsize=(10, 12)) line_corriente, = axs[0].plot([], [], 'g-o', label='Corriente (A)') line_tension, = axs[1].plot([], [], 'r-o', label='Tensión (V)') line_vi, = axs[2].plot([], [], 'b-o', label='Curva V-I') axs[0].set_title('Corriente en Tiempo Real') axs[0].set_xlabel('Tiempo (s)') axs[0].set_ylabel('Corriente (A)') axs[0].grid(True) axs[1].set_title('Tensión en Tiempo Real') axs[1].set_xlabel('Tiempo (s)') axs[1].set_ylabel('Tensión (V)') axs[1].grid(True) axs[2].set_title('Curva V-I') axs[2].set_xlabel('Tensión (V)') axs[2].set_ylabel('Corriente (A)') axs[2].grid(True) while True: # Esperar por una conexión Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 80 conn, addr = s.accept() with conn: print(f"Conectado por {addr}") try: full_data = b'' # Inicializar un contenedor para los datos completos while True: # Recibir datos (máx. 8196 bytes por fragmento) data = conn.recv(8196) if not data: break # Si no hay más datos, finalizar la recepción full_data += data # Acumular los datos recibidos # Procesar los datos recibidos received_message = full_data.decode('utf-8').strip() # Crear el timestamp en el formato deseado fecha_actual = datetime.utcnow() timestamp = fecha_actual.strftime('%Y-%m-%dT%H%M%SZ') # Nombre del archivo con el nuevo formato nombre_archivo = os.path.join(carpeta_datos, f"{timestamp}.txt") # Formato del contenido del archivo contenido = f"$G2CV,{fecha_actual.isoformat()}Z,eui70b3d57ed00667fe,{received_message}" # Guardar en el archivo with open(nombre_archivo, 'w') as file: file.write(contenido) print(f"Datos guardados en {nombre_archivo}:{contenido}") # Separar los datos de corriente y tensión valores = received_message.split(',') Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 81 if 'c' in valores and 'v' in valores: indice_c = valores.index('c') indice_v = valores.index('v') corriente = [float(v) for v in valores[indice_c + 1:indice_v] if v.strip()] tension = [float(v) for v in valores[indice_v + 1:] if v.strip()] # Asegurar que las listas tienen la misma longitud min_longitud = min(len(corriente), len(tension)) corriente = corriente[:min_longitud] tension = tension[:min_longitud] # Generar el eje X en formato tiempo tiempo = np.linspace(0, min_longitud / SAMPLING_RATE, num=min_longitud, endpoint=False) if min_longitud > 0: # Verificar que hay datos válidos # Actualizar gráficos line_corriente.set_data(tiempo, corriente) line_tension.set_data(tiempo, tension) line_vi.set_data(tension, corriente) # Ajustar límites de los ejes axs[0].set_xlim(0, max(tiempo)) axs[0].set_ylim(min(corriente) - 0.1, max(corriente) + 0.1) axs[1].set_xlim(0, max(tiempo)) axs[1].set_ylim(min(tension) - 0.1, max(tension) + 0.1) axs[2].set_xlim(min(tension) - 0.1, max(tension) + 0.1) axs[2].set_ylim(min(corriente) - 0.1, max(corriente) + 0.1) # Refrescar los gráficos plt.pause(0.1) Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 82 # Enviar contenido al servidor UDP try: with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as send_socket: send_socket.sendto(contenido.encode('utf-8'), (SEND_HOST, SEND_PORT)) print(f"Contenido enviado a {SEND_HOST}:{SEND_PORT}") except Exception as send_error: print(f"Error al enviar los datos al servidor UDP: {send_error}") # Responder al cliente confirmando la recepción conn.sendall(b'Datos recibidos correctamente') except Exception as e: print(f"Error al procesar la conexión: {e}") conn.sendall(b'Error al procesar los datos') Figura 42. Representació corrent, tensió i corba I-V. Font: Pròpia Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 83 Figura 43. Representació de la corba I-V a LabVIEW. Font: Pròpia A més, un segon programa de LabVIEW té la funció de filtrar els valors "outliers" i representar la corba filtrada. Aquest programa també permet superposar les corbes successivament per analitzar el comportament del panell al llarg del temps. Aquesta funcionalitat és especialment útil per observar l’evolució del corrent generat, des de les primeres hores del matí fins que el sol assoleix el seu punt més alt. Figura 44. Corba I-V filtrada a LabVIEW. Font: Pròpia Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 84 5.1.5. Programa per representar gràficament pel port sèrie En cas de no disposar de connexió a Wi-Fi, les dades només són enviades pel port sèrie. Per això, és necessari un programa que agafi aquestes dades i les representi gràficament. Així doncs, es programa un codi que llegeix dades en temps real del dispositiu connectat al port sèrie, les processa i les visualitza en gràfics interactius actualitzats contínuament. Les principals diferències respecte al programa que rep les dades per Wi-Fi són les configuracions inicials (en comptes de configurar un servidor es configura el port sèrie) i la lectura de dades (es llegeixen directament els valors enviats, no es crea cap arxiu). A més, s’ha d’importar la llibreria serial, que permet la comunicació amb dispositius a través de ports sèrie. import serial import matplotlib.pyplot as plt import numpy as np # Configuración del puerto serie PUERTO = 'COM13' # Cambiar según el puerto que se use BAUDIOS = 115200 # Inicializar conexión serie ser = serial.Serial(PUERTO, BAUDIOS, timeout=1) # Configuración de las gráficas plt.ion() fig, axs = plt.subplots(3, 1, figsize=(10, 12)) # Configurar subgráficas # Gráfica de Corriente vs Índice axs[0].set_title('Corriente en Tiempo Real') axs[0].set_xlabel('Índice') axs[0].set_ylabel('Corriente (A)') axs[0].grid(True) # Gráfica de Tensión vs Índice Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 85 axs[1].set_title('Tensión en Tiempo Real') axs[1].set_xlabel('Índice') axs[1].set_ylabel('Tensión (V)') axs[1].grid(True) # Gráfica de Curva I-V axs[2].set_title('Curva I-V (Corriente vs Tensión)') axs[2].set_xlabel('Tensión (V)') axs[2].set_ylabel('Corriente (A)') axs[2].grid(True) # Variables para las líneas gráficas line_corriente, = axs[0].plot([], [], 'g-o', label='Corriente (A)') line_tension, = axs[1].plot([], [], 'r-o', label='Tensión (V)') line_iv, = axs[2].plot([], [], 'b-o', label='Curva I-V') while True: try: # Leer línea desde el puerto serie linea = ser.readline().decode('utf-8', errors='ignore').strip() if linea: print(f"Dato recibido: {linea}") # Procesar los datos valores = linea.split(',') if 'c' in valores and 'v' in valores: indice_c = valores.index('c') indice_v = valores.index('v') # Extraer y convertir a flotantes los datos de corriente y tensión corriente = [float(v) for v in valores[indice_c + 1:indice_v]] tension = [float(v) for v in valores[indice_v + 1:]] # Asegurarse de que las listas tengan la misma longitud min_longitud = min(len(corriente), len(tension)) Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 86 corriente = corriente[:min_longitud] tension = tension[:min_longitud] # Actualizar las gráficas # Corriente vs Índice line_corriente.set_data(range(len(corriente)), corriente) axs[0].set_xlim(0, len(corriente) - 1) axs[0].set_ylim(min(corriente) - 0.1, max(corriente) + 0.1) # Tensión vs Índice line_tension.set_data(range(len(tension)), tension) axs[1].set_xlim(0, len(tension) - 1) axs[1].set_ylim(min(tension) - 0.1, max(tension) + 0.1) # Curva I-V line_iv.set_data(tension, corriente) axs[2].set_xlim(min(tension) - 0.1, max(tension) + 0.1) axs[2].set_ylim(min(corriente) - 0.1, max(corriente) + 0.1) # Actualizar el gráfico plt.pause(0.1) except KeyboardInterrupt: print("Finalizando...") break except Exception as e: print(f"Error: {e}") continue # Cerrar el puerto serie al finalizar ser.close() L’inconvenient d’executar aquest programa és que no es pot tenir obert el terminal de comunicació amb el port sèrie, per tant, no es poden rebre ni enviar cap tipus de dades o comandes. Per exemple, no es podria canviar el retard entre mostres ni es podria fer el reinici del microcontrolador. Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 87 5.2. Ajustos en la PCB Un cop programats els codis d’enviament i de recepció, s’ajusten alguns components de les 4 PCB per a un millor funcionament: - Se solda el díode D1 que s’havia tret per realitzar algunes proves. - Se solden els tirapins femella que faltaven en algunes PCB. Figura 45. PCB (detall al díode D1 i als tirapins soldats). Font: Pròpia - Se substitueix la resistència shunt (R17) de 50 mΩ per una de 0,1 Ω (100 mΩ) per augmentar la tensió mesurada amb l'ADC. Per disponibilitat, es solden dues resistències en sèrie de 50 mΩ cadascuna, i per manca d'espai, es fa a la part posterior de la PCB. - Es talla la connexió del condensador C37 per garantir l’arribada dels 3,3 V. Figura 46. Part posterior de la PCB (detall resistència shunt i tall condensador C37). Font: Pròpia Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 88 A més, s'han realitzat proves amb transistors MOSFET IRLB8721 per avaluar la viabilitat de substituir els relés. Cada relé seria reemplaçat per un conjunt de dos transistors, de manera que, per complir la funció de commutació, un transistor conduiria mentre l'altre romandria en tall. S'utilitza un transistor NPN com a inversor per controlar l'activació de la base del MOSFET. Quan el pin del microcontrolador està en estat baix, el transistor permet el pas de tensió des de la placa solar fins a la base del MOSFET, activant-lo i permetent que la tensió de la placa solar flueixi cap a la càrrega o el circuit desitjat. Aquest disseny proporciona una funció de commutació similar a la dels relés. Figura 47. Circuit de commutació amb MOSFET. Font: Pròpia Aquest canvi permetria assolir diverses millores en comparació amb l’ús dels relés: - Silenci: No compten amb parts mecàniques que generin soroll durant la commutació. - Duració: No pateixen desgast mecànic com els relés tradicionals. - Rapidesa: Són capaços de commutar a gran velocitat. Tot i que tenen un inconvenient: la resistència de conducció (Rds(on)), que en aquest cas és de 0,022 Ω. Tot i ser baixa, aquesta resistència genera pèrdues. Una solució podria ser la implementació de dos MOSFET en paral·lel per reduir la potència dissipada, ja que amb un corrent de 10 A es generarien 2,2 W. Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 95 6. Anàlisi de sostenibilitat i implicacions ètiques 6.1. Anàlisi mediambiental El projecte se centra fermament a impulsar les energies renovables, contribuint així a la reducció de la contaminació i a la millora del medi ambient. En promoure l’ús de l’energia solar, es redueix significativament la dependència de fonts energètiques contaminants i no renovables, fomentant una transició cap a un model més sostenible i respectuós amb el planeta. La major part del material utilitzat per al desenvolupament del projecte ja es tenia prèviament, i només s’ha adquirit el material estrictament imprescindible i insubstituïble. Per exemple, en cas de no disposar d’una resistència de 100 mΩ, s’ha optat per col·locar dues de 50 mΩ en sèrie com a solució alternativa. A més, s’ha prioritzat substituir components amb desgast i una vida útil limitada per altres més duradors, minimitzant així la necessitat de manteniment futur. No obstant això, un aspecte negatiu del desenvolupament ha estat la pèrdua de diversos microprocessadors a causa de sobretensions, un problema que es podria haver previngut implementant mesures de seguretat adequades durant les proves i el muntatge. A més, per rebre les dades mesurades, cal un dispositiu que es mantingui encès de forma contínua, fet que implica un consum energètic considerable. De mitjana, un ordinador consumeix 0,2 kWh, i durant la realització del projecte ha estat en funcionament durant unes 750 hores. L’energia utilitzada per aquest ordinador prové de fonts solars, que generen 30 gCO₂ per kWh. Per tant, l’elaboració del projecte ha generat aproximadament 4.500 grams de CO₂. Els components utilitzats són de RS Components, empresa conscienciada amb el desenvolupament mediambiental i social. El novembre de 2021, RS va presentar el seu pla d'acció ESG, "Per un món millor", que estableix quatre objectius globals i 15 ambicioses iniciatives per assolir abans de 2030. Aquest pla també dona suport a sis dels objectius de desenvolupament sostenible de les Nacions Unides i posa les bases per a l'estratègia a llarg termini de l'empresa fins a l'any 2050. Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 96 6.2. Anàlisi econòmic Econòmicament, el cost del projecte ha estat reduït. Només s’han adquirit els microcontroladors i alguns components de baix cost, com resistències o transistors. Tal com s’ha esmentat anteriorment, es disposava de la major part dels components necessaris, i s’han buscat alternatives per evitar la compra de nous materials. El cost dels materials per la realització del projecte ha estat: Component Unitats Preu unitari (€) Preu total (€) Raspberry Pi Pico W 4 12,00 48,00 Raspberry Pi Pico amb ESP8285 2 8,00 16,00 Resistència SMD 10 mΩ 20 0,08 1,60 Resistència SMD 20 mΩ 20 0,08 1,60 Resistència SMD 30 mΩ 20 0,08 1,60 Resistència SMD 40 mΩ 20 0,08 1,60 Resistència SMD 50 mΩ 20 0,08 1,60 Resistència SMD 100 mΩ 20 0,08 1,60 Resistència SMD 200 mΩ 20 0,08 1,60 Resistència SMD 300 mΩ 20 0,08 1,60 Resistència SMD 400 mΩ 20 0,08 1,60 Resistència SMD 500 mΩ 20 0,08 1,60 Díode PMEG3010ER,115 20 0,128 2,56 Mosfet IRLB8721 10 1,299 12,99 TOTAL 99,55 D’altra banda, amb els ajustos realitzats a la PCB, seria possible desenvolupar una nova versió que integrés totes les millores i estigués optimitzada. Tot i que aquesta actualització comportaria una despesa econòmica addicional, permetria perfeccionar el sistema i assegurar-ne una implementació més eficient. Pel que fa al cost de recursos humans, s'han dedicat 500 hores a l'elaboració del projecte. Amb un sou mitjà de 15,58 €/hora d’enginyer, això suposaria una despesa aproximada de 7.790 €. Finalment, amb les optimitzacions implementades a la PCB i al programa, el cost global es reduiria significativament. La raó és que els transistors són més econòmics que els relés i l’ULN2003, i el hardware LoRa no és necessari, ja que la connexió s’estableix mitjançant un router Wi-Fi. Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 97 Si es volgués produir el traçador comercialment, el cost dels materials seria el següent: Component Unitats Preu unitari (€) Preu total (€) ULN2003 1 0,361 0,361 XY308-2.54-2P 3 2,5 7,5 PMEG3010ER,115 1 0,18 0,18 LM4040AIM3-3.0+T 1 3,14 3,14 TS-1187-1816 1 0,058 0,058 DBT50G-7.62-2P-BK-P 3 0,245 0,735 V56MLA1206NH 1 1,23 1,23 B-5R0V474-R 1 2,318 2,318 AP2007SPER 1 0,26 0,26 1SMB5913BT3G 2 0,38 0,76 SRD-05VDC-SL-C 4 1,55 6,2 Resistencia 10k 5 0,13 0,65 Resistencia 470 3 0,41 1,23 Led 3 0,25 0,75 Resistencia 1k 2 0,371 0,742 NTC 1 0,604 0,604 Inductor 4,7uH 1 0,777 0,777 Condensador 4,7uF 1 1,848 1,848 Condensador 330uF 1 0,239 0,239 Bobina 3,3uH 1 1,06 1,06 Condensador 22uF 1 0,409 0,409 Resistencia 100k 1 0,493 0,493 Resistencia 33k 1 0,47 0,47 Resistencia 953k 1 0,435 0,435 Resistencia 56k 1 0,42 0,42 Condensador 470uF 2 1,15 2,3 Resistencia 0,1 1 0,139 0,139 Raspberry Pi Pico W 1 12 12 Tirapins famella 2 0,99 1,98 Tirapins mascle 40 0,005 0,2 Convertidor DC-DC 1 16,94 16,94 Regulador de tensió 1 2,74 2,74 PCB 1 1,2 1,2 TOTAL 70,37 A més, s’hauria d’afegir el cost de muntatge i soldadura de la PCB i el programa de lectura i transmissió de dades i el de recepció, tractament i representació gràfica, que es podria comercialitzar com una llicència. El muntatge i soldadura es realitza en 10 hores, amb un cost d’11,40 €/hora per al soldador, sumant un total de 114 €. La llicència dels programes tindria un cost de 250 €. En conjunt, el cost total del maquinari i el programari ascendiria a 434,37 €. Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 98 Al mercat, els equips de mesura tenen un cost elevat: els més econòmics no baixen dels 1.500 €, els de gamma intermèdia oscil·len al voltant dels 10.000 €, i els avançats poden superar els 25.000 €. Per tant, el nostre traçador representaria una alternativa molt més econòmica en comparació amb els equips de mesura existents, oferint una solució competitiva i assequible. Figura 60. Mapa de posicionament del traçador. Font: Pròpia Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 99 6.3. Anàlisi Social Des del punt de vista social, el projecte fomenta l'ús d'energies renovables, un benefici per a tota la societat, ja que contribueix a la millora del medi ambient i redueix les malalties associades a la contaminació, cosa que millora la salut pública. A més, la transició cap a noves fonts d'energia pot estimular la creació de llocs de treball, contribuint a reduir les desigualtats de gènere presents a la indústria dels combustibles fòssils. Aquesta oportunitat és especialment rellevant per promoure una indústria més inclusiva i equitativa. També s’afavoreix el desenvolupament de països vulnerables, ja que les instal·lacions d’energia solar requereixen inversions inicials més moderades i són una opció excel·lent per a regions amb moltes hores de sol. Això pot ajudar a reduir les desigualtats energètiques globals i impulsar l’autonomia energètica d’aquests territoris. Des d’una perspectiva ètica, la transició de les energies contaminants cap a renovables, com l’energia solar, pot generar debat a causa de la inversió inicial necessària. No obstant això, a llarg termini, aquesta transició no només beneficia el planeta, sinó que també resulta econòmicament viable i sostenible, justificant plenament el canvi. Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 100 7. CONCLUSIONS S’ha aconseguit realitzar amb èxit la lectura de la tensió i el corrent de la placa solar, així com la transmissió posterior de les dades a un dispositiu via Wi-Fi. Aquestes dades es reben a través d’un servidor TCP, s’emmagatzemen en un arxiu de text i es representen gràficament en temps real. A més, s’han implementat diverses funcionalitats que milloren l’eficiència i el control del sistema. Les més destacades són: - La comunicació constant a través del port sèrie, que permet conèixer l’estat del sistema i, en cas de no disposar de connexió Wi-Fi, possibilita la representació de les gràfiques directament mitjançant aquest canal. - La comanda de “reset”, que permet reiniciar el microcontrolador quan sigui necessari. - Les comandes de configuració de retards entre mostres per representar les gràfiques completes durant les hores de baixa irradiància. També s’han fet ajustos en alguns components de la PCB per optimitzar el funcionament del sistema, i s’ha iniciat l’avaluació de la possibilitat de substituir els relés per transistors, per tal de millorar-ne la fiabilitat i eficiència. Al llarg del projecte s’han recollit aproximadament 900 corbes, on es pot observar l’evolució del corrent generat al llarg dels dies. Es comprova que durant la nit la generació de corrent és molt baixa, i va augmentant progressivament a mesura que surt el sol. També s’ha detectat que, en determinades hores del dia, es produeixen desviacions causades per ombres. Aquest fenomen podria estar relacionat amb la inclinació de les plaques o amb la presència de núvols, ja que aquestes desviacions no apareixen durant els moments de bona irradiància. En aquest enllaç es pot visualitzar l’evolució de la corba I-V al llarg de diversos dies: https://www.youtube.com/watch?v=Sf-VAQuZw_0 Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 101 Figura 61. Representació corrent, tensió i corba I-V, desviació a causa d’una ombra. Font: Pròpia Per falta de temps, algunes idees han quedat pendents de realització. Com a possibles millores futures del circuit i del programari, es proposa: - Substituir completament els relés per transistors. - Implementar un sistema de lectura més intel·ligent, que sigui capaç de detectar la irradiància i ajustar automàticament els retards. - Millorar la gestió d’errors per fer el sistema més robust. - Entrenar una intel·ligència artificial capaç d’analitzar les corbes generades per les lectures. Comparant la comunicació Wi-Fi amb LoRa, es pot concloure que el Wi-Fi és l’opció més adequada per a projectes urbans amb instal·lacions que ja disposen de cobertura Wi-Fi. En canvi, per a projectes en zones rurals, on no hi ha accés a una xarxa Wi-Fi o les plaques es troben molt allunyades, la connexió mitjançant LoRaWAN resulta ser una alternativa més eficient. Gràcies a aquest treball he tingut l’oportunitat de posar en pràctica els coneixements adquirits durant el grau, i he pogut aprendre conceptes nous. En concret, he treballat i aprofundit en els següents àmbits: - Programació amb MicroPython i Python. - Energia solar fotovoltaica. - Sistemes electrònics. - Instrumentació electrònica. - Soldadura de components. Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 102 8. AGRAÏMENTS M’agradaria dedicar unes paraules especials d’agraïment a totes aquelles persones que han fet possible la realització d’aquest treball de final de grau. Sense el vostre suport, no hauria estat possible. En primer lloc, vull expressar el meu sincer agraïment al tutor del projecte, el Joaquín del Rio, per tota la seva ajuda, guia i coneixements compartits al llarg d’aquest procés. Han estat moltes hores de treball, proves i aprenentatges que han marcat un abans i un després en aquest camí. També voldria donar les gràcies als membres del SARTI, no només per permetre’m treballar a les seves instal·lacions, sinó també pel tracte excel·lent i el suport constant que he rebut en aquest entorn. Un agraïment molt especial a la meva família, per la seva paciència, comprensió i motivació incondicional durant tot aquest camí. Ha estat un procés llarg i exigent, però amb el vostre suport sempre he tingut forces per continuar endavant. Agrair també a la meva parella, la Martina Sun, per tota l'ajuda i suport que m'ha brindat durant aquest procés. Gràcies a tu, aquesta etapa ha estat molt més lleugera i agradable, i sé que no hauria pogut fer aquest projecte sense la teva presència i recolzament constant. Finalment, gràcies als amics que han estat al meu costat, oferint-me moments de desconnexió, diversió i ànims quan més els he necessitat. Els bons moments compartits amb vosaltres han estat claus per continuar aquest viatge amb il·lusió. Gràcies de tot cor a cadascun de vosaltres. Tanco una etapa molt enriquidora de la meva vida i em preparo amb entusiasme per als nous camins que s’obren. Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 103 9. REFERÈNCIES [1] JAMES, O., 2024. Trazador de curvas I-V inalámbrico para paneles solares [en línia]. [Consulta: 15 de novembre de 2024]. Disponible a: chromeextension://efaidnbmnnnibpcajpcglclefindmkaj/https://upcommons.upc.edu/bitstrea m/handle/2117/406967/Memoria-TFEOscar%20James%20Siboco.pdf?sequence=4&isAllowed=y [2] IBERDROLA, 2022. ¿Cómo funcionan las placas solares fotovoltaicas? [en línia]. [Consulta: 18 d’octubre de 2024]. Disponible a: https://www.iberdrola.com/innovacion/como-funcionan-placas-solaresfotovoltaicas#:~:text=Los%20paneles%20solares%20son%20los,en%20electricidad%20 que%20pueda%20aprovecharse [3] SOLAR 360, 2023. Tipos de Placas Solares [en línia]. [Consulta: 18 d’octubre de 2024]. Disponible a: https://www.solar360.es/blog/autoconsumo/tipos-placas-solares [4] SOTYSOLAR, 2024. ¿Cómo funcionan las placas solares en una casa? [en línia]. [Consulta: 18 d’octubre de 2024]. Disponible a: https://sotysolar.es/blog/placas-solares-comofuncionan [5] SOTYSOLAR, 2024. Tipos de placas solares en 2025 [en línia]. [Consulta: 3 de gener de 2025]. Disponible a: https://sotysolar.es/blog/placas-solarestipos?utm_source=google&utm_medium=cpc&utm_campaign=search_dsa&gad_sourc e=1&gclid=CjwKCAiAnKi8BhB0EiwA58DA4ei8gbeveAxUKWFg2Ijbi0eCpOsUd7MmzCjUeYHldsbGXUvpNE7ZRoCjfoQAvD_BwE [6] SUNFIELDS EUROPE, 2024. Tipos de paneles solares [en línia]. [Consulta: 3 de gener de 2025]. Disponible a: https://www.sfe-solar.com/noticias/articulos/tipos-de-placassolares/#Cuales-son-los-tipos-de-paneles-solares-fotovoltaicos [7] EDP, 2023. Últimos avances en tecnología fotovoltaica [en línia]. [Consulta: 3 de gener de 2025]. Disponible a: https://www.edpenergia.es/es/blog/energiafotovoltaica/ultimos-avances-tecnologia-fotovoltaica/ [8] HIOKI, 2022. Inspección de pruebas de corriente de circuito de cadena para sistemas solares fotovoltaicos [en línia]. [Consulta: 18 d’octubre de 2024]. Disponible a: https://www.hioki.com/us-es/industries-solutions/facilities/pv-current.html [9] CLEVER SOLAR DEVICES, 2020. Por qué son tan importantes las Curvas IV [en línia]. [Consulta: 18 d’octubre de 2024]. Disponible a: https://www.cleversd.com/es/blog/queson-tan-importantes-curvas-iv [10] FLUKE, 2023. Como analizar las curvas I-V [en línia]. [Consulta: 18 d’octubre de 2024]. Disponible a: https://www.fluke.com/es-es/informacion/blog/energiarenovable/analizar-curvas-iv [11] SEAWARD, 2021. Curve Tracing FAQ's [en línia]. [Consulta: 18 d’octubre de 2024]. Disponible a: https://www.seaward.com/gb/support/solar/faqs/29495-curve-tracingfaq-s/#1 Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 104 [12] HT INSTRUMENTS, 2022. Medidores curva I-V [en línea]. [Consulta: 18 d’octubre de 2024]. Disponible a: https://www.ht-instruments.com/eses/productos/instrumentacion-fotovoltaica/medidores-curva-i-v/ [13] PROOFPOINT, 2020. ¿Qué es el wifi? [en línea]. [Consulta: 3 de novembre de 2024]. Disponible a: https://www.proofpoint.com/es/threatreference/wifi#:~:text=Wifi%2C%20que%20es%20una%20contracci%C3%B3n,red%20 mediante%20frecuencias%20de%20radio [14] CONCEPTO, 2024. WIFI [en línia]. [Consulta: 3 de novembre de 2024]. Disponible a: https://concepto.de/wifi/ [15] GENERACIÓN IOT, 2023. Comparativa entre LoRa y WiFi. Estas son las ventajas y las desventajas... [en línea]. [Consulta: 3 de novembre de 2024]. Disponible a: https://internetdelascosas.xyz/articulo.php?id=3917 [16] EBYTE, 2023. LoRa vs Wi-Fi: una comparación de tecnologías de comunicación inalámbrica [en línea]. [Consulta: 3 de noviembre de 2024]. Disponible a: https://www.es-ebyte.com/news/500 [17] RASPBERRY PI, 2024. Disponible a: https://www.raspberrypi.com/ [18] RASPBERRY PI, 2024. RP2040 with ESP8285 on board [en línia]. [Consulta: 7 d’octubre de 2024]. Disponible a: https://forums.raspberrypi.com/viewtopic.php?t=361532&start=50 [19] RS IBÉRICA, 2024. FTDI Chip TTL-232RG-VSW5V-WE. Disponible a: https://es.rsonline.com/web/p/accesorios-para-kits-dedesarrollo/7300155?srsltid=AfmBOoo0K5S3RtVtOqqmyvaWYzRKWX0VMAVGKWvdJhn DE3buMpE7pWdv [20] THONNY, 2024. Disponible a: https://thonny.org/ [21] MICROPYTHON, 2024. Disponible a: https://micropython.org/ [22] VISUAL STUDIO CODE, 2024. Disponible a: https://code.visualstudio.com/ [23] TERA TERM, 2024. Disponible a: https://teratermproject.github.io/index-en.html [24] PYTHON, 2024. Disponible a: https://es.python.org/ [25] SOFTWARE.INFORMER, 2024. Disponible a: https://pspice-student.informer.com/9.1/ Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 111 Figura 73. Circuit per substituir el relé 3. Font: Pròpia Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 112 10.3. Codis 10.3.1. Codi per la Raspberry Pi Pico W amb MicroPython from machine import ADC, Pin, UART import time import network import socket import math import utime # Configuración de pines para los relés rele1 = Pin(6, Pin.OUT) rele2 = Pin(7, Pin.OUT) rele3 = Pin(8, Pin.OUT) rele4 = Pin(9, Pin.OUT) led = Pin('LED', Pin.OUT) # Configuración de los pines ADC adc_voltaje = ADC(Pin(27)) adc_corriente = ADC(Pin(28)) adc_ntc = ADC(Pin(26)) # Configuración de red ssid = "QSARTI" password = "*********************" # Configuración del puerto serie uart = UART(0, baudrate=115200, tx=Pin(0), rx=Pin(1)) # Parpadeo del LED def blink_bien(): led.on() time.sleep(0.2) led.off() time.sleep(0.2) led.on() time.sleep(0.2) led.off() def blink_mal(): led.on() time.sleep(0.01) led.off() time.sleep(0.01) led.on() time.sleep(0.01) led.off() # Conectar al WiFi def conectar_wifi(ssid, password): wlan = network.WLAN(network.STA_IF) Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 113 wlan.active(True) # Intentar conectar si no está conectado if not wlan.isconnected(): print("Intentando conectar a la red Wi-Fi...") uart.write("Intentando conectar a la red Wi-Fi...\r\n") wlan.connect(ssid, password) # Inicia el intento de conexión time.sleep(1) # Espera breve para inicializar la conexión # Comprobar si se logró la conexión if wlan.isconnected(): print("Conectado a la red Wi-Fi") uart.write("Conectado a la red Wi-Fi\r\n") ip = wlan.ifconfig()[0] print("Dirección IP:", ip) uart.write(f"Dirección IP: {ip}\r\n") else: print("No se pudo establecer la conexión a Wi-Fi.") uart.write("No se pudo establecer la conexión a Wi-Fi.\r\n") # Retorna True si está conectado, False si no return wlan.isconnected() # Enviar listas de datos TCP al servidor def enviar_listas_tcp(corriente_final, voltaje_final): addr = ("10.5.159.155", 65432) # Cambiar la IP y el puerto según sea necesario sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: sock.connect(addr) print("Conexión TCP establecida") uart.write("Conexión TCP establecida\r\n") # Convertir las listas a cadenas con prefijos y enviarlas completas corriente_str = "c," + ",".join(map(str, corriente_final)) + ',' tension_str = "v," + ",".join(map(str, voltaje_final)) + ',' sock.send(corriente_str.encode('utf-8')) # Enviar la lista de corriente sock.send(tension_str.encode('utf-8')) # Enviar la lista de voltaje except Exception as e: print("Error en la conexión TCP o envío:", e) uart.write("Error en la conexión TCP o envío:\r\n") finally: sock.close() print("Conexión cerrada") uart.write("Conexión cerrada\r\n") def enviar_por_uart(corriente_final, voltaje_final, uart): Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 114 try: # Obtener la fecha y hora actual fecha_hora_actual = utime.localtime() fecha_hora_str = "{:04d}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}".format( fecha_hora_actual[0], # Año fecha_hora_actual[1], # Mes fecha_hora_actual[2], # Día fecha_hora_actual[3], # Hora fecha_hora_actual[4], # Minuto fecha_hora_actual[5] # Segundo ) # Crear el encabezado con la fecha y hora encabezado = "$G2CV," + fecha_hora_str # Convertir las listas a cadenas con prefijos corriente_str = "c," + ",".join(map(str, corriente_final)) tension_str = "v," + ",".join(map(str, voltaje_final)) # Concatenar todo en una sola cadena mensaje_completo = encabezado + "," + corriente_str + "," + tension_str # Enviar el mensaje por UART uart.write((mensaje_completo + "\r\n").encode('utf-8')) print("Datos enviados por UART") except Exception as e: print("Error en el envío por UART:", e) # Encender los relés def reles_on(): print("Reles encendidos") uart.write("Reles encendidos\r\n") rele1.value(1) rele2.value(1) #time.sleep(0) rele3.value(1) rele4.value(1) # Apagar los relés def reles_off(): rele3.value(0) rele4.value(0) #time.sleep(0) rele1.value(0) rele2.value(0) print("Reles apagados") uart.write("Reles apagados\r\n") # Leer valor NTC Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 115 R1 = 10000 # Resistencia en serie con el NTC Vref = 3.3 # Voltaje de referencia del ADC def leer_ntc(adc_read_count=10): adc_counts = 0 for _ in range(adc_read_count): adc_counts += adc_ntc.read_u16() # Lee el valor ADC (16 bits) time.sleep(0.009) # Pausa de 9 ms entre lecturas # Calcula el promedio adc_promedio = adc_counts / adc_read_count # Convierte la lectura ADC en un voltaje voltage = (adc_promedio / 65535) * Vref # Ajuste para ADC de 16 bits # Calcula la resistencia del NTC usando la ley de divisor de voltaje resistencia_ntc = (R1 * (Vref - voltage)) / voltage # Usa una ecuación de aproximación para convertir la resistencia del NTC en temperatura temperatura = 251 - 24.5 * math.log(resistencia_ntc) return temperatura # Reiniciar def reiniciar_sistema(): print("RESET") uart.write("RESET\r\n") machine.reset() # Forzar el reinicio del sistema # Configurar retardo def configurar_retardo_con_tiempo(retardo_actual): comando = "" # Inicializamos el comando vacío tiempo_inicio = time.time() print("Ingrese un comando (D000, D010, D020, D050 o RESET). Tiempo límite: 3 segundos.") uart.write("Ingrese un comando (D000, D010, D020, D050 o RESET). Tiempo límite: 3 segundos.\r\n") while True: # Verificar si se agotó el tiempo de espera if time.time() - tiempo_inicio > 3: print("Tiempo agotado. Manteniendo el retardo actual.") uart.write("Tiempo agotado. Manteniendo el retardo actual.\r\n") return retardo_actual # Verificar si hay datos disponibles en el puerto serie if uart.any(): byte = uart.read(1).decode('utf-8') # Leer un byte y decodificarlo if byte == '\r' or byte == '\n': # Detectar el final del comando break # Salir del bucle al recibir Enter else: comando += byte # Acumular caracteres en el comando Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 116 # Agregar una pequeña espera para no saturar la CPU time.sleep(0.01) # Imprimir el comando recibido print(f"Comando recibido: '{comando}'") uart.write(f"Comando recibido: '{comando}'\r\n") # Comprobar si el comando es "reset" if comando == "RESET": reiniciar_sistema() # Forzar el reinicio del sistema # Comprobar el comando recibido y asignar el retardo correspondiente elif comando == "D010": print("Retardo configurado a 10 microsegundos") uart.write("Retardo configurado a 10 microsegundos\r\n") return 10 # Retardo en microsegundos elif comando == "D020": print("Retardo configurado a 20 microsegundos") uart.write("Retardo configurado a 20 microsegundos\r\n") return 20 # Retardo en microsegundos elif comando == "D050": print("Retardo configurado a 50 microsegundos") uart.write("Retardo configurado a 50 microsegundos\r\n") return 50 # Retardo en microsegundos elif comando == "D000": print("Retardo configurado a 0 microsegundos") uart.write("Retardo configurado a 0 microsegundos\r\n") return 0 # Retardo en microsegundos else: # Si el comando no es válido, dar retroalimentación print(f"Comando no válido: '{comando}'. Use D000, D010, D020, D050, o RESET.") uart.write(f"Comando no válido: '{comando}'. Use D000, D010, D020, D050, o RESET.\r\n") return retardo_actual # Mantener el retardo actual si el comando no es válido # Lectura de corriente y voltaje def leer_corriente_y_voltaje(retardo_us=0, num_lecturas=600): # Lista de valores sin procesar lecturas_corriente_binario = [] lecturas_voltaje_binario = [] for _ in range(num_lecturas): lectura_corriente = adc_corriente.read_u16() lecturas_corriente_binario.append(lectura_corriente) time.sleep_us(retardo_us) lectura_voltaje = adc_voltaje.read_u16() lecturas_voltaje_binario.append(lectura_voltaje) time.sleep_us(retardo_us) # Ajuste según los componentes lecturas_corriente = [ Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 117 round(((((lectura)*3)*20)/65335), 2) for lectura in lecturas_corriente_binario ] lecturas_voltaje = [ round(((((lectura)*3)*41)/65335), 2) for lectura in lecturas_voltaje_binario ] return lecturas_corriente, lecturas_voltaje # Comprobar conexión Wi-Fi def comprobar_wifi(): wlan = network.WLAN(network.STA_IF) # Verificar si el Wi-Fi está conectado if wlan.isconnected(): print("Wi-Fi está conectado.") uart.write("Wi-Fi está conectado.\r\n") ip = wlan.ifconfig()[0] print("Dirección IP:", ip) uart.write(f"Dirección IP: {ip}\r\n") return True else: print("Wi-Fi no está conectado.") uart.write("Wi-Fi no está conectado.\r\n") return False # Proceso a ejecutar def ejecutar_proceso(): retardo_actual = 0 # Valor inicial por defecto en microsegundos print(f"Retardo inicial: {retardo_actual} microsegundos") uart.write(f"Retardo inicial: {retardo_actual} microsegundos\r\n") blink_bien() led.on() conectar_wifi(ssid, password) led.off() while True: # Comprobar conexión Wi-Fi wifi_disponible = comprobar_wifi() # Configurar el temporizador start_time = time.time() print(f"Iniciando proceso con retardo de {retardo_actual} microsegundos") uart.write(f"Iniciando proceso con retardo de {retardo_actual} microsegundos\r\n") blink_bien() reles_on() corriente_final, voltaje_final = leer_corriente_y_voltaje(retardo_us=retardo_actual, num_lecturas=600) reles_off() Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 118 blink_bien() if wifi_disponible: print("Enviando datos por Wi-Fi y UART") uart.write("Enviando datos por Wi-Fi y UART\r\n") enviar_listas_tcp(corriente_final, voltaje_final) # Enviar por Wi-Fi else: print("Enviando datos solo por UART (Wi-Fi no disponible)") uart.write("Enviando datos solo por UART (Wi-Fi no disponible)\r\n") # Enviar por UART en ambos casos enviar_por_uart(corriente_final, voltaje_final, uart) blink_bien() while True: blink_bien() # Verificar si han pasado 10 segundos if time.time() - start_time >= 120: print("Ejecución automática por temporizador") uart.write("Ejecución automática por temporizador\r\n") break # Verificar si hay datos en el puerto serie if uart.any(): # Si hay datos disponibles en el puerto serie print("Esperando comando de configuración de retardo...") uart.write("Esperando comando de configuración de retardo...\r\n") # Intentar configurar un nuevo retardo nuevo_retardo = configurar_retardo_con_tiempo(retardo_actual) if nuevo_retardo != retardo_actual: print(f"Retardo actualizado a {nuevo_retardo} microsegundos") uart.write(f"Retardo actualizado a {nuevo_retardo} microsegundos\r\n") retardo_actual = nuevo_retardo break # Salir del bucle si hay un comando recibido # Llamada al proceso ejecutar_proceso() Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 119 10.4. Codi per la Raspberry Pi Pico amb ESP8285 amb MicroPython from machine import ADC, Pin, UART import time import math import utime # Configuración de pines para los relés rele1 = Pin(6, Pin.OUT) rele2 = Pin(7, Pin.OUT) rele3 = Pin(8, Pin.OUT) rele4 = Pin(9, Pin.OUT) led = Pin(25, Pin.OUT) # Configuración de los pines ADC adc_voltaje = ADC(Pin(27)) adc_corriente = ADC(Pin(28)) adc_ntc = ADC(Pin(26)) # Configuración de red ssid = "QSARTI" password = "*********************" # Configuración del puerto serie uart = UART(0, baudrate=115200, tx=Pin(0), rx=Pin(1)) # Parpadeo del LED def blink_bien(): led.on() time.sleep(0.2) led.off() time.sleep(0.2) led.on() time.sleep(0.2) led.off() def blink_mal(): led.on() time.sleep(0.01) led.off() time.sleep(0.01) led.on() time.sleep(0.01) led.off() def enviar_comando_at(comando, tiempo_espera=1000): """Envía un comando AT al módulo ESP y retorna la respuesta.""" uart.write(comando + "\r\n") time.sleep(tiempo_espera / 1000) # Tiempo de espera en milisegundos respuesta = uart.read() if respuesta: return respuesta.decode('utf-8') Monitorització preventiva de plaques solars fotovoltaiques mitjançant corba I-V Marc García Monzonís 120 return "" def conectar_wifi(ssid, password): """Conecta a una red Wi-Fi usando comandos AT.""" print("Inicializando el módulo ESP...") uart.write("Inicializando el módulo ESP...\r\n") # Reinicia el módulo ESP respuesta = enviar_comando_at("AT+RST", 2000) print("Respuesta al reinicio:", respuesta) uart.write(f"Respuesta al reinicio: {respuesta}\r\n") # Configura el ESP en modo estación respuesta = enviar_comando_at("AT+CWMODE=1", 1000) print("Configurando en modo estación:", respuesta) uart.write(f"Configurando en modo estación: {respuesta}\r\n") # Conectar a Wi-Fi comando_conexion = f'AT+CWJAP="{ssid}","{password}"' print("Intentando conectar a la red Wi-Fi...") uart.write("Intentando conectar a la red Wi-Fi...\r\n") respuesta = enviar_comando_at(comando_conexion, 5000) print("Respuesta de conexión:", respuesta) uart.write(f"Respuesta de conexión: {respuesta}\r\n") # Verificar si está conectado if "OK" in respuesta: print("Conectado a la red Wi-Fi.") uart.write("Conectado a la red Wi-Fi.\r\n") # Obtener dirección IP respuesta = enviar_comando_at("AT+CIFSR", 1000) print("Información de IP:", respuesta) uart.write(f"Información de IP: {respuesta}\r\n") return True else: print("No se pudo establecer la conexión a Wi-Fi.") uart.write("No se pudo establecer la conexión a Wi-Fi.\r\n") return False def enviar_listas_tcp(corriente_final, voltaje_final): """Envía listas de datos a un servidor TCP utilizando comandos AT.""" ip_servidor = "10.5.159.155" puerto_servidor = 65432 # Inicia la conexión TCP print("Estableciendo conexión TCP con el servidor...") uart.write("Estableciendo conexión TCP con el servidor...\r\n") comando_tcp = f'AT+CIPSTART="TCP","{ip_servidor}",{puerto_servidor}' respuesta = enviar_comando_at(comando_tcp, 5000) print("Respuesta de conexión TCP:", respuesta) uart.write(f"Respuesta de conexión TCP: {respuesta}\r\n")