Códigos
Códigos
Código produzidos e utilizados no sistema de monitoramento, na linguagem C/C++.
//---------------------------------------------------------------//
// DESENVOLVIDO POR AMANDA LISBOA PEREIRA
// EQUIPE: BERNARDO SANTIAGO DE SOUZA
// UNIDADE CURRICULAR: PROJETO INTEGRADOR 2
// TÍTULO: IMPLEMENTAÇÃO DE SISTEMA DE GERAÇÃO FOTOVOLTAICA OFF GRID
// DE PEQUENO PORTE COM SISTEMA DE MONITORAMENTO REMOTO //
// 2020/2021
//----------------------------------------------------------------//
// VERSÃO ARDUINO IDE: 1.8.14
// VERSÃO PACOTE ESP32 ESPRESSIF SYSTEM: 1.0.2
//----------------------------------------------------------------//
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include "Arduino.h"
#include <driver/adc.h>
#include <esp_adc_cal.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <esp_err.h>
#include <esp_log.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define DS18B20PIN 16
OneWire oneWire(DS18B20PIN);
DallasTemperature sensor(&oneWire);
WiFiClientSecure client;//Cria um cliente seguro (para ter acesso ao HTTPS)
String textFix = "GET /forms/d/e/1FAIpQLScGXH33SQGhRwLg1MokB8w 5nKOpqANn8x9RbOg9p0zHJTIeQ/formResponse?ifq&entry.1234423385="; esp_adc_cal_characteristics_t adc_cal;//Estrutura que contem as informacoes para calibracao do conversor analógico-digital
void transmitir_info(float a,float b, float c,float d,float e); //Função que une as informações para "responder" ao formulário float Vrms_sensor_VAC();// Função que calcula a Tensão AC RMS float Irms_sensor_IAC(); // Função que calcula a Corrente AC RMS float cal_vDC(); // Função que calcula a Tensão DC
float Idc_CJMCU_758(); // Função que calcula a Corrente DC float temp_dallas(); // Função que calcula Temperatura //-------------------------------------------------------------------- -----------------//
void setup()
{
Serial.begin(115200);//Inicia a comunicacao serial WiFi.mode(WIFI_STA);//Habilita o modo estaçao
WiFi.begin("sick", "159357NET");//Conecta na rede
adc1_config_width(ADC_WIDTH_BIT_12);//Configura a resolucao
adc1_config_channel_atten(ADC1_CHANNEL_0,
ADC_ATTEN_DB_11);//Configura entrada analógica para 3v3; adc1_config_channel_atten(ADC1_CHANNEL_3, ADC_ATTEN_DB_11);// adc1_config_channel_atten(ADC1_CHANNEL_4, ADC_ATTEN_DB_11);// adc1_config_channel_atten(ADC1_CHANNEL_5, ADC_ATTEN_DB_11);// adc1_config_channel_atten(ADC1_CHANNEL_6, ADC_ATTEN_DB_11);//
esp_adc_cal_value_t adc_type =
esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11,
ADC_WIDTH_BIT_12, 1100, &adc_cal);//Inicializa a estrutura de calibracao
delay(2000);//Espera um tempo para se conectar no WiFi sensor.begin();// Inicializa sensor Temperatura
}
//-------------------------------------------------------------------- -----------------//
void loop() //Função Principal
{
transmitir_info(cal_vDC(),Idc_CJMCU_758(),Vrms_sensor_VAC(),Ir ms_sensor_IAC(),temp_dallas());
delay(3000);
}
//-------------------------------------------------------------------- -----------------//
void transmitir_info(float a,float b, float c,float d,float e){ if (client.connect("docs.google.com", 443) == 1)//Tenta se conectar ao servidor do Google docs na porta 443 (HTTPS) {
String toSend = textFix;//Atribuimos a String auxiliar na nova String que sera enviada
toSend += a;//Adiciona Valor
toSend +="&entry.279279281=";
toSend += b;//Adiciona Valor
toSend +="&entry.1678410852=";
toSend += c;//Adiciona Valor
toSend +="&entry.1149910208=";
toSend += d;//Adiciona Valor
toSend +="&entry.1094242902=";
toSend += e;//Adiciona Valor
toSend += "&submit=Submit HTTP/1.1";//Completamos o metodo GET para formulario.
client.println(toSend);//Enviamos o GET ao servidor- client.println("Host: docs.google.com");//-
client.println();//-
client.stop();//Encerramos a conexao com o servidor Serial.println("Dados enviados.");//Mostra no monitor que foi enviado
}
else
{
Serial.println("Erro ao se conectar");//Se nao for possivel conectar no servidor, irá avisar no monitor.
}
}
//-------------------------------------------------------------------- -----------------//
float Vrms_sensor_VAC() //FUNÇÃO QUE RETORNA VALOR DE TENSÃO RMS {
uint32_t n_amostras = 2000;
uint32_t f_calibrar = 779;
float result = 0;
float mV = 0;
for (int i = 0; i < n_amostras; i++)
{
uint32_t v_adc = adc1_get_raw(ADC1_CHANNEL_4);
mV = ((esp_adc_cal_raw_to_voltage(v_adc, &adc_cal))/1000.0)- 1.31;
result += mV*mV; //CALCULA O QUADRADO DE CADA UMA DAS N AMOSTRAS
ets_delay_us(30);
}
result = sqrt(result / n_amostras)-0.000 ; //CALCULO DE VRMS , RAIZ QUADRADA DA MÉDIA DOS QUADRADOS DE N AMOSTRAS
return ((result*f_calibrar));
}
//-------------------------------------------------------------------- -----------------//
float Irms_sensor_IAC()//FUNÇÃO QUE RETORNA IRMS, IDENTICA A VRMS, PODE SER ESCRITA APENAS UMA FUNÇÃO POSTERIORMENTE, QUE RECEBE O FATOR DE CONV.
{
uint32_t n_amostras = 10000;
uint32_t f_calibrar = 20;
float result = 0;
float mV = 0;
for (int i = 0; i < n_amostras; i++)
{
uint32_t v_adc = adc1_get_raw(ADC1_CHANNEL_0);
mV = ((esp_adc_cal_raw_to_voltage(v_adc, &adc_cal))/1000.0)- 1.68;
result += mV*mV;
ets_delay_us(30);
}
result = sqrt(result / n_amostras)-0.000 ;
return ((result*f_calibrar));
}
//-------------------------------------------------------------------- -----------------//
float cal_vDC() {// FUNÇÃO QUE RETORNA O VALOR DE TENSÃO CONTÍNUA RECEBIDA
float x;
uint32_t v_adc = adc1_get_raw(ADC1_CHANNEL_3);
x = (esp_adc_cal_raw_to_voltage(v_adc, &adc_cal));
if(x<=143) {return 0.0;} // O VALOR DE 143 MILIVOLTS É O ERRO QUE O ESP32 POSSUI, POR ISSO NO CASO DE LEITURA COM ESSE VALOR, RETORNA ZERO else{ // EQUAÇÃO OBTIDA ATRAVÉS DOS PROCEDIMENTOS DE CALIBRAÇÃO return +1.9369
+ 0.0049 * x
+ 2.02e-05 * x * x
+ -1.62e-08* x * x * x
+ 4.90e-12 * x * x * x * x;
}
}
//-------------------------------------------------------------------- -----------------//
float Idc_CJMCU_758(){ //FUNÇÃO QUE RETORNA VALOR DE CORRENTE
uint32_t fator = 25; // SEGUNDO O DATASHEET X_VOLTS/0,04 = VALOR_CORRENTE => 1/0,04 = 25
uint32_t v_adc = 0;
for (int i = 0; i < 100; i++)
{
v_adc += adc1_get_raw(ADC1_CHANNEL_5);//Obtem o valor RAW do ADC
ets_delay_us(30);
}
v_adc /= 100;
float x = (esp_adc_cal_raw_to_voltage(v_adc, &adc_cal)/1000.0- 1.66); // SUBTRAI-SE 1,66 QUE É O NÍVEL MÉDIO DA SAÍDA DO SENSOR, QUANDO NÃO HÁ CORRENTE CIRCULANDO
return x*fator;
}
//-------------------------------------------------------------------- -------------------------------------------------------------//
float temp_dallas(){// FUNÇÃO QUE RETORNA TEMPERATURA
sensor.requestTemperatures();
float tempinC = sensor.getTempCByIndex(0);
return (tempinC);
}