adicionado sensor magnetometro
This commit is contained in:
parent
36a3c1e7b7
commit
72143276ae
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -77,6 +77,7 @@ namespace AgroBase.Models
|
|||
sMAS = 532,
|
||||
sBIC = 422,
|
||||
sPRS = 333,
|
||||
sMAG = 855,
|
||||
}
|
||||
|
||||
public enum BotoesJoystick
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -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}]
|
||||
|
|
@ -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
|
|
@ -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}]
|
||||
Binary file not shown.
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
|
|
@ -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":""}]
|
||||
Binary file not shown.
Binary file not shown.
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ enum S_Code {
|
|||
sMAS = 532,
|
||||
sBIC = 422,
|
||||
sPRS = 333,
|
||||
sMAG = 855,
|
||||
};
|
||||
|
||||
enum Sentido {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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 " ? & :
|
||||
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) {
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue