#include <TFT_eSPI.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_FT6206.h>
#include <ESP32Servo.h>
#define STEPPER_DIR_PIN 12
#define STEPPER_STEP_PIN 14
#define SERVO_PIN 16
#define TFT_CS_PIN 15 // Chip Select
#define TFT_DC_PIN 2 // Data/Command
#define TFT_MOSI_PIN 23 // SPI MOSI (SDA)
#define TFT_SCLK_PIN 18 // SPI Clock
#define TFT_RST_PIN 4 // Reset
#define TFT_MISO_PIN 19 // MISO
Adafruit_FT6206 ctp = Adafruit_FT6206();
TFT_eSPI tft = TFT_eSPI();
Servo servo;
void setupStepperMotor();
void setupServoMotor();
void setupDisplay();
void tftSceneInitializing();
void tftSceneMain();
void mix(byte laps, byte speed, byte direction);
void setup()
{
Serial.begin(115200);
setupDisplay();
tftSceneInitializing();
setupStepperMotor();
setupServoMotor();
delay(500);
tftSceneMain();
delay(1000);
mix(2, 3, 0);
mix(1, 2, 1);
mix(1, 2, 0);
mix(2, 3, 1);
mix(1, 1, 0);
}
void tftSceneInitializing()
{
tft.setCursor(5, 100);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(3);
tft.println("Inicializando...");
}
void drawButton(int x, int y, int width, int height, char *text)
{
tft.fillRoundRect(x, y, width, height, 5, ILI9341_WHITE);
tft.setCursor(x + 7, y + 13);
tft.setTextColor(ILI9341_BLACK);
tft.setTextSize(2);
tft.println(text);
}
void drawLongButton(int y, char *text)
{
drawButton(10, y, 300, 40, text);
}
void tftSceneMain()
{
tft.fillScreen(ILI9341_BLACK);
tft.setCursor(70, 20);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
tft.println("Drink Machine");
drawLongButton(70, "Drink 1");
drawLongButton(120, "Drink 2");
drawLongButton(170, "Drink 3");
}
void tftShowError(char *message)
{
tft.fillScreen(ILI9341_RED);
tft.setCursor(120, 40);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(3);
tft.println("Error");
tft.setCursor(10, 110);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
tft.println(message);
}
void setupStepperMotor()
{
pinMode(STEPPER_STEP_PIN, OUTPUT);
pinMode(STEPPER_DIR_PIN, OUTPUT);
digitalWrite(STEPPER_STEP_PIN, LOW);
}
void setupServoMotor()
{
servo.attach(SERVO_PIN, 500, 2400);
servo.write(0);
}
void setupDisplay()
{
tft.begin();
tft.setRotation(1);
if (!ctp.begin(40))
{
Serial.println("Couldn't start FT6206 touchscreen controller");
tftShowError("Touchscreen problem.");
while (1)
;
}
Serial.println("Capacitive touchscreen started");
}
void loop()
{
if (ctp.touched())
{
TS_Point p = ctp.getPoint();
}
// digitalWrite(STEPPER_DIR_PIN, HIGH);
// for (int i = 0; i < 400; i++)
// {
// digitalWrite(STEPPER_STEP_PIN, HIGH);
// digitalWrite(STEPPER_STEP_PIN, LOW);
// delay(5); // 5 ms * 200 = 1 segundo
// }
// delay(1000);
// digitalWrite(STEPPER_DIR_PIN, LOW);
// for (int i = 0; i < 400; i++)
// {
// digitalWrite(STEPPER_STEP_PIN, HIGH);
// digitalWrite(STEPPER_STEP_PIN, LOW);
// delay(5); // 5 ms * 200 = 1 segundo
// }
// delay(1000);
}
void mix(byte laps, byte speed, byte direction)
{
byte ms = speed == 1 ? 8 : (speed == 2 ? 6 : 4);
int lapsSteps = 200 * laps;
digitalWrite(STEPPER_DIR_PIN, direction == 0 ? HIGH : LOW);
for (int i = 0; i < lapsSteps; i++)
{
digitalWrite(STEPPER_STEP_PIN, HIGH);
digitalWrite(STEPPER_STEP_PIN, LOW);
delay(ms); // Ex.: 3 ms * 200 = 600 milisegundos or 0,6 segundos = RPM[60 segundos / 0,6 segundos] = 100 RPM
}
}