O Octave é uma linguagem de programação de alto nível e um ambiente de desenvolvimento numérico, projetado para realizar cálculos numéricos e análises científicas. Ele fornece uma interface fácil de usar para a manipulação de matrizes, implementação de algoritmos, criação de gráficos e solução de problemas numéricos em geral.
Características do Octave:
Linguagem de programação: O Octave possui uma linguagem de programação própria, que permite aos usuários escreverem scripts e programas para realizar operações numéricas, implementar algoritmos e automatizar tarefas.
Matrizes e cálculos numéricos: O Octave é especialmente adequado para trabalhar com matrizes e realizar cálculos numéricos. Ele suporta operações matriciais, álgebra linear, manipulação de vetores e escalares, além de funções matemáticas avançadas.
Funções embutidas: O Octave possui uma ampla gama de funções embutidas para realizar cálculos matemáticos, estatísticos, trigonométricos, lógicos e outros tipos de operações numéricas.
Gráficos e visualização: O Octave oferece recursos para criar gráficos e visualizar dados. Ele suporta plotagem de gráficos 2D e 3D, diagramas de dispersão, histogramas e outras formas de visualização de dados.
Extensibilidade: O Octave permite estender sua funcionalidade por meio de pacotes e bibliotecas. Existem diversos pacotes disponíveis que fornecem recursos adicionais para áreas específicas, como processamento de sinais, controle, otimização, entre outros.
Código aberto: O Octave é um software de código aberto, o que significa que o seu código-fonte está disponível gratuitamente para acesso, modificação e distribuição. Isso permite que a comunidade contribua para o seu desenvolvimento e oferece flexibilidade aos usuários.
Em resumo, o Octave é uma ferramenta poderosa para realizar cálculos numéricos, análises científicas e implementação de algoritmos, sendo uma alternativa popular ao MATLAB.
Ele é amplamente utilizado por pesquisadores, engenheiros, cientistas e estudantes em diversas áreas acadêmicas e industriais.
Baixando o Octave
O Octave pode ser baixado através do seguinte site:
Com varias correções implementadas nesta versão, estamos modificando drasticamente a ferramenta MQuery. Para isso desativamos a funcionalidade que será totalmente reescrita.
A ultima versão funcional do MQuery esta na versão 2.24
O plugin possui diversos componentes, e entenda por componentes as partes que formam este, como funções e serviços.
O código abaixo, declara os componentes do plugin.
// Cria as tabelas quando o plugin for ativado
register_activation_hook( __FILE__, 'criar_tabelas' );
function criar_tabelas() {
global $wpdb;
// Cria a tabela geiser_leitores
$table_name1 = $wpdb->prefix . 'geiser_leitores';
$charset_collate = $wpdb->get_charset_collate();
$sql1 = "CREATE TABLE $table_name1 (
id mediumint(9) NOT NULL AUTO_INCREMENT,
nome varchar(50) NOT NULL,
token varchar(50) NOT NULL,
status TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (id)
) $charset_collate;";
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql1 );
// Cria a tabela geiser_logs
$table_name2 = $wpdb->prefix . 'geiser_logs';
$sql2 = "CREATE TABLE $table_name2 (
id mediumint(9) NOT NULL AUTO_INCREMENT,
token varchar(50) NOT NULL,
lastdt datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
usvh float NOT NULL,
temp float NOT NULL,
hum float NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
dbDelta( $sql2 );
}
...
// Adiciona o menu no painel de administração
add_action( 'admin_menu', 'geiser_admin_menu' );
function geiser_admin_menu() {
add_menu_page( 'Geiser Admin', 'Geiser Admin', 'manage_options', 'geiser-admin', 'geiser_admin_page', 'geiser_admin_page' );
add_submenu_page( 'geiser-admin', 'Dispositivos', 'Dispositivos', 'manage_options', 'geiser_dispositivos_page', 'geiser_dispositivos_page' );
add_submenu_page( 'geiser-admin', 'Logs', 'Logs', 'manage_options', 'geiser_logs_page', 'geiser_logs_page' );
add_submenu_page( 'geiser-admin', 'Análise', 'Análise', 'manage_options', 'geiser_analise_page', 'geiser_analise_page' );
// Adiciona Chart.js ao painel de administração
add_action('admin_enqueue_scripts', function () {
wp_enqueue_script('chartjs', 'https://cdn.jsdelivr.net/npm/chart.js');
});
}
add_action('rest_api_init', 'registrar_rota_personalizada');
A função register_activation_hook chama uma função no momento da sua ativação. Que é feito apenas uma vez.
A função criar_tabelas , cria as tabelas no banco de dados MYSQL, que é o banco de dados do wordpress.
A função add_action permite registrar um menu no wordpress, conforme apresentamos abaixo, e a função add_menu_page, registra os itens do menu.
Cada chamada do add_menu_page, chama uma função que é referenciada, e ao clicar no menu é chamado.
add_submenu_page( 'geiser-admin', 'Análise', 'Análise', 'manage_options', 'geiser_analise_page', 'geiser_analise_page' );
function geiser_analise_page() {
global $wpdb;
$table_name = $wpdb->prefix . 'geiser_logs';
// Obtenha os dados do banco de dados
$logs = $wpdb->get_results("SELECT token, TIMESTAMP(lastdt) as datetime, AVG(usvh) as avg_usvh, AVG(temp) as avg_temp, AVG(hum) as avg_hum FROM $table_name GROUP BY token, UNIX_TIMESTAMP(lastdt) DIV (15 * 60) ORDER BY token, datetime", ARRAY_A);
// Iniciar a saída do HTML
ob_start();
?>
<div class="wrap">
<h1>Geiser Análise</h1>
<div>
<canvas id="geiserChart"></canvas>
</div>
<script>
document.addEventListener('DOMContentLoaded', function () {
// Organiza os dados para o gráfico
var logs = <?php echo json_encode($logs); ?>;
var tokens = [];
var data = {
usvh: {},
temp: {},
hum: {}
};
logs.forEach(function (log) {
if (!data.usvh.hasOwnProperty(log.token)) {
data.usvh[log.token] = [];
data.temp[log.token] = [];
data.hum[log.token] = [];
}
data.usvh[log.token].push({x: log.datetime, y: parseFloat(log.avg_usvh)});
data.temp[log.token].push({x: log.datetime, y: parseFloat(log.avg_temp)});
data.hum[log.token].push({x: log.datetime, y: parseFloat(log.avg_hum)});
});
Object.keys(data.usvh).forEach(function (key) {
tokens.push({
label: 'Token ' + key + ' - usvh',
data: data.usvh[key],
fill: false,
borderColor: 'rgb(75, 192, 192)',
tension: 0.1
});
tokens.push({
label: 'Token ' + key + ' - temp',
data: data.temp[key],
fill: false,
borderColor: 'rgb(255, 99, 132)',
tension: 0.1
});
tokens.push({
label: 'Token ' + key + ' - hum',
data: data.hum[key],
fill: false,
borderColor: 'rgb(255, 205, 86)',
tension: 0.1
});
});
// Cria o gráfico
var ctx = document.getElementById('geiserChart').getContext('2d');
new Chart(ctx, {
type: 'line',
data: {
datasets: tokens
},
options: {
scales: {
x: {
type: 'time',
time: {
unit: 'minute',
displayFormats: {
minute: 'HH:mm'
}
}
}
}
}
});
});
</script>
</div>
<?php
// Encerrar a saída do HTML
echo ob_get_clean();
}
Criando um Web Service
O Web Service é um serviço web que permite através dos verbos HTTP, armazenar , visualizar e gerenciar dados.
Incluiremos um web service, através do comando .
// Adiciona a rota do web service para chamar o arquivo ./ws/registra_log.php
add_action( 'rest_api_init', 'geiser_register_api_routes' );
...
function geiser_register_api_routes() {
//...
register_rest_route( 'geiser/v1', '/registra_log', array(
'methods' => 'GET',
'callback' => 'geiser_registra_log_endpoint',
'permission_callback' => function () {
return current_user_can( 'manage_options' );
}
) );
}
// Endpoint do web service para inserir dados na tabela geiser_logs
function geiser_logs_endpoint( WP_REST_Request $request ) {
global $wpdb;
$json = $request->get_json_params();
// Insere os dados na tabela geiser_logs
$table_name = $wpdb->prefix . 'geiser_logs';
$data = array(
'id_leitor' => $json['id_leitor'],
'nome' => $json['nome'],
'ip' => $json['ip'],
'lastdt' => $json['lastdt'],
'status' => $json['status']
);
$wpdb->insert( $table_name, $data );
return 'Dados inseridos na tabela com sucesso.';
}
Perceba que incluiremos o add_action, depois referenciamos a função geiser_register_api_routes, que registra o rest, através da chamada register_rest_route.
Que ao ser chamado, chama a função geiser_logs_endpoint.
Como chamar no arduino
O Arduino armazena o envia os dados para o web service, através do fonte: GIESER\hardware\MSTemp02
Do mesmo projeto, acima mencionado, para economizarmos tempo, irei apresentar o fragmento do código:
Utilizaremos um ethernet shield, para mostrar os dados, e para isso, incluiremos a biblioteca Ethernet.h, conforme apresentado no site.
Iremos definir a porta PORT e o endereço do URL, do wordpress, conforme apresentado no url.
E por fim chamaremos no loop a função WriteSite, que passa os dados que se deseja para o site, conforme apresentado.
#include <Ethernet.h>
#define PORT 80
#define url "http://177.26.228.0/wp-json/Geiser/v1/registro.php"
// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// Set the static IP address to use if the DHCP fails to assign
IPAddress ip(192, 168, 0, 177);
IPAddress myDns(192, 168, 0, 1);
// Initialize the Ethernet client library
// with the IP address and port of the URL
// that you want to connect to (port 80 is default for HTTP):
EthernetClient client;
void WriteSite()
{
// give the Ethernet shield a second to initialize:
delay(1000);
Serial.print("connecting to ");
Serial.print(url);
Serial.println("...");
// if you get a connection, report back via serial:
if (client.connect(url, PORT)) {
Serial.print("connected to ");
Serial.println(client.remoteIP());
// Make a HTTP POST request:
client.println("POST /your_endpoint_here HTTP/1.1");
client.print("Host: ");
client.println(url);
client.println("Content-Type: application/json");
client.print("usvh: ");
client.println(usvh);
client.print("temp: ");
client.println(temperature);
client.print("hum: ");
client.println(humidity);
client.println("Connection: close");
// Calculate the content length
String jsonBody = String("{\"usvh\":") + String(usvh) + String(",\"temp\":") + String(temperature) + String(",\"hum\":") + String(humidity) + String("}");
client.print("Content-Length: ");
client.println(jsonBody.length());
client.println(); // Required empty line before the body
client.print(jsonBody);
client.println();
} else {
// if you didn't get a connection to the server:
Serial.println("connection failed");
}
beginMicros = micros();
}
o client é uma variavel de objeto, que armazena a conexão realizada com o servidor, nele chamaremos um cabeçalho do protocolo http, incluindo no verbo http POST as informações que desejamos incluir.
Desta forma simples conseguimos enviar dados para um servidor web.
Resposta B 2ª pois em um circuito em serie a corrente é a mesma.
C)
V1 = 20 * 2 = 40V
V2 = 30* 2 = 60V
V3= 50*2 = 100V
Questão 5
Calcular a intensidade de campo induto
Nro espiras 200
Corrente 1ª
Vamos considerar que o circuito 1 tenha um comprimento médio de 20 cm (0,2 m) e o circuito 2 tenha um comprimento médio de 10 cm (0,1 m).
Ambos os circuitos têm 200 espiras e são percorridos por uma corrente de 1 A.
Para um solenoide retangular, a intensidade do campo indutor pode ser aproximada usando a fórmula de Ampère para um solenoide ideal:
B = μ₀ * n * I
onde B é a intensidade do campo indutor, μ₀ é a permeabilidade magnética do vácuo (aproximadamente 4π × 10⁻⁷ Tm/A), n é o número de espiras por unidade de comprimento e I é a corrente que passa pelas espiras.
Primeiro, vamos calcular o número de espiras por unidade de comprimento para cada circuito:
Circuito 1:
n1 = N / L1 n1 = 200 espiras / 0,2 m n1 = 1000 espiras/m
Circuito 2:
n2 = N / L2 n2 = 200 espiras / 0,1 m n2 = 2000 espiras/m
Agora podemos calcular a intensidade do campo indutor para cada circuito usando a fórmula de Ampère:
Circuito 1:
B1 = μ₀ * n1 * I B1 = (4π × 10⁻⁷ Tm/A) * (1000 espiras/m) * (1 A) B1 ≈ 1,26 T
Circuito 2:
B2 = μ₀ * n2 * I B2 = (4π × 10⁻⁷ Tm/A) * (2000 espiras/m) * (1 A) B2 ≈ 2,52 T
Portanto, a intensidade do campo indutor para o circuito 1 é aproximadamente 1,26 T e para o circuito 2 é aproximadamente 2,52 T.
Este artigo esta sendo escrito, e algumas informações podem estar erradas.
No artigo anterior, vimos as características do MOSFET, onde iniciamos o estudo do projeto, analisando a questão do dimensionamento com relação a Potencia fornecida.
Um ponto importante que foi visto é que o componente apresenta uma variação grande de potencia em relação a temperatura.
Iremos precisar das seguintes informações neste artigo:
Thermal Characteristics Symbol Parameter Typical Unit
Nessa entendemos que para uma potencia de 10V a 75A, temos uma resistência de 3.2mOhms. o que iremos calcular é a corrente e projetar a potencia baseada nessa resistência.
Onde a Vds = 12V;
Para calcular a potência de aquecimento real, precisamos primeiro encontrar a corrente de dreno (ID) e as perdas de condução no MOSFET. Vamos usar a equação de potência:
P = V x I
Onde P é a potência total (120 W), V é a tensão (12 V) e I é a corrente de dreno (ID). Rearranjando a equação para encontrar ID:
ID = P / V = 120 W / 12 V = 10 A
Agora que conhecemos a corrente de dreno (ID), podemos calcular as perdas de condução usando a fórmula:
P_condução = ID^2 x RDS(on)
Utilizando o valor de RDS(on) de 3.2 mΩ:
P_condução = (10 A)^2 x 3.2 mΩ = 100 A² x 0.0032 Ω ≈ 0.32 W
Lembrando que a Potencia de condução é a potencia transformada em calor, durante o processo da passagem de corrente.
Porem existe uma outra perda que é gerada pela comutação, porem como usamos esse equipamento sem comutação ou com comutação extremamente baixa. O valor da perda passa ser desprezível.
Desta forma consideraremos o PD como Condução.
PD = 0.32 W
Temperatura máxima presumida
Agora iremos aplicar as contas tentando achar a temperatura final durante a carga.
Tj = Ta + (Pd x Rth_total)
Onde:
Tj é a temperatura da junção do MOSFET em graus Celsius (°C) (queremos saber)
Ta é a temperatura ambiente em graus Celsius (°C) (40°C)
Pd é a potência dissipada pelo MOSFET em watts (W) (0.32 W)
Rth_total é a resistência térmica total em graus Celsius por watt (°C/W), que inclui tanto a resistência térmica do dissipador de calor (Rth_dissipador) quanto a resistência térmica da junção para o dissipador (Rth_jc) e outros elementos térmicos, como a resistência térmica de interface (Rth_interface) entre o MOSFET e o dissipador, se aplicável.
Recapitulando os valores do Rth_total calculados no seu texto:
Lembrando que a Rth_interface é zero, pois não usamos pasta térmica.
Agora, usando a fórmula da temperatura da junção:
Tj = Ta + (Pd x Rθja ) Tj = 40 + (0.32 x 1,846) -> 40 + 0,59072 -> 40,59072 °C
A temperatura final da junção do MOSFET é de aproximadamente 40,6°C. Isso é bem menor do que os resultados anteriores e está dentro dos limites seguros de operação do MOSFET.
Importânte
Como mencionado anteriormente, Rθjc (Resistência Térmica da Junção ao Case) é de 0,68°C/W. No texto original, você forneceu o valor de Rth_total como a soma de Rth_jc, Rth_interface e Rth_dissipador. Nesse caso, Rth_jc deve ser substituído por Rθjc: Rth_total = Rθjc + Rth_interface + Rth_dissipador Em seguida, você pode usar o valor de Rth_total para calcular a temperatura da junção do MOSFET (Tj) usando a fórmula: Tj = Ta + (Pd x Rth_total) O valor de Rθja (Resistência Térmica da Junção ao Ambiente) de 62°C/W é útil quando você deseja calcular a temperatura da junção do MOSFET sem a ajuda de sistemas de refrigeração adicionais, como dissipadores de calor. Nesse caso, a fórmula seria: Tj = Ta + (Pd x Rθja)
Tj = Ta + (Pd x Rθja ) Tj = 40 + (0.32 x 1,846) -> 40 + 115,375 -> 155,37 °C
O Calculo de transferência de calor, é uma disciplina de termodinâmica.
Estou fugindo da minha área de ação, porem é de minha opnião que pelo menos uma base, para operar e saber esses calculos é fundamental para o perfeito planejamento de placas de circuito eletrônicos.
Conclusão:
Próximo passo:
Experimentação
Iremos simular o modelo, tentando chegar no padrão de temperatura calculado.
Houve dúvidas quanto ao modelo estar ou não correto, pois inicialmente utilizamos a potencia total (120W), posteriormente, identificamos que a potencia que era convertida em energia térmica era uma fração (ohms) da potencia total.
Porem algumas duvidas ainda persistem, e a experimentação provará a exatidão do calculo.
Id (Continuous Drain Current) Temperatura 25C 210A, Tc 100 130A
PD (Power Dissipation) 220W (25C) / 110W (100C)
Inicio da analise
Baseado nessa especificação podemos presumir que a 100C a potencia máxima aplicada seria de 110W.
Sendo assim, supondo trabalharmos com tensão de 5V.
Podemos supor que a corrente fornecida será:
P = V. I
ou seja a 5V:
110W = 5 i -> i = 110 /5 -> 22A de corrente máxima entre a fonte e o dreno.
Ou a 12V:
110w = 12* i -> i = 110 /12 -> 9,11A (máximo)
Este produto é destinado a construção de impressora 3D, mantendo e controlando a corrente da cama aquecida. Observando e pesquisando um exemplo de cama aquecida. Podemos buscar pela seguinte referencia.
Desta forma podemos verificar que a potência requerida esta no limite da fornecida, presumindo que o produto irá funcionar como esperado, porem esta no limite do esforço.
Sendo recomendado uma ventilação auxiliar para o CI, pois este fornece potência maiores quando frio, e um sistema de ventilação iria auxiliar na dissipação térmica ainda mais em países tropicais cuja temperatura máxima pode chegar a 40 graus.