/*********************************************
  Autor: Marlon Nardi Walendorff
  Projeto: Solda ponto para baterias de lítio com Arduino
  Detalhes do projeto:https://marlonnardi.com/2023/12/03/como-fazer-solda-ponto-profissional-para-baterias-18650-e-mais-construa-sua-propria-bicicleta-eletrica-1/
/**********************************************/
 
 
//==================== Inclusão de Bibliotecas =================//
#include <Adafruit_SSD1306.h>
#include <RotaryEncoder.h>
 
//==================== Mapeamento de Hardware ==================//
#define pin_Encoder_CLK 2
#define pin_Encoder_DT 3
#define pin_Encoder_SW 4
 
#define pin_Trigger 5
#define pin_Triac 9
 
#define min_Power_ms 3
#define max_Power_ms 120
 
//==================== Instânciando Objetos ====================//
Adafruit_SSD1306 Display(128, 64, &Wire, -1, 400000, 400000);
RotaryEncoder EncoderOne(pin_Encoder_CLK, pin_Encoder_DT);
 
//==================== Variáveis Globais ==================//
byte aux2 = 0;
 
int16_t valorEncoder = 0;
uint16_t time_ms = 0;
 
 
void setup()
{
 
  Serial.begin(9600);
  //Configura pino como saída
  pinMode(pin_Triac, OUTPUT);
 
  //Configura pino como entrada PULL-UP
  pinMode(pin_Encoder_SW, INPUT_PULLUP);
  //Configura pino como entrada PULL-UP
  pinMode(pin_Trigger, INPUT_PULLUP);
 
 
 
  //================= Interrupção Externa ========================//
  /* Vincula duas interrupções externas no pino 2 e 3 nas funções ISR0 e ISR1
     para garantir que o encoder sempre seja lido com prioridade.*/
  attachInterrupt(digitalPinToInterrupt(2), ISR0, CHANGE);
  attachInterrupt(digitalPinToInterrupt(3), ISR1, CHANGE);
 
  EncoderOne.setPosition(25); // Energia inicial em 25%
 
  //Inicializa o OLED 128X64 0.96 INCH com endereço I2C 0x3C
  Display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
 
  Display.setTextColor(WHITE); //Define a cor do texto
 
 
  //Limpa o display, necessário para apagar a imagem inicial da adafruit
  Display.clearDisplay();
  //Atualiza o display
  Display.display();
 
 
 
  Display.setTextSize(1); //Define o tamanho da fonte do texto
  //Posição Largura/Altura
  Display.setCursor(0, 0);
  Display.print("Acesse o projeto em:");
 
  Display.setTextSize(1); //Define o tamanho da fonte do texto
  //Posição Largura/Altura
  Display.setCursor(0, 25);
  Display.print("marlonnardi.com");
 
  Display.display();
 
 
  delay(2000);
 
  Display.clearDisplay();
  Display.display();
 
 
}//endSetup --------------------------------------
 
 
void loop()
{
  trigger();
  screenOne();
}//end_void_loop ----------------------
 
 
 
void trigger()
{
 
  if (digitalRead(pin_Trigger) ) //Se o botão está solto
  {
    aux2 = 1;
  }
 
  if (!digitalRead(pin_Trigger) && aux2 == 1) //Se o botão está pressionado
  {
 
    digitalWrite(pin_Triac, HIGH);
    delay(time_ms);
    digitalWrite(pin_Triac, LOW);
    delay(time_ms);
 
    aux2 = 0;
  }
 
 
}//----------------------- end_selecionaTela
 
 
//================== ISRs Interrupções Externas =======================//
/* Caso qualquer pino do encoder envie sinal, o metodo .tick() sempre será
  chamado, atualizando o valor do encoder via sua biblioteca. */
 
void ISR0()// Função ligada a uma interrupção ISR logo não pode retornar valor e deve ser mais rápida possível
{
  EncoderOne.tick();// Começa a ler o valor do encoder
}//-------------------------endISR0
 
void ISR1()// Função ligada a uma interrupção ISR logo não pode retornar valor e deve ser mais rápida possível
{
  EncoderOne.tick();// Começa a ler o valor do encoder
 
}//------------------------endISR1
 
 
void screenOne()
{
  Display.clearDisplay();
 
  Display.setTextSize(2); //Define o tamanho da fonte do texto
  //Posição Largura/Altura
  Display.setCursor(27, 0);
  Display.print("Energy:");
 
 
  if (valorEncoder <= 9)
  {
    Display.setTextSize(4); //Define o tamanho da fonte do texto
    //Posição Largura/Altura
    Display.setCursor(46, 25);
    Display.print(valorEncoder);
 
    //Posição Largura/Altura
    Display.setCursor(71, 25);
    Display.print("%");
 
  }
 
  if (valorEncoder >= 10 && valorEncoder <= 99)
  {
 
    Display.setTextSize(4); //Define o tamanho da fonte do texto
    //Posição Largura/Altura
    Display.setCursor(31, 25);
    Display.print(valorEncoder);
 
    //Posição Largura/Altura
    Display.setCursor(81, 25);
    Display.print("%"); 
  }
 
  if (valorEncoder >= 100)
  { 
    Display.setTextSize(4); //Define o tamanho da fonte do texto
    //Posição Largura/Altura
    Display.setCursor(18, 25);
    Display.print(valorEncoder);
 
    //Posição Largura/Altura
    Display.setCursor(92, 25);
    Display.print("%");
 
  }
 
 
  valorEncoder = EncoderOne.getPosition();//Captura o valor do encoder
 
  if (EncoderOne.getPosition() < 1)
  {
    EncoderOne.setPosition(100);
    valorEncoder = 100;
  }
 
  if (EncoderOne.getPosition() > 100)
  {
    EncoderOne.setPosition(1);
    valorEncoder = 1;
  }
 
 
  time_ms = map(valorEncoder, 1, 100, min_Power_ms, max_Power_ms);
 
  Serial.println(time_ms);
 
 
  Display.display();
 
}//end_screenOne ----------------------