//----------/PORTAS/----------//
#define PortaA 4
#define PortaB 5
#define Botao 6
#define PinRS 12
#define PinEn 11
#define Pin04 10
#define Pin05 9
#define Pin06 8
#define Pin07 7
#define Soldador_Pin 2
#define Alicate_Pin 3
byte Portas[] = {PortaA, PortaB, Botao};
//----------/Variaveis/----------//
byte DisplayPosition = 0;
byte Cursor = 0;
byte SSMax = 180; //Remoção do resistor de entrada (enviar 180 diminuir 3 e enviar 180 para silenciar)
byte SSMin = 115;
byte SAMax = 180; //posição de solda = 170 = 169
byte SAMin = 120;
const uint8_t Paw_mini [] PROGMEM = {
0x0C, 0x60, 0x76, 0x30, 0x76, 0x60, 0x0C, 0x00,
};
//----------/BIBLIOTECAS/----------//
#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
Soldador.Attach(Soldador_Pin);
Alicate.Attach(Alicate_Pin);
display.clearDisplay(); //limpa o display
display.setTextSize(1);
display.setTextColor(white);
display.setCursor(32, 16);
display.print("Tenniko!"); //4x8 x 2x8
Serial.print("Iniciando");
display.display(); //envia as informações para o display
// inserir logo
// Programa de inicializção
delay(1000);
}
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!");
evento = 0;
}
else if (evento == 2) {
Serial.println("Girou para ESQUERDA");
evento = 0;
}
else if (evento == 3) {
Serial.println("Girou para DIREITA");
evento = 0;
}
}
void Display() {
/*
Menu principal:
Iniciar / Finalizar
Ajustes
Menu configuração:
Tempo Aquecendo:
Alicate
Soldador
Menu Alicate:
Posição A = Posição inicial (Home)
Posição B = Encostado na ponta de solda
Posição C = Pequena distancia da ponta
Posição D = União das duas pontas
Menu Soldador:
Posição A = Posição inicial (Home)
Posição B = POsição
*/
if (DisplayPosition == 0) { // menu principal
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(white);
display.setCursor(0, 0);
display.print("Iniciar");
if (Cursor == 0 ) {}
} else if (DisplayPosition == 1) { //Menu ajustes
} else if (DisplayPosition == 2) { //Menu Alicate
} else if (DisplayPosition == 3) { //Menu Soldador
}
}
void Servos() {
/* Programa deverá enviar uma serie de comandos em ordem especifica
0. Posição inicial do ferro de solda e das pinças (Definido pelo usuário)
1. INICIAR - deverá mover o ferro de solda para a posição de soldagem
2. Deverá mover a pinça em direção ao ferro de solda de forma gradativa (Manter por tempos especificado pelo usuário)
3. Utiliza uma sequencia de movimentos removendo o ferro e unindo as pontas derretidas (Ferro mirado para cima)
4. Mantêm as pontas pressionadas Usando mecanismo de mola por um periodo e remove a pressão das molas
5. Mantem a posição até que o usuaio confime a remoção da peça soldada
6. retorna para posição inicial;
*/
byte frame = 0; // define uma regra de comandos para os servos
byte sPosition[] = {SSMax, 0, 0, 0, 0, 0}; //guarda as posições de atuação dos servos
byte aPosition[] = {SAMin, 0, 0, 0, 0, 0};
unsigned long Temp_0 = 0;
short movTime = 0;
short ACTtime[] = {0, 0, 0};
byte OK_0 = 0;
if (frame == 0) { //Posição inicial
if (OK_0 == 1) {
Soldador.write(sPosition[0]); //posição inicial
Alicate.write(aPosition[0]);
OK_0 = 0;
} else if (OK_0 == 2) {
frame = 1;
OK_0 = 3;
}
} else if (frame == 1) {
if (OK_0 == 3) {
Soldador.write(sPosition[1]); //Posição de soldagem do Ferro
OK_0 = 2;
} else if (OK_0 == 2) {
Temp_0 = millis(); //atualiza o comparador de tempo para que não esteja atrasado
OK_0 = 1;
} else if (OK_0 == 1) {
if (Delay(Temp_0, movTime)) {
OK_0 = 3;
frame = 2;
}
}
} else if (frame == 2) {
if (OK_0 == 3) {
Alicate.write(aPosition[1]); //derretimento do material
OK_0 = 2;
} else if (OK_0 == 2) {
Temp_0 = millis(); //atualiza o comparador de tempo para que não esteja atrasado
OK_0 = 1;
} else if (OK_0 == 1) {
if (Delay(Temp_0, ACTtime[0])) { //Tempo de Derretimento do material
OK_0 = 3;
frame = 3;
}
}
} else if (frame == 3) {
if (OK_0 == 3) {
Alicate.write(aPosition[2]); //Liberação do ferro
Soldador.write(sPosition[2]); //Remoção do ferro de solda
OK_0 = 2;
} else if (OK_0 == 2) {
Temp_0 = millis(); //atualiza o comparador de tempo para que não esteja atrasado
OK_0 = 1;
} else if (OK_0 == 1) {
if (Delay(Temp_0, movTime)) {
OK_0 = 3;
frame = 4;
}
}
} else if (frame == 4) {
if (OK_0 == 3) {
Alicate.write(aPosition[3]); //Junção do material
OK_0 = 2;
} else if (OK_0 == 2) {
Temp_0 = millis(); //atualiza o comparador de tempo para que não esteja atrasado
OK_0 = 1;
} else if (OK_0 == 1) {
if (Delay(Temp_0, movTime)) {
OK_0 = 3;
frame = 4;
}
}
}
}
bool Delay(unsigned long & Tempo, short intervalo) { // função Neotimer
if (millis() - Tempo >= intervalo) { // verifica se o tempo de inervalo foi alcançado
Tempo = millis(); // guarda o valor de millis() par criar um novo intervalo
return true;
} else {
return false;
}
}
/*
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 = 0; // 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;
} else if (OutSW == 1 && lastSW == 0) { // Detecta botão pressionado
resultado = 1; // botão
lastSW = OutSW;
} else {
resultado = 0;
lastSW = OutSW;
}
return resultado;
}