Ola pessoal, estou enfrentando dificuldade no meu projeto.
Estou usando arduino mega 256, tela lcd touch
Rele , valvula solenoide, para esteira
A parte do código e c++
A maquina funciona , o código funciona, mas apresenta bugs , trava , impossibilitando o funcionamento. Vou disponibilizar o codigo, se alguém tiver um tempinho, pra me ajudar, fico grato pela tempinho
#include <Adafruit_GFX.h>
#include <MCUFRIEND_kbv.h>
#include <TouchScreen.h>
#include <NewPing.h>
#include <SPI.h>
#include <Encoder.h> porque esta travando muito
// Definições do display TFT
#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4
// Definições do touchscreen
#define YP A3
#define XM A2
#define YM 9
#define XP 8
#define POS_X_BOTAO_PARADA 250
#define POS_Y_BOTAO_PARADA 320
#define LARGURA_BOTAO 100
#define ALTURA_BOTAO 80
// Definir as constantes TS_MINX e TS_MINY de acordo com a calibração do touchscreen
#define TS_MINX 69
#define TS_MINY 136
#define TS_MAXX 930
#define TS_MAXY 888
#define MINPRESSURE 10
#define MAXPRESSURE 1000
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
MCUFRIEND_kbv tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// Pinos do sensor infravermelho
#define IR_SENSOR_PIN 35 // Substitua pelo pino real do seu sensor infravermelho
// Pinos do sensor ultrassônico
#define TRIGGER_PIN 31
#define ECHO_PIN 33
// Pinos do encoder
#define ENCODER_PIN_A 51
#define ENCODER_PIN_B 53
// Pino do relé
#define RELE_PIN 41
#define CONVEYOR_PIN 43 // Substitua pelo pino do relé da esteira
// Definições de cores
#define BLUE 0x0000FF
#define BLACK 0x0000
#define WHITE 0xFFFF
#define GREEN 0x07E0
#define RED 0xF800
int X,Y;
//#define ESTEIRA_SPEED 1 // Velocidade da esteira em cm/s
//#define DISTANCIA_SENSOR_ESTEIRA 20 // Distância entre o sensor infravermelho e a esteira em cm
//unsigned long pastelStartTime = 1; // Variável para registrar o tempo de início do pastel
//unsigned long pastelDuration = 0; // Variável para registrar a duração de passagem do pastel
int pastelDetected = 15; // Flag para indicar se o pastel foi detectado
int currentIndex = 0; // Índice dinâmico
//int conveyorSpeed = 128; // Velocidade inicial da esteira (0-255)
int currentPosition = 0;
// Variáveis globais
void printMensagem();
bool checkSelections();
void IntroScreen();
bool stateChanged = true;
bool isMachineRunning = false;
int pastelCount = 0;
int tamanhoSelecionado[3]; // 0: PEQUENO, 1: MEDIO, 2: GRANDE
int tamanhoSelecionadoPastel[3] = {1, 2, 3};
int quantidadeSelecionada = 0 ; // 0: 24cm, 1: 28cm, 2: 34cm
int quantity ;
NewPing sonar(TRIGGER_PIN, ECHO_PIN); // Objeto da biblioteca NewPing para o sensor ultrassônico
bool pressed;
void drawSizeButtons();
void drawQuantityButtons();
void checkSizeButtons(int x, int y);
void checkQuantityButtons(int x, int y);
void startMachine();
void stopMachine();
void stopConveyorAndCut();
void drawButton(int x, int y, int width, int height, uint16_t color, String label, bool pressed);
void drawTriangleButton(int x, int y, int size, uint16_t color, String label, int rotation);
void clearScreen();
void updateDisplay();
int lerDistanciaSensor();
bool verificarMassaNaEsteira();
/_________________________________________________/
TSPoint waitTouch() {
TSPoint p;
do {
p = ts.getPoint();
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
} while ((p.z < MINPRESSURE ) || (p.z > MAXPRESSURE));
int16_t x = map(p.x, TS_MINX, TS_MAXX, 0, tft.width());
int16_t y = map(p.y, TS_MINY, TS_MAXY, 0, tft.height());
return p;
}
/___________________________________________________/
// Objetos do encoder
Encoder myEnc(ENCODER_PIN_A, ENCODER_PIN_B);
// Definir o número de pulsos desejados
unsigned long desiredPulses = 22; // Ajuste este valor conforme necessário
unsigned long lastTime = 0;
unsigned long currentTime = 0;
int lastContador = 0;
volatile int contador = 0;
void setup() {
Serial.begin(38400);
tft.reset();
uint16_t ID = tft.readID();
if (ID == 0xD3D3) ID = 0x7793;
tft.begin(ID);
tft.setRotation(3);
clearScreen();
//IntroScreen();
drawSizeButtons();
drawQuantityButtons();
drawButton(100, 170, 200, 50, GREEN, “iniciar”, true);
pinMode(RELE_PIN, OUTPUT);
pinMode(CONVEYOR_PIN, OUTPUT);
digitalWrite(CONVEYOR_PIN, HIGH);// aqui e low
pinMode(IR_SENSOR_PIN, INPUT);
drawQuantity(140, 200, quantidadeSelecionada);
//digitalWrite(IR_SENSOR_PIN, LOW);
digitalWrite(RELE_PIN, LOW);
//analogWrite(CONVEYOR_PIN, 0);
pinMode(ENCODER_PIN_A, INPUT);
pinMode( ENCODER_PIN_B, INPUT);
myEnc.write(0);
}
void loop() {
TSPoint p = waitTouch();
X = p.x;
Y = p.y;
//checkSizeButtons(X, Y);
millis();
if (p.z > ts.pressureThreshhold) {
int16_t X = map(p.x, TS_MINX, TS_MAXX, 0, tft.width());
int16_t Y = map(p.y, TS_MINY, TS_MAXY, 0, tft.height());
Serial.print("X: ");
Serial.print(X);
Serial.print(" Y: ");
Serial.println(Y);
drawQuantityButtons();
checkSizeButtons(X, Y);
checkQuantityButtons(X, Y);
if (X >= 60 && X <= 125 && Y >= 45 && Y <= 170) {
if (!isMachineRunning) {
Serial.println("Iniciar máquina");
Serial.println("Verificando seleções...");
if (checkSelections()) {
drawButton(100, 170, 200, 50, RED, "Iniciar..", false);
startMachine();
} else {
Serial.println("Seleções inválidas. Máquina não iniciada.");
}
} else {
drawButton(100, 170, 200, 50, BLUE, "Para...", false);
Serial.println("Parar máquina");
stopMachine();
}
}
}
}
void encoderChange() {
contador++;
}
void drawSizeButtons() {
drawButton(40, 20, 60, 60, (tamanhoSelecionadoPastel[0] == 0) ? RED : GREEN, “24”, false);
drawButton(173, 20, 60, 60, (tamanhoSelecionadoPastel[1] == 1) ? RED : GREEN, “28”, false);
drawButton(300, 20, 60, 60, (tamanhoSelecionadoPastel[2] == 2) ? RED : GREEN, “34”, false);
//drawButton(100, 170, 200, 50, (!isMachineRunning) ? RED : BLUE,(!isMachineRunning) ? “Iniciar…” : “Parar”, false);
drawButton(100, 170, 200, 50, GREEN, “iniciar”, true);
drawQuantityButtons();
}
void drawQuantityButtons() {
drawButton(40, 90, 60, 60, (tamanhoSelecionadoPastel[2] == 2) ? RED : GREEN, “+”, false);
drawButton(300, 20, 60, 60, (tamanhoSelecionadoPastel[2] == 2) ? RED : GREEN, “-”, false);
// drawTriangleButton(80, 160, 70, GREEN, “+”, 270);
//drawTriangleButton(290, 90, 70, GREEN, “”, 90);
//drawQuantity(140, 240, quantity);
//tft.fillRect(140, 120, 100, 40, RED); // Limpa a área onde a quantidade é exibida
drawQuantity(20, 200, quantidadeSelecionada);
}
void drawQuantity(int x, int y, int quantidade) {
tft.setCursor(124, 120);
tft.setTextColor(WHITE, BLACK);
tft.setTextSize(2);
tft.print(“Qtd:”);
tft.print(quantidade);
tft.setCursor(136, 150);
tft.setTextSize(2);
tft.print(“P. produzido:”);
tft.print(pastelCount);
}
void drawTriangleButton(int x, int y, int size, uint16_t color, String label, int rotation) {
int halfSize = size / 2;
int x0, y0, x1, y1, x2, y2;
switch (rotation) {
case 0:
x0 = x;
y0 = y - halfSize;
x1 = x + size;
y1 = y - halfSize;
x2 = x + halfSize;
y2 = y + halfSize;
break;
case 90:
x0 = x - halfSize;
y0 = y;
x1 = x - halfSize;
y1 = y + size;
x2 = x + halfSize;
y2 = y + halfSize;
break;
case 180:
x0 = x;
y0 = y + halfSize;
x1 = x - size;
y1 = y + halfSize;
x2 = x - halfSize;
y2 = y - halfSize;
break;
case 270:
x0 = x + halfSize;
y0 = y;
x1 = x + halfSize;
y1 = y - size;
x2 = x - halfSize;
y2 = y - halfSize;
break;
default:
return;
}
tft.fillTriangle(x0, y0, x1, y1, x2, y2, color);
int labelX = x + (halfSize - label.length() * 11) / 6;
int labelY = y + halfSize - 84;
tft.setTextSize(4);
tft.setTextColor(WHITE);
tft.setCursor(labelX, labelY);
tft.print(label);
}
void checkSizeButtons(int x, int y) {
if (x >= 300 && x <= 350 && y >= 150 && y <= 200) {
tamanhoSelecionadoPastel[0] = 0;
tamanhoSelecionadoPastel[1] = 1;
tamanhoSelecionadoPastel[2] = 2;
printMensagem();
} else if (x >= 320 && x <= 333 && y >= 90 && y <= 118) {
tamanhoSelecionadoPastel[0] = 2;
tamanhoSelecionadoPastel[1] = 1;
tamanhoSelecionadoPastel[2] = 0;
printMensagem();
} else if (x >= 300 && x <= 360 && y >= 20 && y <= 80) {
tamanhoSelecionadoPastel[0] = 1;
tamanhoSelecionadoPastel[1] = 0;
tamanhoSelecionadoPastel[2] = 2;
printMensagem();
}
drawSizeButtons();
}
void checkQuantityButtons(int x, int y) {
bool updated = false;
if (x >= 180 && x <= 250 && y >= 160 && y <= 230) {
quantidadeSelecionada++;
updated = true;
Serial.println("Quantidade… +: " + String(quantidadeSelecionada));
} else if (x >= 190 && x <= 225 && y >= 35 && y <= 60 && quantidadeSelecionada > 0) {
quantidadeSelecionada–;
updated = true;
Serial.println("Quantidade -: " + String(quantidadeSelecionada));
}
if (updated) {
// Limpa a área onde a quantidade é exibida antes de desenhar a nova quantidade
//tft.fillRect(200, 200, 300, 40, BLUE);
drawQuantityButtons();
}
}
void startMachine() {
isMachineRunning = true;
pastelCount = 0;
Serial.println("Iniciando máquina...");
while (isMachineRunning) {
if (verificarMassaNaEsteira()) {
pastelCount++;
Serial.print("Pastel detectado! Contagem atual: ");
Serial.println(pastelCount);
stopConveyorAndCut();
Serial.println("Pastel cortado!");
if (pastelCount >= quantidadeSelecionada) {
Serial.println("Quantidade de pastéis atingida! Máquina será parada.");
stopMachine();
break; // Sair do loop para garantir que a máquina pare
}
}
//updateDisplay();
millis();
//delay(1000); // Ajuste este delay conforme necessário
}
}
bool verificarMassaNaEsteira() {
// Lê o valor do sensor infravermelho (IR) para verificar se a massa foi detectada na esteira
int sensorValue = digitalRead(IR_SENSOR_PIN);
// Lê a posição atual do encoder (número de pulsos contados pela esteira)
currentPosition = myEnc.read();
// Imprime a posição atual do encoder no monitor serial para depuração
Serial.print("Posição do Encoder:: ");
Serial.print(currentPosition);
// Imprime a contagem de pastéis (para rastreamento de quantos foram processados)
Serial.println(pastelCount);
// Imprime a quantidade de pulsos desejados para que o corte da massa ocorra
Serial.print(desiredPulses);
// Verifica se o sensor detectou o pastel (sensorValue é true)
if (sensorValue == true){
Serial.print("Pastel na esteira ");
// Se o sensor detectou a massa, a função retorna `false` pois ainda está na esteira
} else {
// Se o sensor não detectou a massa (sensorValue é false):
// Verifica se a posição atual do encoder atingiu o número de pulsos desejado
// OU se a leitura do sensor de distância é menor ou igual à distância detectada,
// indicando que a massa está na posição correta para ser cortada
if (lerDistanciaSensor() <= pastelDetected) {
// Se a condição for verdadeira, para a esteira e realiza o corte
// stopConveyorAndCut();
Serial.print(lerDistanciaSensor());
// Reseta a contagem do encoder para 0 para reiniciar a contagem de pulsos
//Serial.print("Posição do Encoder: dentro do if ");
myEnc.write(0);
// Retorna `true` indicando que a massa está na posição correta para corte
return true;
}
}
// Se a massa ainda não atingiu a posição correta, retorna `false`
return false;
}
void stopConveyorAndCut() {
digitalWrite(CONVEYOR_PIN, HIGH);
delay(8000);
Serial.print(“ESTEIRA PARADA “);
// Realiza o corte
digitalWrite(RELE_PIN, HIGH);
Serial.print(” / CORTANDO PASTEL”);
delay(700);
digitalWrite(RELE_PIN, LOW);
delay(500);
digitalWrite(CONVEYOR_PIN, LOW);
delay(740);
}
void stopMachine() {
isMachineRunning = false;
digitalWrite(RELE_PIN, LOW);
digitalWrite(CONVEYOR_PIN, HIGH);
drawButton(100, 170, 200, 50, RED, “Iniciar”, false);
Serial.println(“Máquina parada”);
drawSizeButtons();
drawQuantityButtons();
}
void drawButton(int x, int y, int width, int height, uint16_t color, String label, bool pressed) {
tft.fillRect(x, y, width, height, color);
tft.setTextSize(3);
tft.setTextColor(WHITE);
int labelX = x + (width - label.length() * 15) / 2;
int labelY = y + (height - 15) / 2;
tft.setCursor(labelX, labelY);
tft.print(label);
if (pressed) {
tft.setTextColor(0x0000);
//tft.setCursor(104, 120);
tft.setTextColor(WHITE, RED);
}
}
void clearScreen() {
tft.fillScreen(BLACK);
}
void updateDisplay() {
clearScreen();
tft.setTextSize(2);
tft.setTextColor(WHITE);
tft.setCursor(50, 100);
tft.print("Pastel produzido: ");
tft.print(pastelCount);
tft.setCursor(50, 80);
tft.print(“Tamanho: “);
tft.println(lerDistanciaSensor());
tft.setCursor(180, 80);
tft.println(” cm”);
tft.println(currentPosition);
//delay(1000);
// drawButton(100, 170, 200, 50, GREEN, “Parar”, true);
if (X >= 60 && X <= 125 && Y >= 45 && Y <= 170) {
if(isMachineRunning){
drawButton(100, 170, 200, 50, GREEN, “Parar”, true);
stopMachine();
}
//drawButton(100, 170, 200, 50, (isMachineRunning) ? RED : BLUE,(!isMachineRunning) ? “PARA…” : “Parar”, false);
//stopMachine();
}else{Serial.println(“nao entrou aqui”);}
}
int lerDistanciaSensor() {
//int distancia;
// Imprime a distância na tela TFT
// tft.setCursor(50, 80);
// clearScreen();
// tft.print("Tamanho: ");
// tft.print(distancia);
return sonar.ping_cm();
}
bool checkSelections() {
if (tamanhoSelecionado[0] == 1 && !isMachineRunning == false || quantidadeSelecionada > 0) {
return true;
} else {
tft.fillScreen(RED);
tft.setCursor(50, 0);
tft.setTextSize(4);
tft.print(“ERRO!”);
tft.setCursor(60, 40);
tft.setTextSize(3);
tft.print(“Selecione”);
tft.setCursor(50, 80);
tft.print(“um tamanho”);
tft.setCursor(80, 120);
tft.print(“e uma quantidade”);
delay(2000);
tft.fillScreen(BLACK);
drawSizeButtons();
drawQuantityButtons();
return false;
}
}
void printMensagem(){
tft.fillScreen(BLACK);
tft.setTextSize(2);
tft.setTextColor(RED);
tft.setCursor(10, 100);
tft.print("Tamanho selecionado: ");
if(tamanhoSelecionadoPastel[0] == 0){
tft.println(“Tradicional”);
}else if(tamanhoSelecionadoPastel[1] == 1){
tft.setCursor (30, 80);
tft.println(“Mini Especial”);
}else{
tft.println(“Especial”);
}
delay(1000); // Espera 2 segundos para que o usuário veja a mensagem
clearScreen();
// currentIndex = (currentIndex + 1) % 3;
}
void IntroScreen() {
tft.setCursor (55, 80);
tft.setTextSize (3);
tft.setTextColor(WHITE);
tft.println(“Bem vindo”);
tft.setCursor (30, 120);
tft.println(“fechador de pastel”);
tft.setCursor (30, 180);
tft.setTextSize (2);
tft.setTextColor(BLUE);
tft.println(“Pastelaria”);
tft.setCursor (30, 200);
tft.setTextColor(WHITE);
tft.println(" Marivas");
tft.setCursor (30, 220);
tft.setTextColor(RED);
tft.println(" whatsap 11 989801118");
delay(3500);
tft.fillScreen(BLACK);
}