finalizacao integracao IMU GY-91

This commit is contained in:
Diego Freitas 2025-04-15 15:18:04 -03:00
parent 5941ee47ec
commit d0d07c8544
29 changed files with 326 additions and 150 deletions

Binary file not shown.

View File

@ -1119,22 +1119,8 @@ namespace AgroBase.Forms.IHM
},
new ColunasDiagnosticoModel()
{
Componente = "WIT MOTION",
Teste = "Conectado",
ValorPadrao = 1,
ComplementoValorPadrao = ComplementosPadrao[1]
},
new ColunasDiagnosticoModel()
{
Componente = "WIT MOTION",
Teste = "Inicializado",
ValorPadrao = 1,
ComplementoValorPadrao = ComplementosPadrao[1]
},
new ColunasDiagnosticoModel()
{
Componente = "WIT MOTION",
Teste = "Orientação Magnética",
Componente = "Módulo Sen",
Teste = "IMU",
ValorPadrao = 0,
ComplementoValorPadrao = "~"
},
@ -1269,13 +1255,8 @@ namespace AgroBase.Forms.IHM
double Corrente12V = S12V != null ? (double)S12V.Current : -1;
idx = PreencheDadosLinha(grid, Testes, idx, Corrente12V);
bool WitConectado = SerialService.DispositivosMapeados.Any(x => x.Dispositivo == Enums.T_Code.Wit);
idx = PreencheDadosLinha(grid, Testes, idx, WitConectado ? 1 : 0);
bool WitInicializado = WT901CService.Iniciado;
idx = PreencheDadosLinha(grid, Testes, idx, WitInicializado ? 1 : 0);
double Orientacao = WitInicializado ? WT901CService.DadosLeitura.AngleZ : -1;
var SImu = ((FirmwareSensorIMU)Modulo_Sen.Sensores.FirstOrDefault(x => x.ID == "GY-91").Leitura);
double Orientacao = SImu.Iniciado ? SImu.Yaw : -1;
idx = PreencheDadosLinha(grid, Testes, idx, Orientacao);
bool GpsConectado = SerialService.DispositivosMapeados.Any(x => x.Dispositivo == Enums.T_Code.Gps);

View File

@ -389,8 +389,9 @@ namespace AgroBase.Forms.Operacoes
{
try
{
double angulo = Variaveis.OperacaoEmAndamento.Sensoriamento.WitMotion.AnguloCorrigido;
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, -270);
double angulo = Variaveis.OperacaoEmAndamento.DispSen?.Dados?.DadosLeitura?.SensoresIMU?.FirstOrDefault()?.Yaw ?? -1;
double anguloCorrigido = Variaveis.OperacaoEmAndamento.DispSen?.Dados?.DadosLeitura?.SensoresIMU?.FirstOrDefault()?.YawFixed ?? -1;
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, -270, (float)anguloCorrigido);
}
catch { }
}

View File

@ -24,7 +24,6 @@ namespace AgroBase.Forms.Operacoes
List<AtuSensoriamentoLogModel> LogsAtuador = new List<AtuSensoriamentoLogModel>();
List<SensoriamentoMensagemJsonModel> LogsSensoriamento = new List<SensoriamentoMensagemJsonModel>();
List<PzmSensoriamentoLogModel> LogsPzem = new List<PzmSensoriamentoLogModel>();
List<WitSensoriamentoLogModel> LogsWt901C = new List<WitSensoriamentoLogModel>();
List<UltrasonicA05Model> LogsA05 = new List<UltrasonicA05Model>();
List<SonarCamModel> LogsSonar = new List<SonarCamModel>();
List<List<CamSoloSensoriamentoLogModel>> LogsCam_Solo = new List<List<CamSoloSensoriamentoLogModel>>();
@ -133,7 +132,6 @@ namespace AgroBase.Forms.Operacoes
LogsAtuador = JsonConvert.DeserializeObject<AtuSensoriamentoLogModel[]>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.atu ?? Enums.T_Code.Atu.ToString())).ToList();
LogsSensoriamento = JsonConvert.DeserializeObject<SensoriamentoMensagemJsonModel[]>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.sen ?? Enums.T_Code.Sen.ToString())).ToList();
LogsPzem = JsonConvert.DeserializeObject<PzmSensoriamentoLogModel[]>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.pzm ?? Enums.T_Code.Pzm.ToString())).ToList();
LogsWt901C = JsonConvert.DeserializeObject<WitSensoriamentoLogModel[]>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.wit ?? Enums.T_Code.Wit.ToString())).ToList();
LogsA05 = JsonConvert.DeserializeObject<UltrasonicA05Model[]>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.a05 ?? Enums.T_Code.A05.ToString())).ToList();
LogsSonar = JsonConvert.DeserializeObject<SonarCamModel[]>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.snr ?? Enums.T_Code.Snr.ToString())).ToList();
LogsCam_Caminho = JsonConvert.DeserializeObject<CamCaminhoSensoriamentoLogModel[]>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.cam_caminho)).ToList();
@ -1124,7 +1122,6 @@ namespace AgroBase.Forms.Operacoes
noModulos.Nodes.Add(AtualizarTextoStatusModulo(Enums.T_Code.Mov, LogsMovimentacao[idxMomentoAtual].Inicializado, LogsMovimentacao[idxMomentoAtual].UltimoComandoRespondido));
noModulos.Nodes.Add(AtualizarTextoStatusModulo(Enums.T_Code.Dir, LogsDirecional[idxMomentoAtual].Inicializado, LogsDirecional[idxMomentoAtual].UltimoComandoRespondido));
noModulos.Nodes.Add(AtualizarTextoStatusModulo(Enums.T_Code.Pzm, LogsPzem[idxMomentoAtual].Inicializado, LogsPzem[idxMomentoAtual].UltimoComandoRespondido));
noModulos.Nodes.Add(AtualizarTextoStatusModulo(Enums.T_Code.Wit, LogsWt901C[idxMomentoAtual].Inicializado, LogsWt901C[idxMomentoAtual].UltimoComandoRespondido));
noModulos.Nodes.Add(AtualizarTextoStatusModulo(Enums.T_Code.A05, LogsA05[idxMomentoAtual].Conectado, LogsA05[idxMomentoAtual].UltimoComandoRespondido));
noModulos.Nodes.Add(AtualizarTextoStatusModulo(Enums.T_Code.Gps, LogsGPS[idxMomentoAtual].Inicializado, LogsGPS[idxMomentoAtual].UltimoComandoRespondido));
//noModulos.Nodes.Add(AtualizarTextoStatusModulo(Enums.T_Code.Knt, LogsCam_Caminho[idxMomentoAtual].Inicializado, LogsCam_Caminho[idxMomentoAtual].UltimaMensagemRecebida));
@ -1377,14 +1374,17 @@ namespace AgroBase.Forms.Operacoes
txtSen_Maximo.Text = Valores.Max().ToString("0.00");
}
var LogWit = LogsWt901C.FirstOrDefault(x => x.Momento == MomentoAtual);
lblMagnetometro.ForeColor = !LogWit.Inicializado ? Color.Red : Color.Black;
var LogImu = LogsSensoriamento.FirstOrDefault(x => x.Momento == MomentoAtual).SensoresIMU.FirstOrDefault();
if (LogImu != null)
{
lblMagnetometro.ForeColor = !LogImu.Iniciado ? Color.Red : Color.Black;
pnlOrientacaoMagnetometro.Invalidate();
pnlInclinacao.Invalidate();
visualizador3D.AtualizarAngulos(-LogWit.AngleX, -LogWit.AngleY, LogWit.AngleZ);
txtTemperatura.Text = LogWit.Temperatura.ToString("0.00");
txtAltitude.Text = LogWit.Altitude.ToString("0.00");
txtPressao.Text = LogWit.Pressao + " Pa (" + (LogWit.Pressao / 101300.0).ToString("0.00") + " atm)";
visualizador3D.AtualizarAngulos(-LogImu.Roll, -LogImu.Pitch, LogImu.Yaw);
txtTemperatura.Text = LogImu.Temperatura.ToString("0.00");
txtAltitude.Text = LogImu.Altitude.ToString("0.00");
txtPressao.Text = LogImu.Pressao + " Pa (" + (LogImu.Pressao / 101300.0).ToString("0.00") + " atm)";
}
var LogSen = LogsSensoriamento.FirstOrDefault(x => x.Momento == MomentoAtual);
pnlManual.BackColor = LogSen.Sinaleiros?.FirstOrDefault(x => x.ID.Contains("MN"))?.Leitura == Enums.StatusLED.Aceso ? Color.Yellow : Color.Gold;
@ -1540,12 +1540,12 @@ namespace AgroBase.Forms.Operacoes
private void pnlOrientacaoMagnetometro_Paint(object sender, PaintEventArgs e)
{
var Log = LogsOperacao.FirstOrDefault(x => x.Momento == MomentoAtual);
var Log = LogsSensoriamento.FirstOrDefault(x => x.Momento == MomentoAtual).SensoresIMU.FirstOrDefault();
double AnguloWit = (Log?.WitMotion?.AngleZ ?? 0);
double AnguloWitCorrigido = (Log?.WitMotion.AnguloCorrigido ?? 0);
double Angulo = (Log?.Yaw ?? 0);
double AnguloCorrigido = (Log?.YawFixed ?? 0);
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)AnguloWit, 90, (float)AnguloWitCorrigido);
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)Angulo, 90.0f, (float)AnguloCorrigido);
}
private void pnlOrientacaoCaminho_Paint(object sender, PaintEventArgs e)
@ -1578,7 +1578,7 @@ namespace AgroBase.Forms.Operacoes
private void pnlInclinacao_Paint(object sender, PaintEventArgs e)
{
var Log = LogsWt901C.FirstOrDefault(x => x.Momento == MomentoAtual);
var Log = LogsSensoriamento.FirstOrDefault(x => x.Momento == MomentoAtual).SensoresIMU.FirstOrDefault();
Graphics g = e.Graphics;
int centerX = pnlInclinacao.Width / 2;
@ -1628,8 +1628,8 @@ namespace AgroBase.Forms.Operacoes
}
// Calcular a posição do círculo com base nos ângulos
int circlePosX = centerX + (int)((Log?.AngleX ?? 0) * (pnlInclinacao.Width / 2 - radius) / 90);
int circlePosY = centerY - (int)((Log?.AngleY ?? 0) * (pnlInclinacao.Height / 2 - radius) / 90);
int circlePosX = centerX + (int)((Log?.Roll ?? 0) * (pnlInclinacao.Width / 2 - radius) / 90);
int circlePosY = centerY - (int)((Log?.Pitch ?? 0) * (pnlInclinacao.Height / 2 - radius) / 90);
// Desenhar o círculo
Brush brush = new SolidBrush(Color.Red);

View File

@ -56,12 +56,6 @@ namespace AgroBase.Forms
lblUL_Pzm.Text = "Ultima Leitura PZM: " + PZEMService.UltimaLeitura.DataHora.ToString("HH:mm:ss");
lblTensao.Text = "Bateria: " + PZEMService.UltimaLeitura.Tensao.ToString("0.00") + " V - " + PZEMService.UltimaLeitura.Corrente.ToString("0.00") + " A - " + PZEMService.UltimaLeitura.Potencia.ToString("0.00") + " W";
}
lblUL_Wit.ForeColor = WT901CService.Iniciado ? Color.Green : Color.Red;
lblMagnetometro.ForeColor = WT901CService.Iniciado ? Color.Green : Color.Red;
if (WT901CService.Iniciado)
{
lblUL_Wit.Text = "Ultima Leitura WIT: " + WT901CService.DadosLeitura.Momento.ToString("HH:mm:ss");
}
lblUL_A05.ForeColor = UltrasonicA05Service.Iniciado ? Color.Green : Color.Red;
if (UltrasonicA05Service.Iniciado)
{
@ -79,10 +73,13 @@ namespace AgroBase.Forms
AtualizarDadosSensorCorrente("AB12V", lblB12V);
}
lblGPS.ForeColor = GPSService.Iniciado ? Color.Green : Color.Red;
if (GPSService.Iniciado)
lblMagnetometro.ForeColor = (Variaveis.OperacaoEmAndamento.DispSen?.Dados?.DadosLeitura?.SensoresIMU?.DefaultIfEmpty()?.FirstOrDefault()?.Iniciado ?? false) ? Color.Green : Color.Red;
var Gps = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps;
lblGPS.ForeColor = Gps.Inicializado ? Color.Green : Color.Red;
if (Gps.Inicializado)
{
lblGPSDetalhes.Text = GPSService.UltimaLeitura.QualidadeFix.ToString() + " - " + GPSService.UltimaLeitura.PrecisaoCm.ToString("0.00") + " cm";
lblGPSDetalhes.Text = Gps.QualidadeFix.ToString() + " - " + Gps.PrecisaoCm.ToString("0.00") + " cm";
}
lblPerformance.Text = Variaveis.OperacaoEmAndamento.DadosPerformance.PerformanceStr;
@ -393,9 +390,9 @@ namespace AgroBase.Forms
private void pnlOrientacaoMagnetometro_Paint(object sender, PaintEventArgs e)
{
double Angulo = Variaveis.OperacaoEmAndamento.Sensoriamento.WitMotion.AnguloCorrigido;
double AnguloCorrigido = Variaveis.OperacaoEmAndamento.Sensoriamento.WitMotion.AnguloCorrigido;
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)Angulo, -90, (float)AnguloCorrigido);
var Imu = Variaveis.OperacaoEmAndamento.DispSen?.Dados?.DadosLeitura?.SensoresIMU?.DefaultIfEmpty()?.FirstOrDefault();
double Angulo = Imu?.Yaw ?? 0;
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)Angulo, -90);
}

View File

@ -461,7 +461,7 @@ namespace AgroBase
private void btnWT901C_Click(object sender, EventArgs e)
{
if (WT901CService.Iniciado)
if (WT901CService.Iniciado || true)
{
frmWT901C frm = new frmWT901C();
frm.Show();

View File

@ -5,6 +5,7 @@ using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.Threading.Tasks;
using System.Linq;
namespace AgroBase.Forms
{
@ -58,10 +59,11 @@ namespace AgroBase.Forms
private async Task tmrLeitura_Tick()
{
AnguloX = Variaveis.OperacaoEmAndamento.Sensoriamento.WitMotion.AngleX;
AnguloY = Variaveis.OperacaoEmAndamento.Sensoriamento.WitMotion.AngleY;
AnguloZ = Variaveis.OperacaoEmAndamento.Sensoriamento.WitMotion.AngleZ;
OrientacaoMagnetica = Variaveis.OperacaoEmAndamento.Sensoriamento.WitMotion.AnguloCorrigido;
var Imu = Variaveis.OperacaoEmAndamento.DispSen?.Dados?.DadosLeitura?.SensoresIMU?.FirstOrDefault();
AnguloX = Imu?.Roll ?? 0;
AnguloY = Imu?.Pitch ?? 0;
AnguloZ = Imu?.Yaw ?? 0;
OrientacaoMagnetica = Imu?.YawFixed ?? 0;
AtualizarDadosTela();
}
@ -229,46 +231,46 @@ namespace AgroBase.Forms
txtY.Text = AnguloY.ToString("0.00");
txtZ.Text = AnguloZ.ToString("0.00");
gridDados.Rows[0].Cells[1].Value = WT901CService.DadosLeitura.Versao;
gridDados.Rows[1].Cells[1].Value = WT901CService.DadosLeitura.Modelo;
gridDados.Rows[2].Cells[1].Value = WT901CService.DadosLeitura.DataHora.ToString("dd/MM/yyyy");
gridDados.Rows[3].Cells[1].Value = WT901CService.DadosLeitura.DataHora.ToString("HH:mm:ss");
gridDados.Rows[4].Cells[1].Value = WT901CService.DadosLeitura.AccX;
gridDados.Rows[5].Cells[1].Value = WT901CService.DadosLeitura.AccY;
gridDados.Rows[6].Cells[1].Value = WT901CService.DadosLeitura.AccZ;
gridDados.Rows[7].Cells[1].Value = WT901CService.DadosLeitura.AccM;
gridDados.Rows[8].Cells[1].Value = WT901CService.DadosLeitura.AsX;
gridDados.Rows[9].Cells[1].Value = WT901CService.DadosLeitura.AsY;
gridDados.Rows[10].Cells[1].Value = WT901CService.DadosLeitura.AsZ;
gridDados.Rows[11].Cells[1].Value = WT901CService.DadosLeitura.AsM;
gridDados.Rows[12].Cells[1].Value = WT901CService.DadosLeitura.AngleX;
gridDados.Rows[13].Cells[1].Value = WT901CService.DadosLeitura.AngleY;
gridDados.Rows[14].Cells[1].Value = WT901CService.DadosLeitura.AngleZ;
gridDados.Rows[15].Cells[1].Value = WT901CService.DadosLeitura.HX;
gridDados.Rows[16].Cells[1].Value = WT901CService.DadosLeitura.HY;
gridDados.Rows[17].Cells[1].Value = WT901CService.DadosLeitura.HZ;
gridDados.Rows[18].Cells[1].Value = WT901CService.DadosLeitura.HM;
gridDados.Rows[19].Cells[1].Value = WT901CService.DadosLeitura.Temperatura;
gridDados.Rows[20].Cells[1].Value = WT901CService.DadosLeitura.Pressao;
gridDados.Rows[21].Cells[1].Value = WT901CService.DadosLeitura.Altitude;
/*gridDados.Rows[0].Cells[1].Value = WT901CService._DadosLeitura.Versao;
gridDados.Rows[1].Cells[1].Value = WT901CService._DadosLeitura.Modelo;
gridDados.Rows[2].Cells[1].Value = WT901CService._DadosLeitura.DataHora.ToString("dd/MM/yyyy");
gridDados.Rows[3].Cells[1].Value = WT901CService._DadosLeitura.DataHora.ToString("HH:mm:ss");
gridDados.Rows[4].Cells[1].Value = WT901CService._DadosLeitura.AccX;
gridDados.Rows[5].Cells[1].Value = WT901CService._DadosLeitura.AccY;
gridDados.Rows[6].Cells[1].Value = WT901CService._DadosLeitura.AccZ;
gridDados.Rows[7].Cells[1].Value = WT901CService._DadosLeitura.AccM;
gridDados.Rows[8].Cells[1].Value = WT901CService._DadosLeitura.AsX;
gridDados.Rows[9].Cells[1].Value = WT901CService._DadosLeitura.AsY;
gridDados.Rows[10].Cells[1].Value = WT901CService._DadosLeitura.AsZ;
gridDados.Rows[11].Cells[1].Value = WT901CService._DadosLeitura.AsM;
gridDados.Rows[12].Cells[1].Value = WT901CService._DadosLeitura.AngleX;
gridDados.Rows[13].Cells[1].Value = WT901CService._DadosLeitura.AngleY;
gridDados.Rows[14].Cells[1].Value = WT901CService._DadosLeitura.AngleZ;
gridDados.Rows[15].Cells[1].Value = WT901CService._DadosLeitura.HX;
gridDados.Rows[16].Cells[1].Value = WT901CService._DadosLeitura.HY;
gridDados.Rows[17].Cells[1].Value = WT901CService._DadosLeitura.HZ;
gridDados.Rows[18].Cells[1].Value = WT901CService._DadosLeitura.HM;
gridDados.Rows[19].Cells[1].Value = WT901CService._DadosLeitura.Temperatura;
gridDados.Rows[20].Cells[1].Value = WT901CService._DadosLeitura.Pressao;
gridDados.Rows[21].Cells[1].Value = WT901CService._DadosLeitura.Altitude;
gridDados.Rows[22].Cells[1].Value = "";
gridDados.Rows[23].Cells[1].Value = WT901CService.DadosLeitura.D0;
gridDados.Rows[24].Cells[1].Value = WT901CService.DadosLeitura.D1;
gridDados.Rows[25].Cells[1].Value = WT901CService.DadosLeitura.D2;
gridDados.Rows[26].Cells[1].Value = WT901CService.DadosLeitura.D3;
gridDados.Rows[27].Cells[1].Value = WT901CService.DadosLeitura.Q0;
gridDados.Rows[28].Cells[1].Value = WT901CService.DadosLeitura.Q1;
gridDados.Rows[29].Cells[1].Value = WT901CService.DadosLeitura.Q2;
gridDados.Rows[30].Cells[1].Value = WT901CService.DadosLeitura.Q3;
gridDados.Rows[31].Cells[1].Value = WT901CService.DadosLeitura.Longitude;
gridDados.Rows[32].Cells[1].Value = WT901CService.DadosLeitura.Latitude;
gridDados.Rows[33].Cells[1].Value = WT901CService.DadosLeitura.GPS_Altitude;
gridDados.Rows[34].Cells[1].Value = WT901CService.DadosLeitura.GPS_Orientacao;
gridDados.Rows[35].Cells[1].Value = WT901CService.DadosLeitura.GPS_Velcodiade;
gridDados.Rows[36].Cells[1].Value = WT901CService.DadosLeitura.GPS_NumeroSatelites;
gridDados.Rows[37].Cells[1].Value = WT901CService.DadosLeitura.PDOP;
gridDados.Rows[38].Cells[1].Value = WT901CService.DadosLeitura.HDOP;
gridDados.Rows[39].Cells[1].Value = WT901CService.DadosLeitura.VDOP;
gridDados.Rows[23].Cells[1].Value = WT901CService._DadosLeitura.D0;
gridDados.Rows[24].Cells[1].Value = WT901CService._DadosLeitura.D1;
gridDados.Rows[25].Cells[1].Value = WT901CService._DadosLeitura.D2;
gridDados.Rows[26].Cells[1].Value = WT901CService._DadosLeitura.D3;
gridDados.Rows[27].Cells[1].Value = WT901CService._DadosLeitura.Q0;
gridDados.Rows[28].Cells[1].Value = WT901CService._DadosLeitura.Q1;
gridDados.Rows[29].Cells[1].Value = WT901CService._DadosLeitura.Q2;
gridDados.Rows[30].Cells[1].Value = WT901CService._DadosLeitura.Q3;
gridDados.Rows[31].Cells[1].Value = WT901CService._DadosLeitura.Longitude;
gridDados.Rows[32].Cells[1].Value = WT901CService._DadosLeitura.Latitude;
gridDados.Rows[33].Cells[1].Value = WT901CService._DadosLeitura.GPS_Altitude;
gridDados.Rows[34].Cells[1].Value = WT901CService._DadosLeitura.GPS_Orientacao;
gridDados.Rows[35].Cells[1].Value = WT901CService._DadosLeitura.GPS_Velcodiade;
gridDados.Rows[36].Cells[1].Value = WT901CService._DadosLeitura.GPS_NumeroSatelites;
gridDados.Rows[37].Cells[1].Value = WT901CService._DadosLeitura.PDOP;
gridDados.Rows[38].Cells[1].Value = WT901CService._DadosLeitura.HDOP;
gridDados.Rows[39].Cells[1].Value = WT901CService._DadosLeitura.VDOP;*/
}

View File

@ -1748,6 +1748,61 @@ namespace AgroBase.Models.Modules
public double Roll { get; set; }
public double Pitch { get; set; }
public double Yaw { get; set; }
public double YawFixed
{
get
{
double angulo = Yaw;
// ✅ Aplica o offset armazenado
return GPSUtils.NormalizarAngulo(GPSUtils.NormalizarAngulo(angulo) + Offset);
}
}
public double Offset { get; set; } = 0.0;
private DateTime ultimaAtualizacaoOffset = DateTime.MinValue;
public void AtualizarOffset(GPSModel UltimaLeitura)
{
// Verifica se a qualidade do GPS é boa
if (UltimaLeitura.QualidadeFix == TiposCorrecaoGPS.RTKFixo || UltimaLeitura.QualidadeFix == TiposCorrecaoGPS.RTKFlutuante)
{
// Só atualiza o offset se a última atualização foi há pelo menos 2 segundos (evita variações rápidas)
if ((DateTime.Now - ultimaAtualizacaoOffset).TotalSeconds > 2)
{
// Suaviza a mudança do offset para evitar grandes variações
double novoOffset = UltimaLeitura.OrientacaoReal - YawFixed;
Offset = (Offset * 0.8) + (novoOffset * 0.2); // Filtro exponencial
// Atualiza o tempo da última atualização
ultimaAtualizacaoOffset = DateTime.Now;
}
}
}
public FirmwareSensorIMU Clone()
{
return new FirmwareSensorIMU()
{
ID = ID,
Iniciado = Iniciado,
Pitch = Pitch,
Roll = Roll,
Yaw = Yaw,
Temperatura = Temperatura,
Altitude = Altitude,
Pressao = Pressao,
AccX = AccX,
AccY = AccY,
AccZ = AccZ,
MagX = MagX,
MagY = MagY,
MagZ = MagZ,
GyrX = GyrX,
GyrY = GyrY,
GyrZ = GyrZ,
Offset = Offset,
};
}
}
@ -1780,6 +1835,12 @@ namespace AgroBase.Models.Modules
return _value;
}
private double ConverterValorEscala(byte[] data, int idx, double escala)
{
int raw = (data[idx] << 8) | data[idx + 1];
return raw * escala;
}
private S_Code DetectarComponenteDoID_Num(int ID_Num)
{
if (ID_Num == Variaveis.ID_Num_sMOD) return S_Code.sMOD;
@ -2145,8 +2206,8 @@ namespace AgroBase.Models.Modules
case S_Code.sIMU:
{
double temperatura = ConverterByteParaDouble(data, 2);
double pressao = ConverterByteParaDouble(data, 4);
double altitude = ConverterByteParaDouble(data, 6);
double pressao = ConverterValorEscala(data, 4, 10);
double altitude = ConverterValorEscala(data, 6, 10);
DefinirOuCriar(ID_Num, posicao, componente, new List<dynamic>() { temperatura, pressao, altitude });
break;
}

View File

@ -1991,24 +1991,6 @@ namespace AgroBase.Models
};
SalvarLog(T_Code.Pzm.ToString(), logPzm, Fim);
WitSensoriamentoLogModel logWit = new WitSensoriamentoLogModel()
{
Momento = Agora,
Inicializado = WT901CService.Iniciado,
DataHora = WT901CService.DadosLeitura.DataHora,
AccM = WT901CService.DadosLeitura.AccM,
Altitude = WT901CService.DadosLeitura.Altitude,
AngleX = WT901CService.DadosLeitura.AngleX,
AngleY = WT901CService.DadosLeitura.AngleY,
AngleZ = WT901CService.DadosLeitura.AngleZ,
AsM = WT901CService.DadosLeitura.AsM,
HM = WT901CService.DadosLeitura.HM,
Pressao = WT901CService.DadosLeitura.Pressao,
Temperatura = WT901CService.DadosLeitura.Temperatura,
UltimoComandoRespondido = WT901CService.DadosLeitura.Momento,
};
SalvarLog(T_Code.Wit.ToString(), logWit, Fim);
UltrasonicA05Model logA05 = new UltrasonicA05Model()
{
Momento = Agora,
@ -2987,7 +2969,6 @@ namespace AgroBase.Models
public OperacaoSensoriamentoLogBateriaModel Bateria { get; set; }
public OperacaoSensoriamentoLogTrajetoriaModel Trajetoria { get; set; }
public GPSModel Gps { get; set; }
public WT901CModel WitMotion { get; set; }
public PerformanceModel DadosPerformance { get; set; } = new PerformanceModel();
public OperacaoControleModel Controle { get; set; }
public SonarCamModel Sonar { get; set; }
@ -3080,8 +3061,6 @@ namespace AgroBase.Models
var dadosGps = GPSService.UltimaLeitura.Clone();
var dadosWitMotion = WT901CService.DadosLeitura.Clone();
var dadosSonar = Variaveis.OperacaoEmAndamento.CameraCaminho?.Sonar?.Clone();
if (dadosSonar == null)
{
@ -3107,7 +3086,6 @@ namespace AgroBase.Models
Bateria = dadosBateria,
Trajetoria = dadosTrajetoria,
Gps = dadosGps,
WitMotion = dadosWitMotion,
Sonar = dadosSonar,
Controle = dadosControle,
DadosPerformance = dadosPerformance
@ -3132,7 +3110,6 @@ namespace AgroBase.Models
Bateria = Bateria.Clone(),
Trajetoria = Trajetoria.Clone(),
Gps = Gps.Clone(),
WitMotion = WitMotion.Clone(),
Sonar = comSonar ? Sonar.Clone() : null,
Controle = Controle.Clone(),
DadosPerformance = DadosPerformance.Clone(),
@ -3311,7 +3288,7 @@ namespace AgroBase.Models
public DateTime UltimoComandoRespondido { get; set; }
}
public class WitSensoriamentoLogModel
public class ImuSensoriamentoLogModel
{
public DateTime Momento { get; set; }
public DateTime DataHora { get; set; }

View File

@ -1,4 +1,5 @@
using AgroBase.Models;
using AgroBase.Models.Modules;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
@ -715,10 +716,10 @@ namespace AgroBase.Services
{
double anguloFinal = 0.0;
bool witIniciado = WT901CService.Iniciado;
bool witIniciado = Variaveis.OperacaoEmAndamento.DispSen.Dados?.DadosLeitura?.SensoresIMU?.FirstOrDefault()?.Iniciado ?? false;
bool gpsIniciado = Iniciado;
WT901CService.DadosLeitura.AtualizarOffset(UltimaLeitura);
Variaveis.OperacaoEmAndamento.DispSen.Dados?.DadosLeitura?.SensoresIMU?.FirstOrDefault()?.AtualizarOffset(UltimaLeitura);
if (gpsIniciado)
{
@ -737,7 +738,7 @@ namespace AgroBase.Services
else if (witIniciado)
{
// Apenas o WT901C está disponível
anguloFinal = WT901CService.DadosLeitura.AnguloCorrigido;
anguloFinal = Variaveis.OperacaoEmAndamento.DispSen.Dados?.DadosLeitura?.SensoresIMU?.FirstOrDefault()?.YawFixed ?? -1;
}
else
{

View File

@ -787,7 +787,7 @@ namespace AgroBase.Services
{
if (Iniciado && !Variaveis.IsAgroMonitor)
{
double TemperaturaCampo = WT901CService.Iniciado ? WT901CService.DadosLeitura.Temperatura : 0;
double TemperaturaCampo = Variaveis.OperacaoEmAndamento.DispSen.Dados?.DadosLeitura?.SensoresIMU?.FirstOrDefault()?.Temperatura ?? -1;
(bool dirOperante, List<string> dirModsFalha) = Variaveis.OperacaoEmAndamento.DispMvd.Dados.StatusModulosDIR(Variaveis.OperacaoEmAndamento.Controle.TipoMovimento);
(bool movEsqOperante, List<string> movEsqModsFalha) = Variaveis.OperacaoEmAndamento.DispMvd.Dados.StatusModulosMOV(Direcao.Esquerda);

View File

@ -16,13 +16,13 @@ namespace AgroBase.Services
{
get
{
return DadosLeitura.Momento.AddMilliseconds(ModbusService.TempoLimiteConexao) > DateTime.Now;
return _DadosLeitura.Momento.AddMilliseconds(ModbusService.TempoLimiteConexao) > DateTime.Now;
}
}
public static byte slaveAddress = 0x50;
private static Dictionary<string, object> DadosSensor { get; } = new Dictionary<string, object>();
public static WT901CModel DadosLeitura { get; set; } = new WT901CModel();
public static WT901CModel _DadosLeitura { get; set; } = new WT901CModel();
public static byte[] ComandoAquisicao = new byte[8] { slaveAddress, 0x03, 0x00, 0x30, 0x00, 0x30, 0x48, 0x50 };
private static byte[] RegistrosIniciais = new byte[]
{
@ -108,7 +108,7 @@ namespace AgroBase.Services
Endereco = ModbusService._PortaModbus.PortName,
Dispositivo = T_Code.Wit,
Erro = !Iniciado,
Versao = DadosLeitura.Versao,
Versao = _DadosLeitura.Versao,
});
}
}
@ -243,7 +243,7 @@ namespace AgroBase.Services
DadosSensor[key] = value;
}
DadosLeitura.Momento = DateTime.Now;
_DadosLeitura.Momento = DateTime.Now;
return true;
}
@ -270,7 +270,7 @@ namespace AgroBase.Services
private static void PreencherDadosLeitura()
{
var wt901CModel = DadosLeitura;
var wt901CModel = _DadosLeitura;
// Versão
var reg2e = GetDeviceData("2E"); // Versão

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -25,7 +25,7 @@
<meta name="viewport" content="width=device-width,
initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<style>
#map_a4006f9d75d902d102b79944f8248919 {
#map_95d095eb3279ac049b5a7920dc2e75dc {
position: relative;
width: 100.0%;
height: 100.0%;
@ -39,14 +39,14 @@
<body>
<div class="folium-map" id="map_a4006f9d75d902d102b79944f8248919" ></div>
<div class="folium-map" id="map_95d095eb3279ac049b5a7920dc2e75dc" ></div>
</body>
<script>
var map_a4006f9d75d902d102b79944f8248919 = L.map(
"map_a4006f9d75d902d102b79944f8248919",
var map_95d095eb3279ac049b5a7920dc2e75dc = L.map(
"map_95d095eb3279ac049b5a7920dc2e75dc",
{
center: [0.0, 0.0],
crs: L.CRS.EPSG3857,
@ -60,13 +60,13 @@
var tile_layer_39ecd34b01d19cdf7444ae1ecfb66d85 = L.tileLayer(
var tile_layer_4f15be748757bce19bb9f40c8cb7d7a5 = L.tileLayer(
"https://tile.openstreetmap.org/{z}/{x}/{y}.png",
{"attribution": "\u0026copy; \u003ca href=\"https://www.openstreetmap.org/copyright\"\u003eOpenStreetMap\u003c/a\u003e contributors", "detectRetina": false, "maxNativeZoom": 19, "maxZoom": 19, "minZoom": 0, "noWrap": false, "opacity": 1, "subdomains": "abc", "tms": false}
);
tile_layer_39ecd34b01d19cdf7444ae1ecfb66d85.addTo(map_a4006f9d75d902d102b79944f8248919);
tile_layer_4f15be748757bce19bb9f40c8cb7d7a5.addTo(map_95d095eb3279ac049b5a7920dc2e75dc);
</script>
@ -87,7 +87,7 @@
}
trajeto_json_add({"features": []});
trajeto_json.addTo(map_a4006f9d75d902d102b79944f8248919);
trajeto_json.addTo(map_95d095eb3279ac049b5a7920dc2e75dc);
function adicionarGeometria(novaGeometria) {
trajeto_json.addData(novaGeometria);
@ -145,7 +145,7 @@
var marcadorDinamico = L.marker([0, 0], {
icon: customIcon
}).addTo(map_a4006f9d75d902d102b79944f8248919);
}).addTo(map_95d095eb3279ac049b5a7920dc2e75dc);
// Conectar ao broker MQTT
const client = mqtt.connect('ws://localhost:9001'); // Use wss para conexão segura
@ -183,7 +183,7 @@
marcadorDinamico.setRotationAngle(angulo);
adicionarCoordenada("Tj", [novaLongitude, novaLatitude]);
map_a4006f9d75d902d102b79944f8248919.setView(novaPosicao, map_a4006f9d75d902d102b79944f8248919.getZoom());
map_95d095eb3279ac049b5a7920dc2e75dc.setView(novaPosicao, map_95d095eb3279ac049b5a7920dc2e75dc.getZoom());
});
function calcularOrientacao(P1latitude, P1longitude, P2latitude, P2longitude) {

View File

@ -482,4 +482,4 @@ C:\ZendionInc\agrobot_base\AgroBase\AgroBase\obj\Debug\AgroBase.csproj.GenerateR
C:\ZendionInc\agrobot_base\AgroBase\AgroBase\obj\Debug\AgroBase.csproj.CoreCompileInputs.cache
C:\ZendionInc\agrobot_base\AgroBase\AgroBase\obj\Debug\AgroBase.exe
C:\ZendionInc\agrobot_base\AgroBase\AgroBase\obj\Debug\AgroBase.pdb
C:\ZendionINC\agrobot_base\AgroBase\AgroBase\obj\Debug\AgroBase.csproj.Up2Date
C:\ZendionInc\agrobot_base\AgroBase\AgroBase\obj\Debug\AgroBase.csproj.CopyComplete

View File

@ -106,13 +106,13 @@ class SensorIMU {
}
void RequisitarDados() {
Serial.print("Temp: "); Serial.println(Temp);
/*Serial.print("Temp: "); Serial.println(Temp);
Serial.print("Pressao: "); Serial.println(Pressao);
Serial.print("Altitude: "); Serial.println(Altitude);
Serial.print("Roll: "); Serial.println(Roll);
Serial.print("Pitch: "); Serial.println(Pitch);
Serial.print("Yaw: "); Serial.println(Yaw);
Serial.println();
Serial.println();*/
}
std::vector<uint8_t> MontarMensagemCAN(CanMessagePosicaoDados posicao) {
@ -140,7 +140,7 @@ class SensorIMU {
case CanMessagePosicaoDados::Dados2: { // Temp, Pressão, Altitude
int16_t temp = Temp * 100;
uint16_t pressao = Pressao / 10; // Ex: 100000 Pa → 10000 (precisão: 10 Pa)
int16_t altitude = Altitude * 100;
int16_t altitude = Altitude / 10;
data.push_back(temp >> 8); data.push_back(temp & 0xFF);
data.push_back(pressao >> 8); data.push_back(pressao & 0xFF);

View File

@ -0,0 +1,123 @@
#include <Wire.h>
#include <MPU9250_WE.h>
#include <Adafruit_BMP280.h>
#include <MadgwickAHRS.h>
#include <MPU9250_asukiaaa.h>
MPU9250_asukiaaa mySensor;
// Endereços típicos dos sensores
#define ADDR_MPU 0x68
#define ADDR_BMP 0x76
MPU9250_WE mpu = MPU9250_WE(ADDR_MPU);
Adafruit_BMP280 bmp;
Madgwick filter;
float AccX = 0, AccY = 0, AccZ = 0;
float GyroX = 0, GyroY = 0, GyroZ = 0;
float MagX = 0, MagY = 0, MagZ = 0;
float Temp = 0;
float Pressao = 0;
float Altitude = 0;
float Roll = 0;
float Pitch = 0;
float Yaw = 0;
void setup() {
Serial.begin(115200);
delay(500);
Wire.begin(1, 2);
Serial.println("🔍 Iniciando Scanner I2C...");
for (byte address = 1; address < 127; address++) {
Wire.beginTransmission(address);
if (Wire.endTransmission() == 0) {
Serial.print("📍 Dispositivo encontrado no endereco 0x");
Serial.println(address, HEX);
}
}
Serial.println("✅ Scanner finalizado.\n");
Serial.println("🎯 Iniciando sensores...");
Serial.print("WHO_AM_I: 0x");
Serial.println(mpu.whoAmI(), HEX);
mySensor.setWire(&Wire);
mySensor.beginAccel();
mySensor.beginGyro();
mySensor.beginMag(); // tenta usar AK8963 se existir
/*bool mpuIniciado = mpu.init();
// MPU9250
if (!mpuIniciado) {
Serial.println("MPU9250 NAO encontrado!");
} else {
mpu.autoOffsets();
mpu.setSampleRateDivider(5);
mpu.setAccRange(MPU9250_ACC_RANGE_2G);
mpu.enableAccDLPF(true);
mpu.setAccDLPF(MPU9250_DLPF_6);
Serial.println("MPU9250 OK");
}*/
// BMP280
if (!bmp.begin(ADDR_BMP)) {
Serial.println("BMP280 NAO encontrado!");
} else {
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,
Adafruit_BMP280::SAMPLING_X2,
Adafruit_BMP280::SAMPLING_X16,
Adafruit_BMP280::FILTER_X16,
Adafruit_BMP280::STANDBY_MS_500);
Serial.println("BMP280 OK");
}
// Madgwick
filter.begin(100); // 100 Hz
}
void loop() {
// Atualizar dados do MPU
/*xyzFloat acc = mpu.getGValues();
xyzFloat gyr = mpu.getGyrValues();
xyzFloat mag = mpu.getMagValues();
AccX = acc.x; AccY = acc.y; AccZ = acc.z;
GyroX = gyr.x; GyroY = gyr.y; GyroZ = gyr.z;
MagX = mag.x; MagY = mag.y; MagZ = mag.z;*/
mySensor.accelUpdate();
mySensor.gyroUpdate();
mySensor.magUpdate(); // pode falhar se não tiver magnetômetro
AccX = mySensor.accelX(); AccY = mySensor.accelY(); AccZ = mySensor.accelZ();
GyroX = mySensor.gyroX(); GyroY = mySensor.gyroY(); GyroZ = mySensor.gyroZ();
MagX = mySensor.magX(); MagY = mySensor.magY(); MagZ = mySensor.magZ();
// Atualizar dados do BMP
Temp = bmp.readTemperature();
Pressao = bmp.readPressure();
Altitude = bmp.readAltitude();
// Filtro Madgwick
filter.update(GyroX, GyroY, GyroZ, AccX, AccY, AccZ, MagX, MagY, MagZ);
Roll = filter.getRoll();
Pitch = filter.getPitch();
Yaw = filter.getYaw();
// Exibir no Serial
Serial.println("---- AMOSTRAGEM ----");
Serial.print("Temp: "); Serial.println(Temp);
Serial.print("Pressao: "); Serial.println(Pressao);
Serial.print("Altitude: "); Serial.println(Altitude);
Serial.print("Roll: "); Serial.println(Roll);
Serial.print("Pitch: "); Serial.println(Pitch);
Serial.print("Yaw: "); Serial.println(Yaw);
Serial.println();
delay(1000);
}

View File

@ -0,0 +1,33 @@
#include <Wire.h>
#include <LSM6.h>
LSM6 imu;
void setup() {
Serial.begin(115200);
Wire.begin(1, 2);
if (!imu.init()) {
Serial.println("Falha ao detectar o LSM6!");
while (1);
}
imu.enableDefault();
Serial.println("LSM6DS33 inicializado com sucesso!");
}
void loop() {
imu.read();
Serial.print("Acel: ");
Serial.print(imu.a.x); Serial.print('\t');
Serial.print(imu.a.y); Serial.print('\t');
Serial.print(imu.a.z); Serial.print('\n');
Serial.print("Gyro: ");
Serial.print(imu.g.x); Serial.print('\t');
Serial.print(imu.g.y); Serial.print('\t');
Serial.print(imu.g.z); Serial.print('\n');
delay(500);
}