4.1 Detec¸c˜ ao de dist´ urbios
4.1.2 Testes com amostras de dist´ urbios no gerador de fun¸c˜ oes
Para realiza¸c˜ao dos testes com gerador de fun¸c˜ao, foi utilizado o software chamado Audacity. A reprodu¸c˜ao de dist´urbios arbitr´arios em uma rede A/C real, exigiria a utiliza- ¸c˜ao de plataformas de supervis˜ao complexas e de alto custo financeiro, como por exemplo
os sistemas baseados em SCADA (Supervisory Control and Data Acquisition) ou simula- dores de sistemas de energia que demandam hardware e software propriet´arios como por exemplo o sistema oferecido pela RTDS Technologies 1. A utiliza¸c˜ao da fun¸c˜ao de gerador de fun¸c˜oes presente no Audacity possui tamb´em ferramentas de edi¸c˜ao que possibilitaram trabalhar com amostras de dist´urbios disponibilizadas pelo IEEE 2. Estas amostras fo- ram importadas no Audacity e adicionadas em paralelo com um sinal de referˆencia. As amostras utilizadas foram ajustadas para que os fragmentos de dist´urbio fossem posicio- nados ap´os o per´ıodo de inicializa¸c˜ao do sistema e obten¸c˜ao das amostras para referˆencia (aproximadamente 10 segundos). As amostras obtidas do IEEE e utilizadas nos testes referem-se aos dist´urbios: transit´orios de forma de onda e varia¸c˜ao de tens˜ao.
A Figura 4.3 representa o exemplo de uma amostra utilizada nos testes. Na parte superior da figura encontra-se o sinal original e na parte inferior, o dist´urbio, neste caso, um transit´orio.
Figura 4.3 – Amostra de dist´urbio - Transit´orio
Fonte: Do autor (2016)
Para realiza¸c˜ao dos testes com gerador de fun¸c˜ao, foram utilizados fragmentos das amostras de dist´urbios obtidas do IEEE, preservando suas caracter´ısticas. Os resultados de detec¸c˜ao conforme a dura¸c˜ao do dist´urbios s˜ao apresentados na tabela 4.2.
1 https://www.rtds.com/
Tabela 4.2 – Porcentagens de acerto na detec¸c˜ao - Gerador de fun¸c˜oes Dura¸c˜ao do dist´urbio Quantidade
de itera¸c˜oes
Principais dist´urbios de tens˜ao Varia¸c˜ao de tens˜ao Transit´orios
>1 ciclo 1000 100% 100%
1 ciclo 1000 100% 100%
3 ms 1000 100% 100%
<1ms 1000 92% 94%
Fonte: Do autor (2016)
A Tabela4.2 apresenta as taxas de acerto na detec¸c˜ao para os principais dist´urbios de tens˜ao com dura¸c˜ao igual ou maior que um milissegundo foi de 100%. Para dist´urbios inferiores a 1ms, as taxas de detec¸c˜ao apresentaram respectivamente 92% e 94% para varia¸c˜ao de tens˜ao e transit´orios. Com uma fra¸c˜ao de tempo menor, a diferen¸ca dos valores no intervalo de tempo pode n˜ao atingir os limiares de 0,5%.
4.2 Monitoramento e comunica¸c˜ao
Para analisar o processo de monitoramento e comunica¸c˜ao do sistema desenvolvido foram realizadas opera¸c˜oes como: altera¸c˜ao de parˆametros de configura¸c˜ao pela interface web, exporta¸c˜ao de configura¸c˜oes e logs e acompanhamento do gr´afico indicador da QEE diante dos dist´urbios testados. Para realiza¸c˜ao dos testes de notifica¸c˜oes por mensagem SMS, o sistema foi configurado para enviar todas as notifica¸c˜oes para um ´unico smartphone utilizado para confirmar o recebimento dos SMS.
Os parˆametros configurados para mudan¸ca da cor no status da QEE da interface web se baseiam na distˆancia obtida pelo m´etodo de detec¸c˜ao, porcentagem entre os limiares de compara¸c˜ao.
a) Verde - Ausˆencia de dist´urbios ou para valores de D que se enquadram em at´e 0,5% de diferen¸ca do sinal original, posicionado no limiar de detec¸c˜ao sem ocorrˆencia de falsos positivos;
b) Laranja - para valores de D entre 0,6% at´e 3% do valor de referˆencia; c) Vermelho - para valores superiores a 3,1% do valor de referˆencia.
Figura 4.4 – Tela do monitoramento web- Alarme verde
Fonte: Do autor (2016)
A Figura 4.5 apresenta a tela da interface web com alarme laranja. Figura 4.5 – Tela do monitoramento web- Alarme laranja
Fonte: Do autor (2016)
Figura 4.6 – Tela do monitoramento web - Alarme vermelho
Fonte: Do autor (2016)
Al´em do gr´afico integrado ao sistema, utilizado para uma verifica¸c˜ao mais pontual das condi¸c˜oes da QEE, o sistema tamb´em implementa uma instˆancia de cliente Zabbix. Com esta op¸c˜ao, ´e poss´ıvel enviar as informa¸c˜oes de monitoramento para um servidor externo, por´em, esta op¸c˜ao n˜ao oferece configura¸c˜ao de parˆametros, al´em de operar com um tempo maior para renova¸c˜ao das informa¸c˜oes.
A Figura4.7demonstra uma tela capturada a partir de um servidor Zabbix, confi- gurado para obter os dados a partir do sistema desenvolvido. Para este gr´afico foi utilizada uma subtens˜ao como amostra de sinal. A linha vermelha corresponde aos valores de re- ferˆencia e a linha verde registra os valores monitorados. Caso ocorra a necessidade de renova¸c˜ao dos valores de referˆencia, o procedimento pode ser realizado pela interface web integrada ao sistema.
Figura 4.7 – Tela web - Zabbix
Fonte: Do autor (2016)
Os registros dos dist´urbios, s˜ao ainda gravados em um cart˜ao SD, e ficam dispon´ı- veis para visualiza¸c˜ao ou download via interface web. Um exemplo do arquivo log gerado pelo sistema pode ser observado pelo fragmento do arquivo LOG.TXT.
14/7/16 22 : 02 : 2 8 Dist :10661 ( ref : 1 0 68 4 ); vrms :110.00 V 14/7/16 22 : 02 : 2 8 Dist :10735 ( ref : 1 0 68 4 ); vrms :110.00 V 14/7/16 22 : 02 : 2 8 Dist :10677 ( ref : 1 0 68 4 ); vrms :109.40 V 14/7/16 22 : 02 : 2 9 Dist :10709 ( ref : 1 0 68 4 ); vrms :110.00 V 14/7/16 22 : 02 : 2 9 Dist :10713 ( ref : 1 0 68 4 ); vrms :109.40 V 14/7/16 22 : 02 : 2 9 Dist :10713 ( ref : 1 0 68 4 ); vrms :110.00 V 14/7/16 22 : 02 : 3 0 Dist :10698 ( ref : 1 0 68 4 ); vrms :110.00 V
Os dados representados no arquivo de log s˜ao respectivamente, data, hora, valor de D (distˆancia do sinal monitorado em rela¸c˜ao ao valor de referˆencia) e tens˜ao RMS. De forma semelhante, arquivo de log das mensagens SMS guarda as mensagens em arquivo texto separadas por quebra de linha.
5 CONCLUS ˜AO
O objetivo deste trabalho foi o desenvolvimento de um sistema para monitora- mento da qualidade da energia el´etrica com interface de configura¸c˜ao web, redundˆancia de comunica¸c˜ao e notifica¸c˜ao de dist´urbios de tens˜ao. Estas funcionalidades s˜ao requisitos para que o sistema funcione no cen´ario das esta¸c˜oes remotas de comunica¸c˜ao.
O sistema desenvolvido se mostrou eficaz na detec¸c˜ao de dist´urbios de tens˜ao com precis˜ao e em tempo real e apresentou de forma integrada, gr´afico para o monitoramento da QEE. Sua abordagem com redundˆancia na comunica¸c˜ao acrescentou confiabilidade ao sistema, estas caracter´ısticas diferenciam este trabalho das demais solu¸c˜oes, que s˜ao quase sempre voltadas pra detectar apenas interrup¸c˜oes no fornecimento de energia. Al´em disso, a comunica¸c˜ao via interface web, possibilitou a configura¸c˜ao remota de parˆametros para o monitoramento do ´ındice de QEE e notifica¸c˜ao de dist´urbios junto `a concession´aria de energia de forma autˆonoma. O sistema implementou ainda um agente Zabbix que possibilitou sua integra¸c˜ao com plataformas externas de monitoramento.
Os resultados obtidos na detec¸c˜ao dos principais dist´urbios de tens˜ao foram de 100% de acerto para dist´urbios com dura¸c˜ao superior a 1ms e 92% e 94% de acerto para dist´urbios com dura¸c˜ao inferior a 1ms. O sistema ainda monitora a tens˜ao RMS e a frequˆencia da rede el´etrica A/C, informa¸c˜oes que tamb´em s˜ao apresentadas pela interface web de monitoramento.
Trabalhos futuros poder˜ao adicionar funcionalidades como sele¸c˜ao de fontes de energia alternativas como solar e e´olica em fun¸c˜ao do n´ıvel de QEE que se espera da rede da concession´aria. Visto que o sistema proposto neste trabalho consegue detectar dist´urbios de tens˜ao com precis˜ao e em tempo real, com capacidade de prover informa¸c˜ao via redes de comunica¸c˜ao, espera-se que seu emprego favore¸ca a integra¸c˜ao de ERCs no conceito de Smart Grid, contribuindo com a melhoria dos indicadores de QEE.
REFERˆENCIAS
ABB AUTOMATION TECHNOLOGIES. GSM/GPRS communication adapter user manual. Sweden:ABB, 2008. 14 p.
AGˆENCIA NACIONAL DE ENERGIA EL´ETRICA - ANEEL. Resolu¸c˜ao Normativa no 414, de 9 de setembro de 2010: Estabelece as condi¸c˜oes gerais de fornecimento de energia el´etrica de forma atualizada e consolidada. Bras´ılia: ANEEL, 2010. 213 p. AGˆENCIA NACIONAL DE ENERGIA EL´ETRICA - ANEEL. Informa¸c˜oes T´ecnicas: qualidade do servi¸co e do produto. Bras´ılia: ANEEL, 2015.
AGˆENCIA NACIONAL DE ENERGIA EL´ETRICA - ANEEL. PRODIST:
procedimentos de distribui¸c˜ao de energia el´etrica no sistema el´etrico nacional. Bras´ılia: ANEEL, 2015. 26 p.
ALVARENGA, L. H. et al. Smart grid na telefonia m´ovel. RTI Redes, Telecom e Instala¸c˜oes, Rio de Janeiro, v. 1, n. 188, p. 30–39, jan. 2016.
ARDUINO. About Us. [S.l: s.n.], 2014. Dispon´ıvel em: <http://arduino.cc/>. Acesso em: 30 out. 2014.
ATMEL. ATmega640/V-1280/V-1281/V-2560/V-2561/V. San Jose: Atmel, 2014. 435 p.
BOLLEN, M. H.; GU, I. Signal processing of power quality disturbances. New Jersey: John Wiley & Sons, 2006. 861 p.
BURNS, A.; WELLINGS, A. Real-time Systems and Programming Languages: Ada, Real-Time Java and C/Real-Time POSIX. Canad´a: Pearson Education Canada, 2009. 624 p.
COMAT RELECO. SMS relay rele de controle e monitoramento remoto via SMS. S˜ao Caetano do Sul: [s.n.], 2014. Dispon´ıvel em: <https://comatreleco.com.br/ sms-relay-controle-e-monitoramento-remoto-via-sms-celular/>. Acesso em: 19 fev. 2015. COMPANHIA ENERG´ETICA DE MINAS GERAIS - CEMIG. Cidades do Futuro. [S.l.]: Cemig, 2015. Dispon´ıvel em: <http://www.cemig.com.br/pt-br/A Cemig e o
Futuro/inovacao/Alternativas Energeticas/Paginas/cidades do futuro.aspx>. Acesso
em: 17 nov. 2015.
DECKMANN, S. M.; POMILIO, J. A. Avalia¸c˜ao da Qualidade da Energia El´etrica. Campinas: UNICAMP, 2010. 1 Apostila.
FANG, A.; GUO, J.; LUO, L. Remote electric power network monitoring system based on gprs. In: INTERNATIONAL CONFERENCE ON, Zhangjiajie. Proceedings..., Zhangjiajie: IITA, China, 2009, n. 1, p. 229–231, 2009.
FERREIRA, D. D. An´alise de dist´urbios el´etricos em sistemas de potˆencia. 2010. 233 p. Tese (Doutorado em Engenharia El´etrica) - Universidade Federal do Rio de Janeiro, Rio de Janeiro, 2010.
FOROUZAN, B. Comunica¸c˜ao de dados e redes de computadores. Porto Alegre: McGraw Hill Brasil, 2007. 1168 p.
FOROUZAN, B.; MOSHARRAF, F. Redes de computadores: uma abordagem top-down. Porto Alegre: AMGH Editora, 2013. 896 p.
HUDSON, G.; LEA, T. Open Energy Monitor. [S.l.: s.n.], 2015. Dispon´ıvel em:
<https://openenergymonitor.org/emon/buildingblocks>. Acesso em: 14 jun. 2014. IEEE. IEEE standard for information technology - local and metropolitan area networks. IEEE Xplore, Canad´a, 2004. Dispon´ıvel em: <https://standards.ieee.org/findstds/ standard/802.3ah-2004.html>. Acesso em: 22 de mai. 2015.
IEEE. IEEE 802 LAN/MAN Standards Committee. IEEE Xplore, Canad´a, 2014. Dispon´ıvel em: <http://grouper.ieee.org/groups/802/>. Acesso em: 7 de abr. 2015. INSTITUTO NACIONAL DE ENERGIA EL´ETRICA - INERGE. Relat´orio de atividades. Juiz de Fora: INERGE, 2012.
INTERNATIONAL TELECOMMUNICATION UNION - ITU. G.984.1: gigabit-capable passive optical networks (GPON): general characteristics. [S.l.]: ITU, 2012. Dispon´ıvel em: <http://www.itu.int/rec/T-REC-G.984.1>. Acesso em: 22 de mai. 2015.
INTERNET ENGINEERING TASK FORCE - IETF. Request for Comments, URI Scheme for Global System for Mobile Communications (GSM) Short Message Service (SMS). [S.l.: s.n.], 2010. Dispon´ıvel em: <https: //www.ietf.org/rfc/rfc5724.txt>. Acesso em: 22 de mai. 2015.
KNAPP, E. D.; SAMANI, R. What is the smart grid? In: KNAPP, E. D.; SAMANI, R. (Ed.). Applied cyber security and the smart grid. Boston: Syngress, 2013. Chap. 1, p. 1-15.
LOPES, Y. et al. Smart grid e iec 61850: novos desafios em redes e telecomunica¸c˜oes para o sistema el´etrico. In: SIMP ´OSIO BRASILEIRO DE TELECOMUNICA ¸C ˜OES, 30., 2012, Salvador. Anais..., Salvador: Sociedade Brasileira de Telecomunica¸c˜oes, Salvador, p. 44, 2012.
MARQUES, C. A. G. T´ecnica de detec¸c˜ao de dist´urbios para o monitoramento da qualidade da energia. 2007. 103 p. Disserta¸c˜ao (Mestrado em Engenharia) - Universidade Federal de Juiz de Fora, Juiz de Fora, 2007.
MCROBERTS, M. Arduino B´asico. S˜ao Paulo: Novatec Editora, 2011. 448 p. MENDES, T. M. et al. Monitoramento multidimensional de qualidade de energia el´etrica para smart grids. In: CONFERˆENCIA BRASILEIRA SOBRE QUALIDADE DE ENERGIA EL´ETRICA, 11., 2015, Campina Grande. Anais..., Campina Grande: SBQEE, 2015. 2015. p 1-4.
MINIST´ERIO DE MINAS E ENERGIA. Relat´orio Smart Grid. Bras´ılia: Minist´erio de Minas e Energia, 2010. 229 p. Dispon´ıvel em: <http://www.mme. gov.br/documents/10584/1256641/Relatxrio GT Smart Grid Portaria 440-2010.pdf/
3661c46c-5f86-4274-b8d7-72d72e7e1157>. Acesso em: 22 de mai. 2015.
OLIVEIRA, A. HSDPA: transmiss˜ao de dados em telefonia m´ovel. Teleco, Bras´ılia, p. 1–15, 2007. Dispon´ıvel em: <http://www.teleco.com.br/tutoriais/tutorialhsdpad/ default.asp>. Acesso em: 8 de mar. 2014.
PICORONE, A. A. M.; RIBEIRO, M. V. Levantamento das caracter´ısicas das redes de energia el´etrica para o uso de sismteas power line communication: Survey plc. In: SEMIN ´ARIO NACIONAL DE PRODU ¸C ˜AO E TRANSMISS ˜AO DE ENERGIA EL´ETRICA, 23., 2015, Foz do Igua¸cu. Anais..., Foz do Igua¸cu: [s.n.], p. 1–8, 2015. PINHEIRO, J. Infraestrutura el´etrica para rede de computadores. Rio de Janeiro: Ciˆencia Moderna, 2008. v. 1. 304 p.
ROSA, F. A. F. Avalia¸c˜ao de novos atributos para estabelecimento de metas de DEC E FEC em redes de distribui¸c˜ao. 2009. 103 p. Disserta¸c˜ao (Mestrado em Engenharia El´etrica) - Universidade Federal de Itajub´a, Itajub´a, 2009.
SENRA, R. Energia El´etrica: medi¸c˜ao, qualidade e eficiˆencia. S˜ao Paulo: Bara´una, 2013. 695 p.
SHAO, C. Design of power quality monitoring system based on DSP and GPRS. In: INTERNATIONAL CONFERENCE ON, 1., 2011, Dalian. Anais..., Dalian: IEEE, 2011, v. 1, n. 18567, p. 479–481, 2011.
SILVA, J. C. d. Diagn´ostico de dist´urbios de tens˜ao em sistemas de distribui¸c˜ao de energia el´etrica usando um algoritmo imuno-neural. 2014. 100 p. Disserta¸c˜ao (Mestrado em Engenharia El´etrica) - Universidade Estadual Paulista J´ulio de Mesquita Filho, Ilha Solteira, 2014.
SOUZA, W. A. de et al. Power quality, smart meters and additional information from di↵erent power terms. IEEE Latin America Transactions, New York, v. 13, n. 1, p. 158–165, 2015.
SOUZA, W. C. Suprimento de Energia em Telecomunica¸c˜oes: uma contribui¸c˜ao ao estudo da qualidade da energia el´etrica no suprimento de sistemas de telecomunica¸c˜oes. 2002. 150 p. Disserta¸c˜ao (Mestrado em Engenharia El´etrica) - Instituto Nacional de Telecomunica¸c˜oes, Santa Rita do Sapuca´ı, 2002.
TELEBRASIL. Mapa de ERBs Brasil. [S.l.: s.n.], 2016. Dispon´ıvel em:
<http://www.telebrasil.org.br/>. Acesso em: 14 de abr. 2016.
TOLEDO, F. Desvendando as redes el´etricas inteligentes: smart grid handbook. Rio de Janeiro: Brasport, 2012. 336 p.
TUDE, E. Inteligˆencia em telecomunica¸c˜oes. Teleco, Bras´ılia, 2003. Dispon´ıvel em:
<http://www.teleco.com.br/tutoriais/tutorialgprs/default.asp>. Acesso em: 15 de mar. 2014.
TYCON POWER SYSTEM. Remote powersense monitor and control. [S.l.: s.n.], 2014. Dispon´ıvel em: <http://www.tyconpower.com/products/files/
TPDIN-Monitor-WEB spec sheet.pdf>. Acesso em: 21 de fev. 2015.
URIBE-P´EREZ, N. et al. State of the art and trends review of smart metering in electricity grids. Applied Sciences, Tubingen, v. 6, n. 3, p. 68, 2016.
YAN, Y. et al. A survey on smart grid communication infrastructures: Motivations, requirements and challenges. Communications Surveys Tutorials, Amsterdam, v. 15, n. 1, p. 5–20, 2013.
YI, P.; IWAYEMI, A.; ZHOU, C. Developing zigbee deployment guideline under wifi interference for smart grid applications. IEEE Transactions on Smart Grid, Amsterdam, v. 2, n. 1, p. 110–120, 2011.
APˆENDICE A – C´odigo-fonte do programa principal # in c lu de < SPI .h > # in c lu de < SD .h > # in c lu de < E t h e r n e t .h > # in c lu de < sms .h > # in c lu de < S o f t w a r e S e r i a l .h > # in c lu de < T im e Li b .h > SMSGSM sms ; # define C O N F I G F I L E " C O N F I G . TXT " # define S M SF IL E " SMS . TXT " # define L O GF IL E " LOG . TXT " # define SMSLOG " S M S L O G . TXT " class C on f ig s { public : char c o m p a n y N u m b e r [20]; char m o n i t N u m b e r [20]; char m o n i t B a c k u p [20]; char d e f a u l t M e s s a g e [160]; bool f o r w a r d S M S = false ; double Vcal = 110.0; double tol = 0.01; bool s d F a i l e d = false ; void save () { if (! s d F a i l e d ) { SD . remove ( C O N F I G F I L E );
File file = SD . open ( CONFIGFILE , F I L E _ W R I T E ); file . pr in t ln ( c o m p a n y N u m b e r ); file . pr in t ln ( m o n i t N u m b e r ); file . pr in t ln ( m o n i t B a c k u p ); file . pr in t ln ( f o r w a r d S M S ); file . pr in t ln ( Vcal ); file . pr in t ln ( tol ); file . close (); SD . remove ( S MS F IL E );
file = SD . open ( SMSFILE , F I L E _ W R I T E ); file . print ( d e f a u l t M e s s a g e ); file . close (); } } void load () { if (! s d F a i l e d ) { char buf [80];
File file = SD . open ( CONFIGFILE , F I L E _ R E A D ); if ( file ) {
file . r e a d B y t e s ( buf , 80); file . close ();
char * cn = strtok ( buf , " \ r \ n " ); char * mn = strtok ( NULL , " \ r \ n " ); char * mb = strtok ( NULL , " \ r \ n " ); char * fs = strtok ( NULL , " \ r \ n " ); char * vc = strtok ( NULL , " \ r \ n " ); char * t = strtok ( NULL , " \ r \ n " ); strcpy ( companyNumber , cn ); strcpy ( monitNumber , mn ); strcpy ( monitBackup , mb ); f o r w a r d S M S = atoi ( fs ); Vcal = String ( vc ). to F lo a t (); tol = String ( t ). t o Fl oa t (); }
file = SD . open ( SMSFILE , F I L E _ R E A D ); if ( file ) { file . r e a d B y t e s ( de fa u lt M es sa g e , 160); file . close (); } } } String json () { String r e s p o n s e = " {\" n c o n c e s s \ ":\ " " ; r e s p o n s e += c o m p a n y N u m b e r ; r e s p o n s e += " \" ,\" n m o n i t \" :\" " ; r e s p o n s e += m o n i t N u m b e r ; r e s p o n s e += " \" ,\" n m o n i t b a c k u p \ ":\ " " ; r e s p o n s e += m o n i t B a c k u p ; r e s p o n s e += " \" ,\" f o r w a r d S M S \": " ; r e s p o n s e += ( f o r w a r d S M S ) ? " true " : " fa lse " ; r e s p o n s e += " ,\" vol ts \": " ; r e s p o n s e += Vcal ; r e s p o n s e += " ,\" tol \": " ; r e s p o n s e += tol ; r e s p o n s e += " ,\" m e s s a g e \" :\" " ; r e s p o n s e += d e f a u l t M e s s a g e ; r e s p o n s e += " \"} " ; return r e s p o n s e ; } } c on fi g s ; static bo ol e an g s m S t a r t e d = false ;
static byte mac [] = { 0 xDE , 0 xAD , 0 xBE , 0 xEF , 0 xFE , 0 xED }; // s t a t i c I P A d d r e s s ip (10 , 42 , 0 , 20);
static E t h e r n e t S e r v e r server (80);
static E t h e r n e t S e r v e r z a b b i x S e r v e r ( 1 0 0 5 0 ) ; static E t h e r n e t C l i e n t z a b b i x C l i e n t ;
static u n s i g n e d int l o c a l P o r t = 8888;
static const int N T P _ P A C K E T _ S I Z E = 48;
const int t i m e Z o n e = -3; // H o r a r i o de B r a s i l i a static E t h e r n e t U D P Udp ;
# define M A X _ C M D _ L E N G T H 25
b oo l ea n c o n n e c t e d = false ;
static String cmd ; // FOR Z A B B I X C O M M A N D static int c o un t er = 1; // For t e s t i n g
static int limit = 1; // C o m m a n d size . U s i n g 1 for b e t t e r p e r f o r m a n c e .
// A m o s t r a s por c i c l o # define S A MP LE S 160 # define SKIP 20
# define DISTS ( S AM PL E S / SKIP ) # define S E CO ND S 1
# define POS (f , i ) ( f + i ) % B UF S IZ E # define DPOS (f , i ) ( f + i ) % DISTS
# define REF ( DISTS * 60 * S EC O ND S )
# define B U FS IZ E ( SA M PL E S ) // B u f f e r com as a m o s t r a s ao q u a d r a d o static v o l a t i l e long sq u ar e s [ B UF S IZ E ]; # define I N T E R V A L (90) # define T O T A L _ D I S T S ( I N T E R V A L * DISTS ) // v o l a t i l e u n s i g n e d int r a w I n p u t [1]; // v o l a t i l e bool i n p u t R e a d y [1] = { f a l s e }; // B u f f e r com os v a l o r e s de dist static u n s i g n e d int dist [ T O T A L _ D I S T S ]; int lDist = 0;
static u n s i g n e d long ref = 0;
static v o l a t i l e u n s i g n e d short first = 0 , last =0; static int count = 0;
static v o l a t i l e u n s i g n e d short skip = SKIP ; // s t a t i c bool d o I n t = true ;
static double Vrms ;
// V a l o r alto para nao a c u s a r q u e d a de t e n s a o logo ao i n i c i a r static v o l a t i l e int Vpeak = 200;
static int V p e a k T e m p = 0; // s t a t i c int V n p e a k = 0;
inline void f o r m a t T i m e ( char * t i m e S t r i n g ) { // d i g i t a l c l o c k d i s p l a y of the time
s pr i nt f ( timeString , " % d /% d /% d % d :%02 d :%02 d " , day () , month () , year () , hour () , minute () , second ()); } inline void c a l c D i s t () _ _ a t t r i b u t e _ _ (( a l w a y s _ i n l i n e )); inline void c a l c D i s t () { while ( skip ); skip = SKIP ; r e g i s t e r long sum = 0; for ( r e g i s t e r u n s i g n e d short i = 0; i < S AM P LE S ; ++ i ) { sum += s qu a re s [ POS ( first , i )];
}
sum > >= 10;
dist [ lDist ] = sum ; }
inline double readV () _ _ a t t r i b u t e _ _ (( a l w a y s _ i n l i n e )); inline double readV () {
return ( c o nf i gs . Vcal * ( Vpeak * 0 . 7 0 7 1 0 6 7 8 1 ) ) / (184 * 0 . 7 0 7 1 0 6 7 8 1 ) ; }
void ca l cR e f () { c a l c D i s t ();
ref = dist [ lDist ];
for ( u n s i g n e d int i = 0; i < REF ; ++ i ) { c a l c D i s t ();
ref += dist [ lDist ]; ref > >= 1; } } void setup () { Serial . begin (9 6 00 ) ; if (! SD . begin (4)) { Serial . p r in tl n ( " P r o b l e m a com c a r t a o " ); c on f ig s . s d F a i l e d = true ; } c on f ig s . load (); if (! gsm . begin ( 48 0 0) ) { Serial . p r in tl n ( " GSM nao i n i c i a l i z a d o " ); } else { g s m S t a r t e d = true ; sms . Se n dS M S ( c on f ig s . monitNumber , c o nf ig s . d e f a u l t M e s s a g e ); for ( short i = 0; i < 20; ++ i ) { sms . D e l e t e S M S ( i ); }
}
// T I M S K 0 = 0 x00 ; // d i s a b l e t i m e r ( c a u s e s a n o y i n g i n t e r r u p t s ) // Set ADC p r e s c a l e r to 128 - 125 KHz s a m p l e rate @ 16 MHz
ADCSRA |= ( 1 << ADPS2 ) | ( 1 << ADPS1 ) | ( 1 << ADPS0 ); ADMUX |= ( 1 << REFS0 ); // Set ADC r e f e r e n c e to AVCC ADCSRB |= (1 < < MUX5 ); // Pino 8
DIDR2 |= (1 < < ADC8D ); // D e s a b i l i t a d i g i t a l no pino 8 ADCSRA |= (1 < < ADATE ); // Auto t r i g g e r
ADCSRA |= (1 < < ADEN ); // Liga ADC ADCSRA |= (1 < < ADIE ); // Free r u n n i n g ADCSRA |= (1 < < ADSC ); // I n i c i a c o n v e r s o e s
// a t t a c h I n t e r r u p t (2 , cross , R I S I N G );
sei (); // Set g l o b a l i n t e r r u p t flag delay (100);
E t h e r n e t . begin ( mac );
Serial . p ri n tl n ( E t h e r n e t . lo ca l IP ()); Udp . begin ( l o c a l P o r t );
Serial . p ri n tl n ( " w a i t i n g for sync " ); s e t S y n c P r o v i d e r ( g e t N t p T i m e ); c al c Re f (); Serial . p ri n tl n ( " I n i c i o " ); server . begin (); z a b b i x S e r v e r . begin (); } void loop () { E t h e r n e t . m a i n t a i n (); // S e r i a l . p r i n t l n ( r e a d V ()); z a b b i x A g e n t (); d o N e t w o r k i n g (); c a l c D i s t ();
if (( dist [ lDist ] > ((1.0 + c on f ig s . tol ) * ref )) || ( dist [ lDist ] < ((1.0 - c on f ig s . tol ) * ref ))) {
double rmsV = readV ();
File lo g fi l e = SD . open ( LOGFILE , F I L E _ W R I T E ); char d i s t u r b T i m e [20];
f o r m a t T i m e ( d i s t u r b T i m e ); l og f il e . print ( d i s t u r b T i m e );
l og f il e . print ( " D i s t u r b i o . V alo r D : " ); l og f il e . print ( dist [ lDist ]);
l og f il e . print ( " ( r e f e r e n c i a : " ); l og f il e . print ( ref ); l og f il e . print ( " ); t e n s a o : " ); l og f il e . print ( rmsV ); l og f il e . p r in tl n ( " V " ); // S e r i a l . p r i n t l n ( d i s t u r b T i m e );
l og f il e . close (); if ( rmsV < 80.0) { sms . Se n dS M S ( c on f ig s . companyNumber , c on f ig s . d e f a u l t M e s s a g e ); } } if ( g s m S t a r t e d ) { short smsPos = sms . I s S M S P r e s e n t ( S M S _ U N R E A D ); if ( smsPos ) { char p h o n e N u m b e r [20]; char sm s Te x t [160]; char st r Ti m e [20]; f o r m a t T i m e ( s t rT i me );
sms . GetSMS ( smsPos , phoneNumber , 20 , smsText , 160); Serial . p r in tl n ( " M e n s a g e m r e c e b i d a : " ); Serial . p r in tl n ( p h o n e N u m b e r ); Serial . p r in tl n ( sm sT e xt ); if (! c on fi g s . s d F a i l e d ) { String m e s s a g e T o L o g = st r Ti me ; m e s s a g e T o L o g += " m e n s a g e m r e c e b i d a de " ; m e s s a g e T o L o g += p h o n e N u m b e r ; m e s s a g e T o L o g += " :\ n " ; m e s s a g e T o L o g += s ms T ex t ;
File file = SD . open ( SMSLOG , F I L E _ W R I T E ); file . pr in t ln ( m e s s a g e T o L o g ); file . close (); } if ( c on f ig s . f o r w a r d S M S && ( strcmp ( phoneNumber , co n fi g s . c o m p a n y N u m b e r ) == 0)) { char me s sa g e [160]; s pr in t f ( message , " E n c a m i n h a d o de % s \ n \ n % s " , phoneNumber , s m sT ex t ); sms . Se n dS M S ( c on f ig s . monitNumber , m e ss a ge ); } } } } // L e i t u r a das a m o s t r a s ( t r a t a d o r de i n t e r r u p c a o ) ISR ( A D C _ v e c t ) { // if ( d o I n t ) {
long r a w I n p u t = ADCL ; // s t o r e l o w e r byte ADC r a w I n p u t += ADCH << 8; // s t o r e h i g h e r b y t e s ADC r a w I n p u t -= 492; if ( count > ( SA M PL E S *10)) { count = 0; Vpeak = V p e a k T e m p ; V p e a k T e m p = 0; // V n p e a k = r a w I n p u t ; } else if ( r a w I n p u t > V p e a k T e m p ) {
V p e a k T e m p = r a w I n p u t ; } /* else if ( r a w I n p u t < V n p e a k ) { V n p e a k = r a w I n p u t ; } */ r a w I n p u t *= r a w I n p u t ; s qu a re s [ last ] = r a w I n p u t ; last = POS ( last , 1); count ++; if ( skip ) -- skip ; // } // d o I n t = ! d o I n t ; } // Read c o m m a n d r e c e i v e d . void r e a d T e l n e t C o m m a n d ( char c ) { if ( cmd . length () == M A X _ C M D _ L E N G T H ) { cmd = " " ; } cmd += c ; if ( c == ’\ n ’ || cmd . length () == limit ) { p a r s e C o m m a n d (); } else { } } // C o m m a n d s r e c e i v e d by a g e n t on port 1 0 0 5 0 p a r s i n g void p a r s e C o m m a n d () { if ( cmd . equals ( " " )) { } else { c ou nt e r = co un t er + 1; // A G E N T ping if ( cmd . equals ( " p " )) { z a b b i x S e r v e r . pr i nt ln ( " 1 " ); } else if ( cmd . equals ( " l " )) { z a b b i x S e r v e r . pr i nt ln ( " A r d u i n o Z a b b i x Ag ent 1.0 " ); delay (100); } else if ( cmd . equals ( " q " )) { z a b b i x S e r v e r . pr i nt ln ( dist [ lDist ]); } else if ( cmd . equals ( " w " )) { z a b b i x S e r v e r . pr i nt ln ( ref ); } else { // A gen t err or
// z a b b i x S e r v e r . p r i n t (" Z B X D Z B X _ N O T S U P P O R T E D "); // z a b b i x S e r v e r . p r i n t (" E r r o r "); } cmd = " " ; z a b b i x C l i e n t . stop (); } }
void z a b b i x A g e n t () { z a b b i x C l i e n t = z a b b i x S e r v e r . a v a i l a b l e (); if ( z a b b i x C l i e n t ) { if (! c o n n e c t e d ) { z a b b i x C l i e n t . flush (); c o n n e c t e d = true ; z a b b i x C l i e n t . stop (); } if ( z a b b i x C l i e n t . a v a i l a b l e () > 0) { int c l i e n t r e a d = z a b b i x C l i e n t . read (); char charcr = c l i e n t r e a d ; r e a d T e l n e t C o m m a n d ( c l i e n t r e a d ); } } } void d o N e t w o r k i n g () { E t h e r n e t C l i e n t client = server . a v a i l a b l e (); const int D A T A S I Z E = 500; if ( client . c o n n e c t e d ()) { const char P RO G ME M * n o t F o u n d = " 404. HTM " ; const char P RO GM E M * index = " IN DEX . HTM " ; const char P RO GM E M * t y p e N o n e = " " ;
const char P RO GM E M * t y p e H t m l = " Content - Type : text / html ; c h a r s e t = utf -8\ n " ; const char P RO GM E M * t y p e J s o n = " Content - Type : text / json ; c h a r s e t = utf -8\ n " ; const char P RO GM E M * typeJs = " Content - Type : text / j a v a s c r i p t ; c h a r s e t = utf -8\ n " ; const char P RO GM E M * t y pe C ss = " Content - Type : text / css ; c h a r s e t = utf -8\ n " ; const char P RO GM E M * t y pe T xt = " Content - Type : text / pl ain ; c h a r s e t = utf -8\ n " ; const char P RO GM E M * a l l o w O r i g i n = " Access - Control - Allow - O r i g i n : *\ n " ; char * c o n t e n t T y p e = t y p e N o n e ;
char c o n t e n t D i s p o s i t i o n [100] = " " ; char buf [ D A T A S I Z E ];
const char P RO GM E M * r e s p o n s e O K = " HTTP /1.1 200 OK " ;
const char P RO GM E M * n o R e s p o n s e = " HTTP /1.1 204 No R e s p o n s e " ; const char P RO GM E M * r e s p o n s e N o t F o u n d = " HTTP /1.1 404 Not F oun d " ;
const char P RO GM E M * r e s p o n s e I n t e r n a l E r r o r = " HTTP /1.1 500 I n t e r n a l E rro r " ; char * r e s p o n s e = r e s p o n s e O K ;
String ad dr e ss ; String pa yl o ad ;
if ( client . a v a i l a b l e ()) {
short bytes = client . r e a d B y t e s ( buf , D A T A S I Z E ); buf [ bytes ] = ’ \0 ’;
}
// S e r i a l . p r i n t ( buf );
char * req = strtok ( buf , " \ n " );
String co mm a nd = strtok ( req , " " ); a dd r es s = strtok ( NULL , " " ) + 1; if ( c om m an d == " GET " ) { if ( a dd r es s [0] == ’ \0 ’) { a dd re s s = index ; } String ext = st rr c hr ( ad d re s s . c_str () , ’. ’ ); if ( SD . exists ( a dd r es s )) { if ( ext == " . htm " ) { c o n t e n t T y p e = t y p e H t m l ; } else if ( ext == " . css " ) { c o n t e n t T y p e = ty p eC s s ; } else if ( ext == " . js " ) { c o n t e n t T y p e = typeJs ; } else if ( ext == " . txt " ) { c o n t e n t T y p e = ty p eT x t ; s pr in t f ( c o n t e n t D i s p o s i t i o n , " Content - D i s p o s i t i o n : a t t a c h m e n t ; a d d r e s s =\"% s \"\ n " , a d dr es s . c_str ()); }
} else if ( ext == " . json " ) { c o n t e n t T y p e = t y p e J s o n ; } else if ( co n fi gs . s d F a i l e d ) { c o n t e n t T y p e = t y p e H t m l ; r e s p o n s e = r e s p o n s e I n t e r n a l E r r o r ; } else { c o n t e n t T y p e = t y p e H t m l ; a dd re s s = n o t F o u n d ; r e s p o n s e = r e s p o n s e N o t F o u n d ; } } else if ( co m ma nd == " POST " ) { r e s p o n s e = n o R e s p o n s e ; p ay l oa d = strstr ( remaining , " \ r \ n \ r \ n " ) + 4; if ( a dd r es s == " m e s s a g e " ) { strcpy ( c o nf ig s . de fa u lt M es sa g e , p a yl oa d . c_str ()); } else if ( ad d re ss == " vo lts " ) { c on fi g s . Vcal = p ay l oa d . t o Fl oa t (); } else if ( ad d re ss == " n c o n c e s s " ) { strcpy ( c o nf ig s . companyNumber , p a yl o ad . c_str ()); } else if ( ad d re ss == " n m o n i t " ) { strcpy ( c o nf ig s . monitNumber , pa yl o ad . c_str ()); } else if ( ad d re ss == " n m o n i t b a c k u p " ) { strcpy ( c on f ig s . monitBackup , p a yl o ad . c_str ()); } else if ( ad d re ss == " tol " ) { c on fi g s . tol = p ay l oa d . t o Fl o at (); } else if ( ad d re ss == " re set " ) { c al cR e f (); } c on f ig s . save (); }
s pr i nt f ( buf , " % s \ n % s % s % s S e r v e r : A r d u i n o \ n C o n n e c t i o n : cl ose \ n \ n " , response , allowOrigin , contentType , c o n t e n t D i s p o s i t i o n );
client . print ( buf );
if ( c o n t e n t T y p e == t y p e J s o n ) { if ( a dd r es s == " data . json " ) {
client . print ( " [ " ); client . print ( ref ); client . print ( " ," );
client . print ( dist [ lDist ]); client . print ( " ," );
client . print ( readV ()); client . print ( " ] " );
} else if ( ad d re ss == " c o n f i g . json " ) { client . print ( co nf i gs . json ());
}
} else if ( co n fi gs . s d F a i l e d ) {
client . p r in tl n ( " < html > < head > < title > D e t e t o r de di stu rbi os </ title > </ head > < body > < h1 >