# 3. Leitura dos sensores infravermelhos

Neste capítulo será abordado a parte do código para obter os dados dos sensores IR

# 3.1 Código em Java

___

Nesta página será descrito como deve ser feito o código em Java para lermos os dados obtidos pelo sensor infravermelho. Antes de começarmos a programar é importante esclarecer alguns items:

- Estamos considerando que você já saiba como mexer no VS Code WPILib de maneira geral e tenha sua elétrica montada conforme os capítulos anteriores.
- O código é o mesmo para qualquer sensor infravermelho retro reflexivo, ou que tenha um input apenas, como nosso caso.
____
## **Código**

A primeira etapa que devemos fazer é declarar a nossa entrada do roboRIO que estará fazendo a leitura do sensor. Portanto:

```java
  DigitalInput sensorInfravermelho = new DigitalInput(0);
```

Onde temos o número **0** é o local - parâmetro da função construtora da classe **DigitalInput** - que deve ser declarado qual porta **DIO** do roboRIO estamos utilizando, nesse caso, a 0, mas poderia ser a 1, 2, 3...
____

A segunda parte é a exibição desses valores em uma dashboard, em nosso caso estaremos utilizando a *shuffleboard*. Para fazer isso apenas faça - **dentro de uma função períodica para leituras contínuas**:

```java
@Override
public void robotPeriodic() 
{
  SmartDashboard.putBoolean("Estado do sensor IR", sensorInfravermelho.get());
}
```

> Caso sua leitura esteja invertida, ou seja, quando o sensor não está detectando nenhum objeto ele retorna verdadeiro (nesse caso será representado pelo true na *shuffleboard*), mas se detectar retorna falso. Para resolver isso apenas precisamos inverter a leitura. Para isso faça como o código abaixo:

```java
@Override
public void robotPeriodic() 
{
  SmartDashboard.putBoolean("Estado do sensor IR", !sensorInfravermelho.get());
}
```
>Se estiver utilizando o sensor ED30-D80B4 é possível reverter a leitura na própria calibração do sensor, para isso de uma olhada na página [1.3 Calibração do sensor](https://docs.stemos.com.br/books/sensores-quick-irs/page/13-calibracao-do-sensor)
____

## **Exibição na shuffleboard**

Quando colocarmos nossa variável de leitura na *shuffleboard*, será apenas uma caixa de texto, portanto, ela dirá *true* ou *false*. Entretanto é possível alterarmos para uma boolean box, a qual indicará pela cor se nosso sensor esta ou não lendo algo. Para fazer isso, clique com o botão direito no elemento da *shuffleboard* e faça o seguinte:

<div align="center">

[![Captura de tela 2023-10-17 150637.png](https://docs.stemos.com.br/uploads/images/gallery/2023-10/scaled-1680-/captura-de-tela-2023-10-17-150637.png)](https://docs.stemos.com.br/uploads/images/gallery/2023-10/captura-de-tela-2023-10-17-150637.png)

</div>

Caso nosso sensor detecte um objeto essa caixa deverá ficar verde.
___
> Lembrando que se ficar invertido é necessário reverter isso na leitura do código, como descrito mais acima nesta página

# 3.2 Código em LabView

___

Antes de começarmos a realizar a leitura dos nosso sensores infravermelhos em LabVIEW é preciso esclarecer dois items:

- Estamos considerando que você já saiba como instalar e mexer no programa LabVIEW para FRC.
- A segunda parte é que estamos considerando que você já tenha o resto da sua elétrica montada, e a única coisa que precisaremos fazer é construir o código no roboRIO.
___

## **Código**

A primeira etapa que devemos realizar é configurar uma referência para nossa porta de entrada digital, isso é feito em nosso **Begin.vi**, portanto vamos utilizar um VI de Open para informar a porta DIO que o sensor está conectado, e depois vamos fazer o registro da referência:

<div align="center">

[![Captura de tela 2023-10-18 141355.png](https://docs.stemos.com.br/uploads/images/gallery/2023-10/scaled-1680-/captura-de-tela-2023-10-18-141355.png)](https://docs.stemos.com.br/uploads/images/gallery/2023-10/captura-de-tela-2023-10-18-141355.png)

</div>

>Caso queira alterar a porta digital, apenas edite a constante DIO 0.

Para realizarmos a leitura do sensor infravermelho é preciso acessar a referência do sensor declarada anteriormente e obter seu valor por meio de um VI que retorna o valor da porta. Nesse caso estamos colocando seu valor em um **indicador**. Faremos isso utilizando o seguinte diagrama:

<div align="center">

[![Captura de tela 2023-10-18 142011.png](https://docs.stemos.com.br/uploads/images/gallery/2023-10/scaled-1680-/captura-de-tela-2023-10-18-142011.png)](https://docs.stemos.com.br/uploads/images/gallery/2023-10/captura-de-tela-2023-10-18-142011.png)

</div>

As vezes pode ser necessário reverter a leitura do sensor, pois ele pode detectar um objeto e retornar *false*, e isso atrapalha na hora da visualização. Portanto, para inverter a leitura faça o seguinte, adicione um not na função *get*, como segue:

<div align="center">

[![Captura de tela 2023-10-18 145441.png](https://docs.stemos.com.br/uploads/images/gallery/2023-10/scaled-1680-/captura-de-tela-2023-10-18-145441.png)](https://docs.stemos.com.br/uploads/images/gallery/2023-10/captura-de-tela-2023-10-18-145441.png)

</div>

>Se estiver utilizando um sensor ED30-D80B4 é possível inverter a leitura no próprio sensor, para isso de uma olhada na página [1.3 Calibração do sensor](https://docs.stemos.com.br/books/sensores-quick-irs/page/13-calibracao-do-sensor)

____

## **Visualização no Painel Frontal**

Quando criamos o indicador que armazena o estado do nosso sensor, automáticamente no *front panel* do LabVIEW é criado um elemento que indica o estado da variável. Da seguinte forma:

<div align="center">

[![Captura de tela 2023-10-18 142302.png](https://docs.stemos.com.br/uploads/images/gallery/2023-10/scaled-1680-/captura-de-tela-2023-10-18-142302.png)](https://docs.stemos.com.br/uploads/images/gallery/2023-10/captura-de-tela-2023-10-18-142302.png)

</div>