diff --git a/AgroBase/.vs/AgroBase/v17/.suo b/AgroBase/.vs/AgroBase/v17/.suo index 1d5ed4d90..38e6db3f9 100644 Binary files a/AgroBase/.vs/AgroBase/v17/.suo and b/AgroBase/.vs/AgroBase/v17/.suo differ diff --git a/AgroBase/.vs/AgroBase/v17/DocumentLayout.json b/AgroBase/.vs/AgroBase/v17/DocumentLayout.json index 15edfc75b..621070f46 100644 --- a/AgroBase/.vs/AgroBase/v17/DocumentLayout.json +++ b/AgroBase/.vs/AgroBase/v17/DocumentLayout.json @@ -3,52 +3,8 @@ "WorkspaceRootPath": "C:\\ZendionINC\\agrobot_base\\AgroBase\\", "Documents": [ { - "AbsoluteMoniker": "D:0:0:{C54B41C0-1D21-4E3E-949E-0F86BBC86A33}|AgroBase\\AgroBase.csproj|c:\\zendioninc\\agrobot_base\\agrobase\\agrobase\\models\\modules\\direcionalmodel.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{C54B41C0-1D21-4E3E-949E-0F86BBC86A33}|AgroBase\\AgroBase.csproj|solutionrelative:agrobase\\models\\modules\\direcionalmodel.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - }, - { - "AbsoluteMoniker": "D:0:0:{C54B41C0-1D21-4E3E-949E-0F86BBC86A33}|AgroBase\\AgroBase.csproj|C:\\ZendionINC\\agrobot_base\\AgroBase\\agrobase\\models\\modules\\movimentacaomodel.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{C54B41C0-1D21-4E3E-949E-0F86BBC86A33}|AgroBase\\AgroBase.csproj|solutionrelative:agrobase\\models\\modules\\movimentacaomodel.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - }, - { - "AbsoluteMoniker": "D:0:0:{C54B41C0-1D21-4E3E-949E-0F86BBC86A33}|AgroBase\\AgroBase.csproj|c:\\zendioninc\\agrobot_base\\agrobase\\agrobase\\forms\\frmprincipal.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{C54B41C0-1D21-4E3E-949E-0F86BBC86A33}|AgroBase\\AgroBase.csproj|solutionrelative:agrobase\\forms\\frmprincipal.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - }, - { - "AbsoluteMoniker": "D:0:0:{C54B41C0-1D21-4E3E-949E-0F86BBC86A33}|AgroBase\\AgroBase.csproj|c:\\zendioninc\\agrobot_base\\agrobase\\agrobase\\forms\\movimentacao\\frmmovconfig.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}|Form", - "RelativeMoniker": "D:0:0:{C54B41C0-1D21-4E3E-949E-0F86BBC86A33}|AgroBase\\AgroBase.csproj|solutionrelative:agrobase\\forms\\movimentacao\\frmmovconfig.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}|Form" - }, - { - "AbsoluteMoniker": "D:0:0:{C54B41C0-1D21-4E3E-949E-0F86BBC86A33}|AgroBase\\AgroBase.csproj|c:\\zendioninc\\agrobot_base\\agrobase\\agrobase\\services\\dispositivosservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{C54B41C0-1D21-4E3E-949E-0F86BBC86A33}|AgroBase\\AgroBase.csproj|solutionrelative:agrobase\\services\\dispositivosservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - }, - { - "AbsoluteMoniker": "D:0:0:{C54B41C0-1D21-4E3E-949E-0F86BBC86A33}|AgroBase\\AgroBase.csproj|c:\\zendioninc\\agrobot_base\\agrobase\\agrobase\\models\\modules\\pinoutmodel.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{C54B41C0-1D21-4E3E-949E-0F86BBC86A33}|AgroBase\\AgroBase.csproj|solutionrelative:agrobase\\models\\modules\\pinoutmodel.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - }, - { - "AbsoluteMoniker": "D:0:0:{C54B41C0-1D21-4E3E-949E-0F86BBC86A33}|AgroBase\\AgroBase.csproj|c:\\zendioninc\\agrobot_base\\agrobase\\agrobase\\services\\serialservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{C54B41C0-1D21-4E3E-949E-0F86BBC86A33}|AgroBase\\AgroBase.csproj|solutionrelative:agrobase\\services\\serialservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - }, - { - "AbsoluteMoniker": "D:0:0:{C54B41C0-1D21-4E3E-949E-0F86BBC86A33}|AgroBase\\AgroBase.csproj|c:\\zendioninc\\agrobot_base\\agrobase\\agrobase\\forms\\frmacompanhamento.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}|Form", - "RelativeMoniker": "D:0:0:{C54B41C0-1D21-4E3E-949E-0F86BBC86A33}|AgroBase\\AgroBase.csproj|solutionrelative:agrobase\\forms\\frmacompanhamento.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}|Form" - }, - { - "AbsoluteMoniker": "D:0:0:{C54B41C0-1D21-4E3E-949E-0F86BBC86A33}|AgroBase\\AgroBase.csproj|C:\\ZendionINC\\agrobot_base\\AgroBase\\agrobase\\forms\\frmacompanhamento.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{C54B41C0-1D21-4E3E-949E-0F86BBC86A33}|AgroBase\\AgroBase.csproj|solutionrelative:agrobase\\forms\\frmacompanhamento.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - }, - { - "AbsoluteMoniker": "D:0:0:{C54B41C0-1D21-4E3E-949E-0F86BBC86A33}|AgroBase\\AgroBase.csproj|C:\\ZendionINC\\agrobot_base\\AgroBase\\agrobase\\models\\variaveis.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{C54B41C0-1D21-4E3E-949E-0F86BBC86A33}|AgroBase\\AgroBase.csproj|solutionrelative:agrobase\\models\\variaveis.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - }, - { - "AbsoluteMoniker": "D:0:0:{C54B41C0-1D21-4E3E-949E-0F86BBC86A33}|AgroBase\\AgroBase.csproj|C:\\ZendionINC\\agrobot_base\\AgroBase\\agrobase\\models\\modules\\sensoriamentomodel.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{C54B41C0-1D21-4E3E-949E-0F86BBC86A33}|AgroBase\\AgroBase.csproj|solutionrelative:agrobase\\models\\modules\\sensoriamentomodel.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - }, - { - "AbsoluteMoniker": "D:0:0:{C54B41C0-1D21-4E3E-949E-0F86BBC86A33}|AgroBase\\AgroBase.csproj|C:\\ZendionINC\\agrobot_base\\AgroBase\\agrobase\\services\\wt901cservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{C54B41C0-1D21-4E3E-949E-0F86BBC86A33}|AgroBase\\AgroBase.csproj|solutionrelative:agrobase\\services\\wt901cservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + "AbsoluteMoniker": "D:0:0:{C54B41C0-1D21-4E3E-949E-0F86BBC86A33}|AgroBase\\AgroBase.csproj|c:\\zendioninc\\agrobot_base\\agrobase\\agrobase\\models\\enuns.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{C54B41C0-1D21-4E3E-949E-0F86BBC86A33}|AgroBase\\AgroBase.csproj|solutionrelative:agrobase\\models\\enuns.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" } ], "DocumentGroupContainers": [ @@ -58,157 +14,19 @@ "DocumentGroups": [ { "DockedWidth": 200, - "SelectedChildIndex": 2, + "SelectedChildIndex": 0, "Children": [ - { - "$type": "Document", - "DocumentIndex": 2, - "Title": "frmPrincipal.cs", - "DocumentMoniker": "C:\\ZendionINC\\agrobot_base\\AgroBase\\AgroBase\\Forms\\frmPrincipal.cs", - "RelativeDocumentMoniker": "AgroBase\\Forms\\frmPrincipal.cs", - "ToolTip": "C:\\ZendionINC\\agrobot_base\\AgroBase\\AgroBase\\Forms\\frmPrincipal.cs", - "RelativeToolTip": "AgroBase\\Forms\\frmPrincipal.cs", - "ViewState": "AQIAAOkAAAAAAAAAAIA9wAsBAAAAAAAA", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2024-06-05T13:56:57.085Z", - "EditorCaption": "" - }, - { - "$type": "Document", - "DocumentIndex": 3, - "Title": "frmMovConfig.cs [Design]", - "DocumentMoniker": "C:\\ZendionINC\\agrobot_base\\AgroBase\\AgroBase\\Forms\\Movimentacao\\frmMovConfig.cs", - "RelativeDocumentMoniker": "AgroBase\\Forms\\Movimentacao\\frmMovConfig.cs", - "ToolTip": "C:\\ZendionINC\\agrobot_base\\AgroBase\\AgroBase\\Forms\\Movimentacao\\frmMovConfig.cs [Design]", - "RelativeToolTip": "AgroBase\\Forms\\Movimentacao\\frmMovConfig.cs [Design]", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2024-06-05T17:08:27.297Z", - "EditorCaption": " [Design]" - }, { "$type": "Document", "DocumentIndex": 0, - "Title": "DirecionalModel.cs", - "DocumentMoniker": "C:\\ZendionINC\\agrobot_base\\AgroBase\\AgroBase\\Models\\Modules\\DirecionalModel.cs", - "RelativeDocumentMoniker": "AgroBase\\Models\\Modules\\DirecionalModel.cs", - "ToolTip": "C:\\ZendionINC\\agrobot_base\\AgroBase\\AgroBase\\Models\\Modules\\DirecionalModel.cs", - "RelativeToolTip": "AgroBase\\Models\\Modules\\DirecionalModel.cs", - "ViewState": "AQIAAAgAAAAAAAAAAIAwwKoAAAAAAAAA", + "Title": "Enuns.cs", + "DocumentMoniker": "C:\\ZendionINC\\agrobot_base\\AgroBase\\AgroBase\\Models\\Enuns.cs", + "RelativeDocumentMoniker": "AgroBase\\Models\\Enuns.cs", + "ToolTip": "C:\\ZendionINC\\agrobot_base\\AgroBase\\AgroBase\\Models\\Enuns.cs", + "RelativeToolTip": "AgroBase\\Models\\Enuns.cs", + "ViewState": "AQIAAAgAAAAAAAAAAAAxwDUAAAAMAAAA", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2024-06-05T12:25:23.841Z", - "EditorCaption": "" - }, - { - "$type": "Document", - "DocumentIndex": 4, - "Title": "DispositivosService.cs", - "DocumentMoniker": "C:\\ZendionINC\\agrobot_base\\AgroBase\\AgroBase\\Services\\DispositivosService.cs", - "RelativeDocumentMoniker": "AgroBase\\Services\\DispositivosService.cs", - "ToolTip": "C:\\ZendionINC\\agrobot_base\\AgroBase\\AgroBase\\Services\\DispositivosService.cs", - "RelativeToolTip": "AgroBase\\Services\\DispositivosService.cs", - "ViewState": "AQIAAMQCAAAAAAAAAIA9wN8CAAAfAAAA", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2024-06-05T12:11:58.639Z", - "EditorCaption": "" - }, - { - "$type": "Document", - "DocumentIndex": 5, - "Title": "PinoutModel.cs", - "DocumentMoniker": "C:\\ZendionINC\\agrobot_base\\AgroBase\\AgroBase\\Models\\Modules\\PinoutModel.cs", - "RelativeDocumentMoniker": "AgroBase\\Models\\Modules\\PinoutModel.cs", - "ToolTip": "C:\\ZendionINC\\agrobot_base\\AgroBase\\AgroBase\\Models\\Modules\\PinoutModel.cs", - "RelativeToolTip": "AgroBase\\Models\\Modules\\PinoutModel.cs", - "ViewState": "AQIAABUAAAAAAAAAAAA4wIAAAAAAAAAA", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2024-06-05T11:57:33.236Z", - "EditorCaption": "" - }, - { - "$type": "Document", - "DocumentIndex": 6, - "Title": "SerialService.cs", - "DocumentMoniker": "C:\\ZendionINC\\agrobot_base\\AgroBase\\AgroBase\\Services\\SerialService.cs", - "RelativeDocumentMoniker": "AgroBase\\Services\\SerialService.cs", - "ToolTip": "C:\\ZendionINC\\agrobot_base\\AgroBase\\AgroBase\\Services\\SerialService.cs", - "RelativeToolTip": "AgroBase\\Services\\SerialService.cs", - "ViewState": "AQIAAAcAAAAAAAAAAAASwDkAAAAAAAAA", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2024-06-05T11:19:50.984Z", - "EditorCaption": "" - }, - { - "$type": "Document", - "DocumentIndex": 8, - "Title": "frmAcompanhamento.cs", - "DocumentMoniker": "C:\\ZendionINC\\agrobot_base\\AgroBase\\AgroBase\\Forms\\frmAcompanhamento.cs", - "RelativeDocumentMoniker": "AgroBase\\Forms\\frmAcompanhamento.cs", - "ToolTip": "C:\\ZendionINC\\agrobot_base\\AgroBase\\AgroBase\\Forms\\frmAcompanhamento.cs", - "RelativeToolTip": "AgroBase\\Forms\\frmAcompanhamento.cs", - "ViewState": "AQIAAAAAAAAAAAAAAAAAAHQAAAAUAAAA", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2024-06-04T13:26:58.628Z", - "EditorCaption": "" - }, - { - "$type": "Document", - "DocumentIndex": 7, - "Title": "frmAcompanhamento.cs [Design]", - "DocumentMoniker": "C:\\ZendionINC\\agrobot_base\\AgroBase\\AgroBase\\Forms\\frmAcompanhamento.cs", - "RelativeDocumentMoniker": "AgroBase\\Forms\\frmAcompanhamento.cs", - "ToolTip": "C:\\ZendionINC\\agrobot_base\\AgroBase\\AgroBase\\Forms\\frmAcompanhamento.cs [Design]", - "RelativeToolTip": "AgroBase\\Forms\\frmAcompanhamento.cs [Design]", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2024-06-04T13:26:35.932Z", - "EditorCaption": " [Design]" - }, - { - "$type": "Document", - "DocumentIndex": 9, - "Title": "Variaveis.cs", - "DocumentMoniker": "C:\\ZendionINC\\agrobot_base\\AgroBase\\AgroBase\\Models\\Variaveis.cs", - "RelativeDocumentMoniker": "AgroBase\\Models\\Variaveis.cs", - "ToolTip": "C:\\ZendionINC\\agrobot_base\\AgroBase\\AgroBase\\Models\\Variaveis.cs", - "RelativeToolTip": "AgroBase\\Models\\Variaveis.cs", - "ViewState": "AQIAAIgAAAAAAAAAAAAIwJ0BAABPAAAA", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2024-06-04T11:07:28.156Z" - }, - { - "$type": "Document", - "DocumentIndex": 10, - "Title": "SensoriamentoModel.cs", - "DocumentMoniker": "C:\\ZendionINC\\agrobot_base\\AgroBase\\AgroBase\\Models\\Modules\\SensoriamentoModel.cs", - "RelativeDocumentMoniker": "AgroBase\\Models\\Modules\\SensoriamentoModel.cs", - "ToolTip": "C:\\ZendionINC\\agrobot_base\\AgroBase\\AgroBase\\Models\\Modules\\SensoriamentoModel.cs", - "RelativeToolTip": "AgroBase\\Models\\Modules\\SensoriamentoModel.cs", - "ViewState": "AQIAAIcBAAAAAAAAAAAgwNoBAACSAAAA", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2024-06-04T11:06:48.719Z" - }, - { - "$type": "Document", - "DocumentIndex": 11, - "Title": "WT901CService.cs", - "DocumentMoniker": "C:\\ZendionINC\\agrobot_base\\AgroBase\\AgroBase\\Services\\WT901CService.cs", - "RelativeDocumentMoniker": "AgroBase\\Services\\WT901CService.cs", - "ToolTip": "C:\\ZendionINC\\agrobot_base\\AgroBase\\AgroBase\\Services\\WT901CService.cs", - "RelativeToolTip": "AgroBase\\Services\\WT901CService.cs", - "ViewState": "AQIAAAAAAAAAAAAAAAAAABwAAAAQAAAA", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2024-06-04T10:42:18.417Z" - }, - { - "$type": "Document", - "DocumentIndex": 1, - "Title": "MovimentacaoModel.cs", - "DocumentMoniker": "C:\\ZendionINC\\agrobot_base\\AgroBase\\AgroBase\\Models\\Modules\\MovimentacaoModel.cs", - "RelativeDocumentMoniker": "AgroBase\\Models\\Modules\\MovimentacaoModel.cs", - "ToolTip": "C:\\ZendionINC\\agrobot_base\\AgroBase\\AgroBase\\Models\\Modules\\MovimentacaoModel.cs", - "RelativeToolTip": "AgroBase\\Models\\Modules\\MovimentacaoModel.cs", - "ViewState": "AQIAAIcAAAAAAAAAAADwv58AAAAkAAAA", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2024-06-04T10:59:59.838Z", + "WhenOpened": "2024-06-06T10:38:10.351Z", "EditorCaption": "" } ] diff --git a/Firmware/Modulos/Enuns.h b/Firmware/Modulos/Enuns.h index ce99995bf..14fe679a6 100644 --- a/Firmware/Modulos/Enuns.h +++ b/Firmware/Modulos/Enuns.h @@ -7,6 +7,12 @@ enum T_Code { Dir = 101, Sen = 102, Atu = 103, + Gps = 104, + Pzm = 105, + Lra = 106, + Wit = 107, + Bld = 108, + Mvd = 109, }; enum F_Code { diff --git a/Firmware/Modulos/Pinout.h b/Firmware/Modulos/Pinout.h index b562a5a0e..0e5be448c 100644 --- a/Firmware/Modulos/Pinout.h +++ b/Firmware/Modulos/Pinout.h @@ -87,7 +87,7 @@ class PinoModel { } }; -void iniciarMCP(T_Code Modulo, int sda, int scl, byte endereco, bool Mandatorio = false) { +void iniciarMCP(T_Code Modulo, String Mod_ID, int sda, int scl, byte endereco, bool Mandatorio = false) { Serial.println("Iniciando MCP23X17..."); if (!mcpInicializado) { bool init = Wire.begin(sda, scl); @@ -99,9 +99,9 @@ void iniciarMCP(T_Code Modulo, int sda, int scl, byte endereco, bool Mandatorio Serial.println("Erro ao iniciar MCP23X17!"); if (Mandatorio) { Serial.println("Conexão obrigatória, tentando novamente em 5 segundos..."); - EnviarDadosSerial(MontarProtocoloErro(Modulo)); + EnviarDadosSerial(Mod_ID, MontarProtocoloErro(Modulo)); delay(5000); - iniciarMCP(Modulo, sda, scl, endereco, Mandatorio); + iniciarMCP(Modulo, Mod_ID, sda, scl, endereco, Mandatorio); } } else { diff --git a/Firmware/Modulos/SerialService.h b/Firmware/Modulos/SerialService.h index 15c150384..d7cd540ca 100644 --- a/Firmware/Modulos/SerialService.h +++ b/Firmware/Modulos/SerialService.h @@ -95,8 +95,9 @@ std::vector LerBufferSerialFila() { -void EnviarDadosSerial(String Mensagem) { - Serial.println(Mensagem); +void EnviarDadosSerial(String ID, String Mensagem) { + String ProtocoloEnvio = ID + ";" + Mensagem; + Serial.println(ProtocoloEnvio); Serial.flush(); vTaskDelay(pdMS_TO_TICKS(10)); } diff --git a/Firmware/MovUnificado/MovUnificado_v1/MovUnificado_v1.ino b/Firmware/MovUnificado/MovUnificado_v1/MovUnificado_v1.ino new file mode 100644 index 000000000..eb7cd8dec --- /dev/null +++ b/Firmware/MovUnificado/MovUnificado_v1/MovUnificado_v1.ino @@ -0,0 +1,401 @@ +// Dispositivo: Movimentação e Direcional Unificados +// Versão Firmware: 1 +// Ultima atualização: 06/06/2024 +// Atualização: Unificação dos módulos direcional e movimentação + +#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\SerialService.h" +#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\ModbusService.h" +#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\utils.h" +#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\Pinout.h" +#include +#include + +#define D_Code Mvd +#define VERSION 1 +String Mod_ID = ""; +int Cod_Alarme = 0; + +#define _pinoLED RGB_BUILTIN +#define _pinoAddr0 36 +#define _pinoAddr1 39 + +void AtualizarEnderecoModulo() { + bool A0 = digitalRead(_pinoAddr0) == 1; + bool A1 = digitalRead(_pinoAddr1) == 1; + + if (!A0 && !A1) { + Mod_ID = "ET"; + } + else if (A0 && !A1) { + Mod_ID = "EF"; + } + else if (!A0 && A1) { + Mod_ID = "DT"; + } + else if (A0 && A1) { + Mod_ID = "DF"; + } +} + +long _baudRate = 115200; +bool Conectado = false; +int _TaxaAmostragem = 500; + + +class MotorBLDC { + public: + String _ID = (String)Mov; + + bool Iniciado = false; + bool Testando = false; + + PinoModel _pinoTMP; + SimpleKalmanFilter* tempKalman; + + byte _endereco; + int _numPolos; + int _rampa; + int _rpmMax; + + // Consumo + double RPM; + double RPM_SP; + double Temperatura; + double TemperaturaDriver; + double Tensao; + double CorrenteMax; + bool Ligado; + bool Freio; + Sentido _Sentido = Parado; + int CodAlarme; + + // Entrada de dados + double _RPM_SP; + bool _Ligado = false; + bool _Freio = false; + Sentido _SentidoSP = Parado; + + + void Inicializar() { + if (Iniciado) { + EnviarDadosSerial(Mod_ID, _ID + " ja inicializado"); + EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0")); + return; + } + + Iniciado = ConfigurarDriver(); + + if (Iniciado) { + if (_pinoTMP.Definido()) { + _pinoTMP.Conectar(); + tempKalman = new SimpleKalmanFilter(2, 2, 0.01); + } + + xTaskCreatePinnedToCore(&MotorBLDC::MovTaskWrapper, "MovTask", 5000, this, 20, &MovTaskHandle, tskNO_AFFINITY); + + AtualizarDadosControle(true); + + EnviarDadosSerial(Mod_ID, _ID + " Iniciado"); + } + + EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0")); + } + + void Desligar() { + if (!Iniciado) { + EnviarDadosSerial(Mod_ID, _ID + " nao esta inicializado"); + EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0")); + return; + } + + // Parar a execução das tarefas + vTaskDelete(MovTaskHandle); + + // Redefinir as configurações para os valores iniciais + _pinoTMP.Desconectar(); + + // Outras redefinições de variáveis de estado, se necessário + delete tempKalman; + + EnviarDadosSerial(Mod_ID, _ID + " Desligado"); + + Iniciado = false; + + EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0")); + + AtualizarDadosControle(true); + } + + ModbusGetResponse EnviarComandoModbus(byte endereco, byte funcao, byte registro, int valor, bool aguardarResposta = true) { + const int maxTentativas = 2; + int tentativas = 0; + bool sucesso = false; + ModbusGetResponse resposta; + + while (tentativas < maxTentativas && !sucesso) { + uint8_t response[256]; + uint8_t length = 0; + + sendModbusCommand(endereco, funcao, registro, valor, response, length, aguardarResposta); + + if (aguardarResposta) { + // GET + if (funcao == 0x03) { + if (length >= 5) { // Verifica se a resposta tem pelo menos 5 bytes (endereco, codigo_comando, numero_registros, 2 bytes de dados, 2 bytes de CRC) + resposta._success = true; + resposta._address = response[0]; + resposta._command_code = response[1]; + resposta._num_registers = response[2]; + + if (resposta._num_registers == 2) { // Caso de 2 bytes (sem ponto flutuante) + uint16_t value = (response[3] << 8) | response[4]; // Combina os dois bytes + resposta._value = static_cast(value); // Converte para double + sucesso = true; + } else if (resposta._num_registers == 4 && length >= 7) { // Caso de 4 bytes (com ponto flutuante) + uint16_t highBytes = (response[3] << 8) | response[4]; // Combina os dois primeiros bytes + uint16_t lowBytes = (response[5] << 8) | response[6]; // Combina os dois últimos bytes + + // Converte para double + resposta._value = highBytes + (lowBytes / 10000.0); // Supondo que os valores após a vírgula são representados em 4 dígitos decimais + sucesso = true; + } else { + Serial.println("Numero de registros inesperado ou resposta incompleta."); + resposta._success = false; + } + } else { + Serial.println("Resposta incompleta."); + resposta._success = false; + } + } + // SET + else if (funcao == 0x06) { + if (length >= 8) { + resposta._success = true; + resposta._address = response[0]; + resposta._command_code = response[1]; + resposta._num_registers = 0; + resposta._value = (response[4] << 8) | response[5]; + sucesso = true; + } else { + Serial.println("Erro ao enviar comando"); + resposta._success = false; + } + } + + tentativas++; + } + else { + sucesso = true; + resposta._success = sucesso; + } + + } + + return resposta; + } + + bool ConfigurarDriver() { + ModbusGetResponse a = EnviarComandoModbus(_endereco, 0x06, 0x00B6, 1); + if (a._success) { + ModbusGetResponse b = EnviarComandoModbus(_endereco, 0x06, 0x0076, 0); + if (b._success) { + ModbusGetResponse c = EnviarComandoModbus(_endereco, 0x06, 0x0086, _numPolos); + if (c._success) { + ModbusGetResponse d = EnviarComandoModbus(_endereco, 0x06, 0x008A, _rampa); + if (d._success) { + ModbusGetResponse e = EnviarComandoModbus(_endereco, 0x06, 0x0092, _rpmMax); + return e._success; + } + } + } + } + return false; + } + + void AtualizarDadosControle(bool reset = false) { + if (!Iniciado) { + return; + } + + if (reset) { + _Ligado = false; + _Freio = false; + _SentidoSP = Parado; + _RPM_SP = 0; + } + + /*if (_SentidoSP != Parado && _SentidoSP != _Sentido) { + int std = EnviarComandoModbus(_endereco, 0x06, 0x006D, _SentidoSP == Horario ? 1 : 0)._value; + _Sentido = !Ligado ? Parado : std == 0 ? Horario : Antihorario; + } + if (_RPM_SP != RPM_SP) { + RPM_SP = EnviarComandoModbus(_endereco, 0x06, 0x0056, _RPM_SP)._value; + } + if (_Freio != Freio) { + Freio = EnviarComandoModbus(_endereco, 0x06, 0x006A, _Freio ? 1 : 0)._value == 1; + } + if (_Ligado != Ligado) { + Ligado = EnviarComandoModbus(_endereco, 0x06, 0x0066, _Ligado ? 1 : 0)._value == 1; + }*/ + + if (_SentidoSP != Parado && _SentidoSP != _Sentido) { + EnviarComandoModbus(_endereco, 0x06, 0x006D, _SentidoSP == Horario ? 1 : 0, false); + } + if (_RPM_SP != RPM_SP) { + EnviarComandoModbus(_endereco, 0x06, 0x0056, _RPM_SP, false); + } + if (_Freio != Freio) { + EnviarComandoModbus(_endereco, 0x06, 0x006A, _Freio ? 1 : 0, false); + } + if (_Ligado != Ligado) { + EnviarComandoModbus(_endereco, 0x06, 0x0066, _Ligado ? 1 : 0, false); + } + + /*EnviarComandoModbus(_endereco, 0x06, 0x006D, _SentidoSP == Horario ? 1 : 0, false); + EnviarComandoModbus(_endereco, 0x06, 0x0056, _RPM_SP, false); + EnviarComandoModbus(_endereco, 0x06, 0x006A, _Freio ? 1 : 0, false); + EnviarComandoModbus(_endereco, 0x06, 0x0066, _Ligado ? 1 : 0, false);*/ + + } + + private: + + TaskHandle_t MovTaskHandle = NULL; + static void MovTaskWrapper(void *pvParameters) { + MotorBLDC *motor = static_cast(pvParameters); + motor->MovTask(); + } + + void MovTask() { + 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) { + + AferirTemperatura(); + AferirDadosDriver(); + + EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sBLD, _ID, MontarDadosProtocoloBLD(RPM, Temperatura, Tensao, CorrenteMax, Ligado, _Sentido, Freio, CodAlarme, TemperaturaDriver))); + firstMilis = millis(); + } + + // Aguarda metade do menor período possível entre leituras + vTaskDelay(1); + } + } + + void AferirDadosDriver() { + RPM_SP = EnviarComandoModbus(_endereco, 0x03, 0x0056, 1)._value; + RPM = EnviarComandoModbus(_endereco, 0x03, 0x005F, 1)._value; + Ligado = EnviarComandoModbus(_endereco, 0x03, 0x0066, 1)._value == 1; + Freio = EnviarComandoModbus(_endereco, 0x03, 0x006A, 1)._value == 1; + _Sentido = Ligado ? EnviarComandoModbus(_endereco, 0x03, 0x006D, 1)._value == 1 ? Horario : Antihorario : Parado; + CodAlarme = EnviarComandoModbus(_endereco, 0x03, 0x0076, 1)._value; + Tensao = EnviarComandoModbus(_endereco, 0x03, 0x00C8, 2)._value; + CorrenteMax = EnviarComandoModbus(_endereco, 0x03, 0x0096, 2)._value; + TemperaturaDriver = EnviarComandoModbus(_endereco, 0x03, 0x00D2, 2)._value; + } + + void AferirTemperatura() { + int leitura = _pinoTMP.get(); + float leituraNormalizada = tempKalman->updateEstimate(leitura); + Temperatura = leituraNormalizada; + } + +}; + +MotorBLDC MotorMOV; + +void setup() { + pinMode(_pinoAddr0, INPUT); + pinMode(_pinoAddr1, INPUT); + + AtualizarEnderecoModulo(); + + Serial.begin(_baudRate); + + delay(10); + + InicializarModbus(); +} + +void loop() { + std::vector protocolos = LerBufferSerialFila(); + + for (int i = 0; i < protocolos.size(); i++) { + ProcessarProtocolo(protocolos[i].protocolo, protocolos[i].funcao, protocolos[i].idMensagem); + } +} + +void ProcessarProtocolo(String Protocolo, F_Code _funcao, int idMensagem) { + + if (_funcao == Chk) { + EnviarDadosSerial(Mod_ID, MontarProtocoloVerificacao(D_Code, VERSION)); + } + /*else if (_funcao == Cfg) { + std::vector Partes = SplitString(Protocolo, (char*)","); + + String ID = Partes[0]; + bool Conectar = Partes[1] == "1"; + if (ID == "MD") { + _TaxaAmostragem = Partes[2].toInt(); + + EnviarDadosSerial(MontarProtocoloSensor(sCFG, "MD", Conectar ? "1" : "0")); + + vTaskDelay(pdMS_TO_TICKS(100)); + + Conectado = Conectar; + } + else { + int canal = Partes[2].toInt(); + String addr = Partes[3]; + int num_polos = Partes[4].toInt(); + int rampa = Partes[5].toInt(); + int rpm_max = Partes[6].toInt(); + TiposBarramentos tmpB = (TiposBarramentos)Partes[7].toInt(); + int tmp = Partes[8].toInt(); + + MotorBLDC* _motor = MotorPorID(ID); + if (Conectar) { + _motor->_canal = canal; + _motor->_endereco = stringToByte(addr); + _motor->_numPolos = num_polos; + _motor->_rampa = rampa; + _motor->_rpmMax = rpm_max; + _motor->_pinoTMP = PinoModel(tmp, tmpB, _INPUT, ANALOGICO); + + _motor->Inicializar(); + } + else { + _motor->Desligar(); + } + vTaskDelay(pdMS_TO_TICKS(500)); + } + } + else if (_funcao == Cmd) { + std::vector Partes = SplitString(Protocolo, (char*)","); + + String ID = Partes[0]; + + MotorBLDC* _motor = MotorPorID(ID); + + _motor->_SentidoSP = (Sentido)Partes[1].toInt(); + _motor->_Ligado = _motor->_SentidoSP != Parado; + _motor->_RPM_SP = Partes[2].toInt(); + _motor->_Freio = Partes[3] == "1"; + + _motor->AtualizarDadosControle(); + }*/ + + EnviarDadosSerial(Mod_ID, MontarProtocoloMensagemRecebida(idMensagem)); + +}