# leituraSensoriamento.hpp
[toc]
## Objetivo:
O código tem como objetivo reunir os dados acerca das leituras feitas em cada um dos sensores - já calibrados, para calcular a posição do robô em relação à pista.
## [Fluxograma](https://miro.com/welcomeonboard/eUlVUDVxTW5rNmpWeDdVam9UNjZPam5KVXFZckhZYzRLY1dsdHNtczg1WjJkVHNKSjZVUVkzM3hFbDM3RUpsT3wzNDU4NzY0NTM5MDA3MTM2NjM1fDI=?share_link_id=395314307886)
## Processo criativo:
Com base em um código previamente criado da equipe, foram implementadas mudanças que facilitassem o entendimento do tal. Renomeando a classe para "Sensores", a fim de integrar as funções de calibração dos aparelhos dentro dela e, também, simplificando a inicialização da pinagem dos sensores.
## Ferramentas utilizadas:
Não há emprego de nenhuma biblioteca, dispondo apenas dos arquivos "datacenter" e "pinos" para realização de algumas tarefas.
## Passo a passo para rodar o projeto:
Ao iniciar, criamos uma lista para separar cada sensor do outro
## Instruções de teste:
Utilizamos um pedaço de folha branca para testarmos a variação dos valores dos sensores, dado que os sensores por serem infravermelhos conseguem realizar a distinção entre o branco e o preto pela refletância da luz.
### Funções no código e seus propósitos:
Dentro do código, as funções a seguir se encontram dentro da classe Sensores:
**Sensores()**

// atualizar print
Aqui é onde se determina a numeração(valor) das variáveis ligadas a cada um dos sensores. As quais são de calibragem máxima e mínima, como também a de leitura, que é fornecida pelo sensor naquele instante.
**initPins()**

São definidas as funções de cada pino relativo aos sensores. Sendo os da frente controlados pelo MUX: 4 para saída e 1 para entrada .E no caso dos das laterais: são 3 de entrada pois eles enviam os valores direto para o ESP (ADC).
**readCalibrated()**

Ela tem a função de ajustar os valores dos sensores na escala de leitura do ESP e limitando o valor máximo e mínimo, assim calibrando os valores de leitura.
**calibrateSensors()**

Esta função tem o objetivo de calibrar o valor máximo e minimo possíveis para leitura dos sensores. Esses valores serão modificados caso a leitura retorne valores menores que o mínimo ou maiores que o máximo.
**choseSensor() and readSensors()**

A choseSensor fará a escolha do sensor que queremos fazer a leitura, enviando um sinal específico em binário para o Mux.
A readSensors fará a leitura dos valores retornados pelo Mux, no qual será necessário mandar sinais em loop para ser possível ler todos os sensores recebidos pelo Mux. Após isso, sensores laterais são lidos.
**CalculatePosition()**


O cálculo da posição é feito utilizando os valores dos sensores para verificar como o robô está em relação à linha. As leituras são multiplicadas por pesos que aumentam quanto mais na ponta do robô. Assim, o sensor frontal mais à esquerda é multiplicado por um valor maior do que o sensor no centro. O valor retornado, determina o quanto o robô deve ser girado, ou seja, quanto maior o valor de retorno, maior o grau de giro.
### Possíveis Dúvidas:
Sobre o funcionamento do Mux:
O Multiplexador possui 4 entradas lógicas que por lógica booleana(2^4) nos permite selecionar 16 saídas. Essas saídas são as entradas dos sensores que vão enviar o sinal do sensor selecionado para a saída do Mux, o MUXOUT.
Por exemplo: Se passarmos os seguintes valores para as entradas do Mux: MUX0 = 0, MUX1 = 1, MUX2 = 0, MUX3 = 1, teremos em binário o número "1010" que é equivalente ao valor 10 em decimal. Então o valor que estaremos pegando será o do sensor 10, no qual a leitura vai ser enviada para o MUXOUT.
### Possíveis melhorias:

