ajustes de parametros dos sensores
This commit is contained in:
parent
4f13738426
commit
c963625920
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -240,6 +240,12 @@
|
|||
<Compile Include="Forms\Sensoriamento\frmSenCamera.Designer.cs">
|
||||
<DependentUpon>frmSenCamera.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Forms\Sensoriamento\frmSenConfig.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Forms\Sensoriamento\frmSenConfig.Designer.cs">
|
||||
<DependentUpon>frmSenConfig.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Models\CameraModel.cs" />
|
||||
<Compile Include="Models\GPSModel.cs" />
|
||||
<Compile Include="Models\MapasModel.cs" />
|
||||
|
|
@ -316,6 +322,9 @@
|
|||
<EmbeddedResource Include="Forms\Sensoriamento\frmSenCamera.resx">
|
||||
<DependentUpon>frmSenCamera.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Forms\Sensoriamento\frmSenConfig.resx">
|
||||
<DependentUpon>frmSenConfig.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Properties\Resources.resx">
|
||||
<Generator>ResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,114 @@
|
|||
namespace AgroBase.Forms.Sensoriamento
|
||||
{
|
||||
partial class frmSenConfig
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.gridsTEN = new System.Windows.Forms.DataGridView();
|
||||
this.gridsCOR = new System.Windows.Forms.DataGridView();
|
||||
this.btnSalvar = new System.Windows.Forms.Button();
|
||||
this.lblTensao = new System.Windows.Forms.Label();
|
||||
this.lblCorrente = new System.Windows.Forms.Label();
|
||||
((System.ComponentModel.ISupportInitialize)(this.gridsTEN)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.gridsCOR)).BeginInit();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// gridsTEN
|
||||
//
|
||||
this.gridsTEN.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
|
||||
this.gridsTEN.Location = new System.Drawing.Point(12, 25);
|
||||
this.gridsTEN.Name = "gridsTEN";
|
||||
this.gridsTEN.Size = new System.Drawing.Size(270, 124);
|
||||
this.gridsTEN.TabIndex = 1;
|
||||
//
|
||||
// gridsCOR
|
||||
//
|
||||
this.gridsCOR.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
|
||||
this.gridsCOR.Location = new System.Drawing.Point(288, 25);
|
||||
this.gridsCOR.Name = "gridsCOR";
|
||||
this.gridsCOR.Size = new System.Drawing.Size(270, 124);
|
||||
this.gridsCOR.TabIndex = 1;
|
||||
//
|
||||
// btnSalvar
|
||||
//
|
||||
this.btnSalvar.Location = new System.Drawing.Point(483, 155);
|
||||
this.btnSalvar.Name = "btnSalvar";
|
||||
this.btnSalvar.Size = new System.Drawing.Size(75, 23);
|
||||
this.btnSalvar.TabIndex = 3;
|
||||
this.btnSalvar.Text = "Salvar";
|
||||
this.btnSalvar.UseVisualStyleBackColor = true;
|
||||
this.btnSalvar.Click += new System.EventHandler(this.btnSalvar_Click);
|
||||
//
|
||||
// lblTensao
|
||||
//
|
||||
this.lblTensao.AutoSize = true;
|
||||
this.lblTensao.Location = new System.Drawing.Point(12, 9);
|
||||
this.lblTensao.Name = "lblTensao";
|
||||
this.lblTensao.Size = new System.Drawing.Size(43, 13);
|
||||
this.lblTensao.TabIndex = 4;
|
||||
this.lblTensao.Text = "Tensão";
|
||||
//
|
||||
// lblCorrente
|
||||
//
|
||||
this.lblCorrente.AutoSize = true;
|
||||
this.lblCorrente.Location = new System.Drawing.Point(285, 9);
|
||||
this.lblCorrente.Name = "lblCorrente";
|
||||
this.lblCorrente.Size = new System.Drawing.Size(47, 13);
|
||||
this.lblCorrente.TabIndex = 5;
|
||||
this.lblCorrente.Text = "Corrente";
|
||||
//
|
||||
// frmSenConfig
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(571, 188);
|
||||
this.Controls.Add(this.lblCorrente);
|
||||
this.Controls.Add(this.lblTensao);
|
||||
this.Controls.Add(this.gridsCOR);
|
||||
this.Controls.Add(this.gridsTEN);
|
||||
this.Controls.Add(this.btnSalvar);
|
||||
this.MaximizeBox = false;
|
||||
this.Name = "frmSenConfig";
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
|
||||
this.Text = "Sensoriamento - Parametrização";
|
||||
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.frmSenConfig_FormClosing);
|
||||
this.Load += new System.EventHandler(this.frmSenConfig_Load);
|
||||
((System.ComponentModel.ISupportInitialize)(this.gridsTEN)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.gridsCOR)).EndInit();
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
private System.Windows.Forms.DataGridView gridsTEN;
|
||||
private System.Windows.Forms.DataGridView gridsCOR;
|
||||
private System.Windows.Forms.Button btnSalvar;
|
||||
private System.Windows.Forms.Label lblTensao;
|
||||
private System.Windows.Forms.Label lblCorrente;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,88 @@
|
|||
using AgroBase.Comum;
|
||||
using AgroBase.Models;
|
||||
using AgroBase.Models.Modules;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using static AgroBase.Models.Enuns;
|
||||
|
||||
namespace AgroBase.Forms.Sensoriamento
|
||||
{
|
||||
public partial class frmSenConfig : Form
|
||||
{
|
||||
DispositivosService<SensoriamentoModel> Disp = (DispositivosService<SensoriamentoModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Sen);
|
||||
|
||||
public frmSenConfig()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private void frmSenConfig_Load(object sender, EventArgs e)
|
||||
{
|
||||
if (Disp == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (var Sensor in Disp.Dados.Sensores)
|
||||
{
|
||||
string gridName = "grid" + Enum.GetName(typeof(S_Code), Sensor.Componente);
|
||||
DataGridView grid = this.Controls.OfType<DataGridView>().ToList().FirstOrDefault(x => x.Name == gridName);
|
||||
if (grid != null)
|
||||
{
|
||||
grid.Rows.Clear();
|
||||
grid.Columns.Clear();
|
||||
grid.Columns.Add("clParametro", "Parâmetro");
|
||||
grid.Columns.Add("clValor", "Valor");
|
||||
foreach (var Parametro in Sensor.Parametros)
|
||||
{
|
||||
grid.Rows.Add(Parametro[0], Parametro[1]);
|
||||
}
|
||||
//grid.Rows.RemoveAt(grid.Rows.Count - 1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void frmSenConfig_FormClosing(object sender, FormClosingEventArgs e)
|
||||
{
|
||||
e.Cancel = true;
|
||||
this.Visible = false;
|
||||
}
|
||||
|
||||
private void btnSalvar_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (Disp == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (var Sensor in Disp.Dados.Sensores)
|
||||
{
|
||||
string gridName = "grid" + Enum.GetName(typeof(S_Code), Sensor.Componente);
|
||||
DataGridView grid = this.Controls.OfType<DataGridView>().ToList().FirstOrDefault(x => x.Name == gridName);
|
||||
if (grid != null && grid.Rows.Count > 1)
|
||||
{
|
||||
Sensor.Parametros = new List<string[]>();
|
||||
foreach (DataGridViewRow Row in grid.Rows)
|
||||
{
|
||||
if (Row.Cells[0].Value != null)
|
||||
{
|
||||
Sensor.Parametros.Add(new string[] { Row.Cells[0].Value.ToString(), Row.Cells[1].Value.ToString() });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,120 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
|
|
@ -124,6 +124,8 @@ namespace AgroBase.Forms
|
|||
this.btnEFReferenciar = new System.Windows.Forms.Button();
|
||||
this.lblM1 = new System.Windows.Forms.Label();
|
||||
this.picEF = new System.Windows.Forms.PictureBox();
|
||||
this.lblCorrente = new System.Windows.Forms.Label();
|
||||
this.lblTensao = new System.Windows.Forms.Label();
|
||||
this.pnlFundo.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.chartET)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.chartDT)).BeginInit();
|
||||
|
|
@ -140,6 +142,8 @@ namespace AgroBase.Forms
|
|||
//
|
||||
this.pnlFundo.AutoScroll = true;
|
||||
this.pnlFundo.BackColor = System.Drawing.Color.White;
|
||||
this.pnlFundo.Controls.Add(this.lblCorrente);
|
||||
this.pnlFundo.Controls.Add(this.lblTensao);
|
||||
this.pnlFundo.Controls.Add(this.lblDistanciaParcial);
|
||||
this.pnlFundo.Controls.Add(this.lblDistanciaTotal);
|
||||
this.pnlFundo.Controls.Add(this.lblTempoEmMovimento);
|
||||
|
|
@ -223,7 +227,7 @@ namespace AgroBase.Forms
|
|||
this.pnlFundo.Controls.Add(this.picEF);
|
||||
this.pnlFundo.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.pnlFundo.Location = new System.Drawing.Point(0, 0);
|
||||
this.pnlFundo.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
|
||||
this.pnlFundo.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.pnlFundo.Name = "pnlFundo";
|
||||
this.pnlFundo.Size = new System.Drawing.Size(1484, 749);
|
||||
this.pnlFundo.TabIndex = 0;
|
||||
|
|
@ -272,7 +276,7 @@ namespace AgroBase.Forms
|
|||
//
|
||||
this.chbDTLivre.AutoSize = true;
|
||||
this.chbDTLivre.Location = new System.Drawing.Point(784, 725);
|
||||
this.chbDTLivre.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
|
||||
this.chbDTLivre.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.chbDTLivre.Name = "chbDTLivre";
|
||||
this.chbDTLivre.Size = new System.Drawing.Size(49, 17);
|
||||
this.chbDTLivre.TabIndex = 166;
|
||||
|
|
@ -283,7 +287,7 @@ namespace AgroBase.Forms
|
|||
//
|
||||
this.chbDTControlar.AutoSize = true;
|
||||
this.chbDTControlar.Location = new System.Drawing.Point(764, 703);
|
||||
this.chbDTControlar.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
|
||||
this.chbDTControlar.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.chbDTControlar.Name = "chbDTControlar";
|
||||
this.chbDTControlar.Size = new System.Drawing.Size(68, 17);
|
||||
this.chbDTControlar.TabIndex = 165;
|
||||
|
|
@ -294,7 +298,7 @@ namespace AgroBase.Forms
|
|||
//
|
||||
this.chbETLivre.AutoSize = true;
|
||||
this.chbETLivre.Location = new System.Drawing.Point(639, 725);
|
||||
this.chbETLivre.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
|
||||
this.chbETLivre.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.chbETLivre.Name = "chbETLivre";
|
||||
this.chbETLivre.Size = new System.Drawing.Size(49, 17);
|
||||
this.chbETLivre.TabIndex = 164;
|
||||
|
|
@ -305,7 +309,7 @@ namespace AgroBase.Forms
|
|||
//
|
||||
this.chbETControlar.AutoSize = true;
|
||||
this.chbETControlar.Location = new System.Drawing.Point(639, 703);
|
||||
this.chbETControlar.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
|
||||
this.chbETControlar.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.chbETControlar.Name = "chbETControlar";
|
||||
this.chbETControlar.Size = new System.Drawing.Size(68, 17);
|
||||
this.chbETControlar.TabIndex = 163;
|
||||
|
|
@ -316,7 +320,7 @@ namespace AgroBase.Forms
|
|||
//
|
||||
this.chbDFLivre.AutoSize = true;
|
||||
this.chbDFLivre.Location = new System.Drawing.Point(784, 86);
|
||||
this.chbDFLivre.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
|
||||
this.chbDFLivre.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.chbDFLivre.Name = "chbDFLivre";
|
||||
this.chbDFLivre.Size = new System.Drawing.Size(49, 17);
|
||||
this.chbDFLivre.TabIndex = 162;
|
||||
|
|
@ -327,7 +331,7 @@ namespace AgroBase.Forms
|
|||
//
|
||||
this.chbDFControlar.AutoSize = true;
|
||||
this.chbDFControlar.Location = new System.Drawing.Point(764, 64);
|
||||
this.chbDFControlar.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
|
||||
this.chbDFControlar.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.chbDFControlar.Name = "chbDFControlar";
|
||||
this.chbDFControlar.Size = new System.Drawing.Size(68, 17);
|
||||
this.chbDFControlar.TabIndex = 161;
|
||||
|
|
@ -338,7 +342,7 @@ namespace AgroBase.Forms
|
|||
//
|
||||
this.chbEFLivre.AutoSize = true;
|
||||
this.chbEFLivre.Location = new System.Drawing.Point(639, 86);
|
||||
this.chbEFLivre.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
|
||||
this.chbEFLivre.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.chbEFLivre.Name = "chbEFLivre";
|
||||
this.chbEFLivre.Size = new System.Drawing.Size(49, 17);
|
||||
this.chbEFLivre.TabIndex = 160;
|
||||
|
|
@ -349,7 +353,7 @@ namespace AgroBase.Forms
|
|||
//
|
||||
this.chbEFControlar.AutoSize = true;
|
||||
this.chbEFControlar.Location = new System.Drawing.Point(639, 64);
|
||||
this.chbEFControlar.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
|
||||
this.chbEFControlar.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.chbEFControlar.Name = "chbEFControlar";
|
||||
this.chbEFControlar.Size = new System.Drawing.Size(68, 17);
|
||||
this.chbEFControlar.TabIndex = 159;
|
||||
|
|
@ -363,7 +367,7 @@ namespace AgroBase.Forms
|
|||
legend1.Name = "Legend1";
|
||||
this.chartET.Legends.Add(legend1);
|
||||
this.chartET.Location = new System.Drawing.Point(201, 410);
|
||||
this.chartET.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
|
||||
this.chartET.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.chartET.Name = "chartET";
|
||||
series1.ChartArea = "ChartArea1";
|
||||
series1.Legend = "Legend1";
|
||||
|
|
@ -380,7 +384,7 @@ namespace AgroBase.Forms
|
|||
legend2.Name = "Legend1";
|
||||
this.chartDT.Legends.Add(legend2);
|
||||
this.chartDT.Location = new System.Drawing.Point(834, 410);
|
||||
this.chartDT.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
|
||||
this.chartDT.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.chartDT.Name = "chartDT";
|
||||
series2.ChartArea = "ChartArea1";
|
||||
series2.Legend = "Legend1";
|
||||
|
|
@ -397,7 +401,7 @@ namespace AgroBase.Forms
|
|||
legend3.Name = "Legend1";
|
||||
this.chartDF.Legends.Add(legend3);
|
||||
this.chartDF.Location = new System.Drawing.Point(834, 4);
|
||||
this.chartDF.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
|
||||
this.chartDF.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.chartDF.Name = "chartDF";
|
||||
series3.ChartArea = "ChartArea1";
|
||||
series3.Legend = "Legend1";
|
||||
|
|
@ -414,7 +418,7 @@ namespace AgroBase.Forms
|
|||
legend4.Name = "Legend1";
|
||||
this.chartEF.Legends.Add(legend4);
|
||||
this.chartEF.Location = new System.Drawing.Point(201, 4);
|
||||
this.chartEF.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
|
||||
this.chartEF.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.chartEF.Name = "chartEF";
|
||||
series4.ChartArea = "ChartArea1";
|
||||
series4.Legend = "Legend1";
|
||||
|
|
@ -428,7 +432,7 @@ namespace AgroBase.Forms
|
|||
//
|
||||
this.picRobo.Image = ((System.Drawing.Image)(resources.GetObject("picRobo.Image")));
|
||||
this.picRobo.Location = new System.Drawing.Point(602, 206);
|
||||
this.picRobo.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
|
||||
this.picRobo.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.picRobo.Name = "picRobo";
|
||||
this.picRobo.Size = new System.Drawing.Size(265, 395);
|
||||
this.picRobo.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
|
||||
|
|
@ -758,7 +762,7 @@ namespace AgroBase.Forms
|
|||
// btnDTReverter
|
||||
//
|
||||
this.btnDTReverter.Location = new System.Drawing.Point(736, 774);
|
||||
this.btnDTReverter.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
|
||||
this.btnDTReverter.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.btnDTReverter.Name = "btnDTReverter";
|
||||
this.btnDTReverter.Size = new System.Drawing.Size(93, 23);
|
||||
this.btnDTReverter.TabIndex = 125;
|
||||
|
|
@ -768,7 +772,7 @@ namespace AgroBase.Forms
|
|||
// btnETReverter
|
||||
//
|
||||
this.btnETReverter.Location = new System.Drawing.Point(639, 774);
|
||||
this.btnETReverter.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
|
||||
this.btnETReverter.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.btnETReverter.Name = "btnETReverter";
|
||||
this.btnETReverter.Size = new System.Drawing.Size(93, 23);
|
||||
this.btnETReverter.TabIndex = 124;
|
||||
|
|
@ -778,7 +782,7 @@ namespace AgroBase.Forms
|
|||
// btnDFReverter
|
||||
//
|
||||
this.btnDFReverter.Location = new System.Drawing.Point(736, 37);
|
||||
this.btnDFReverter.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
|
||||
this.btnDFReverter.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.btnDFReverter.Name = "btnDFReverter";
|
||||
this.btnDFReverter.Size = new System.Drawing.Size(93, 23);
|
||||
this.btnDFReverter.TabIndex = 123;
|
||||
|
|
@ -788,7 +792,7 @@ namespace AgroBase.Forms
|
|||
// btnEFReverter
|
||||
//
|
||||
this.btnEFReverter.Location = new System.Drawing.Point(639, 37);
|
||||
this.btnEFReverter.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
|
||||
this.btnEFReverter.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.btnEFReverter.Name = "btnEFReverter";
|
||||
this.btnEFReverter.Size = new System.Drawing.Size(93, 23);
|
||||
this.btnEFReverter.TabIndex = 122;
|
||||
|
|
@ -838,7 +842,7 @@ namespace AgroBase.Forms
|
|||
// btnDTReferenciar
|
||||
//
|
||||
this.btnDTReferenciar.Location = new System.Drawing.Point(736, 747);
|
||||
this.btnDTReferenciar.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
|
||||
this.btnDTReferenciar.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.btnDTReferenciar.Name = "btnDTReferenciar";
|
||||
this.btnDTReferenciar.Size = new System.Drawing.Size(93, 23);
|
||||
this.btnDTReferenciar.TabIndex = 117;
|
||||
|
|
@ -859,7 +863,7 @@ namespace AgroBase.Forms
|
|||
// picDT
|
||||
//
|
||||
this.picDT.Location = new System.Drawing.Point(1271, 432);
|
||||
this.picDT.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
|
||||
this.picDT.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.picDT.Name = "picDT";
|
||||
this.picDT.Size = new System.Drawing.Size(188, 203);
|
||||
this.picDT.TabIndex = 115;
|
||||
|
|
@ -908,7 +912,7 @@ namespace AgroBase.Forms
|
|||
// btnDFReferenciar
|
||||
//
|
||||
this.btnDFReferenciar.Location = new System.Drawing.Point(736, 9);
|
||||
this.btnDFReferenciar.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
|
||||
this.btnDFReferenciar.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.btnDFReferenciar.Name = "btnDFReferenciar";
|
||||
this.btnDFReferenciar.Size = new System.Drawing.Size(93, 23);
|
||||
this.btnDFReferenciar.TabIndex = 108;
|
||||
|
|
@ -929,7 +933,7 @@ namespace AgroBase.Forms
|
|||
// picDF
|
||||
//
|
||||
this.picDF.Location = new System.Drawing.Point(1271, 27);
|
||||
this.picDF.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
|
||||
this.picDF.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.picDF.Name = "picDF";
|
||||
this.picDF.Size = new System.Drawing.Size(188, 203);
|
||||
this.picDF.TabIndex = 106;
|
||||
|
|
@ -978,7 +982,7 @@ namespace AgroBase.Forms
|
|||
// btnETReferenciar
|
||||
//
|
||||
this.btnETReferenciar.Location = new System.Drawing.Point(639, 747);
|
||||
this.btnETReferenciar.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
|
||||
this.btnETReferenciar.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.btnETReferenciar.Name = "btnETReferenciar";
|
||||
this.btnETReferenciar.Size = new System.Drawing.Size(93, 23);
|
||||
this.btnETReferenciar.TabIndex = 101;
|
||||
|
|
@ -999,7 +1003,7 @@ namespace AgroBase.Forms
|
|||
// picET
|
||||
//
|
||||
this.picET.Location = new System.Drawing.Point(9, 432);
|
||||
this.picET.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
|
||||
this.picET.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.picET.Name = "picET";
|
||||
this.picET.Size = new System.Drawing.Size(188, 203);
|
||||
this.picET.TabIndex = 99;
|
||||
|
|
@ -1048,7 +1052,7 @@ namespace AgroBase.Forms
|
|||
// btnEFReferenciar
|
||||
//
|
||||
this.btnEFReferenciar.Location = new System.Drawing.Point(639, 9);
|
||||
this.btnEFReferenciar.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
|
||||
this.btnEFReferenciar.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.btnEFReferenciar.Name = "btnEFReferenciar";
|
||||
this.btnEFReferenciar.Size = new System.Drawing.Size(93, 23);
|
||||
this.btnEFReferenciar.TabIndex = 92;
|
||||
|
|
@ -1069,19 +1073,41 @@ namespace AgroBase.Forms
|
|||
// picEF
|
||||
//
|
||||
this.picEF.Location = new System.Drawing.Point(9, 27);
|
||||
this.picEF.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
|
||||
this.picEF.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.picEF.Name = "picEF";
|
||||
this.picEF.Size = new System.Drawing.Size(188, 203);
|
||||
this.picEF.TabIndex = 90;
|
||||
this.picEF.TabStop = false;
|
||||
//
|
||||
// lblCorrente
|
||||
//
|
||||
this.lblCorrente.AutoSize = true;
|
||||
this.lblCorrente.Font = new System.Drawing.Font("Microsoft Sans Serif", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.lblCorrente.Location = new System.Drawing.Point(639, 619);
|
||||
this.lblCorrente.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||
this.lblCorrente.Name = "lblCorrente";
|
||||
this.lblCorrente.Size = new System.Drawing.Size(202, 12);
|
||||
this.lblCorrente.TabIndex = 172;
|
||||
this.lblCorrente.Text = "Corrente atual: 0,00A - Mín: 0,00A - Máx: 0,00A";
|
||||
//
|
||||
// lblTensao
|
||||
//
|
||||
this.lblTensao.AutoSize = true;
|
||||
this.lblTensao.Font = new System.Drawing.Font("Microsoft Sans Serif", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.lblTensao.Location = new System.Drawing.Point(639, 606);
|
||||
this.lblTensao.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||
this.lblTensao.Name = "lblTensao";
|
||||
this.lblTensao.Size = new System.Drawing.Size(196, 12);
|
||||
this.lblTensao.TabIndex = 171;
|
||||
this.lblTensao.Text = "Tensão atual: 0,00V - Mín: 0,00V - Máx: 0,00V";
|
||||
//
|
||||
// frmAcompanhamento
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(1484, 749);
|
||||
this.Controls.Add(this.pnlFundo);
|
||||
this.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
|
||||
this.Margin = new System.Windows.Forms.Padding(2);
|
||||
this.Name = "frmAcompanhamento";
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
|
||||
this.Text = "Acompanhamento";
|
||||
|
|
@ -1187,5 +1213,7 @@ namespace AgroBase.Forms
|
|||
private System.Windows.Forms.Label lblDistanciaTotal;
|
||||
private System.Windows.Forms.Label lblTempoEmMovimento;
|
||||
private System.Windows.Forms.Label lblTempoConectado;
|
||||
public System.Windows.Forms.Label lblCorrente;
|
||||
public System.Windows.Forms.Label lblTensao;
|
||||
}
|
||||
}
|
||||
|
|
@ -396,6 +396,21 @@ namespace AgroBase.Forms
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
delegate void AtualizarSensoresDelegate(string Texto);
|
||||
|
||||
public void AtualizarSensores(string Texto)
|
||||
{
|
||||
Label lbl = Texto.Contains("Corrente") ? lblCorrente : lblTensao;
|
||||
if (lbl.InvokeRequired)
|
||||
{
|
||||
lbl.Invoke(new AtualizarSensoresDelegate(AtualizarSensores), Texto);
|
||||
}
|
||||
else
|
||||
{
|
||||
lbl.Text = Texto;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -273,5 +273,7 @@ namespace AgroBase.Models.Modules
|
|||
Leitura3,
|
||||
Leitura4,
|
||||
I2C,
|
||||
Tensao,
|
||||
Corrente,
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ namespace AgroBase.Models.Modules
|
|||
FuncoesPinout.TMP,
|
||||
},
|
||||
DelayAmostragem = 200,
|
||||
Parametros = new List<string[]>(),
|
||||
},
|
||||
new SensorModel()
|
||||
{
|
||||
|
|
@ -56,6 +57,7 @@ namespace AgroBase.Models.Modules
|
|||
FuncoesPinout.TMP,
|
||||
},
|
||||
DelayAmostragem = 200,
|
||||
Parametros = new List<string[]>(),
|
||||
},
|
||||
new SensorModel()
|
||||
{
|
||||
|
|
@ -71,6 +73,7 @@ namespace AgroBase.Models.Modules
|
|||
FuncoesPinout.TMP,
|
||||
},
|
||||
DelayAmostragem = 200,
|
||||
Parametros = new List<string[]>(),
|
||||
},
|
||||
new SensorModel()
|
||||
{
|
||||
|
|
@ -86,10 +89,11 @@ namespace AgroBase.Models.Modules
|
|||
FuncoesPinout.TMP,
|
||||
},
|
||||
DelayAmostragem = 200,
|
||||
Parametros = new List<string[]>(),
|
||||
},
|
||||
new SensorModel()
|
||||
{
|
||||
ID = "VBAT ",
|
||||
ID = "VBAT",
|
||||
Descricao = "Tensão da bateria",
|
||||
Prioridade = 20,
|
||||
Componente = S_Code.sTEN,
|
||||
|
|
@ -98,13 +102,19 @@ namespace AgroBase.Models.Modules
|
|||
Testando = false,
|
||||
Funcoes = new List<FuncoesPinout>()
|
||||
{
|
||||
FuncoesPinout.Leitura1,
|
||||
FuncoesPinout.Tensao,
|
||||
},
|
||||
DelayAmostragem = 500,
|
||||
Parametros = new List<string[]>()
|
||||
{
|
||||
new string[] { "V offset", "000.85" },
|
||||
new string[] { "R1", "120000" },
|
||||
new string[] { "R2", "010000" },
|
||||
},
|
||||
DelayAmostragem = 1000,
|
||||
},
|
||||
new SensorModel()
|
||||
{
|
||||
ID = "ABAT ",
|
||||
ID = "ABAT",
|
||||
Prioridade = 10,
|
||||
Descricao = "Corrente da bateria",
|
||||
Componente = S_Code.sCOR,
|
||||
|
|
@ -113,9 +123,14 @@ namespace AgroBase.Models.Modules
|
|||
Testando = false,
|
||||
Funcoes = new List<FuncoesPinout>()
|
||||
{
|
||||
FuncoesPinout.Leitura1,
|
||||
FuncoesPinout.Corrente,
|
||||
},
|
||||
DelayAmostragem = 500,
|
||||
Parametros = new List<string[]>()
|
||||
{
|
||||
new string[] { "V offset", "00.413" },
|
||||
new string[] { "Sensibilidade", "000.35" },
|
||||
},
|
||||
DelayAmostragem = 950,
|
||||
},
|
||||
}
|
||||
};
|
||||
|
|
@ -146,7 +161,7 @@ namespace AgroBase.Models.Modules
|
|||
}
|
||||
|
||||
S_Code TipoSensor = (S_Code)(cod);
|
||||
SensorModel Sensor = Sensores.FirstOrDefault(x => x.ID == Dados[1]);
|
||||
SensorModel Sensor = Sensores.FirstOrDefault(x => x.ID == Dados[1].Trim());
|
||||
if (Sensor == null)
|
||||
{
|
||||
if (Dados[1] == "MD")
|
||||
|
|
@ -162,26 +177,60 @@ namespace AgroBase.Models.Modules
|
|||
switch (TipoSensor)
|
||||
{
|
||||
case S_Code.sCOR:
|
||||
double l1 = -1;
|
||||
double.TryParse(Dados[2], out l1);
|
||||
double l2 = -1;
|
||||
double.TryParse(Dados[3], out l2);
|
||||
double l3 = -1;
|
||||
double.TryParse(Dados[4], out l3);
|
||||
double l4 = -1;
|
||||
double.TryParse(Dados[5], out l4);
|
||||
|
||||
double leitura = -1;
|
||||
double.TryParse(Dados[2].Replace(".", ","), out leitura);
|
||||
double vPin = -1;
|
||||
double.TryParse(Dados[3].Replace(".", ","), out vPin);
|
||||
double corrente = -1;
|
||||
double.TryParse(Dados[4].Replace(".", ","), out corrente);
|
||||
|
||||
Sensor.Leituras = new List<double>()
|
||||
{
|
||||
l1,
|
||||
l2,
|
||||
l3,
|
||||
l4
|
||||
leitura,
|
||||
vPin,
|
||||
corrente,
|
||||
};
|
||||
|
||||
if (corrente > Sensor.ValorMaximo)
|
||||
{
|
||||
Sensor.ValorMaximo = corrente;
|
||||
}
|
||||
else if (corrente < Sensor.ValorMinimo)
|
||||
{
|
||||
Sensor.ValorMinimo = corrente;
|
||||
}
|
||||
|
||||
frmInstancial.frmAcompanhamento.AtualizarSensores("Corrente atual: " + corrente.ToString("0.00") + "A - Mín: " + Sensor.ValorMinimo.ToString("0.00") + "A - Máx: " + Sensor.ValorMaximo.ToString("0.00") + "A");
|
||||
|
||||
AtualizaGrafico = true;
|
||||
break;
|
||||
case S_Code.sTEN:
|
||||
double leituraV = -1;
|
||||
double.TryParse(Dados[2].Replace(".", ","), out leituraV);
|
||||
double vPinV = -1;
|
||||
double.TryParse(Dados[3].Replace(".", ","), out vPinV);
|
||||
double tensao = -1;
|
||||
double.TryParse(Dados[4].Replace(".", ","), out tensao);
|
||||
|
||||
Sensor.Leituras = new List<double>()
|
||||
{
|
||||
leituraV,
|
||||
vPinV,
|
||||
tensao,
|
||||
};
|
||||
|
||||
if (tensao > Sensor.ValorMaximo)
|
||||
{
|
||||
Sensor.ValorMaximo = tensao;
|
||||
}
|
||||
else if (tensao < Sensor.ValorMinimo)
|
||||
{
|
||||
Sensor.ValorMinimo = tensao;
|
||||
}
|
||||
|
||||
frmInstancial.frmAcompanhamento.AtualizarSensores("Tensão atual: " + tensao.ToString("0.00") + "V - Mín: " + Sensor.ValorMinimo.ToString("0.00") + "V - Máx: " + Sensor.ValorMaximo.ToString("0.00") + "V");
|
||||
|
||||
AtualizaGrafico = true;
|
||||
|
||||
break;
|
||||
case S_Code.sCFG:
|
||||
|
|
@ -189,31 +238,31 @@ namespace AgroBase.Models.Modules
|
|||
Sensor.Inicializado = Dados[2] == "1";
|
||||
break;
|
||||
}
|
||||
case S_Code.sTMP: {
|
||||
double temp = -1;
|
||||
double.TryParse(Dados[2].Replace(".", ","), out temp);
|
||||
Sensor.Leituras = new List<double>() { temp };
|
||||
if (temp > Sensor.ValorMaximo)
|
||||
{
|
||||
Sensor.ValorMaximo = temp;
|
||||
}
|
||||
else if (temp < Sensor.ValorMinimo)
|
||||
{
|
||||
Sensor.ValorMinimo = temp;
|
||||
}
|
||||
|
||||
MovSensoriamentoMotor Motor =
|
||||
Variaveis.DispositivosConectados.Any(x => x.Dispositivo == T_Code.Mov) ?
|
||||
((MovimentacaoModel)(Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Mov).Dados)).Motores.FirstOrDefault(x => Sensor.ID.Contains(x.ID)) :
|
||||
null;
|
||||
if (Motor != null)
|
||||
{
|
||||
Motor.Temperatura = temp;
|
||||
}
|
||||
|
||||
AtualizaGrafico = true;
|
||||
break;
|
||||
case S_Code.sTMP: {
|
||||
double temp = -1;
|
||||
double.TryParse(Dados[2].Replace(".", ","), out temp);
|
||||
Sensor.Leituras = new List<double>() { temp };
|
||||
if (temp > Sensor.ValorMaximo)
|
||||
{
|
||||
Sensor.ValorMaximo = temp;
|
||||
}
|
||||
else if (temp < Sensor.ValorMinimo)
|
||||
{
|
||||
Sensor.ValorMinimo = temp;
|
||||
}
|
||||
|
||||
MovSensoriamentoMotor Motor =
|
||||
Variaveis.DispositivosConectados.Any(x => x.Dispositivo == T_Code.Mov) ?
|
||||
((MovimentacaoModel)(Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Mov).Dados)).Motores.FirstOrDefault(x => Sensor.ID.Contains(x.ID)) :
|
||||
null;
|
||||
if (Motor != null)
|
||||
{
|
||||
Motor.Temperatura = temp;
|
||||
}
|
||||
|
||||
AtualizaGrafico = true;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -325,6 +374,7 @@ namespace AgroBase.Models.Modules
|
|||
public bool Inicializado { get; set; } = false;
|
||||
public bool Testando { get; set; } = false;
|
||||
public List<FuncoesPinout> Funcoes { get; set; }
|
||||
public List<string[]> Parametros { get; set;} = new List<string[]>();
|
||||
|
||||
public string UnidadeMedida { get; set; }
|
||||
public List<double> Leituras { get; set; }
|
||||
|
|
@ -336,13 +386,17 @@ namespace AgroBase.Models.Modules
|
|||
{
|
||||
var _pinout = SensoriamentoModel.Pinout.Where(x => x.ComponenteID == ID).ToList();
|
||||
string Protocolo = ((int)F_Code.Cfg).ToString() +
|
||||
ID + ";" + // 0 ~ 4
|
||||
ID.PadRight(5, ' ') + ";" + // 0 ~ 4
|
||||
(Conectar ? "1" : "0") + ";" + // 6
|
||||
((int)Componente).ToString() + ";" + // 8 ~ 10
|
||||
(Aferir ? "1" : "0") + ";" + // 12
|
||||
DelayAmostragem.ToString("00000") + ";" + // 14 ~ 18
|
||||
Prioridade.ToString("00") + ";" + // 20 ~ 21
|
||||
(_pinout.Any(x => x.Funcao != FuncoesPinout.NaoConectado) ? _pinout.FirstOrDefault(x => x.Funcao != FuncoesPinout.NaoConectado).Pino.ToString("00") : "-1"); // 23 ~ 24
|
||||
foreach (var Parametro in Parametros)
|
||||
{
|
||||
Protocolo += ";" + Parametro[1];
|
||||
}
|
||||
return Protocolo;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
using AgroBase.Forms;
|
||||
using AgroBase.Forms.Direcional;
|
||||
using AgroBase.Forms.Movimentacao;
|
||||
using AgroBase.Forms.Sensoriamento;
|
||||
using AgroBase.Models;
|
||||
using AgroBase.Models.Modules;
|
||||
using AgroBase.Services;
|
||||
|
|
@ -198,7 +199,7 @@ namespace AgroBase.Comum
|
|||
break;
|
||||
case T_Code.Sen:
|
||||
Dados = CarregarParametros(SensoriamentoModel.CarregarParametrosIniciais());
|
||||
//frmConfig = new frmSenConfig2();
|
||||
frmConfig = new frmSenConfig();
|
||||
break;
|
||||
case T_Code.Atu:
|
||||
Dados = CarregarParametros(AtuadorModel.CarregarParametrosIniciais());
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -1 +1 @@
|
|||
{"Conectado":false,"Sensores":[{"LogGrafico":[],"ID":"TMVET","Prioridade":0,"Descricao":"Temperatura Motor Esquerdo Trás","Componente":411,"Aferir":true,"DelayAmostragem":200,"Inicializado":false,"Testando":false,"Funcoes":[12],"UnidadeMedida":null,"Leituras":[33.78],"ValorMinimo":0.0,"ValorMaximo":23935.0},{"LogGrafico":[],"ID":"TMVEF","Prioridade":0,"Descricao":"Temperatura Motor Esquerdo Frente","Componente":411,"Aferir":true,"DelayAmostragem":200,"Inicializado":false,"Testando":false,"Funcoes":[12],"UnidadeMedida":null,"Leituras":[29.35],"ValorMinimo":-27315.0,"ValorMaximo":12833.0},{"LogGrafico":[],"ID":"TMVDT","Prioridade":0,"Descricao":"Temperatura Motor Direito Trás","Componente":411,"Aferir":true,"DelayAmostragem":200,"Inicializado":false,"Testando":false,"Funcoes":[12],"UnidadeMedida":null,"Leituras":[29.69],"ValorMinimo":-27315.0,"ValorMaximo":7745.0},{"LogGrafico":[],"ID":"TMVDF","Prioridade":0,"Descricao":"Temperatura Motor Direito Frente","Componente":411,"Aferir":true,"DelayAmostragem":200,"Inicializado":false,"Testando":false,"Funcoes":[12],"UnidadeMedida":null,"Leituras":[30.38],"ValorMinimo":-27315.0,"ValorMaximo":7936.0},{"LogGrafico":[],"ID":"VBAT ","Prioridade":20,"Descricao":"Tensão da bateria","Componente":112,"Aferir":false,"DelayAmostragem":1000,"Inicializado":false,"Testando":false,"Funcoes":[23],"UnidadeMedida":null,"Leituras":null,"ValorMinimo":0.0,"ValorMaximo":0.0},{"LogGrafico":[],"ID":"ABAT ","Prioridade":10,"Descricao":"Corrente da bateria","Componente":322,"Aferir":false,"DelayAmostragem":950,"Inicializado":false,"Testando":false,"Funcoes":[23],"UnidadeMedida":null,"Leituras":null,"ValorMinimo":0.0,"ValorMaximo":0.0}]}
|
||||
{"Conectado":false,"Sensores":[{"LogGrafico":[],"ID":"TMVET","Prioridade":0,"Descricao":"Temperatura Motor Esquerdo Trás","Componente":411,"Aferir":false,"DelayAmostragem":200,"Inicializado":false,"Testando":false,"Funcoes":[12],"Parametros":[],"UnidadeMedida":null,"Leituras":null,"ValorMinimo":0.0,"ValorMaximo":0.0},{"LogGrafico":[],"ID":"TMVEF","Prioridade":0,"Descricao":"Temperatura Motor Esquerdo Frente","Componente":411,"Aferir":false,"DelayAmostragem":200,"Inicializado":false,"Testando":false,"Funcoes":[12],"Parametros":[],"UnidadeMedida":null,"Leituras":null,"ValorMinimo":0.0,"ValorMaximo":0.0},{"LogGrafico":[],"ID":"TMVDT","Prioridade":0,"Descricao":"Temperatura Motor Direito Trás","Componente":411,"Aferir":false,"DelayAmostragem":200,"Inicializado":false,"Testando":false,"Funcoes":[12],"Parametros":[],"UnidadeMedida":null,"Leituras":null,"ValorMinimo":0.0,"ValorMaximo":0.0},{"LogGrafico":[],"ID":"TMVDF","Prioridade":0,"Descricao":"Temperatura Motor Direito Frente","Componente":411,"Aferir":false,"DelayAmostragem":200,"Inicializado":false,"Testando":false,"Funcoes":[12],"Parametros":[],"UnidadeMedida":null,"Leituras":null,"ValorMinimo":0.0,"ValorMaximo":0.0},{"LogGrafico":[],"ID":"VBAT","Prioridade":20,"Descricao":"Tensão da bateria","Componente":112,"Aferir":true,"DelayAmostragem":500,"Inicializado":false,"Testando":false,"Funcoes":[28],"Parametros":[["V offset","000.85"],["R1","120000"],["R2","010000"]],"UnidadeMedida":null,"Leituras":[711.3,0.64,8.3],"ValorMinimo":0.0,"ValorMaximo":13.73},{"LogGrafico":[],"ID":"ABAT","Prioridade":10,"Descricao":"Corrente da bateria","Componente":322,"Aferir":true,"DelayAmostragem":500,"Inicializado":false,"Testando":false,"Funcoes":[29],"Parametros":[["V offset","00.370"],["Sensibilidade","000.35"]],"UnidadeMedida":null,"Leituras":[482.8,0.39,0.05],"ValorMinimo":-0.87,"ValorMaximo":0.23}]}
|
||||
|
|
@ -1 +1 @@
|
|||
[{"Tipo":1,"Pino":99,"Descricao":"1","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":1,"Pino":98,"Descricao":"2","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":1,"Pino":36,"Descricao":"3","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":39,"Descricao":"4","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":34,"Descricao":"5","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":35,"Descricao":"6","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":32,"Descricao":"7","Funcao":12,"Habilitado":true,"ComponenteID":"TMVET"},{"Tipo":1,"Pino":33,"Descricao":"8","Funcao":12,"Habilitado":true,"ComponenteID":"TMVEF"},{"Tipo":1,"Pino":25,"Descricao":"9","Funcao":12,"Habilitado":true,"ComponenteID":"TMVDT"},{"Tipo":1,"Pino":26,"Descricao":"10","Funcao":12,"Habilitado":true,"ComponenteID":"TMVDF"},{"Tipo":1,"Pino":27,"Descricao":"11","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":14,"Descricao":"12","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":12,"Descricao":"13","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":97,"Descricao":"14","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":1,"Pino":13,"Descricao":"15","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":9,"Descricao":"16","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":1,"Pino":10,"Descricao":"17","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":1,"Pino":11,"Descricao":"18","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":1,"Pino":96,"Descricao":"19","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":1,"Pino":6,"Descricao":"26","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":1,"Pino":7,"Descricao":"27","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":1,"Pino":8,"Descricao":"28","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":1,"Pino":15,"Descricao":"29","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":2,"Descricao":"30","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":0,"Descricao":"31","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":4,"Descricao":"32","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":16,"Descricao":"33","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":17,"Descricao":"34","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":5,"Descricao":"35","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":18,"Descricao":"36","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":19,"Descricao":"37","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":95,"Descricao":"38","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":1,"Pino":21,"Descricao":"39","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":3,"Descricao":"40","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":1,"Pino":1,"Descricao":"41","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":1,"Pino":22,"Descricao":"42","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":23,"Descricao":"43","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":94,"Descricao":"44","Funcao":0,"Habilitado":true,"ComponenteID":""}]
|
||||
[{"Tipo":1,"Pino":99,"Descricao":"1","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":1,"Pino":98,"Descricao":"2","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":1,"Pino":36,"Descricao":"3","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":39,"Descricao":"4","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":34,"Descricao":"5","Funcao":12,"Habilitado":true,"ComponenteID":"TMVET"},{"Tipo":1,"Pino":35,"Descricao":"6","Funcao":12,"Habilitado":true,"ComponenteID":"TMVEF"},{"Tipo":1,"Pino":32,"Descricao":"7","Funcao":12,"Habilitado":true,"ComponenteID":"TMVDT"},{"Tipo":1,"Pino":33,"Descricao":"8","Funcao":12,"Habilitado":true,"ComponenteID":"TMVDF"},{"Tipo":1,"Pino":25,"Descricao":"9","Funcao":29,"Habilitado":true,"ComponenteID":"ABAT"},{"Tipo":1,"Pino":26,"Descricao":"10","Funcao":28,"Habilitado":true,"ComponenteID":"VBAT"},{"Tipo":1,"Pino":27,"Descricao":"11","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":14,"Descricao":"12","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":12,"Descricao":"13","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":97,"Descricao":"14","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":1,"Pino":13,"Descricao":"15","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":9,"Descricao":"16","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":1,"Pino":10,"Descricao":"17","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":1,"Pino":11,"Descricao":"18","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":1,"Pino":96,"Descricao":"19","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":1,"Pino":6,"Descricao":"26","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":1,"Pino":7,"Descricao":"27","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":1,"Pino":8,"Descricao":"28","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":1,"Pino":15,"Descricao":"29","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":2,"Descricao":"30","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":0,"Descricao":"31","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":4,"Descricao":"32","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":16,"Descricao":"33","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":17,"Descricao":"34","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":5,"Descricao":"35","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":18,"Descricao":"36","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":19,"Descricao":"37","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":95,"Descricao":"38","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":1,"Pino":21,"Descricao":"39","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":3,"Descricao":"40","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":1,"Pino":1,"Descricao":"41","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":1,"Pino":22,"Descricao":"42","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":23,"Descricao":"43","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":94,"Descricao":"44","Funcao":0,"Habilitado":true,"ComponenteID":""}]
|
||||
Binary file not shown.
|
|
@ -1 +1 @@
|
|||
5282e2e8323b29ea19e29f87e03985324ecefc8410e637b6614d0e3935fd65df
|
||||
522c469433cd27a9bb1c105d2bee798bc5682bc54372eaac60a028a8592b0825
|
||||
|
|
|
|||
|
|
@ -361,3 +361,4 @@ C:\ZendionInc\agrobot_base\AgroBase\AgroBase\obj\Debug\AgroBase.pdb
|
|||
C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\Debug\Python\Scripts\gps-viewer.py
|
||||
C:\ZendionInc\agrobot_base\AgroBase\AgroBase\obj\Debug\AgroBase.Forms.frmGPS.resources
|
||||
C:\ZendionInc\agrobot_base\AgroBase\AgroBase\obj\Debug\AgroBase.Forms.frmPinout.resources
|
||||
C:\ZendionInc\agrobot_base\AgroBase\AgroBase\obj\Debug\AgroBase.Forms.Sensoriamento.frmSenConfig.resources
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1,8 +1,8 @@
|
|||
// Dispositivo: Atuador
|
||||
// Versão Firmware: 1
|
||||
// Ultima atualização: 22/12/2023
|
||||
// Ultima atualização: 23/01/2024
|
||||
|
||||
#include "C:\Zendion Inc\agrobot_base\Firmware\Modulos\SerialService.h"
|
||||
#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\SerialService.h"
|
||||
#define D_Code Atu
|
||||
|
||||
#define _pinoLED RGB_BUILTIN
|
||||
|
|
@ -14,6 +14,7 @@ bool Conectado = false;
|
|||
|
||||
int _TaxaAmostragem = 500;
|
||||
int BicosAtivos = 10;
|
||||
bool BicoLigado = false;
|
||||
|
||||
class BicoPulverizador {
|
||||
public:
|
||||
|
|
@ -36,7 +37,7 @@ public:
|
|||
bool StatusBico;
|
||||
|
||||
// Entrada de dados
|
||||
bool _BicoAtuado = false;
|
||||
bool _BicoAtuado = !BicoLigado;
|
||||
|
||||
void Inicializar() {
|
||||
if (Iniciado) {
|
||||
|
|
@ -47,9 +48,9 @@ public:
|
|||
|
||||
if (_pinoSolenoide > -1) {
|
||||
pinMode(_pinoSolenoide, OUTPUT);
|
||||
digitalWrite(_pinoSolenoide, LOW);
|
||||
_BicoAtuado = false;
|
||||
StatusBico = digitalRead(_pinoSolenoide) == 1;
|
||||
_BicoAtuado = !BicoLigado;
|
||||
digitalWrite(_pinoSolenoide, _BicoAtuado);
|
||||
StatusBico = digitalRead(_pinoSolenoide) == (BicoLigado ? 1 : 0);
|
||||
}
|
||||
if (_pinoSensor > -1) {
|
||||
pinMode(_pinoSensor, INPUT);
|
||||
|
|
@ -88,7 +89,7 @@ public:
|
|||
|
||||
void AlterarStatusBico() {
|
||||
digitalWrite(_pinoSolenoide, _BicoAtuado);
|
||||
StatusBico = digitalRead(_pinoSolenoide) == 1;
|
||||
StatusBico = digitalRead(_pinoSolenoide) == (BicoLigado ? 1 : 0);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -151,9 +152,20 @@ BicoPulverizador* BicoPorID(String ID) {
|
|||
return _bico;
|
||||
}
|
||||
|
||||
void ZerarPinos() {
|
||||
const int gpios[] = {2, 4, 5, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 25, 26, 27, 32, 33};
|
||||
|
||||
for (int i = 0; i < sizeof(gpios) / sizeof(gpios[0]); i++) {
|
||||
pinMode(gpios[i], OUTPUT);
|
||||
digitalWrite(gpios[i], !BicoLigado);
|
||||
}
|
||||
}
|
||||
|
||||
void setup() {
|
||||
Serial.begin(_baudRate);
|
||||
|
||||
ZerarPinos();
|
||||
|
||||
if (_pinoReleGeral > -1) {
|
||||
pinMode(_pinoReleGeral, OUTPUT);
|
||||
digitalWrite(_pinoReleGeral, LOW);
|
||||
|
|
@ -231,7 +243,7 @@ void loop() {
|
|||
|
||||
BicoPulverizador* _bico = BicoPorID(ID);
|
||||
|
||||
_bico->_BicoAtuado = (String)Protocolo[4] == "1";
|
||||
_bico->_BicoAtuado = (String)Protocolo[4] == (BicoLigado ? "1" : "0");
|
||||
_bico->AlterarStatusBico();
|
||||
}
|
||||
else if (_funcao == Tst) {
|
||||
|
|
|
|||
|
|
@ -488,6 +488,16 @@ Motor M2("EF");
|
|||
Motor M3("DT");
|
||||
Motor M4("DF");
|
||||
|
||||
Motor* MotorPorID(String ID) {
|
||||
Motor* _motor =
|
||||
ID == "ET" ? &M1 :
|
||||
ID == "EF" ? &M2 :
|
||||
ID == "DT" ? &M3 :
|
||||
ID == "DF" ? &M4 :
|
||||
nullptr;
|
||||
return _motor;
|
||||
}
|
||||
|
||||
void setup() {
|
||||
Serial.begin(_baudRate);
|
||||
|
||||
|
|
@ -543,7 +553,7 @@ void loop() {
|
|||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, "MD", Conectado ? "1" : "0"));
|
||||
}
|
||||
else {
|
||||
Motor* _motor = ID == "ET" ? &M1 : ID == "EF" ? &M2 : ID == "DT" ? &M3 : &M4;
|
||||
Motor* _motor = MotorPorID(ID);
|
||||
|
||||
int canal = ((String)Protocolo[5]).toInt();
|
||||
bool motor_ativado = ((String)Protocolo[7]) == "1";
|
||||
|
|
@ -587,7 +597,7 @@ void loop() {
|
|||
//0;0;000.00
|
||||
String ID = ((String)Protocolo[0] + (String)Protocolo[1]);
|
||||
|
||||
Motor* _motor = ID == "ET" ? &M1 : ID == "EF" ? &M2 : ID == "DT" ? &M3 : &M4;
|
||||
Motor* _motor = MotorPorID(ID);
|
||||
|
||||
Sentido sentido = (Sentido)((String)Protocolo[3]).toInt();
|
||||
int angulo = ((String)Protocolo[5] + (String)Protocolo[6] + (String)Protocolo[7]).toInt();
|
||||
|
|
@ -614,7 +624,7 @@ void loop() {
|
|||
else if (_funcao == Tst) {
|
||||
String ID = ((String)Protocolo[0] + (String)Protocolo[1]);
|
||||
|
||||
Motor* _motor = ID == "ET" ? &M1 : ID == "EF" ? &M2 : ID == "DT" ? &M3 : &M4;
|
||||
Motor* _motor = MotorPorID(ID);
|
||||
|
||||
bool EmTeste = _motor->Testando;
|
||||
if (!EmTeste) {
|
||||
|
|
|
|||
|
|
@ -1,12 +1,10 @@
|
|||
// Dispositivo: Movimentação
|
||||
// Versão Firmware: 9
|
||||
// Ultima atualização: 21/11/2023
|
||||
// Versão Firmware: 14
|
||||
// Ultima atualização: 16/01/2024
|
||||
|
||||
#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\SerialService.h"
|
||||
#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\MemoryService.h"
|
||||
#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\utils.h"
|
||||
#include <PID_v1.h>
|
||||
#include "DHT.h"
|
||||
#define D_Code Mov
|
||||
|
||||
#define _pinoLED RGB_BUILTIN
|
||||
|
|
@ -23,17 +21,11 @@ int RampaMin = 0;
|
|||
int ZeroRampa = 0;
|
||||
int RampaMax = 1023;
|
||||
|
||||
int M1_US_Addr = 25;
|
||||
int M2_US_Addr = 35;
|
||||
int M3_US_Addr = 45;
|
||||
int M4_US_Addr = 55;
|
||||
|
||||
class Motor {
|
||||
public:
|
||||
// Construtor
|
||||
Motor(String desc, int SentidoAddr) {
|
||||
Motor(String desc) {
|
||||
_ID = desc;
|
||||
_US_Addr = SentidoAddr;
|
||||
}
|
||||
|
||||
// Definições
|
||||
|
|
@ -46,7 +38,6 @@ public:
|
|||
int _pinoHLA;
|
||||
int _pinoHLB;
|
||||
int _pinoHLC;
|
||||
int _pinoTMP;
|
||||
|
||||
double _Kp;
|
||||
double _Ki;
|
||||
|
|
@ -67,12 +58,11 @@ public:
|
|||
double RPM;
|
||||
double PotenciaAtual;
|
||||
volatile int ultimaLeituraHallA = 0;
|
||||
volatile int ultimaLeituraHallB = 0;
|
||||
volatile int ultimaLeituraHallC = 0;
|
||||
volatile unsigned int tempoAnterior = 0;
|
||||
volatile float periodo = 0;
|
||||
|
||||
// Sensores
|
||||
DHT* dht;
|
||||
|
||||
// Entrada de dados
|
||||
bool _MalhaFechada;
|
||||
int _PotMap;
|
||||
|
|
@ -103,7 +93,7 @@ public:
|
|||
pinMode(_pinoDIR, OUTPUT);
|
||||
digitalWrite(_pinoDIR, LOW);
|
||||
|
||||
_SentidoM = (Sentido)LerMemoria(_US_Addr);
|
||||
_SentidoM = Parado;
|
||||
}
|
||||
if (_pinoBRK > -1) {
|
||||
pinMode(_pinoBRK, OUTPUT);
|
||||
|
|
@ -131,14 +121,11 @@ public:
|
|||
}
|
||||
if (_pinoHLB > -1) {
|
||||
pinMode(_pinoHLB, INPUT);
|
||||
ultimaLeituraHallB = digitalRead(_pinoHLB);
|
||||
}
|
||||
if (_pinoHLC > -1) {
|
||||
pinMode(_pinoHLC, INPUT);
|
||||
}
|
||||
if (_pinoTMP > -1) {
|
||||
dht = new DHT(_pinoTMP, DHT22);
|
||||
dht->begin();
|
||||
xTaskCreatePinnedToCore(&Motor::DHT22TaskWrapper, "DHT22Task", 10000, this, 17 - _canal, &DHT22TaskHandle, tskNO_AFFINITY);
|
||||
ultimaLeituraHallC = digitalRead(_pinoHLC);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -163,9 +150,6 @@ public:
|
|||
if (_pinoHLA > -1) {
|
||||
vTaskDelete(RPMTaskHandle);
|
||||
}
|
||||
if (_pinoTMP > -1) {
|
||||
vTaskDelete(DHT22TaskHandle);
|
||||
}
|
||||
|
||||
// Desanexar o canal PWM
|
||||
if (_pinoPWM > -1) {
|
||||
|
|
@ -180,7 +164,6 @@ public:
|
|||
pinMode(_pinoHLA, INPUT);
|
||||
pinMode(_pinoHLB, INPUT);
|
||||
pinMode(_pinoHLC, INPUT);
|
||||
pinMode(_pinoTMP, INPUT);
|
||||
|
||||
// Outras redefinições de variáveis de estado, se necessário
|
||||
delete _PID;
|
||||
|
|
@ -208,7 +191,6 @@ public:
|
|||
|
||||
void ReverterSentidoGiro() {
|
||||
_SentidoM = _SentidoM == Horario ? Antihorario : Horario;
|
||||
GravarMemoria(_US_Addr, (int)_SentidoM);
|
||||
}
|
||||
|
||||
private:
|
||||
|
|
@ -234,7 +216,7 @@ private:
|
|||
}
|
||||
|
||||
// Medir RPM apenas quando ocorrer um pulso no sensor HALL
|
||||
int LeituraHa = digitalRead(_pinoHLA);
|
||||
bool LeituraHa = digitalRead(_pinoHLA) == 1;
|
||||
if (LeituraHa != ultimaLeituraHallA) {
|
||||
ultimaLeituraHallA = LeituraHa;
|
||||
pulsos++;
|
||||
|
|
@ -320,10 +302,10 @@ private:
|
|||
|
||||
// Comparação das leituras atuais com as leituras anteriores
|
||||
if (LeituraHa == LeituraAnteriorHc && LeituraHc == LeituraAnteriorHa) {
|
||||
_Sentido = Horario;
|
||||
_Sentido = Antihorario;
|
||||
}
|
||||
else if (LeituraHa == LeituraAnteriorHb && LeituraHb == LeituraAnteriorHa) {
|
||||
_Sentido = Antihorario;
|
||||
_Sentido = Horario;
|
||||
}
|
||||
else {
|
||||
// Outros casos (não determinados)
|
||||
|
|
@ -386,7 +368,7 @@ private:
|
|||
}
|
||||
|
||||
void RampaTask() {
|
||||
unsigned long previousMillisRampa = millis();
|
||||
unsigned long firstMilis = millis();
|
||||
while (1)
|
||||
{
|
||||
if (!Conectado) {
|
||||
|
|
@ -416,15 +398,15 @@ private:
|
|||
Revertendo = _SentidoSP != Parado && _SentidoSP != _SentidoM;
|
||||
|
||||
if (Revertendo) {
|
||||
digitalWrite(_pinoDIR, HIGH);
|
||||
vTaskDelay(1500);
|
||||
digitalWrite(_pinoDIR, LOW);
|
||||
ledcWrite(_canal, ZeroRampa);
|
||||
vTaskDelay(400);
|
||||
|
||||
_SentidoM = _SentidoSP;
|
||||
GravarMemoria(_US_Addr, (int)_SentidoM);
|
||||
|
||||
Revertendo = false;
|
||||
}
|
||||
|
||||
digitalWrite(_pinoDIR, _SentidoSP == Horario);
|
||||
|
||||
}
|
||||
if (_pinoBRK > -1) {
|
||||
|
|
@ -444,62 +426,27 @@ private:
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
// TEMPERATURA E UMIDADE
|
||||
TaskHandle_t DHT22TaskHandle = NULL;
|
||||
static void DHT22TaskWrapper(void *pvParameters) {
|
||||
Motor *motor = static_cast<Motor*>(pvParameters);
|
||||
motor->DHT22Task();
|
||||
}
|
||||
|
||||
void DHT22Task() {
|
||||
unsigned long firstMilis = millis();
|
||||
while (1)
|
||||
{
|
||||
if (!Conectado) {
|
||||
vTaskDelay(1000);
|
||||
continue;
|
||||
}
|
||||
|
||||
long intMillis = (millis() - firstMilis);
|
||||
|
||||
if (intMillis >= _TaxaAmostragem + 2000) {
|
||||
|
||||
float t = dht->readTemperature();
|
||||
yield();
|
||||
vTaskDelay(500);
|
||||
float h = dht->readHumidity();
|
||||
yield();
|
||||
vTaskDelay(500);
|
||||
float hic = dht->computeHeatIndex(t, h, false);
|
||||
yield();
|
||||
vTaskDelay(500);
|
||||
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sTMP, _ID, MontarDadosProtocoloDHT22(t, h, hic)));
|
||||
firstMilis = millis();
|
||||
}
|
||||
|
||||
vTaskDelay(100);
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
Motor M1("ET", M1_US_Addr);
|
||||
Motor M2("EF", M2_US_Addr);
|
||||
Motor M3("DT", M3_US_Addr);
|
||||
Motor M4("DF", M4_US_Addr);
|
||||
Motor M1("ET");
|
||||
Motor M2("EF");
|
||||
Motor M3("DT");
|
||||
Motor M4("DF");
|
||||
|
||||
Motor* MotorPorID(String ID) {
|
||||
Motor* _motor =
|
||||
ID == "ET" ? &M1 :
|
||||
ID == "EF" ? &M2 :
|
||||
ID == "DT" ? &M3 :
|
||||
ID == "DF" ? &M4 :
|
||||
nullptr;
|
||||
return _motor;
|
||||
}
|
||||
|
||||
void setup() {
|
||||
Serial.begin(_baudRate);
|
||||
|
||||
IniciarMemoria();
|
||||
delay(10);
|
||||
/*LimparMemoria();
|
||||
GravarMemoria(M1_US_Addr, (int)Horario);
|
||||
GravarMemoria(M2_US_Addr, (int)Antihorario);
|
||||
GravarMemoria(M3_US_Addr, (int)Antihorario);
|
||||
GravarMemoria(M4_US_Addr, (int)Horario);*/
|
||||
|
||||
if (_pinoReleGeral > -1) {
|
||||
pinMode(_pinoReleGeral, OUTPUT);
|
||||
|
|
@ -569,9 +516,8 @@ void loop() {
|
|||
int hallA = ((String)Protocolo[41] + (String)Protocolo[42]).toInt();
|
||||
int hallB = ((String)Protocolo[44] + (String)Protocolo[45]).toInt();
|
||||
int hallC = ((String)Protocolo[47] + (String)Protocolo[48]).toInt();
|
||||
int tmp = ((String)Protocolo[50] + (String)Protocolo[51]).toInt();
|
||||
|
||||
Motor* _motor = ID == "ET" ? &M1 : ID == "EF" ? &M2 : ID == "DT" ? &M3 : &M4;
|
||||
Motor* _motor = MotorPorID(ID);
|
||||
if (motor_ativado) {
|
||||
if (Conectar) {
|
||||
_motor->_canal = canal;
|
||||
|
|
@ -582,7 +528,6 @@ void loop() {
|
|||
_motor->_pinoHLA = hallA;
|
||||
_motor->_pinoHLB = hallB;
|
||||
_motor->_pinoHLC = hallC;
|
||||
_motor->_pinoTMP = tmp;
|
||||
_motor->_MalhaFechada = _foc;
|
||||
_motor->_Kp = _Kp;
|
||||
_motor->_Ki = _Ki;
|
||||
|
|
@ -602,7 +547,7 @@ void loop() {
|
|||
//0;000;0;000;000;000
|
||||
String ID = ((String)Protocolo[0] + (String)Protocolo[1]);
|
||||
|
||||
Motor* _motor = ID == "ET" ? &M1 : ID == "EF" ? &M2 : ID == "DT" ? &M3 : &M4;
|
||||
Motor* _motor = MotorPorID(ID);
|
||||
|
||||
_motor->_SentidoSP = (Sentido)((String)Protocolo[3]).toInt();
|
||||
_motor->_RPM_SP = ((String)Protocolo[5] + (String)Protocolo[6] + (String)Protocolo[7]).toInt();
|
||||
|
|
@ -617,7 +562,7 @@ void loop() {
|
|||
else if (_funcao == Tst) {
|
||||
String ID = ((String)Protocolo[0] +(String)Protocolo[1]);
|
||||
|
||||
Motor* _motor = ID == "ET" ? &M1 : ID == "EF" ? &M2 : ID == "DT" ? &M3 : &M4;
|
||||
Motor* _motor = MotorPorID(ID);
|
||||
|
||||
bool EmTeste = _motor->Testando;
|
||||
if (!EmTeste) {
|
||||
|
|
|
|||
|
|
@ -1,8 +1,11 @@
|
|||
// Dispositivo: Sensoriamento
|
||||
// Versão Firmware: 1
|
||||
// Ultima atualização: 28/11/2023
|
||||
// Versão Firmware: 3
|
||||
// Ultima atualização: 23/01/2024
|
||||
|
||||
#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\SerialService.h"
|
||||
|
||||
#include <SimpleKalmanFilter.h>
|
||||
|
||||
#include "C:\Zendion Inc\agrobot_base\Firmware\Modulos\SerialService.h"
|
||||
#define D_Code Sen
|
||||
|
||||
#define _pinoLED RGB_BUILTIN
|
||||
|
|
@ -15,140 +18,369 @@ int _TaxaAmostragem;
|
|||
int FrequenciaMaxima = 10000;
|
||||
|
||||
|
||||
class Sensor {
|
||||
public:
|
||||
// Construtor
|
||||
Sensor(String desc) {
|
||||
_ID = desc;
|
||||
}
|
||||
|
||||
// Definições
|
||||
String _ID;
|
||||
S_Code _componente;
|
||||
int _prioridade;
|
||||
int _delayAmostragem;
|
||||
bool _I2C;
|
||||
int _pinoLeitura1;
|
||||
int _pinoLeitura2;
|
||||
int _pinoLeitura3;
|
||||
int _pinoLeitura4;
|
||||
|
||||
bool Iniciado = false;
|
||||
bool Testando = false;
|
||||
|
||||
// Consumo
|
||||
|
||||
// Entrada de dados
|
||||
|
||||
|
||||
void Inicializar() {
|
||||
if (Iniciado) {
|
||||
EnviarDadosSerial(_ID + " ja inicializado");
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||
return;
|
||||
class SensorTemperatura {
|
||||
public:
|
||||
SensorTemperatura(String desc) {
|
||||
_ID = desc;
|
||||
}
|
||||
|
||||
if (_pinoLeitura1 > -1) {
|
||||
pinMode(_pinoLeitura1, INPUT);
|
||||
}
|
||||
if (_pinoLeitura2 > -1) {
|
||||
pinMode(_pinoLeitura2, INPUT);
|
||||
}
|
||||
if (_pinoLeitura3 > -1) {
|
||||
pinMode(_pinoLeitura3, INPUT);
|
||||
}
|
||||
if (_pinoLeitura4 > -1) {
|
||||
pinMode(_pinoLeitura4, INPUT);
|
||||
}
|
||||
|
||||
// Definições
|
||||
String _ID;
|
||||
S_Code _componente = sTMP;
|
||||
int _pino;
|
||||
int _delayAmostragem;
|
||||
int _prioridade;
|
||||
|
||||
xTaskCreatePinnedToCore(&Sensor::LeituraTaskWrapper, "LeituraTask", 5000, this, _prioridade, &LeituraTaskHandle, tskNO_AFFINITY);
|
||||
bool Iniciado = false;
|
||||
|
||||
|
||||
Iniciado = true;
|
||||
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||
}
|
||||
|
||||
void Desligar() {
|
||||
if (!Iniciado) {
|
||||
EnviarDadosSerial(_ID + " nao esta inicializado");
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||
return;
|
||||
}
|
||||
|
||||
// Parar a execução das tarefas
|
||||
vTaskDelete(LeituraTaskHandle);
|
||||
|
||||
// Redefinir as configurações para os valores iniciais
|
||||
if (_pinoLeitura1 > -1) {
|
||||
pinMode(_pinoLeitura1, INPUT);
|
||||
}
|
||||
if (_pinoLeitura2 > -1) {
|
||||
pinMode(_pinoLeitura2, INPUT);
|
||||
}
|
||||
if (_pinoLeitura3 > -1) {
|
||||
pinMode(_pinoLeitura3, INPUT);
|
||||
}
|
||||
if (_pinoLeitura4 > -1) {
|
||||
pinMode(_pinoLeitura4, INPUT);
|
||||
}
|
||||
|
||||
|
||||
EnviarDadosSerial(_ID + " Desligado");
|
||||
|
||||
Iniciado = false;
|
||||
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||
}
|
||||
|
||||
void Testar() {
|
||||
Testando = true;
|
||||
|
||||
Testando = false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
private:
|
||||
|
||||
TaskHandle_t LeituraTaskHandle = NULL;
|
||||
static void LeituraTaskWrapper(void *pvParameters) {
|
||||
Sensor *sensor = static_cast<Sensor*>(pvParameters);
|
||||
sensor->LeituraTask();
|
||||
}
|
||||
|
||||
void LeituraTask() {
|
||||
unsigned long previousMillisLeitura = millis();
|
||||
|
||||
while (1)
|
||||
{
|
||||
if (!Conectado) {
|
||||
// Caso não esteja conectado, aguarda 1 segundo até a próxima verificação, liberando uso de CPU
|
||||
vTaskDelay(1000);
|
||||
continue;
|
||||
void Inicializar() {
|
||||
if (Iniciado) {
|
||||
EnviarDadosSerial(_ID + " ja inicializado");
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||
return;
|
||||
}
|
||||
|
||||
// LEITURA AQUI
|
||||
|
||||
unsigned long currentMillis = millis();
|
||||
if ((currentMillis - previousMillisLeitura) >= (_TaxaAmostragem + _delayAmostragem)) {
|
||||
previousMillisLeitura = currentMillis;
|
||||
|
||||
EnviarDadosSerial(MontarProtocoloSensor(_componente, _ID, MontarDadosProtocoloSensorGenerico("")));
|
||||
if (_pino > -1) {
|
||||
pinMode(_pino, INPUT);
|
||||
}
|
||||
|
||||
vTaskDelay(1);
|
||||
xTaskCreatePinnedToCore(&SensorTemperatura::STTaskWrapper, "STTask", 5000, this, _prioridade, &STTaskHandle, tskNO_AFFINITY);
|
||||
|
||||
EnviarDadosSerial(_ID + " Iniciado");
|
||||
|
||||
Iniciado = true;
|
||||
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||
}
|
||||
}
|
||||
|
||||
void Desligar() {
|
||||
if (!Iniciado) {
|
||||
EnviarDadosSerial(_ID + " nao esta inicializado");
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||
return;
|
||||
}
|
||||
|
||||
// Parar a execução das tarefas
|
||||
vTaskDelete(STTaskHandle);
|
||||
|
||||
// Redefinir as configurações para os valores iniciais
|
||||
pinMode(_pino, INPUT);
|
||||
|
||||
EnviarDadosSerial(_ID + " Desligado");
|
||||
|
||||
Iniciado = false;
|
||||
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
// Variáveis
|
||||
double Vs = 3.3; // TENSÃO DE SAIDA DO ESP32
|
||||
double R1 = 10000; //RESISTOR UTILIZADO NO DIVISOR DE TENSÃO
|
||||
double Beta = 3950; // VALOR DE BETA
|
||||
double To = 298.15; // VALOR EM KELVIN REFERENTE A 25° CELSIUS
|
||||
double Ro = 10000;
|
||||
double adcMax = 4095.0;
|
||||
|
||||
TaskHandle_t STTaskHandle = NULL;
|
||||
static void STTaskWrapper(void *pvParameters) {
|
||||
SensorTemperatura *sensor = static_cast<SensorTemperatura*>(pvParameters);
|
||||
sensor->STTask();
|
||||
}
|
||||
|
||||
void STTask() {
|
||||
unsigned long firstMilis = millis();
|
||||
while (1)
|
||||
{
|
||||
if (!Conectado) {
|
||||
// Caso não esteja conectado, aguarda 1 segundo até a próxima verificação, liberando uso de CPU
|
||||
vTaskDelay(1000);
|
||||
continue;
|
||||
}
|
||||
|
||||
long intMillis = (millis() - firstMilis);
|
||||
|
||||
// A cada _TaxaAmostragem, enviar os dados para o software
|
||||
if (intMillis >= (_TaxaAmostragem + _delayAmostragem)) {
|
||||
AferirTemperatura();
|
||||
|
||||
firstMilis = millis();
|
||||
}
|
||||
|
||||
// Aguarda metade do menor período possível entre leituras
|
||||
vTaskDelay(1);
|
||||
}
|
||||
}
|
||||
|
||||
void AferirTemperatura() {
|
||||
double Vout, Rt = 0;
|
||||
double T, Tc, Tf, adc = 0;
|
||||
adc = analogRead(_pino); // VARIÁVEL QUE RECEBE A LEITURA DO NTC10K
|
||||
//float adcValue = tempKalman->updateEstimate(adc);
|
||||
float adcValue = adc;
|
||||
//CALCULOS PARA CONVERSÃO DA LEITURA RECEBIDA PELO ESP32 EM TEMPERATURA EM °C
|
||||
Vout = adcValue * Vs / adcMax;
|
||||
Rt = R1 * Vout / (Vs - Vout);
|
||||
T = 1 / (1 / To + log(Rt / Ro) / Beta);
|
||||
Tc = T - 273.15;
|
||||
Tf = Tc * 9 / 5 + 32;
|
||||
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sTMP, _ID, MontarDadosProtocoloNTC10K(Tc)));
|
||||
}
|
||||
};
|
||||
|
||||
class SensorTensao {
|
||||
public:
|
||||
SensorTensao(String desc) {
|
||||
_ID = desc;
|
||||
}
|
||||
|
||||
// Variáveis
|
||||
const float Vcc = 3.3; // Tensão de alimentação
|
||||
float Voffset = 0.85;
|
||||
int R1 = 47000;
|
||||
int R2 = 10000;
|
||||
|
||||
// Definições
|
||||
String _ID;
|
||||
S_Code _componente = sTEN;
|
||||
int _pino;
|
||||
int _delayAmostragem;
|
||||
int _prioridade;
|
||||
|
||||
SimpleKalmanFilter* kalmanTEN;
|
||||
|
||||
bool Iniciado = false;
|
||||
|
||||
void Inicializar() {
|
||||
if (Iniciado) {
|
||||
EnviarDadosSerial(_ID + " ja inicializado");
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (_pino > -1) {
|
||||
pinMode(_pino, INPUT);
|
||||
}
|
||||
|
||||
kalmanTEN = new SimpleKalmanFilter(2, 2, 0.01);
|
||||
|
||||
xTaskCreatePinnedToCore(&SensorTensao::SVTaskWrapper, "SVTask", 5000, this, _prioridade, &SVTaskHandle, tskNO_AFFINITY);
|
||||
|
||||
EnviarDadosSerial(_ID + " Iniciado");
|
||||
|
||||
Iniciado = true;
|
||||
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||
}
|
||||
|
||||
void Desligar() {
|
||||
if (!Iniciado) {
|
||||
EnviarDadosSerial(_ID + " nao esta inicializado");
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||
return;
|
||||
}
|
||||
|
||||
// Parar a execução das tarefas
|
||||
vTaskDelete(SVTaskHandle);
|
||||
|
||||
// Redefinir as configurações para os valores iniciais
|
||||
pinMode(_pino, INPUT);
|
||||
|
||||
delete kalmanTEN;
|
||||
|
||||
EnviarDadosSerial(_ID + " Desligado");
|
||||
|
||||
Iniciado = false;
|
||||
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||
}
|
||||
|
||||
private:
|
||||
TaskHandle_t SVTaskHandle = NULL;
|
||||
static void SVTaskWrapper(void *pvParameters) {
|
||||
SensorTensao *sensor = static_cast<SensorTensao*>(pvParameters);
|
||||
sensor->SVTask();
|
||||
}
|
||||
|
||||
void SVTask() {
|
||||
unsigned long firstMilis = millis();
|
||||
while (1)
|
||||
{
|
||||
if (!Conectado) {
|
||||
// Caso não esteja conectado, aguarda 1 segundo até a próxima verificação, liberando uso de CPU
|
||||
vTaskDelay(1000);
|
||||
continue;
|
||||
}
|
||||
|
||||
long intMillis = (millis() - firstMilis);
|
||||
|
||||
// A cada _TaxaAmostragem, enviar os dados para o software
|
||||
if (intMillis >= (_TaxaAmostragem + _delayAmostragem)) {
|
||||
AferirTensao();
|
||||
|
||||
firstMilis = millis();
|
||||
}
|
||||
|
||||
// Aguarda metade do menor período possível entre leituras
|
||||
vTaskDelay(1);
|
||||
}
|
||||
}
|
||||
|
||||
void AferirTensao() {
|
||||
float Razao = (R1 + R2) / (float)R2;
|
||||
int adcV = analogRead(_pino);
|
||||
float adcValueV = kalmanTEN->updateEstimate(adcV);
|
||||
|
||||
float voltageV = (adcValueV * (Vcc / 4095.0)) + (Voffset / Razao); // Convertendo o valor ADC para tensão
|
||||
float realVoltage = voltageV * Razao;
|
||||
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sTEN, _ID, MontarDadosProtocoloTensao(adcValueV, voltageV, realVoltage)));
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
Sensor sVBAT("VBAT");
|
||||
Sensor sABAT("ABAT");
|
||||
class SensorCorrente {
|
||||
public:
|
||||
SensorCorrente(String desc) {
|
||||
_ID = desc;
|
||||
}
|
||||
|
||||
// Variáveis
|
||||
const float Vcc = 3.3; // Tensão de alimentação
|
||||
float Voffset = 0.413;
|
||||
float sensibilidade = 0.35;
|
||||
|
||||
// Definições
|
||||
String _ID;
|
||||
S_Code _componente = sCOR;
|
||||
int _pino;
|
||||
int _delayAmostragem;
|
||||
int _prioridade;
|
||||
|
||||
SimpleKalmanFilter* kalmanCOR;
|
||||
|
||||
bool Iniciado = false;
|
||||
|
||||
void Inicializar() {
|
||||
if (Iniciado) {
|
||||
EnviarDadosSerial(_ID + " ja inicializado");
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (_pino > -1) {
|
||||
pinMode(_pino, INPUT);
|
||||
}
|
||||
|
||||
kalmanCOR = new SimpleKalmanFilter(2, 2, 0.01);
|
||||
|
||||
xTaskCreatePinnedToCore(&SensorCorrente::SATaskWrapper, "SATask", 5000, this, _prioridade, &SATaskHandle, tskNO_AFFINITY);
|
||||
|
||||
EnviarDadosSerial(_ID + " Iniciado");
|
||||
|
||||
Iniciado = true;
|
||||
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||
}
|
||||
|
||||
void Desligar() {
|
||||
if (!Iniciado) {
|
||||
EnviarDadosSerial(_ID + " nao esta inicializado");
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||
return;
|
||||
}
|
||||
|
||||
// Parar a execução das tarefas
|
||||
vTaskDelete(SATaskHandle);
|
||||
|
||||
// Redefinir as configurações para os valores iniciais
|
||||
pinMode(_pino, INPUT);
|
||||
|
||||
delete kalmanCOR;
|
||||
|
||||
EnviarDadosSerial(_ID + " Desligado");
|
||||
|
||||
Iniciado = false;
|
||||
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||
}
|
||||
|
||||
private:
|
||||
TaskHandle_t SATaskHandle = NULL;
|
||||
static void SATaskWrapper(void *pvParameters) {
|
||||
SensorCorrente *sensor = static_cast<SensorCorrente*>(pvParameters);
|
||||
sensor->SATask();
|
||||
}
|
||||
|
||||
void SATask() {
|
||||
unsigned long firstMilis = millis();
|
||||
while (1)
|
||||
{
|
||||
if (!Conectado) {
|
||||
// Caso não esteja conectado, aguarda 1 segundo até a próxima verificação, liberando uso de CPU
|
||||
vTaskDelay(1000);
|
||||
continue;
|
||||
}
|
||||
|
||||
long intMillis = (millis() - firstMilis);
|
||||
|
||||
// A cada _TaxaAmostragem, enviar os dados para o software
|
||||
if (intMillis >= (_TaxaAmostragem + _delayAmostragem)) {
|
||||
AferirCorrente();
|
||||
|
||||
firstMilis = millis();
|
||||
}
|
||||
|
||||
// Aguarda metade do menor período possível entre leituras
|
||||
vTaskDelay(1);
|
||||
}
|
||||
}
|
||||
|
||||
void AferirCorrente() {
|
||||
int adcV = analogRead(_pino);
|
||||
float adcValue = kalmanCOR->updateEstimate(adcV);
|
||||
|
||||
float voltage = adcValue * (Vcc / 4095.0); // Convertendo o valor ADC para tensão
|
||||
float current = (voltage - Voffset) / sensibilidade; // Calculando a corrente em A
|
||||
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCOR, _ID, MontarDadosProtocoloCorrente(adcValue, voltage, current)));
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
SensorTemperatura TM1("TMVET");
|
||||
SensorTemperatura TM2("TMVEF");
|
||||
SensorTemperatura TM3("TMVDT");
|
||||
SensorTemperatura TM4("TMVDF");
|
||||
SensorTensao VBAT("VBAT ");
|
||||
SensorCorrente ABAT("ABAT ");
|
||||
|
||||
|
||||
SensorTemperatura* STPorID(String ID) {
|
||||
SensorTemperatura* _sensor =
|
||||
ID == "TMVET" ? &TM1 :
|
||||
ID == "TMVEF" ? &TM2 :
|
||||
ID == "TMVDT" ? &TM3 :
|
||||
ID == "TMVDF" ? &TM4 :
|
||||
nullptr;
|
||||
return _sensor;
|
||||
}
|
||||
|
||||
SensorTensao* SVPorID(String ID) {
|
||||
SensorTensao* _sensor =
|
||||
ID == "VBAT " ? &VBAT :
|
||||
nullptr;
|
||||
return _sensor;
|
||||
}
|
||||
|
||||
SensorCorrente* SAPorID(String ID) {
|
||||
SensorCorrente* _sensor =
|
||||
ID == "ABAT " ? &ABAT :
|
||||
nullptr;
|
||||
return _sensor;
|
||||
}
|
||||
|
||||
void setup() {
|
||||
Serial.begin(_baudRate);
|
||||
|
|
@ -176,59 +408,91 @@ void loop() {
|
|||
|
||||
if (_funcao == Chk) {
|
||||
EnviarDadosSerial(MontarProtocoloVerificacao(D_Code));
|
||||
}
|
||||
else if (_funcao == Cfg) {
|
||||
String ID = ((String)Protocolo[0] + (String)Protocolo[1]);
|
||||
bool Conectar = (String)Protocolo[3] == "1";
|
||||
if (ID == "MD") {
|
||||
_TaxaAmostragem = ((String)Protocolo[5] + (String)Protocolo[6] + (String)Protocolo[7] + (String)Protocolo[8] + (String)Protocolo[9]).toInt();
|
||||
} else if (_funcao == Cfg) {
|
||||
String ID = ((String)Protocolo[0] + (String)Protocolo[1] + (String)Protocolo[2] + (String)Protocolo[3] + (String)Protocolo[4]);
|
||||
bool Conectar = (String)Protocolo[6] == "1";
|
||||
if (ID == "MD ") {
|
||||
_TaxaAmostragem = ((String)Protocolo[8] + (String)Protocolo[9] + (String)Protocolo[10] + (String)Protocolo[11] + (String)Protocolo[12]).toInt();
|
||||
|
||||
vTaskDelay(pdMS_TO_TICKS(100));
|
||||
Conectado = Conectar;
|
||||
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, "MD", Conectado ? "1" : "0"));
|
||||
}
|
||||
else {
|
||||
Sensor* _sensor = ID == "VBAT" ? &sVBAT : ID == "ABAT" ? &sABAT : nullptr;
|
||||
S_Code componente = (S_Code)((String)Protocolo[8] + (String)Protocolo[9] + (String)Protocolo[10]).toInt();
|
||||
bool sensor_ativado = (String)Protocolo[12] == "1";
|
||||
int delayAmostragem = ((String)Protocolo[14] + (String)Protocolo[15] + (String)Protocolo[16] + (String)Protocolo[17] + (String)Protocolo[18]).toInt();
|
||||
int prioridade = ((String)Protocolo[20] + (String)Protocolo[21]).toInt();
|
||||
int pino = ((String)Protocolo[23] + (String)Protocolo[24]).toInt();
|
||||
|
||||
switch (componente) {
|
||||
case sTMP: {
|
||||
SensorTemperatura* _sensor = STPorID(ID);
|
||||
if (sensor_ativado) {
|
||||
if (Conectar) {
|
||||
_sensor->_pino = pino;
|
||||
_sensor->_prioridade = prioridade;
|
||||
_sensor->_delayAmostragem = delayAmostragem;
|
||||
|
||||
_sensor->Inicializar();
|
||||
}
|
||||
else {
|
||||
_sensor->Desligar();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case sTEN: {
|
||||
SensorTensao* _sensor = SVPorID(ID);
|
||||
if (sensor_ativado) {
|
||||
double _voffset = ((String)Protocolo[26] + (String)Protocolo[27] + (String)Protocolo[28] + (String)Protocolo[29] + (String)Protocolo[30] + (String)Protocolo[31]).toDouble();
|
||||
double _r1 = ((String)Protocolo[33] + (String)Protocolo[34] + (String)Protocolo[35] + (String)Protocolo[36] + (String)Protocolo[37] + (String)Protocolo[38]).toDouble();
|
||||
double _r2 = ((String)Protocolo[40] + (String)Protocolo[41] + (String)Protocolo[42] + (String)Protocolo[43] + (String)Protocolo[44] + (String)Protocolo[45]).toDouble();
|
||||
_sensor->Voffset = (float)_voffset;
|
||||
_sensor->R1 = (int)_r1;
|
||||
_sensor->R2 = (int)_r2;
|
||||
if (Conectar) {
|
||||
_sensor->_pino = pino;
|
||||
_sensor->_prioridade = prioridade;
|
||||
_sensor->_delayAmostragem = delayAmostragem;
|
||||
|
||||
_sensor->Inicializar();
|
||||
}
|
||||
else {
|
||||
_sensor->Desligar();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case sCOR: {
|
||||
SensorCorrente* _sensor = SAPorID(ID);
|
||||
if (sensor_ativado) {
|
||||
double _voffset = ((String)Protocolo[26] + (String)Protocolo[27] + (String)Protocolo[28] + (String)Protocolo[29] + (String)Protocolo[30] + (String)Protocolo[31]).toDouble();
|
||||
double _sensibilidade = ((String)Protocolo[33] + (String)Protocolo[34] + (String)Protocolo[35] + (String)Protocolo[36] + (String)Protocolo[37] + (String)Protocolo[38]).toDouble();
|
||||
_sensor->Voffset = (float)_voffset;
|
||||
_sensor->sensibilidade = (float)_sensibilidade;
|
||||
if (Conectar) {
|
||||
_sensor->_pino = pino;
|
||||
_sensor->_prioridade = prioridade;
|
||||
_sensor->_delayAmostragem = delayAmostragem;
|
||||
|
||||
_sensor->Inicializar();
|
||||
}
|
||||
else {
|
||||
_sensor->Desligar();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (_sensor == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
S_Code componente = (S_Code)((String)Protocolo[5]).toInt();
|
||||
int prioridade = ((String)Protocolo[7] + (String)Protocolo[8]).toInt();
|
||||
int delayAmostragem = ((String)Protocolo[10] + (String)Protocolo[11] + (String)Protocolo[12] + (String)Protocolo[13] + (String)Protocolo[14]).toInt();
|
||||
bool aferir = ((String)Protocolo[16]) == "1";
|
||||
bool i2c = ((String)Protocolo[18]) == "1";
|
||||
int lei_1 = ((String)Protocolo[20] + (String)Protocolo[21]).toInt();
|
||||
int lei_2 = ((String)Protocolo[23] + (String)Protocolo[24]).toInt();
|
||||
int lei_3 = ((String)Protocolo[26] + (String)Protocolo[27]).toInt();
|
||||
int lei_4 = ((String)Protocolo[29] + (String)Protocolo[30]).toInt();
|
||||
|
||||
if (aferir) {
|
||||
if (Conectar) {
|
||||
_sensor->_prioridade = prioridade;
|
||||
_sensor->_delayAmostragem = delayAmostragem;
|
||||
_sensor->_I2C = i2c;
|
||||
_sensor->_pinoLeitura1 = lei_1;
|
||||
_sensor->_pinoLeitura2 = lei_2;
|
||||
_sensor->_pinoLeitura3 = lei_3;
|
||||
_sensor->_pinoLeitura4 = lei_4;
|
||||
_sensor->Inicializar();
|
||||
}
|
||||
else {
|
||||
_sensor->Desligar();
|
||||
}
|
||||
vTaskDelay(pdMS_TO_TICKS(500));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
else if (_funcao == Cmd) {
|
||||
|
||||
}
|
||||
else if (_funcao == Tst) {
|
||||
|
||||
}
|
||||
|
||||
} else if (_funcao == Cmd) {
|
||||
|
||||
} else if (_funcao == Tst) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -93,4 +93,20 @@ String MontarDadosProtocoloNTC10K(float temperatura) {
|
|||
return Protocolo;
|
||||
}
|
||||
|
||||
String MontarDadosProtocoloTensao(float leitura, float vPin, float vReal) {
|
||||
String Protocolo =
|
||||
(String)leitura + ";" +
|
||||
(String)vPin + ";" +
|
||||
(String)vReal;
|
||||
return Protocolo;
|
||||
}
|
||||
|
||||
String MontarDadosProtocoloCorrente(float leitura, float vPin, float corrente) {
|
||||
String Protocolo =
|
||||
(String)leitura + ";" +
|
||||
(String)vPin + ";" +
|
||||
(String)corrente;
|
||||
return Protocolo;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -429,6 +429,16 @@ Motor M2("EF");
|
|||
Motor M3("DT");
|
||||
Motor M4("DF");
|
||||
|
||||
Motor* MotorPorID(String ID) {
|
||||
Motor* _motor =
|
||||
ID == "ET" ? &M1 :
|
||||
ID == "EF" ? &M2 :
|
||||
ID == "DT" ? &M3 :
|
||||
ID == "DF" ? &M4 :
|
||||
nullptr;
|
||||
return _motor;
|
||||
}
|
||||
|
||||
void setup() {
|
||||
Serial.begin(_baudRate);
|
||||
|
||||
|
|
@ -503,7 +513,7 @@ void loop() {
|
|||
int hallB = ((String)Protocolo[44] + (String)Protocolo[45]).toInt();
|
||||
int hallC = ((String)Protocolo[47] + (String)Protocolo[48]).toInt();
|
||||
|
||||
Motor* _motor = ID == "ET" ? &M1 : ID == "EF" ? &M2 : ID == "DT" ? &M3 : &M4;
|
||||
Motor* _motor = MotorPorID(ID);
|
||||
if (motor_ativado) {
|
||||
if (Conectar) {
|
||||
_motor->_canal = canal;
|
||||
|
|
@ -533,7 +543,7 @@ void loop() {
|
|||
//0;000;0;000;000;000
|
||||
String ID = ((String)Protocolo[0] + (String)Protocolo[1]);
|
||||
|
||||
Motor* _motor = ID == "ET" ? &M1 : ID == "EF" ? &M2 : ID == "DT" ? &M3 : &M4;
|
||||
Motor* _motor = MotorPorID(ID);
|
||||
|
||||
_motor->_SentidoSP = (Sentido)((String)Protocolo[3]).toInt();
|
||||
_motor->_RPM_SP = ((String)Protocolo[5] + (String)Protocolo[6] + (String)Protocolo[7]).toInt();
|
||||
|
|
@ -548,7 +558,7 @@ void loop() {
|
|||
else if (_funcao == Tst) {
|
||||
String ID = ((String)Protocolo[0] +(String)Protocolo[1]);
|
||||
|
||||
Motor* _motor = ID == "ET" ? &M1 : ID == "EF" ? &M2 : ID == "DT" ? &M3 : &M4;
|
||||
Motor* _motor = MotorPorID(ID);
|
||||
|
||||
bool EmTeste = _motor->Testando;
|
||||
if (!EmTeste) {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,10 @@
|
|||
#include "C:\Zendion Inc\agrobot_base\Firmware\Modulos\SerialService.h"
|
||||
#include "C:\Zendion Inc\agrobot_base\Firmware\Modulos\MemoryService.h"
|
||||
#include "C:\Zendion Inc\agrobot_base\Firmware\Modulos\utils.h"
|
||||
// Dispositivo: Movimentação
|
||||
// Versão Firmware: 9
|
||||
// Ultima atualização: 21/11/2023
|
||||
|
||||
#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\SerialService.h"
|
||||
#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\MemoryService.h"
|
||||
#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\utils.h"
|
||||
#include <PID_v1.h>
|
||||
#include "DHT.h"
|
||||
#define D_Code Mov
|
||||
|
|
|
|||
|
|
@ -0,0 +1,494 @@
|
|||
#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\SerialService.h"
|
||||
|
||||
#include <SimpleKalmanFilter.h>
|
||||
|
||||
#define D_Code Sen
|
||||
|
||||
#define _pinoLED RGB_BUILTIN
|
||||
|
||||
long _baudRate = 115200;
|
||||
|
||||
bool Conectado = false;
|
||||
|
||||
int _TaxaAmostragem;
|
||||
int FrequenciaMaxima = 10000;
|
||||
|
||||
|
||||
class SensorTemperatura {
|
||||
public:
|
||||
SensorTemperatura(String desc) {
|
||||
_ID = desc;
|
||||
}
|
||||
|
||||
// Definições
|
||||
String _ID;
|
||||
S_Code _componente = sTMP;
|
||||
int _pino;
|
||||
int _delayAmostragem;
|
||||
int _prioridade;
|
||||
|
||||
bool Iniciado = false;
|
||||
|
||||
void Inicializar() {
|
||||
if (Iniciado) {
|
||||
EnviarDadosSerial(_ID + " ja inicializado");
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (_pino > -1) {
|
||||
pinMode(_pino, INPUT);
|
||||
}
|
||||
|
||||
xTaskCreatePinnedToCore(&SensorTemperatura::STTaskWrapper, "STTask", 5000, this, _prioridade, &STTaskHandle, tskNO_AFFINITY);
|
||||
|
||||
EnviarDadosSerial(_ID + " Iniciado");
|
||||
|
||||
Iniciado = true;
|
||||
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||
}
|
||||
|
||||
void Desligar() {
|
||||
if (!Iniciado) {
|
||||
EnviarDadosSerial(_ID + " nao esta inicializado");
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||
return;
|
||||
}
|
||||
|
||||
// Parar a execução das tarefas
|
||||
vTaskDelete(STTaskHandle);
|
||||
|
||||
// Redefinir as configurações para os valores iniciais
|
||||
pinMode(_pino, INPUT);
|
||||
|
||||
EnviarDadosSerial(_ID + " Desligado");
|
||||
|
||||
Iniciado = false;
|
||||
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
// Variáveis
|
||||
double Vs = 3.3; // TENSÃO DE SAIDA DO ESP32
|
||||
double R1 = 10000; //RESISTOR UTILIZADO NO DIVISOR DE TENSÃO
|
||||
double Beta = 3950; // VALOR DE BETA
|
||||
double To = 298.15; // VALOR EM KELVIN REFERENTE A 25° CELSIUS
|
||||
double Ro = 10000;
|
||||
double adcMax = 4095.0;
|
||||
|
||||
TaskHandle_t STTaskHandle = NULL;
|
||||
static void STTaskWrapper(void *pvParameters) {
|
||||
SensorTemperatura *sensor = static_cast<SensorTemperatura*>(pvParameters);
|
||||
sensor->STTask();
|
||||
}
|
||||
|
||||
void STTask() {
|
||||
unsigned long firstMilis = millis();
|
||||
while (1)
|
||||
{
|
||||
if (!Conectado) {
|
||||
// Caso não esteja conectado, aguarda 1 segundo até a próxima verificação, liberando uso de CPU
|
||||
vTaskDelay(1000);
|
||||
continue;
|
||||
}
|
||||
|
||||
long intMillis = (millis() - firstMilis);
|
||||
|
||||
// A cada _TaxaAmostragem, enviar os dados para o software
|
||||
if (intMillis >= (_TaxaAmostragem + _delayAmostragem)) {
|
||||
AferirTemperatura();
|
||||
|
||||
firstMilis = millis();
|
||||
}
|
||||
|
||||
// Aguarda metade do menor período possível entre leituras
|
||||
vTaskDelay(1);
|
||||
}
|
||||
}
|
||||
|
||||
void AferirTemperatura() {
|
||||
double Vout, Rt = 0;
|
||||
double T, Tc, Tf, adc = 0;
|
||||
adc = analogRead(_pino); // VARIÁVEL QUE RECEBE A LEITURA DO NTC10K
|
||||
//float adcValue = tempKalman->updateEstimate(adc);
|
||||
float adcValue = adc;
|
||||
//CALCULOS PARA CONVERSÃO DA LEITURA RECEBIDA PELO ESP32 EM TEMPERATURA EM °C
|
||||
Vout = adcValue * Vs / adcMax;
|
||||
Rt = R1 * Vout / (Vs - Vout);
|
||||
T = 1 / (1 / To + log(Rt / Ro) / Beta);
|
||||
Tc = T - 273.15;
|
||||
Tf = Tc * 9 / 5 + 32;
|
||||
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sTMP, _ID, MontarDadosProtocoloNTC10K(Tc)));
|
||||
}
|
||||
};
|
||||
|
||||
class SensorTensao {
|
||||
public:
|
||||
SensorTensao(String desc) {
|
||||
_ID = desc;
|
||||
}
|
||||
|
||||
// Variáveis
|
||||
const float Vcc = 3.3; // Tensão de alimentação
|
||||
float Voffset = 0.85;
|
||||
int R1 = 47000;
|
||||
int R2 = 10000;
|
||||
|
||||
// Definições
|
||||
String _ID;
|
||||
S_Code _componente = sTEN;
|
||||
int _pino;
|
||||
int _delayAmostragem;
|
||||
int _prioridade;
|
||||
|
||||
SimpleKalmanFilter* kalmanTEN;
|
||||
|
||||
bool Iniciado = false;
|
||||
|
||||
void Inicializar() {
|
||||
if (Iniciado) {
|
||||
EnviarDadosSerial(_ID + " ja inicializado");
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (_pino > -1) {
|
||||
pinMode(_pino, INPUT);
|
||||
}
|
||||
|
||||
kalmanTEN = new SimpleKalmanFilter(2, 2, 0.01);
|
||||
|
||||
xTaskCreatePinnedToCore(&SensorTensao::SVTaskWrapper, "SVTask", 5000, this, _prioridade, &SVTaskHandle, tskNO_AFFINITY);
|
||||
|
||||
EnviarDadosSerial(_ID + " Iniciado");
|
||||
|
||||
Iniciado = true;
|
||||
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||
}
|
||||
|
||||
void Desligar() {
|
||||
if (!Iniciado) {
|
||||
EnviarDadosSerial(_ID + " nao esta inicializado");
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||
return;
|
||||
}
|
||||
|
||||
// Parar a execução das tarefas
|
||||
vTaskDelete(SVTaskHandle);
|
||||
|
||||
// Redefinir as configurações para os valores iniciais
|
||||
pinMode(_pino, INPUT);
|
||||
|
||||
delete kalmanTEN;
|
||||
|
||||
EnviarDadosSerial(_ID + " Desligado");
|
||||
|
||||
Iniciado = false;
|
||||
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||
}
|
||||
|
||||
private:
|
||||
TaskHandle_t SVTaskHandle = NULL;
|
||||
static void SVTaskWrapper(void *pvParameters) {
|
||||
SensorTensao *sensor = static_cast<SensorTensao*>(pvParameters);
|
||||
sensor->SVTask();
|
||||
}
|
||||
|
||||
void SVTask() {
|
||||
unsigned long firstMilis = millis();
|
||||
while (1)
|
||||
{
|
||||
if (!Conectado) {
|
||||
// Caso não esteja conectado, aguarda 1 segundo até a próxima verificação, liberando uso de CPU
|
||||
vTaskDelay(1000);
|
||||
continue;
|
||||
}
|
||||
|
||||
long intMillis = (millis() - firstMilis);
|
||||
|
||||
// A cada _TaxaAmostragem, enviar os dados para o software
|
||||
if (intMillis >= (_TaxaAmostragem + _delayAmostragem)) {
|
||||
AferirTensao();
|
||||
|
||||
firstMilis = millis();
|
||||
}
|
||||
|
||||
// Aguarda metade do menor período possível entre leituras
|
||||
vTaskDelay(1);
|
||||
}
|
||||
}
|
||||
|
||||
void AferirTensao() {
|
||||
float Razao = (R1 + R2) / (float)R2;
|
||||
int adcV = analogRead(_pino);
|
||||
float adcValueV = kalmanTEN->updateEstimate(adcV);
|
||||
|
||||
float voltageV = (adcValueV * (Vcc / 4095.0)) + (Voffset / Razao); // Convertendo o valor ADC para tensão
|
||||
float realVoltage = voltageV * Razao;
|
||||
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sTEN, _ID, MontarDadosProtocoloTensao(adcValueV, voltageV, realVoltage)));
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
class SensorCorrente {
|
||||
public:
|
||||
SensorCorrente(String desc) {
|
||||
_ID = desc;
|
||||
}
|
||||
|
||||
// Variáveis
|
||||
const float Vcc = 3.3; // Tensão de alimentação
|
||||
float Voffset = 0.413;
|
||||
float sensibilidade = 0.35;
|
||||
|
||||
// Definições
|
||||
String _ID;
|
||||
S_Code _componente = sCOR;
|
||||
int _pino;
|
||||
int _delayAmostragem;
|
||||
int _prioridade;
|
||||
|
||||
SimpleKalmanFilter* kalmanCOR;
|
||||
|
||||
bool Iniciado = false;
|
||||
|
||||
void Inicializar() {
|
||||
if (Iniciado) {
|
||||
EnviarDadosSerial(_ID + " ja inicializado");
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (_pino > -1) {
|
||||
pinMode(_pino, INPUT);
|
||||
}
|
||||
|
||||
kalmanCOR = new SimpleKalmanFilter(2, 2, 0.01);
|
||||
|
||||
xTaskCreatePinnedToCore(&SensorCorrente::SATaskWrapper, "SATask", 5000, this, _prioridade, &SATaskHandle, tskNO_AFFINITY);
|
||||
|
||||
EnviarDadosSerial(_ID + " Iniciado");
|
||||
|
||||
Iniciado = true;
|
||||
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||
}
|
||||
|
||||
void Desligar() {
|
||||
if (!Iniciado) {
|
||||
EnviarDadosSerial(_ID + " nao esta inicializado");
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||
return;
|
||||
}
|
||||
|
||||
// Parar a execução das tarefas
|
||||
vTaskDelete(SATaskHandle);
|
||||
|
||||
// Redefinir as configurações para os valores iniciais
|
||||
pinMode(_pino, INPUT);
|
||||
|
||||
delete kalmanCOR;
|
||||
|
||||
EnviarDadosSerial(_ID + " Desligado");
|
||||
|
||||
Iniciado = false;
|
||||
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
||||
}
|
||||
|
||||
private:
|
||||
TaskHandle_t SATaskHandle = NULL;
|
||||
static void SATaskWrapper(void *pvParameters) {
|
||||
SensorCorrente *sensor = static_cast<SensorCorrente*>(pvParameters);
|
||||
sensor->SATask();
|
||||
}
|
||||
|
||||
void SATask() {
|
||||
unsigned long firstMilis = millis();
|
||||
while (1)
|
||||
{
|
||||
if (!Conectado) {
|
||||
// Caso não esteja conectado, aguarda 1 segundo até a próxima verificação, liberando uso de CPU
|
||||
vTaskDelay(1000);
|
||||
continue;
|
||||
}
|
||||
|
||||
long intMillis = (millis() - firstMilis);
|
||||
|
||||
// A cada _TaxaAmostragem, enviar os dados para o software
|
||||
if (intMillis >= (_TaxaAmostragem + _delayAmostragem)) {
|
||||
AferirCorrente();
|
||||
|
||||
firstMilis = millis();
|
||||
}
|
||||
|
||||
// Aguarda metade do menor período possível entre leituras
|
||||
vTaskDelay(1);
|
||||
}
|
||||
}
|
||||
|
||||
void AferirCorrente() {
|
||||
int adcV = analogRead(_pino);
|
||||
float adcValue = kalmanCOR->updateEstimate(adcV);
|
||||
|
||||
float voltage = adcValue * (Vcc / 4095.0); // Convertendo o valor ADC para tensão
|
||||
float current = (voltage - Voffset) / sensibilidade; // Calculando a corrente em A
|
||||
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCOR, _ID, MontarDadosProtocoloCorrente(adcValue, voltage, current)));
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
SensorTemperatura TM1("TMVET");
|
||||
SensorTemperatura TM2("TMVEF");
|
||||
SensorTemperatura TM3("TMVDT");
|
||||
SensorTemperatura TM4("TMVDF");
|
||||
SensorTensao VBAT("VBAT ");
|
||||
SensorCorrente ABAT("ABAT ");
|
||||
|
||||
|
||||
SensorTemperatura* STPorID(String ID) {
|
||||
SensorTemperatura* _sensor =
|
||||
ID == "TMVET" ? &TM1 :
|
||||
ID == "TMVEF" ? &TM2 :
|
||||
ID == "TMVDT" ? &TM3 :
|
||||
ID == "TMVDF" ? &TM4 :
|
||||
nullptr;
|
||||
return _sensor;
|
||||
}
|
||||
|
||||
SensorTensao* SVPorID(String ID) {
|
||||
SensorTensao* _sensor =
|
||||
ID == "VBAT " ? &VBAT :
|
||||
nullptr;
|
||||
return _sensor;
|
||||
}
|
||||
|
||||
SensorCorrente* SAPorID(String ID) {
|
||||
SensorCorrente* _sensor =
|
||||
ID == "ABAT " ? &ABAT :
|
||||
nullptr;
|
||||
return _sensor;
|
||||
}
|
||||
|
||||
void setup() {
|
||||
Serial.begin(_baudRate);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
if (Serial.available() > 3) {
|
||||
String Protocolo = "";
|
||||
F_Code _funcao = Nda;
|
||||
while (Serial.available()) {
|
||||
char Entrada = (char)Serial.read();
|
||||
if (Entrada == EndLine) {
|
||||
break;
|
||||
}
|
||||
Protocolo += Entrada;
|
||||
if (Protocolo.length() == 3) {
|
||||
if (_funcao == Nda) {
|
||||
_funcao = (F_Code)((String)Protocolo[0] + (String)Protocolo[1] + (String)Protocolo[2]).toInt();
|
||||
Protocolo = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
EnviarDadosSerial("OK");
|
||||
|
||||
if (_funcao == Chk) {
|
||||
EnviarDadosSerial(MontarProtocoloVerificacao(D_Code));
|
||||
} else if (_funcao == Cfg) {
|
||||
String ID = ((String)Protocolo[0] + (String)Protocolo[1] + (String)Protocolo[2] + (String)Protocolo[3] + (String)Protocolo[4]);
|
||||
bool Conectar = (String)Protocolo[6] == "1";
|
||||
if (ID == "MD ") {
|
||||
_TaxaAmostragem = ((String)Protocolo[8] + (String)Protocolo[9] + (String)Protocolo[10] + (String)Protocolo[11] + (String)Protocolo[12]).toInt();
|
||||
|
||||
vTaskDelay(pdMS_TO_TICKS(100));
|
||||
Conectado = Conectar;
|
||||
EnviarDadosSerial(MontarProtocoloSensor(sCFG, "MD", Conectado ? "1" : "0"));
|
||||
}
|
||||
else {
|
||||
S_Code componente = (S_Code)((String)Protocolo[8] + (String)Protocolo[9] + (String)Protocolo[10]).toInt();
|
||||
bool sensor_ativado = (String)Protocolo[12] == "1";
|
||||
int delayAmostragem = ((String)Protocolo[14] + (String)Protocolo[15] + (String)Protocolo[16] + (String)Protocolo[17] + (String)Protocolo[18]).toInt();
|
||||
int prioridade = ((String)Protocolo[20] + (String)Protocolo[21]).toInt();
|
||||
int pino = ((String)Protocolo[23] + (String)Protocolo[24]).toInt();
|
||||
|
||||
switch (componente) {
|
||||
case sTMP: {
|
||||
SensorTemperatura* _sensor = STPorID(ID);
|
||||
if (sensor_ativado) {
|
||||
if (Conectar) {
|
||||
_sensor->_pino = pino;
|
||||
_sensor->_prioridade = prioridade;
|
||||
_sensor->_delayAmostragem = delayAmostragem;
|
||||
|
||||
_sensor->Inicializar();
|
||||
}
|
||||
else {
|
||||
_sensor->Desligar();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case sTEN: {
|
||||
SensorTensao* _sensor = SVPorID(ID);
|
||||
if (sensor_ativado) {
|
||||
double _voffset = ((String)Protocolo[26] + (String)Protocolo[27] + (String)Protocolo[28] + (String)Protocolo[29] + (String)Protocolo[30] + (String)Protocolo[31]).toDouble();
|
||||
double _r1 = ((String)Protocolo[33] + (String)Protocolo[34] + (String)Protocolo[35] + (String)Protocolo[36] + (String)Protocolo[37] + (String)Protocolo[38]).toDouble();
|
||||
double _r2 = ((String)Protocolo[40] + (String)Protocolo[41] + (String)Protocolo[42] + (String)Protocolo[43] + (String)Protocolo[44] + (String)Protocolo[45]).toDouble();
|
||||
_sensor->Voffset = (float)_voffset;
|
||||
_sensor->R1 = (int)_r1;
|
||||
_sensor->R2 = (int)_r2;
|
||||
if (Conectar) {
|
||||
_sensor->_pino = pino;
|
||||
_sensor->_prioridade = prioridade;
|
||||
_sensor->_delayAmostragem = delayAmostragem;
|
||||
|
||||
_sensor->Inicializar();
|
||||
}
|
||||
else {
|
||||
_sensor->Desligar();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case sCOR: {
|
||||
SensorCorrente* _sensor = SAPorID(ID);
|
||||
if (sensor_ativado) {
|
||||
double _voffset = ((String)Protocolo[26] + (String)Protocolo[27] + (String)Protocolo[28] + (String)Protocolo[29] + (String)Protocolo[30] + (String)Protocolo[31]).toDouble();
|
||||
double _sensibilidade = ((String)Protocolo[33] + (String)Protocolo[34] + (String)Protocolo[35] + (String)Protocolo[36] + (String)Protocolo[37] + (String)Protocolo[38]).toDouble();
|
||||
_sensor->Voffset = (float)_voffset;
|
||||
_sensor->sensibilidade = (float)_sensibilidade;
|
||||
if (Conectar) {
|
||||
_sensor->_pino = pino;
|
||||
_sensor->_prioridade = prioridade;
|
||||
_sensor->_delayAmostragem = delayAmostragem;
|
||||
|
||||
_sensor->Inicializar();
|
||||
}
|
||||
else {
|
||||
_sensor->Desligar();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
} else if (_funcao == Cmd) {
|
||||
|
||||
} else if (_funcao == Tst) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -3,11 +3,8 @@
|
|||
SimpleKalmanFilter kalmanCOR(2, 2, 0.01);
|
||||
SimpleKalmanFilter kalmanTEN(2, 2, 0.01);
|
||||
|
||||
#define _pinoCOR 4
|
||||
#define _pinoTEN 34
|
||||
const float Vcc = 4.16; // Tensão de alimentação do ACS758
|
||||
const float Voffset = 0.502; // Tensão de offset do ACS758
|
||||
const float sensibilidade = 0.17; // Sensibilidade do ACS758 em V/A (40mV/A para este exemplo)
|
||||
#define _pinoCOR 25
|
||||
#define _pinoTEN 26
|
||||
|
||||
void setup() {
|
||||
Serial.begin(115200);
|
||||
|
|
@ -16,6 +13,17 @@ void setup() {
|
|||
}
|
||||
|
||||
void loop() {
|
||||
AferirCorrente();
|
||||
AferirTensao();
|
||||
|
||||
delay(100);
|
||||
}
|
||||
|
||||
void AferirCorrente() {
|
||||
const float Vcc = 3.3; // Tensão de alimentação do ACS758
|
||||
const float Voffset = 0.413; // Tensão de offset do ACS758
|
||||
const float sensibilidade = 0.35; // Sensibilidade do ACS758 em V/A (40mV/A para este exemplo)
|
||||
|
||||
int adcValueO = analogRead(_pinoCOR);
|
||||
float adcValue = kalmanCOR.updateEstimate(adcValueO);
|
||||
|
||||
|
|
@ -28,16 +36,24 @@ void loop() {
|
|||
Serial.print(voltage, 3); // Mostra a tensão com 3 casas decimais
|
||||
Serial.print(" Current: ");
|
||||
Serial.println(current, 3); // Mostra a corrente com 3 casas decimais
|
||||
|
||||
delay(100);
|
||||
}
|
||||
|
||||
void AferirTensao() {
|
||||
const float Vcc = 3.3; // Tensão de alimentação
|
||||
const float Voffset = 0.85;
|
||||
int R1 = 47000;
|
||||
int R2 = 10000;
|
||||
float Razao = (R1 + R2) / (float)R2;
|
||||
int adcV = analogRead(_pinoTEN);
|
||||
float adcValueV = kalmanTEN.updateEstimate(adcV);
|
||||
|
||||
float voltageV = adcValueV * (Vcc / 4095.0); // Convertendo o valor ADC para tensão
|
||||
float voltageV = (adcValueV * (Vcc / 4095.0)) + (Voffset / Razao); // Convertendo o valor ADC para tensão
|
||||
float realVoltage = voltageV * Razao;
|
||||
|
||||
Serial.print("Leitura: ");
|
||||
Serial.print(adcValueV);
|
||||
Serial.print(" - Tensao: ");
|
||||
Serial.println(voltageV);
|
||||
Serial.print(" - Tensao pino: ");
|
||||
Serial.print(voltageV);
|
||||
Serial.print(" - Tensão: ");
|
||||
Serial.println(realVoltage);
|
||||
}
|
||||
Loading…
Reference in New Issue