/*
  Servo and LCD 16x2 using Franzininho, Slide potentiometer and LCD 16x2 i2c
  by Anderson Costa with ❤ for the Wokwi community
  Visit https://wokwi.com to learn about the Wokwi Simulator
  Visit https://franzininho.com.br to learn about the Franzininho
*/
#include "LiquidCrystal_I2C.h"
#include "Servo8Bit.h"

#define SERVO_PIN          PB1           // Define o pino onde o servo está conectado
#define SLIDE_PIN          PB3           // Define o pino onde o potenciômetro está conectado

int main()
{
    Servo8Bit myServo;                   // Cria um objeto servo
    myServo.attach(SERVO_PIN);           // Conecta o servo ao pino PB1

    LiquidCrystal_I2C lcd(0x27, 16, 2);  // Define endereço e 16 caracteres/2 linhas

    lcd.init();                          // Inicializa o display
    lcd.backlight();                     // Acende a luz de fundo do display
    lcd.clear();                         // Limpa o display
    lcd.setCursor(0, 0);                 // Coloca o cursor na primeira linha
    lcd.print("ANGULO DO SERVO:");       // Imprime a mensagem no display
    lcd.setCursor(0, 1);                 // Coloca o cursor na segunda linha
    lcd.print("ADC:");                   // Imprime a mensagem no display

    // Faz a leitura do potenciometro, imprime no display e controla o servo
    while (1) {
        // Obtém o resultado do potenciômetro, ADC de 10 bits (0-1023)
        int pot = analogRead(SLIDE_PIN);

        // Coloca na posição do valor do ADC no display
        lcd.setCursor(5, 1);
        lcd.print(pot);
        lcd.print("   ");                // Limpa o valor anterior que ficou na frente

        // Converte para um valor entre 0 e 180 para ficar longe de overflows adjacentes
        int pos = map(pot, 0, 1023, 0, 180);

        // Coloca na posição do valor do ângulo do servo no display
        lcd.setCursor(12, 1);
        lcd.print(pos);
        lcd.print((char)223);
        lcd.print("  ");                 // Limpa o valor anterior que ficou na frente

        myServo.write(pos);              // Define o servo para ir para a posição na variável 'pos'
        myServo.delay(15);               // Espera 15ms para o servo alcançar a posição
    }
}