204 lines
5.4 KiB
C++
204 lines
5.4 KiB
C++
#include "SerialService.h"
|
|
#include "Pinout.h"
|
|
#include "Utils.h"
|
|
|
|
#ifndef SensorSonarModel
|
|
#define SensorSonarModel
|
|
|
|
class SensorSonar {
|
|
public:
|
|
|
|
SensorSonar(String _modID, String _id) {
|
|
Mod_ID = _modID;
|
|
_ID = _id;
|
|
}
|
|
|
|
// Definições
|
|
String Mod_ID;
|
|
String _ID;
|
|
S_Code _componente = sSNR;
|
|
PinoModel _pinoE;
|
|
PinoModel _pinoT;
|
|
PinoModel _pinoServoX;
|
|
PinoModel _pinoServoY;
|
|
int _delayAmostragem;
|
|
int _prioridade;
|
|
|
|
Servo _ServoX;
|
|
Servo _ServoY;
|
|
|
|
int _AgPlus;
|
|
int _AgPosition;
|
|
|
|
bool Iniciado = false;
|
|
|
|
long _distancia = 0;
|
|
long _angulo = 0;
|
|
int _posicao = 0;
|
|
|
|
void Inicializar() {
|
|
if (Iniciado) {
|
|
//EnviarDadosSerial(_ID + " ja inicializado");
|
|
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
|
return;
|
|
}
|
|
|
|
_pinoE.Conectar();
|
|
_pinoT.Conectar();
|
|
if (_pinoServoX.Definido()) {
|
|
_ServoX.attach(_pinoServoX.num);
|
|
_ServoX.write(0);
|
|
}
|
|
if (_pinoServoY.Definido()) {
|
|
_ServoY.attach(_pinoServoY.num);
|
|
_ServoY.write(0);
|
|
}
|
|
|
|
xTaskCreatePinnedToCore(&SensorSonar::SSTaskWrapper, "SSTask", 5000, this, _prioridade, &SSTaskHandle, tskNO_AFFINITY);
|
|
|
|
//EnviarDadosSerial(_ID + " Iniciado");
|
|
|
|
Iniciado = true;
|
|
|
|
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
|
}
|
|
|
|
void Desligar() {
|
|
if (!Iniciado) {
|
|
//EnviarDadosSerial(_ID + " nao esta inicializado");
|
|
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
|
return;
|
|
}
|
|
|
|
// Parar a execução das tarefas
|
|
vTaskDelete(SSTaskHandle);
|
|
|
|
if (_pinoServoX.Definido()) {
|
|
_ServoX.detach();
|
|
}
|
|
if (_pinoServoY.Definido()) {
|
|
_ServoY.detach();
|
|
}
|
|
|
|
// Redefinir as configurações para os valores iniciais
|
|
_pinoE.Desconectar();
|
|
_pinoT.Desconectar();
|
|
|
|
//EnviarDadosSerial(_ID + " Desligado");
|
|
|
|
Iniciado = false;
|
|
|
|
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
|
|
}
|
|
|
|
void RequisitarDados() {
|
|
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sSNR, _ID, MontarDadosProtocoloSonar(_distancia, _angulo, _posicao)));
|
|
}
|
|
|
|
private:
|
|
TaskHandle_t SSTaskHandle = NULL;
|
|
static void SSTaskWrapper(void *pvParameters) {
|
|
SensorSonar *sensor = static_cast<SensorSonar*>(pvParameters);
|
|
sensor->SSTask();
|
|
}
|
|
|
|
/*int idx = 0;
|
|
int distancias[36];
|
|
int angulos[36];*/
|
|
|
|
void SSTask() {
|
|
bool Horario = true;
|
|
bool Subindo = true;
|
|
int position = 0;
|
|
unsigned long firstMilis = millis();
|
|
while (1)
|
|
{
|
|
if (!Iniciado) {
|
|
// Caso não esteja conectado, aguarda 1 segundo até a próxima verificação, liberando uso de CPU
|
|
vTaskDelay(1000);
|
|
continue;
|
|
}
|
|
|
|
if (Subindo) {
|
|
for (position = 0; position < 2; position++) {
|
|
position = 1; // REMOVER
|
|
_ServoY.write(position * _AgPosition); // Move o servo para o ângulo desejado
|
|
//vTaskDelay(100); // Espera meio segundo para o servo se mover
|
|
if (Horario) {
|
|
for(int angle = 0; angle <= 180; angle += _AgPlus) { // Move o servo de 0 a 180 graus
|
|
LeituraSonar(angle, position);
|
|
}
|
|
Horario = false;
|
|
}
|
|
else {
|
|
for(int angle = 180; angle > 0; angle -= _AgPlus) { // Move o servo de 0 a 180 graus
|
|
LeituraSonar(angle, position);
|
|
}
|
|
Horario = true;
|
|
}
|
|
}
|
|
Subindo = false;
|
|
}
|
|
else {
|
|
for (position = 2; position > 0; position--) {
|
|
position = 1; // REMOVER
|
|
_ServoY.write(position * _AgPosition); // Move o servo para o ângulo desejado
|
|
//vTaskDelay(100); // Espera meio segundo para o servo se mover
|
|
if (Horario) {
|
|
for(int angle = 0; angle <= 180; angle += _AgPlus) { // Move o servo de 0 a 180 graus
|
|
LeituraSonar(angle, position);
|
|
}
|
|
Horario = false;
|
|
}
|
|
else {
|
|
for(int angle = 180; angle > 0; angle -= _AgPlus) { // Move o servo de 0 a 180 graus
|
|
LeituraSonar(angle, position);
|
|
}
|
|
Horario = true;
|
|
}
|
|
}
|
|
Subindo = true;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
void LeituraSonar(int angle, int position) {
|
|
long duration, distance;
|
|
|
|
for (int i = 0; i < 3; i++) {
|
|
_pinoT.set(false);
|
|
delayMicroseconds(2);
|
|
_pinoT.set(true);
|
|
delayMicroseconds(10);
|
|
_pinoT.set(false);
|
|
|
|
duration = pulseIn(_pinoE.num, HIGH);
|
|
distance = (duration / 2) / 29.1; // Calcula a distância em centímetros
|
|
if (distance > 10) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*angulos[idx] = angle;
|
|
distancias[idx] = distance;
|
|
idx++;*/
|
|
|
|
_ServoX.write(angle); // Move o servo para o ângulo desejado
|
|
vTaskDelay(30); // Espera meio segundo para o servo se mover
|
|
|
|
_distancia = distance;
|
|
_angulo = angle;
|
|
_posicao = position;
|
|
|
|
RequisitarDados();
|
|
|
|
/*if (idx >= 35) {
|
|
EnviarDadosSerial(MontarProtocoloSensor(sSNR, _ID, MontarDadosProtocoloSonarM(distancias, angulos, position)));
|
|
idx = 0;
|
|
}*/
|
|
}
|
|
|
|
};
|
|
|
|
#endif |