adicionado sensor magnetometro

This commit is contained in:
Diego Freitas 2024-03-13 15:33:13 -03:00
parent 36a3c1e7b7
commit 72143276ae
30 changed files with 1014 additions and 44 deletions

Binary file not shown.

View File

@ -792,8 +792,8 @@ namespace AgroBase.Forms.Operacoes
{
try
{
//DesenharInclinacao((Panel)sender, e, (float)GPSService.UltimaLeitura.Orientacao);
DesenharInclinacao((Panel)sender, e, (float)Variaveis.OperacaoEmAndamento.ReferencialRuaGPS.AnguloCarro, -90);
double angulo = Variaveis.OperacaoEmAndamento.ReferencialRuaGPS.AnguloCarro;
DesenharInclinacao((Panel)sender, e, (float)angulo, -90);
}
catch { }
}
@ -892,6 +892,7 @@ namespace AgroBase.Forms.Operacoes
}
#endregion

View File

@ -77,6 +77,7 @@ namespace AgroBase.Models
sMAS = 532,
sBIC = 422,
sPRS = 333,
sMAG = 855,
}
public enum BotoesJoystick

View File

@ -325,6 +325,23 @@ namespace AgroBase.Models.Modules
UnidadeMedida = "cm",
Parametros = new List<string[]>(),
},
new SensorModel()
{
ID = "SMAG ",
Descricao = "Sensor Magnetômetro",
Prioridade = 15,
Componente = S_Code.sMAG,
Aferir = true,
Inicializado = false,
Testando = false,
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.I2C,
},
DelayAmostragem = 500,
UnidadeMedida = "º",
Parametros = new List<string[]>(),
},
}
};
}
@ -354,7 +371,7 @@ namespace AgroBase.Models.Modules
}
S_Code TipoSensor = (S_Code)(cod);
SensorModel Sensor = Sensores.FirstOrDefault(x => x.ID == Dados[1].Trim());
SensorModel Sensor = Sensores.FirstOrDefault(x => x.ID.Trim() == Dados[1].Trim());
if (Sensor == null)
{
if (Dados[1] == "MD")
@ -458,6 +475,28 @@ namespace AgroBase.Models.Modules
Variaveis.OperacaoEmAndamento.Sensoriamento.DistanciaDireita = distancia;
}
AtualizaGrafico = true;
break;
case S_Code.sMAG:
int x = -1;
int.TryParse(Dados[2], out x);
int y = -1;
int.TryParse(Dados[3], out y);
int z = -1;
int.TryParse(Dados[4], out z);
double angulo = -1;
double.TryParse(Dados[5].Replace(".", ","), out angulo);
Sensor.Leituras = new List<double>()
{
angulo,
x,
y,
z,
};
Variaveis.OperacaoEmAndamento.Sensoriamento.AnguloCarroBussola = angulo;
AtualizaGrafico = true;
break;

View File

@ -974,19 +974,26 @@ namespace AgroBase.Models
{
try
{
double somaAngulo = 0;
var Pontos = !Variaveis.OperacaoEmAndamento.GPSTrajetoriaRua.Any() ? new List<GPSModel>() :
Variaveis.OperacaoEmAndamento.GPSTrajetoriaRua[Variaveis.OperacaoEmAndamento.Mapa.IdxRuaAtual].Count > PontosConsiderarAngulo ?
Variaveis.OperacaoEmAndamento.GPSTrajetoriaRua[Variaveis.OperacaoEmAndamento.Mapa.IdxRuaAtual].OrderByDescending(x => x.DataHora).Take(PontosConsiderarAngulo).ToList() :
Variaveis.OperacaoEmAndamento.GPSTrajetoriaRua[Variaveis.OperacaoEmAndamento.Mapa.IdxRuaAtual].OrderByDescending(x => x.DataHora).ToList();
Pontos = Pontos.OrderBy(x => x.DataHora).ToList();
for (int i = 0; i < Pontos.Count - 1; i++)
if (Variaveis.OperacaoEmAndamento.DispSen.Dados.Sensores.Any(x => x.Componente == S_Code.sMAG && x.Inicializado))
{
somaAngulo += GPSService.CalcularOrientacao(Pontos[i + 1], Pontos[i]);
return Variaveis.OperacaoEmAndamento.Sensoriamento.AnguloCarroBussola;
}
double mediaAngulo = somaAngulo / (Pontos.Count - 1);
else
{
double somaAngulo = 0;
var Pontos = !Variaveis.OperacaoEmAndamento.GPSTrajetoriaRua.Any() ? new List<GPSModel>() :
Variaveis.OperacaoEmAndamento.GPSTrajetoriaRua[Variaveis.OperacaoEmAndamento.Mapa.IdxRuaAtual].Count > PontosConsiderarAngulo ?
Variaveis.OperacaoEmAndamento.GPSTrajetoriaRua[Variaveis.OperacaoEmAndamento.Mapa.IdxRuaAtual].OrderByDescending(x => x.DataHora).Take(PontosConsiderarAngulo).ToList() :
Variaveis.OperacaoEmAndamento.GPSTrajetoriaRua[Variaveis.OperacaoEmAndamento.Mapa.IdxRuaAtual].OrderByDescending(x => x.DataHora).ToList();
Pontos = Pontos.OrderBy(x => x.DataHora).ToList();
for (int i = 0; i < Pontos.Count - 1; i++)
{
somaAngulo += GPSService.CalcularOrientacao(Pontos[i + 1], Pontos[i]);
}
double mediaAngulo = somaAngulo / (Pontos.Count - 1);
return (!(mediaAngulo >= 0 || mediaAngulo <= 0)) ? 0 : mediaAngulo;
return (!(mediaAngulo >= 0 || mediaAngulo <= 0)) ? 0 : mediaAngulo;
}
}
catch
{
@ -1031,6 +1038,11 @@ namespace AgroBase.Models
public DirecaoCarroRua Direcao
{
get {
if (GPSService.UltimaLeitura.Latitude == GPSService.PenultimaLeitura.Latitude && GPSService.UltimaLeitura.Longitude == GPSService.PenultimaLeitura.Longitude && GPSService.UltimaLeitura.DataHora > GPSService.PenultimaLeitura.DataHora)
{
return DirecaoCarroRua.Parado;
}
double mediaAngulo = AnguloCarro;
double anguloOposto = (mediaAngulo + 180) % 360;
double mediaAnguloRua = AnguloRua;

View File

@ -302,6 +302,13 @@ namespace AgroBase.Services
}
}
PenultimaLeitura = new GPSModel()
{
DataHora = UltimaLeitura.DataHora,
Longitude = UltimaLeitura.Longitude,
Latitude = UltimaLeitura.Latitude,
};
UltimaLeitura = new GPSModel()
{
DataHora = DateTime.Now,

View File

@ -0,0 +1 @@
[{"Momento":"2024-03-13T14:31:11.0256389-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.1875,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":9.1666666666666679,"BateriaConsumida":0.0,"ErvasIdentificadas":0,"AtuacoesPorBico":[0,0,0,0],"DistanciaPercorrida":[],"ProgressoTrajeto":0.0,"ProgressoRua":0.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":2,"AnguloCarro":0.0,"AnguloCarroBussola":324.37,"AnguloRua":333.18452915675431,"AnguloRuaCamera":0.0,"AnguloDif":-8.814529156754304,"Direcao":0,"DentroDaRua":false,"IdxPontoAproximadoRua":0,"IdxRuaAtual":0},{"Momento":"2024-03-13T14:31:16.0108928-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.1875,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":12.738095238095237,"BateriaConsumida":0.0,"ErvasIdentificadas":0,"AtuacoesPorBico":[0,0,0,0],"DistanciaPercorrida":[],"ProgressoTrajeto":0.0,"ProgressoRua":0.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":3,"AnguloCarro":0.0,"AnguloCarroBussola":322.25,"AnguloRua":333.18452915675431,"AnguloRuaCamera":0.0,"AnguloDif":-10.934529156754309,"Direcao":0,"DentroDaRua":false,"IdxPontoAproximadoRua":0,"IdxRuaAtual":0},{"Momento":"2024-03-13T14:31:21.024346-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.1875,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":9.6666666666666643,"BateriaConsumida":0.0,"ErvasIdentificadas":0,"AtuacoesPorBico":[0,0,0,0],"DistanciaPercorrida":[0.0],"ProgressoTrajeto":0.0,"ProgressoRua":0.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":3,"AnguloCarro":0.0,"AnguloCarroBussola":332.03,"AnguloRua":333.18452915675431,"AnguloRuaCamera":0.0,"AnguloDif":-1.1545291567543359,"Direcao":0,"DentroDaRua":false,"IdxPontoAproximadoRua":0,"IdxRuaAtual":0},{"Momento":"2024-03-13T14:31:26.0107182-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.1875,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":11.904761904761903,"BateriaConsumida":0.0,"ErvasIdentificadas":0,"AtuacoesPorBico":[0,0,0,0],"DistanciaPercorrida":[15.532164373823042],"ProgressoTrajeto":1.1641049109827626,"ProgressoRua":37.5,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":4,"AnguloCarro":332.97738784499131,"AnguloCarroBussola":348.87,"AnguloRua":333.49773703294312,"AnguloRuaCamera":0.0,"AnguloDif":15.372262967056884,"Direcao":1,"DentroDaRua":true,"IdxPontoAproximadoRua":3,"IdxRuaAtual":0},{"Momento":"2024-03-13T14:31:31.0195894-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.1875,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":11.952380952380953,"BateriaConsumida":0.0,"ErvasIdentificadas":0,"AtuacoesPorBico":[0,0,0,0],"DistanciaPercorrida":[25.822843000933517],"ProgressoTrajeto":1.9353708620020584,"ProgressoRua":100.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":6,"AnguloCarro":333.59977895821442,"AnguloCarroBussola":348.18,"AnguloRua":333.85247665632448,"AnguloRuaCamera":0.0,"AnguloDif":14.327523343675523,"Direcao":1,"DentroDaRua":false,"IdxPontoAproximadoRua":8,"IdxRuaAtual":0},{"Momento":"2024-03-13T14:31:36.013512-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.1875,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":10.809523809523808,"BateriaConsumida":0.0,"ErvasIdentificadas":0,"AtuacoesPorBico":[0,0,0,0],"DistanciaPercorrida":[43.0191269239837],"ProgressoTrajeto":3.224198232333924,"ProgressoRua":100.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":6,"AnguloCarro":343.23615375058216,"AnguloCarroBussola":176.98,"AnguloRua":333.85247665632448,"AnguloRuaCamera":0.0,"AnguloDif":23.127523343675534,"Direcao":1,"DentroDaRua":false,"IdxPontoAproximadoRua":8,"IdxRuaAtual":0},{"Momento":"2024-03-13T14:31:36.9170128-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.1875,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":10.809523809523808,"BateriaConsumida":0.0,"ErvasIdentificadas":0,"AtuacoesPorBico":[0,0,0,0],"DistanciaPercorrida":[43.0191269239837],"ProgressoTrajeto":3.224198232333924,"ProgressoRua":0.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":1,"AnguloCarro":0.0,"AnguloCarroBussola":178.94,"AnguloRua":333.85247665632448,"AnguloRuaCamera":0.0,"AnguloDif":25.087523343675514,"Direcao":0,"DentroDaRua":false,"IdxPontoAproximadoRua":8,"IdxRuaAtual":0}],{"Momento":"2024-03-13T14:31:37.812075-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.1875,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":11.928571428571429,"BateriaConsumida":0.0,"ErvasIdentificadas":0,"AtuacoesPorBico":[0,0,0,0],"DistanciaPercorrida":[43.0191269239837],"ProgressoTrajeto":3.224198232333924,"ProgressoRua":0.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":1,"AnguloCarro":0.0,"AnguloCarroBussola":178.94,"AnguloRua":333.85247665632448,"AnguloRuaCamera":0.0,"AnguloDif":25.087523343675514,"Direcao":0,"DentroDaRua":false,"IdxPontoAproximadoRua":8,"IdxRuaAtual":0}]

View File

@ -0,0 +1 @@
[{"Latitude":-22.339442335994335,"Longitude":-47.264067138109773,"DataHora":"2024-03-13T14:31:10.0630348-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339442335994335,"Longitude":-47.264067138109773,"DataHora":"2024-03-13T14:31:15.0251015-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339566770425247,"Longitude":-47.263998524140789,"DataHora":"2024-03-13T14:31:20.0248611-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339649665078522,"Longitude":-47.263954035496013,"DataHora":"2024-03-13T14:31:25.0268915-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-13T14:31:30.0246535-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-13T14:31:35.0332136-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-13T14:31:36.0525106-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-13T14:31:37.030014-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181}]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
[{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-11T18:21:54.966587-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181}]
[{"Latitude":-22.339442335994335,"Longitude":-47.264067138109773,"DataHora":"2024-03-13T14:26:42.4374835-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.64967801047743}]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -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":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":33,"Descricao":"8","Funcao":12,"Habilitado":true,"ComponenteID":"TBAT"},{"Tipo":1,"Pino":25,"Descricao":"9","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":1,"Pino":26,"Descricao":"10","Funcao":28,"Habilitado":true,"ComponenteID":"VBAT"},{"Tipo":1,"Pino":27,"Descricao":"11","Funcao":12,"Habilitado":true,"ComponenteID":"TMVET"},{"Tipo":1,"Pino":14,"Descricao":"12","Funcao":12,"Habilitado":true,"ComponenteID":"TMVEF"},{"Tipo":1,"Pino":12,"Descricao":"13","Funcao":12,"Habilitado":true,"ComponenteID":"TMVDT"},{"Tipo":1,"Pino":97,"Descricao":"14","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":1,"Pino":13,"Descricao":"15","Funcao":12,"Habilitado":true,"ComponenteID":"TMVDF"},{"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":30,"Habilitado":true,"ComponenteID":"SUESQ"},{"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":false,"ComponenteID":""}]
[{"Tipo":0,"Pino":99,"Descricao":"1","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":0,"Pino":98,"Descricao":"2","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":0,"Pino":97,"Descricao":"3","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":0,"Pino":4,"Descricao":"4","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":5,"Descricao":"5","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":6,"Descricao":"6","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":7,"Descricao":"7","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":15,"Descricao":"8","Funcao":12,"Habilitado":true,"ComponenteID":"TBAT"},{"Tipo":0,"Pino":16,"Descricao":"9","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":17,"Descricao":"10","Funcao":28,"Habilitado":true,"ComponenteID":"VBAT"},{"Tipo":0,"Pino":18,"Descricao":"11","Funcao":12,"Habilitado":true,"ComponenteID":"TMVET"},{"Tipo":0,"Pino":8,"Descricao":"12","Funcao":12,"Habilitado":true,"ComponenteID":"TMVEF"},{"Tipo":0,"Pino":3,"Descricao":"13","Funcao":12,"Habilitado":true,"ComponenteID":"TMVDT"},{"Tipo":0,"Pino":46,"Descricao":"14","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":9,"Descricao":"15","Funcao":12,"Habilitado":true,"ComponenteID":"TMVDF"},{"Tipo":0,"Pino":10,"Descricao":"16","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":11,"Descricao":"17","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":12,"Descricao":"18","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":13,"Descricao":"19","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":14,"Descricao":"20","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":96,"Descricao":"21","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":0,"Pino":95,"Descricao":"22","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":0,"Pino":94,"Descricao":"23","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":0,"Pino":93,"Descricao":"24","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":0,"Pino":19,"Descricao":"25","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":20,"Descricao":"26","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":21,"Descricao":"27","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":47,"Descricao":"28","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":48,"Descricao":"29","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":45,"Descricao":"30","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":0,"Descricao":"31","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":35,"Descricao":"32","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":36,"Descricao":"33","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":37,"Descricao":"34","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":38,"Descricao":"35","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":39,"Descricao":"36","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":40,"Descricao":"37","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":41,"Descricao":"38","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":42,"Descricao":"39","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":2,"Descricao":"40","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":1,"Descricao":"41","Funcao":0,"Habilitado":true,"ComponenteID":""},{"Tipo":0,"Pino":44,"Descricao":"42","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":0,"Pino":43,"Descricao":"43","Funcao":0,"Habilitado":false,"ComponenteID":""},{"Tipo":0,"Pino":92,"Descricao":"44","Funcao":0,"Habilitado":false,"ComponenteID":""}]

View File

@ -1,6 +1,6 @@
// Dispositivo: Atuador
// Versão Firmware: 2
// Ultima atualização: 21/02/2023
// Ultima atualização: 11/03/2024
#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\SerialService.h"
#include "HX711.h"
@ -15,7 +15,7 @@ bool Conectado = false;
int _TaxaAmostragem = 500;
int BicosAtivos = 10;
bool AtuacaoNivelAlto = false;
bool AtuacaoNivelAlto = true;
class BicoPulverizador {
public:
@ -44,7 +44,7 @@ class BicoPulverizador {
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
return;
}
if (_pinoSolenoide > -1) {
pinMode(_pinoSolenoide, OUTPUT);
_BicoAtuado = !AtuacaoNivelAlto;
@ -498,7 +498,8 @@ SensorPressao* SPPorID(String ID) {
}
void ZerarPinos() {
const int gpios[] = {2, 4, 5, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 25, 26, 27, 32, 33};
//const int gpios[] = {2, 4, 5, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 25, 26, 27, 32, 33};
const int gpios[] = {4, 5, 6, 7, 15, 16, 17, 18, 8, 3, 46, 9, 10, 11, 12, 13, 14, 19, 20, 21, 47, 48, 45, 0, 35, 36, 37, 38, 39, 40, 41, 42, 2, 1};
for (int i = 0; i < sizeof(gpios) / sizeof(gpios[0]); i++) {
pinMode(gpios[i], OUTPUT);
@ -546,6 +547,9 @@ void loop() {
if (ID == "MD ") {
_TaxaAmostragem = ((String)Protocolo[8] + (String)Protocolo[9] + (String)Protocolo[10] + (String)Protocolo[11] + (String)Protocolo[12]).toInt();
int pinoReleGeral = ((String)Protocolo[14] + (String)Protocolo[15]).toInt();
bool _AtuaNivelAlto = (String)Protocolo[17] == "1";
AtuacaoNivelAlto = _AtuaNivelAlto;
if (pinoReleGeral > -1) {
pinMode(_pinoReleGeral, INPUT);
@ -565,7 +569,6 @@ void loop() {
bool bico_ativado = (String)Protocolo[8] == "1";
int posicao = ((String)Protocolo[10] + (String)Protocolo[11]).toInt();
int solenoide = ((String)Protocolo[13] + (String)Protocolo[14]).toInt();
if (bico_ativado) {
if (Conectar) {
_bico->_posicao = posicao;
@ -648,7 +651,7 @@ void loop() {
else if (_funcao == Cmd) {
//canal;potencia;sentido;rampa;precisao;rpm
//0;000;0;000;000;000
String ID = ((String)Protocolo[0] + (String)Protocolo[1] + (String)Protocolo[2]);
String ID = ((String)Protocolo[0] + (String)Protocolo[1] + (String)Protocolo[2] + " ");
BicoPulverizador* _bico = BicoPorID(ID);

View File

@ -30,6 +30,7 @@ enum S_Code {
sMAS = 532,
sBIC = 422,
sPRS = 333,
sMAG = 855,
};
enum Sentido {

View File

@ -1,12 +1,14 @@
// Dispositivo: Sensoriamento
// Versão Firmware: 5
// Ultima atualização: 21/02/2024
// Versão Firmware: 6
// Ultima atualização: 13/03/2024
#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\SerialService.h"
#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\Utils.h"
#include <SimpleKalmanFilter.h>
#include "INA226.h"
#include <INA226.h>
#include <MechaQMC5883.h>
#include <Wire.h>
#define D_Code Sen
@ -19,6 +21,9 @@ bool Conectado = false;
int _TaxaAmostragem;
int FrequenciaMaxima = 10000;
#define _pinoSDA 19
#define _pinoSCL 20
class SensorTemperatura {
public:
@ -275,7 +280,6 @@ class SensorCorrente {
}
INA = new INA226(_Endereco);
Wire.begin();
Iniciado = INA->begin();
if (Iniciado) {
INA->setMaxCurrentShunt(1, 0.002);
@ -456,6 +460,104 @@ class SensorUltrassom {
};
class SensorMagnetometro {
public:
SensorMagnetometro(String desc) {
_ID = desc;
}
// Variáveis
MechaQMC5883* qmc = nullptr;
// Definições
String _ID;
S_Code _componente = sMAG;
byte _Endereco;
int _delayAmostragem;
int _prioridade;
bool Iniciado = false;
void Inicializar() {
if (Iniciado) {
EnviarDadosSerial(_ID + " ja inicializado");
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
return;
}
qmc = new MechaQMC5883();
qmc->init();
xTaskCreatePinnedToCore(&SensorMagnetometro::SMTaskWrapper, "SMTask", 5000, this, _prioridade, &SMTaskHandle, 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(SMTaskHandle);
delete qmc;
EnviarDadosSerial(_ID + " Desligado");
Iniciado = false;
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
}
private:
TaskHandle_t SMTaskHandle = NULL;
static void SMTaskWrapper(void *pvParameters) {
SensorMagnetometro *sensor = static_cast<SensorMagnetometro*>(pvParameters);
sensor->SMTask();
}
void SMTask() {
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)) {
AferirOrientacao();
firstMilis = millis();
}
// Aguarda metade do menor período possível entre leituras
vTaskDelay(1);
}
}
void AferirOrientacao() {
int x, y, z;
float orientacao;
qmc->read(&x, &y, &z,&orientacao);
EnviarDadosSerial(MontarProtocoloSensor(sMAG, _ID, MontarDadosProtocoloMagnetometro(x, y, z, orientacao)));
}
};
SensorTemperatura TM1("TMVET");
SensorTemperatura TM2("TMVEF");
SensorTemperatura TM3("TMVDT");
@ -471,6 +573,7 @@ SensorCorrente AAT("AAT ");
SensorCorrente APC("APC ");
SensorUltrassom SUESQ("SUESQ");
SensorUltrassom SUDIR("SUDIR");
SensorMagnetometro SMAG("SMAG ");
SensorTemperatura* STPorID(String ID) {
@ -512,8 +615,16 @@ SensorUltrassom* SUPorID(String ID) {
return _sensor;
}
SensorMagnetometro* SMPorID(String ID) {
SensorMagnetometro* _sensor =
ID == "SMAG " ? &SMAG :
nullptr;
return _sensor;
}
void setup() {
Serial.begin(_baudRate);
Wire.begin(_pinoSDA, _pinoSCL);
}
void loop() {
@ -631,6 +742,21 @@ void loop() {
}
break;
}
case sMAG: {
SensorMagnetometro* _sensor = SMPorID(ID);
if (sensor_ativado) {
if (Conectar) {
_sensor->_prioridade = prioridade;
_sensor->_delayAmostragem = delayAmostragem;
_sensor->Inicializar();
}
else {
_sensor->Desligar();
}
}
break;
}
}

View File

@ -145,4 +145,13 @@ String MontarDadosProtocoloPressao(float pressao, int leitura) {
return Protocolo;
}
String MontarDadosProtocoloMagnetometro(int x, int y, int z, float orientacao) {
String Protocolo =
(String)x + ";" +
(String)y + ";" +
(String)z + ";" +
(String)orientacao;
return Protocolo;
}
#endif

View File

@ -0,0 +1,767 @@
#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\SerialService.h"
#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\Utils.h"
#include <SimpleKalmanFilter.h>
#include <INA226.h>
#include <MechaQMC5883.h>
#include <Wire.h>
#define D_Code Sen
#define _pinoLED RGB_BUILTIN
long _baudRate = 115200;
bool Conectado = false;
int _TaxaAmostragem;
int FrequenciaMaxima = 10000;
#define _pinoSDA 19
#define _pinoSCL 20
class SensorTemperatura {
public:
SensorTemperatura(String desc) {
_ID = desc;
}
// Definições
String _ID;
S_Code _componente = sTMP;
int _pino;
int _delayAmostragem;
int _prioridade;
float Voffset = 0.0;
bool Iniciado = false;
SimpleKalmanFilter* tempKalman;
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;
tempKalman = new SimpleKalmanFilter(2, 2, 0.01);
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);
delete tempKalman;
// 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);
//CALCULOS PARA CONVERSÃO DA LEITURA RECEBIDA PELO ESP32 EM TEMPERATURA EM °C
Vout = (adcValue * Vs / adcMax) + Voffset;
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 = adcV; //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
INA226* INA = nullptr;
// Definições
String _ID;
S_Code _componente = sCOR;
byte _Endereco;
int _delayAmostragem;
int _prioridade;
bool Iniciado = false;
void Inicializar() {
if (Iniciado) {
EnviarDadosSerial(_ID + " ja inicializado");
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
return;
}
INA = new INA226(_Endereco);
Iniciado = INA->begin();
if (Iniciado) {
INA->setMaxCurrentShunt(1, 0.002);
xTaskCreatePinnedToCore(&SensorCorrente::SATaskWrapper, "SATask", 5000, this, _prioridade, &SATaskHandle, tskNO_AFFINITY);
EnviarDadosSerial(_ID + " Iniciado");
}
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);
delete INA;
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() {
float busVoltage = INA->getBusVoltage();
float shuntVoltage = INA->getShuntVoltage_mV();
float current = INA->getCurrent();
float power = INA->getPower();
EnviarDadosSerial(MontarProtocoloSensor(sCOR, _ID, MontarDadosProtocoloINA226(busVoltage, shuntVoltage, current, power)));
}
};
class SensorUltrassom {
public:
SensorUltrassom(String desc) {
_ID = desc;
}
// Variáveis
#define SOUND_SPEED 0.034
// Definições
String _ID;
S_Code _componente = sULT;
int _pinoE;
int _pinoT;
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 (_pinoE > -1) {
pinMode(_pinoE, INPUT);
}
if (_pinoT > -1) {
pinMode(_pinoT, OUTPUT);
}
xTaskCreatePinnedToCore(&SensorUltrassom::SUTaskWrapper, "SUTask", 5000, this, _prioridade, &SUTaskHandle, 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(SUTaskHandle);
// Redefinir as configurações para os valores iniciais
pinMode(_pinoE, INPUT);
pinMode(_pinoT, INPUT);
EnviarDadosSerial(_ID + " Desligado");
Iniciado = false;
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
}
private:
TaskHandle_t SUTaskHandle = NULL;
static void SUTaskWrapper(void *pvParameters) {
SensorUltrassom *sensor = static_cast<SensorUltrassom*>(pvParameters);
sensor->SUTask();
}
void SUTask() {
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)) {
AferirDistancia();
firstMilis = millis();
}
// Aguarda metade do menor período possível entre leituras
vTaskDelay(1);
}
}
void AferirDistancia() {
digitalWrite(_pinoT, LOW);
delayMicroseconds(2);
digitalWrite(_pinoT, HIGH);
delayMicroseconds(10);
digitalWrite(_pinoT, LOW);
long duration = pulseIn(_pinoE, HIGH);
float distanceCm = duration * SOUND_SPEED / 2;
EnviarDadosSerial(MontarProtocoloSensor(sULT, _ID, MontarDadosProtocoloUltrassom(distanceCm, duration)));
}
};
class SensorMagnetometro {
public:
SensorMagnetometro(String desc) {
_ID = desc;
}
// Variáveis
MechaQMC5883* qmc = nullptr;
// Definições
String _ID;
S_Code _componente = sMAG;
byte _Endereco;
int _delayAmostragem;
int _prioridade;
bool Iniciado = false;
void Inicializar() {
if (Iniciado) {
EnviarDadosSerial(_ID + " ja inicializado");
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
return;
}
qmc = new MechaQMC5883();
qmc->init();
xTaskCreatePinnedToCore(&SensorMagnetometro::SMTaskWrapper, "SMTask", 5000, this, _prioridade, &SMTaskHandle, 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(SMTaskHandle);
delete qmc;
EnviarDadosSerial(_ID + " Desligado");
Iniciado = false;
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
}
private:
TaskHandle_t SMTaskHandle = NULL;
static void SMTaskWrapper(void *pvParameters) {
SensorMagnetometro *sensor = static_cast<SensorMagnetometro*>(pvParameters);
sensor->SMTask();
}
void SMTask() {
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)) {
AferirOrientacao();
firstMilis = millis();
}
// Aguarda metade do menor período possível entre leituras
vTaskDelay(1);
}
}
void AferirOrientacao() {
int x, y, z;
float orientacao;
qmc->read(&x, &y, &z,&orientacao);
EnviarDadosSerial(MontarProtocoloSensor(sMAG, _ID, MontarDadosProtocoloMagnetometro(x, y, z, orientacao)));
}
};
SensorTemperatura TM1("TMVET");
SensorTemperatura TM2("TMVEF");
SensorTemperatura TM3("TMVDT");
SensorTemperatura TM4("TMVDF");
SensorTemperatura TBAT("TBAT ");
SensorTensao VBAT("VBAT ");
SensorCorrente AM1("AMVET");
SensorCorrente AM2("AMVEF");
SensorCorrente AM3("AMVDT");
SensorCorrente AM4("AMVDF");
SensorCorrente AMP("AMP ");
SensorCorrente AAT("AAT ");
SensorCorrente APC("APC ");
SensorUltrassom SUESQ("SUESQ");
SensorUltrassom SUDIR("SUDIR");
SensorMagnetometro SMAG("SMAG ");
SensorTemperatura* STPorID(String ID) {
SensorTemperatura* _sensor =
ID == "TMVET" ? &TM1 :
ID == "TMVEF" ? &TM2 :
ID == "TMVDT" ? &TM3 :
ID == "TMVDF" ? &TM4 :
ID == "TBAT " ? &TBAT :
nullptr;
return _sensor;
}
SensorTensao* SVPorID(String ID) {
SensorTensao* _sensor =
ID == "VBAT " ? &VBAT :
nullptr;
return _sensor;
}
SensorCorrente* SAPorID(String ID) {
SensorCorrente* _sensor =
ID == "AMVET" ? &AM1 :
ID == "AMVEF" ? &AM2 :
ID == "AMVDT" ? &AM3 :
ID == "AMVDF" ? &AM4 :
ID == "AMP " ? &AMP :
ID == "AAT " ? &AAT :
ID == "APC " ? &APC :
nullptr;
return _sensor;
}
SensorUltrassom* SUPorID(String ID) {
SensorUltrassom* _sensor =
ID == "SUESQ" ? &SUESQ :
ID == "SUDIR" ? &SUDIR :
nullptr;
return _sensor;
}
SensorMagnetometro* SMPorID(String ID) {
SensorMagnetometro* _sensor =
ID == "SMAG " ? &SMAG :
nullptr;
return _sensor;
}
void setup() {
Serial.begin(_baudRate);
Wire.begin(_pinoSDA, _pinoSCL);
}
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();
int pino2 = ((String)Protocolo[26] + (String)Protocolo[27]).toInt();
switch (componente) {
case sTMP: {
SensorTemperatura* _sensor = STPorID(ID);
if (sensor_ativado) {
double _voffset = ((String)Protocolo[29] + (String)Protocolo[30] + (String)Protocolo[31] + (String)Protocolo[32] + (String)Protocolo[33] + (String)Protocolo[34]).toDouble();
_sensor->Voffset = (float)_voffset;
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[29] + (String)Protocolo[30] + (String)Protocolo[31] + (String)Protocolo[32] + (String)Protocolo[33] + (String)Protocolo[34]).toDouble();
double _r1 = ((String)Protocolo[36] + (String)Protocolo[37] + (String)Protocolo[38] + (String)Protocolo[39] + (String)Protocolo[40] + (String)Protocolo[41]).toDouble();
double _r2 = ((String)Protocolo[43] + (String)Protocolo[44] + (String)Protocolo[45] + (String)Protocolo[46] + (String)Protocolo[47] + (String)Protocolo[48]).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) {
String _endereco = ((String)Protocolo[29] + (String)Protocolo[30] + (String)Protocolo[31] + (String)Protocolo[32] + (String)Protocolo[33] + (String)Protocolo[34]);
if (Conectar) {
_sensor->_Endereco = stringToByte(_endereco);
_sensor->_prioridade = prioridade;
_sensor->_delayAmostragem = delayAmostragem;
_sensor->Inicializar();
}
else {
_sensor->Desligar();
}
}
break;
}
case sULT: {
SensorUltrassom* _sensor = SUPorID(ID);
if (sensor_ativado) {
if (Conectar) {
_sensor->_pinoE = pino;
_sensor->_pinoT = pino2;
_sensor->_prioridade = prioridade;
_sensor->_delayAmostragem = delayAmostragem;
_sensor->Inicializar();
}
else {
_sensor->Desligar();
}
}
break;
}
case sMAG: {
SensorMagnetometro* _sensor = SMPorID(ID);
if (sensor_ativado) {
if (Conectar) {
_sensor->_prioridade = prioridade;
_sensor->_delayAmostragem = delayAmostragem;
_sensor->Inicializar();
}
else {
_sensor->Desligar();
}
}
break;
}
}
}
} else if (_funcao == Cmd) {
} else if (_funcao == Tst) {
}
}
}