Escola Superior de Tecnologia de Tomar Tiago Alexandre Martins Fernandes sistema integrado de segurança e gestão de energia (sisge)



Baixar 9.55 Mb.
Página26/26
Encontro30.10.2016
Tamanho9.55 Mb.
1   ...   18   19   20   21   22   23   24   25   26

Anexo B – Portas NodeMCU.


Autor: Zeroday nodemcu, retirada da página web https://github.com/nodemcu.


Anexo C – Código de programação do Arduino Mega


Partes deste código são baseadas nos exemplos fornecidos com as bibliotecas utilizadas.

//Inclusão de bibliotecas

#include

#include

#include


// Definições de rede

byte mac[] = { 0xDE, 0xEE, 0xBA, 0xFE, 0xFE, 0xED };

IPAddress ip(192, 168, 1, 11);

IPAddress server(192, 168, 1, 68);


//Variaveis

int samples = 1500; //número de amostras

int inU = A0;//Portas de entrada tensão e corrente

int inI0 = A4;

double UCAL = 0.9;

double ICAL = 0.29;

double calibFase = 0.1;

int lastU,lastI,sampleU,sampleI;

double lastFilterU, lastFilterI, filterU, filterI = 0;

double filterTemp;

double calibU;

double sqrtI,sqrtU,instP,sumI,sumV,sumP;

double activPower,apparentPower,powerFactor,Vrms,Irms;

unsigned long postingInterval = 6000; //Intervalo de envios

unsigned long lastRequest = 0;

long now = 0;

int restart = 0;

unsigned long endTime, startTime, timeLastMeasure;

unsigned long startUpTime;

double energyTotal =0.0;

unsigned long LastZero;

unsigned long periodU;

unsigned long periodUSum;

unsigned long periodUCount;

float freq;

unsigned long sinPeriod = 20000;

unsigned long filterWidth = 2000;

//recebe as mensagens vindas do topico mqtt subscrito

//atualiza as constantes de calibração, tempo e estado

void callback(char* topic, byte* payload, unsigned int length) {

Serial.print("Message arrived [");

Serial.print(topic);

Serial.print("] ");

char msgBuffer[100];

for (int i=0;i

msgBuffer[i] = payload[i];

Serial.print((char)payload[i]);

}


String msg = String(msgBuffer);

Serial.println();

if(msg.startsWith("sendTime")){

postingInterval = msg.substring(8).toFloat();

Serial.println(postingInterval);

}else if(msg.startsWith("VConstant")){

UCAL = msg.substring(9).toFloat();

}else if(msg.startsWith("IConstant")){

ICAL = msg.substring(9).toFloat();

}else if(msg.startsWith("setToday")){

energyTotal = msg.substring(8).toFloat();

}else if(msg.equals("newDay")){

energyTotal = 0;

}else if(msg.startsWith("device")){

digitalWrite(msg.substring(6,7).toInt()+5,msg.substring(7,8).toInt());

}

}



EthernetClient ethClient;

PubSubClient client(ethClient);

//reinicia o programa

void software_Reset()

{

asm volatile (" jmp 0");



}

void reconnect() {

while (!client.connected()) {

Serial.print("Attempting MQTT connection...");

if (client.connect("arduinoClient")) {

Serial.println("connected");

client.subscribe("sisge/control");

String getSettings = "getSettings";

char getSettingsArray[getSettings.length()];

getSettings.toCharArray(getSettingsArray, getSettings.length()+1);

client.publish("sisge/settings", getSettingsArray);

restart = 0;

} else {

Serial.print("failed, rc=");

Serial.print(client.state());

Serial.println(" try again in 5 seconds");

restart++;

if(restart>=12){

software_Reset();

}

delay(1000);



}

}

}



int Energy()

{

for (int n=0; n

{

//guarda ultimas amostras

lastU=sampleU;

lastI=sampleI;

//Recolhe amostras

sampleU = analogRead(inU);

sampleI = analogRead(inI0);

//guarda ultimos valores filtrados

lastFilterU = filterU;

lastFilterI = filterI;

//Aplicação do filtro digital.

filterU = 0.996 * (lastFilterU+sampleU-lastU);

filterI = 0.996 * (lastFilterI+sampleI-lastI);

//Calibração de fase

calibU = lastFilterU + calibFase * (filterU - lastFilterU);

//Tensão RMS

sqrtU= calibU * calibU;

sumV += sqrtU;

//Corrente RMS

sqrtI = filterI * filterI;

sumI += sqrtI;

//Potência instantanea

instP = abs(calibU * filterI);

sumP += instP;

//Frequência

if (n==0) LastZero = micros();

//Verifica se está a passar por zero

if (lastFilterU < 0 && filterU >= 0 && n>1)

{

//Periodo da onda da tensão



periodU = micros() - LastZero;

//Filtra leituras erradas

if (periodU > (sinPeriod-filterWidth) && periodU<(sinPeriod+filterWidth))

{

periodUSum += periodU;



periodUCount++;

}

LastZero = micros();



}

}

//Cálculo dos valores aproximados



Vrms = UCAL*sqrt(sumV / samples);

Irms = ICAL*sqrt(sumI / samples);

//Potência

activPower = UCAL*ICAL*sumP / samples;

apparentPower = Vrms * Irms;

if(apparentPower>activPower){

powerFactor = activPower / apparentPower;

}else{


powerFactor=1;

}

//Frequência



freq = (1000000.0 * periodUCount) / periodUSum;

periodUSum=0;

periodUCount=0;

//Calcula o tempo desde a ultima medição

endTime = startTime;

startTime = millis();

timeLastMeasure = startTime - endTime;

//Calcula a energia consumida no intervalo e adiciona à soma dos kWh

energyTotal = energyTotal + ((activPower/1000.0) * 1.0/3600.0 * (timeLastMeasure/1000.0));

Serial.print("RP=");

Serial.print(activPower);

Serial.print(" AP=");

Serial.print(apparentPower);

Serial.print(" PF=");

Serial.print(powerFactor);

Serial.print(" V=");

Serial.print(Vrms);

Serial.print(" I=");

Serial.print(Irms);

Serial.print(" KW=");

Serial.print(energyTotal );

Serial.print(" F=");

Serial.println(freq);

//envia mensagem

if (now - lastRequest >= postingInterval) {

if(freq){freq=50;}

String energyStr = "Ard001;Monitor1;"+String(Vrms)+";"+(String)Irms+";"+(String)activPower+";"+(String)apparentPower+";"+(String)powerFactor+";"+(String)energyTotal +";"+(String)freq;

int energyStrLength = energyStr.length();

char energyArray[energyStrLength];

energyStr.toCharArray(energyArray, energyStrLength);

client.publish("sisge/energy", energyArray);

Serial.println("Message sent");

lastRequest = now;

}
sumV = 0;

sumI = 0;

sumP = 0;

}

void setup()



{

//inicia os resgitos relativos à porta Serie de debug,

//cliente mqtt, ethernet, e define quais os pinos de saída para os atuadores

Serial.begin(9600);

//Define a referência do ADC para 2,56V

analogReference(INTERNAL2V56);

client.setServer(server, 1883);

client.setCallback(callback);

Ethernet.begin(mac, ip);

startTime = millis();

startUpTime=startTime;

lastRequest = millis();

pinMode(6, OUTPUT);

pinMode(7, OUTPUT);

pinMode(8, OUTPUT);

pinMode(9, OUTPUT);

digitalWrite(6,0);

digitalWrite(7,0);

digitalWrite(8,0);

digitalWrite(9,0);

}

void loop()



{

now = millis();

if (!client.connected()) {

reconnect();

}

client.loop();



Energy();

delay(100);

}

}}




Anexo D – Código de programação do NodeMCU


Partes deste código são baseadas nos exemplos fornecidos com as bibliotecas utilizadas. Biblioteca e procedimentos de instalação para utilização deste código no IDE Arduino em:

https://github.com/esp8266/Arduino-esp8266fs-plugin



#include

#include

// Config Rede

const char* ssid = "_NOME_DA_REDE_";

const char* password = "_PALAVRA_PASS_DA_REDE_";

const char* mqtt_server = "192.168.1.68";

//Tempo em segundos para o sensor se calibrar ao ambiente

int calibrationTime = 15;

//tempo em que o sensor passa a "0"

long unsigned int lowIn;

//Temmpo em que se considera que não haverá mais movimento

long unsigned int pause = 5000;

//Variaveis de estado

boolean lockLow = true;

boolean takeLowTime;

//Porta à qual está ligado o sensor PIR

int pirPin = D1;

// Inicia o cliente WiFi e MQTT

WiFiClient espClient;

PubSubClient client(espClient);

long lastMsg = 0;

char msg[50];

int value = 0;

int active = 1;

void setup() {

//inicia a resistência de pullup interna

pinMode(pirPin, INPUT);

Serial.begin(9600); //inicia a ligação série

setup_wifi(); //efetua a ligação à rede wireless

client.setServer(mqtt_server, 1883);

client.setCallback(callback);

Serial.print("calibrating sensor ");

for(int i = 0; i < calibrationTime; i++){

Serial.print(".");

delay(1000);

}

Serial.println(" done");



Serial.println("SENSOR ACTIVE");

delay(50);

}
void setup_wifi() {
delay(10);

// Efetua a ligação à rede wireless

Serial.println();

Serial.print("Connecting to ");

Serial.println(ssid);
WiFi.begin(ssid, password);

//espera até que a ligação esteja concluida

while (WiFi.status() != WL_CONNECTED) {

delay(500);

Serial.print(".");

}
Serial.println("");

Serial.println("WiFi connected");

Serial.println("IP address: ");

Serial.println(WiFi.localIP());

}
void callback(char* topic, byte* payload, unsigned int length) {

Serial.print("Message arrived [");

Serial.print(topic);

Serial.print("] ");

char msgBuffer[100];

for (int i = 0; i < length; i++) {

msgBuffer[i] = payload[i];

Serial.print((char)payload[i]);

}

String msg = String(msgBuffer);



Serial.println();

if(msg.startsWith("active")){

//define estado de envio

active = msg.substring(6,7).toInt();

Serial.println(active);

}

}


void reconnect() {

// Loop até que a ligação ao broker seja efetuada

while (!client.connected()) {

Serial.print("Attempting MQTT connection...");

// tentativa de ligação

if (client.connect("ESP8266Client")) {

Serial.println("connected");

// Assimm que ligado publica mensagem

client.publish("sisge/security", "PIRSensor-ON");

// subscreve o topico de controlo

client.subscribe("sisge/control");

String getSettings = "getSettings";

char getSettingsArray[getSettings.length()];

getSettings.toCharArray(getSettingsArray, getSettings.length()+1);

client.publish("sisge/settings", getSettingsArray);

} else {


Serial.print("failed, rc=");

Serial.print(client.state());

Serial.println(" try again in 5 seconds");

// espera 10 seundos até voltar a tentar

delay(10000);

}

}



}
void pirSensor(){

if(digitalRead(pirPin) == 1){

digitalWrite(BUILTIN_LED, LOW);//Liga o LED interno caso haja ativação do PIR

if(lockLow){

lockLow = false;

Serial.println("---");

Serial.print("motion detected at ");

Serial.print(millis()/1000);

Serial.println(" sec");

//Se o envio estiver ativo comunica à central o estado

if(active==1){

snprintf (msg, 75, "Alarm-ON");

client.publish("sisge/security", msg);

}

delay(50);



}

takeLowTime = true;

}
if(digitalRead(pirPin) == 0){

digitalWrite(BUILTIN_LED, HIGH); //Desliga o LED interno caso não haja ativação do PIR


if(takeLowTime){

lowIn = millis();

takeLowTime = false;

}

if(!lockLow && millis() - lowIn > pause){



lockLow = true;

Serial.print("motion ended at "); //output

Serial.print((millis() - pause)/1000);

Serial.println(" sec");

//Comunica à central estado

snprintf (msg, 75, "Alarm-OFF");

client.publish("sisge/security", msg);

delay(50);

}

}

}


void loop() {

if (!client.connected()) {

reconnect();

}

client.loop();



pirSensor();

}




Anexo E – Principais scripts da aplicação SISGE


Utilizados widgets disponíveis em:

https://github.com/Shopify/dashing

https://github.com/FlorianZ/hadashboard

Script de atualização dos widget da aplicação.



# encoding: UTF-8

require 'net/http'

require 'json'

require 'mysql2'

#URL de acesso aos servicos REST do node-red

urlLive = 'http://localhost:1880/services/rest/getEnergy'

url5Min = 'http://localhost:1880/services/rest/getLast5Min'

url24h = 'http://localhost:1880/services/rest/getLast24h'

urlgetList = 'http://localhost:1880/services/rest/getList'

urlgetContracted = 'http://localhost:1880/services/rest/getContracted'


#Indicadores de grandezas eletricas

SCHEDULER.every '5s' do

liveResponse = Net::HTTP.get_response(URI.parse(urlLive))

liveResponseText = liveResponse.body

parsedLive = JSON.parse(liveResponseText)

send_event('volt', { value: parsedLive[0]["VOLT"] })

send_event('watt', { value: parsedLive[0]["TOTAL_POWER"] })

send_event('amper', { value: parsedLive[0]["TOTAL_CURRENT"] })

send_event('today', { value: parsedLive[0]["TOTAL_TO_ENERGY"] })

data = [

{ label: "Consumo", value: parsedLive[0]["TOTAL_TO_ENERGY"] },

{ label: "Produção", value: parsedLive[0]["PRO_TO_ENERGY"] },

]

send_event('energy_now', { value: data })



send_event('current_cost', { value: parsedLive[0]["PRICE"] })

send_event('hour_type', { value: parsedLive[0]["HOUR_TYPE"] })

send_event('tarif_type', { value: parsedLive[0]["TYPE"] })

send_event('cycle', { value: parsedLive[0]["CYCLE_TYPE"] })

send_event('contracted', { value: parsedLive[0]["CONTRACTED"] })

send_event('cost_today', { value: parsedLive[0]["DAY"] })

send_event('cost_week', { value: parsedLive[0]["WEEK"] })

send_event('cost_month', { value: parsedLive[0]["MONTH"] })

send_event('cost_week', { value: parsedLive[0]["WEEK"] })

send_event('cost_year', { value: parsedLive[0]["YEAR"] })

send_event('contracted_price', { value: parsedLive[0]["POWER_PRICE"] })

send_event('service', { value: parsedLive[0]["SERVICE"] })

end
#Grafico ultimos 5 minutos

SCHEDULER.every '5s' do

fiveMinResponse = Net::HTTP.get_response(URI.parse(url5Min))

fiveMinResponseText = fiveMinResponse.body

parsedFiveMin = JSON.parse(fiveMinResponseText)

series = [];

series[0]=parsedFiveMin[0];

send_event('last5min', series: series)

end
#Grafico ultimas 12 horas

SCHEDULER.every '300s' do

h24Response = Net::HTTP.get_response(URI.parse(url24h))

h24ResponseText = h24Response.body

parsed24h = JSON.parse(h24ResponseText)

series = [];

series[0]=parsed24h[0];

send_event('last24h', series: series)

end

#listas de consumo atual e diario



SCHEDULER.every '10s' do

getListResponse = Net::HTTP.get_response(URI.parse(urlgetList))

getListResponseTxt = getListResponse.body

parsedList = JSON.parse(getListResponseTxt)

send_event('list_now', { items: parsedList[0] })

send_event('list_today', { items: parsedList[1] })

end

#lista de precos da energia



SCHEDULER.every '600s' do

getContractedResponse = Net::HTTP.get_response(URI.parse(urlgetContracted))

getContractedResponseTxt = getContractedResponse.body

parsedgetContracted = JSON.parse(getContractedResponseTxt)

send_event('list_hours', { items: parsedgetContracted })

end

Script para interação com os serviços REST criados no Node-RED.

require 'json'
#URL da aplicacao Dashing

host_uri = 'http://localhost:3030'


app = NRApp.new()

#Servico de atualizacao dos sensores

get '/services/rest' do

app.getSensorStatus(params['sensorId'],params['deviceType'], params)

end

#Servico de comando dos atuadores



post '/services/rest' do

app.sendCommand(params['sensorId'],params['deviceType'], params['command'],params)

end

#Servico de atualizacao dos estado dos atuadores



get '/services/rest/status' do

app.setSensorStatus(params['sensorId'],params['status'], params)

end

#Servico de atualizacao dos estado do dimmer



get '/services/rest/level' do

app.setSensorLevel(params['sensorId'],params['level'], params)



end



Anexo F – DVD-ROM


Aplicações SISGE:

    • Pasta Projeto_Dashing – ficheiros relativos ao projeto Dashing.

      • Pasta sisge/jobs contém os scripts utilizados;

      • Pasta sisge/widgets contém os widgets utilizados;

      • Pasta sisge/dashboards contém as páginas principais.

      • Pasta sisge/lib contém o script de ligação ao Node-RED

Documentos consultados:

    • Atmel ATmega640V-1280V-1281V-2560V-2561V.pdf

    • Atmel AVR465 Single-Phase PowerEnergy Meter.pdf

    • ERSE-PreçosRef_BTN.pdf

    • ESPRESSIF SMART CONNECTIVITY PLATFORM ESP8266.pdf

    • HC-SR501 PIR.pdf

    • IBM MQTT.pdf

    • ST - UNDERSTANDING POWER FACTOR 1999.pdf

    • ST -UNDERSTANDING POWER FACTOR 2003.pdf

    • W5100 Datasheet.pdf

    • YHDC SCT-013-000.pdf/YHDC SCT-013-030.pdf

Export Node-Red:

  • Pasta Node-Red – contém a extração do s fluxos da aplicação Node-RED

Figuras utilizadas no projeto:

Projetos Arduino:

    • Pasta Projetos Arduino IDE

Projeto Eagle

    • Pasta Eagle – contém o projeto da placa de circuito impresso.

Scripts MySQL (SQL):

    • Pasta db/Dados – Contém os scripts com dados para inserção nas tabelas;

    • Pasta db/Tabelas - Contém os scripts para criação das tabelas;

    • Pasta db/Vistas - Contém os scripts para criação das vistas.

    • Pasta db/Triggers - Contém os scripts para criação Triggers e eventos;

Catálogo: bitstream -> 10400.26 -> 12643
12643 -> Escola Superior de Tecnologia de Tomar Tiago Alexandre Martins Fernandes sistema integrado de segurança e gestão de energia (sisge)
10400.26 -> Fatores determinantes na mudança de auditor: o caso português
10400.26 -> Instituto Politécnico de Portalegre Escola Superior de Tecnologia e Gestão de Portalegre
10400.26 -> Instituto Superior de Gestão a tributação Específica das Sociedades Desportivas em Portugal: o caso particular do Futebol Profissional Fernanda Duarte Marques Projeto apresentado no Instituto Superior de Gestão, para obtenção do Grau de Mestre em Gestão
10400.26 -> Instituto Politécnico de Coimbra Escola Superior Agrária de Coimbra
10400.26 -> BioEnergia Acrónimo: BioEnergia
10400.26 -> Introdução 1 Capítulo I prática de Ensino Supervisionada I e II
10400.26 -> Relatório final da prática de ensino supervisionada andreia Sofia Aguiar Silva
10400.26 -> Validade e Fiabilidade da escala de Mobilidade Funcional – Idosos e Muito Idosos (emf-imi)

Baixar 9.55 Mb.

Compartilhe com seus amigos:
1   ...   18   19   20   21   22   23   24   25   26




©bemvin.org 2020
enviar mensagem

    Página principal
Prefeitura municipal
santa catarina
Universidade federal
prefeitura municipal
pregão presencial
universidade federal
outras providências
processo seletivo
catarina prefeitura
minas gerais
secretaria municipal
CÂmara municipal
ensino fundamental
ensino médio
concurso público
catarina município
Dispõe sobre
reunião ordinária
Serviço público
câmara municipal
público federal
Processo seletivo
processo licitatório
educaçÃo universidade
seletivo simplificado
Secretaria municipal
sessão ordinária
ensino superior
Relatório técnico
Universidade estadual
Conselho municipal
técnico científico
direitos humanos
científico período
espírito santo
pregão eletrônico
Curriculum vitae
Sequência didática
Quarta feira
prefeito municipal
distrito federal
conselho municipal
língua portuguesa
nossa senhora
educaçÃo secretaria
segunda feira
Pregão presencial
recursos humanos
Terça feira
educaçÃO ciência
agricultura familiar