Entradas y salidas.

Si. Puedes en el loop usar pinMode(pin, OUTPUT o INPUT) y cambiarle la funcionalidad.

De hecho hay rutinas y librerías que lo hacen. Ejemplo: leer un DHT22 o un DS18B20 implica una comunicación bidirección por un solo pin. Ese pin pasa de modo Salida a modo entrada en diferentes fases del código. Lo mismo que estas consultando.