//----------/PORTAS/----------//
#define PortaA 4
#define PortaB 5
#define Botao 6
#define Servo_Soldador 2
#define Servo_Alicate 3
byte Portas[] = {PortaA, PortaB, Botao};
//----------/BIBLIOTECAS/----------//
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Servo.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
int white = SSD1306_WHITE;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
Servo Soldador;
Servo Alicate;
void setup() {
for (byte Np = 0; Np <= 2; Np++) {
pinMode(Portas[Np], INPUT);
}
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
Serial.begin(115200); //inicia a comunicação serial
display.clearDisplay(); //limpa o display
display.setTextSize(1);
display.setTextColor(white);
display.setCursor(0, 0);
display.print("Iniciando");
Serial.print("Iniciando");
display.display(); //envia as informações para o display
// inserir logo
// Programa de inicializção
}
void loop() {
/* Objetivos:
Menu de Configuração inicial.
Menu interno de configuração dos servos
Opções:
* Iniciar
* Ajustes
* Configurações do encoder
- -
* Posição A do Servo Alicate
* Posição B do Servo Alicate
* Posição A do Servo Soldador
* Posição B do Servo Soldador
* Inverter Rotação
*/
bool estadoA = digitalRead(PortaA);
bool estadoB = digitalRead(PortaB);
bool estadoSW = digitalRead(Botao);
byte evento = Encoder(estadoA, estadoB, estadoSW);
if (evento == 1){
Serial.println("Botão pressionado!");
}
else if (evento == 2) {
Serial.println("Girou para ESQUERDA");
}
else if (evento == 3) {
Serial.println("Girou para DIREITA");
}
}
void Display() {
}
void Servos(){
}
/*
Circuito do encoder:
2 sinais de pulso para identificar o sentido de rotação do encoder sendo A - B
Objetivo: Verificar Qual das duas portas de sinais serão alterada primeiro
Ex: A alternado Antes de B = Rotação para Esquerda
B Alternado antes de A = Rotação Para Direita
*/
/*
//histórico guarda o estado anterior das portas
bool OutA1 = 0;
bool OutB1 = 0;
bool OutSW1 = 0;
byte Encoder(bool OutA, bool OutB , bool OutSW){
// obtém o estado atual para as portas do encoder
if (OutA != OutA1 && OutB == OutB1) { // A alternado Antes de B = Rotação para Esquerda
OutA1 = OutA; //salva as ultima posições do encoder
OutB1 = OutB;
return 2;
} else if (OutB != OutB1 && OutA == OutA1 ) { // B Alternado antes de A = Rotação Para Direita
OutA1 = OutA; //salva as ultima posições do encoder
OutB1 = OutB;
return 3;
} else if (OutSW == 1 && OutSW1 == 0) { //Botão Encoder Apertado
OutSW1 = OutSW;
return 1;
} else { return 0; }
}; */
// Variáveis globais para guardar o último estado
bool lastA = 0;
bool lastB = 0;
bool lastSW = 1; // botão começa solto (puxado para HIGH)
byte resultado = 0;
byte Encoder(bool OutA, bool OutB, bool OutSW) {
if (OutA != lastA && OutB == lastB) { // Detecta rotação para a esquerda
if (OutA == OutB) {
resultado = 2; // esquerda
} else {
resultado = 3; // direita
}
lastA = OutA;
lastB = OutB;
} else if (OutB != lastB && OutA == lastA) { // Detecta rotação para a direita (caso complementar)
if (OutA == OutB) {
resultado = 3; // direita
} else {
resultado = 2; // esquerda
}
lastA = OutA;
lastB = OutB;
}
if (OutSW == 0 && lastSW == 1) { // Detecta botão pressionado
resultado = 1; // botão
}
lastSW = OutSW;
return resultado;
}