#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED width, in pixels
#define SCREEN_HEIGHT 64 // OLED height, in pixels
// create an OLED display object connected to I2C
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
//Variables y terminales para control del motor
int enA = 25;
int in1 = 26;
int in2 = 27;
float PWM_max = 255;
float velocidadMax = 5000, velmin=500;// dependen de la caracterizacion del motor
float PWM=0;
// Variables de la secuencia
float velocidades[4], vel=0, paso=0, incvel=0;
int tiempos[4],selfijvar[4], seltv=0, tiempo=0, numEventos,i=0, j=0,duracion=0, anular=0, tmax=180;
///////////////////////////////////////////////////////////////////
void setup() {
Serial.begin(115200);
//Configura los pines
pinMode(enA, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
///////////////////////////////////
// initialize OLED display with I2C address 0x3C
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("failed to start SSD1306 OLED"));
while (1);
}
delay(100);
oled.clearDisplay(); // clear display
oled.setTextSize(2);
oled.setTextColor(WHITE); // set text color
oled.setCursor(0, 2); // set position to display (x,y)
oled.println("Spin Coater V1"); // set text
oled.display();
delay(1000);
}
////////////////////////////////////////////////////////////////
void loop() {
//Apaga el motor
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
analogWrite(enA, 0);
//////////////////////pantalla////////////////////////////////////
oled.clearDisplay(); // clear display
oled.setTextSize(3);
oled.setTextColor(WHITE); // set text color
oled.setCursor(0, 2); // set position to display (x,y)
oled.println("CAPTURA v Y t"); // set text
oled.display();
///////////////////////////////////////////////////////////////
//Captura de velocidades y tiempos
Serial.println("Ingrese el número de eventos (máximo 4): ");
while (!Serial.available()) {}
numEventos = Serial.parseInt();
Serial.println(numEventos);
if (numEventos > 0 && numEventos <= 4)
{
//Solicita la velocidad de i evento
for (int i = 0; i < numEventos; i++) {
//Serial.print(i);
Serial.print("Ingrese la velocidad deseada ");
Serial.print(i+1);
Serial.print(": ");
Serial.println(" ");
Serial.available();
//Permanece "oyendo" en espera del usuario
while(vel==0){
vel= Serial.parseFloat();
if(vel>velmin && vel <= velocidadMax ){
velocidades[i] = vel;
Serial.print("Velocidad ");
Serial.print(i+1);
Serial.println(" ");
Serial.print(vel);
Serial.println(" ");
}
else{
Serial.println("Error ");
vel=0;
}
}
vel=0; // reestablece la condicion del ciclo
//Solicita el tiempo de i evento
Serial.print("Ingrese el tiempo de encendido del motor ");
Serial.print(i+1);
Serial.print(": ");
Serial.println(" ");
//Permanece "oyendo" en espera del usuario
while(tiempo==0){
tiempo = Serial.parseInt();
if(tiempo>0 && tiempo <= tmax ){
tiempos[i] = tiempo;
Serial.print("tiempo ");
Serial.print(i+1);
Serial.println(" ");
Serial.print(tiempo);
Serial.println(" ");
}
else{
Serial.println("Error ");
tiempo=0;
}
}
tiempo=0;// reestablece la condicion del ciclo
//Seleccion velocidad fija o incremental
Serial.print("Presione 1 para velocidad fija o 2 para incremental para sel#");
Serial.print(i+1);
Serial.print(": ");
Serial.println(" ");
//Permanece "oyendo" en espera del usuario
while(seltv==0){
seltv = Serial.parseInt();
if(seltv>0 && seltv < 3 ){
selfijvar[i]= seltv;
Serial.print("seltv ");
Serial.print(i+1);
Serial.println(" ");
Serial.print(seltv);
Serial.println(" ");
}
else{
seltv=0;
}
}
seltv=0;// reestablece la condicion del ciclo
/////////////////////////Pantalla///////////////////////////////////////////
oled.clearDisplay();
oled.setTextSize(2);
oled.setTextColor(SSD1306_WHITE);
oled.setCursor(0, 2); // Cambia la posición vertical
oled.println("V" + String(i+1) + " " + String(velocidades[i]));
oled.setCursor(0, 30);
oled.println("T" + String(i+1) + " " + String(tiempos[i]));
oled.display();
////////////////////////////////////////////////////////////
}
// Corre la secuencia
Serial.println("Presione Y para correr secuencia");
while(1)
{
//Rompe el ciclo al presionar la tecla Q
if (Serial.available() > 0) {
char tecla = Serial.read();
if (tecla == 'y' || tecla == 'Y') {
break;
}
}
}
////////////////////////////////////////////////////////////
Serial.println("Corriendo secuencia");
for ( i = 0; i < numEventos; i++) {
duracion = tiempos[i];
incvel=0;
//Serial.println(duracion);
if(selfijvar[i]==1)
{
for ( j = 0; j < duracion; j++) {
PWM = PWM_max * velocidades[i] / velocidadMax;
Serial.print("Velocidad ");
Serial.println(velocidades[i]);
/////////////////////////Pantalla///////////////////////////////////////////
oled.clearDisplay();
oled.setTextSize(2);
oled.setTextColor(SSD1306_WHITE);
oled.setCursor(0, 2); // Cambia la posición vertical según tus necesidades
oled.println("V" + String(i+1) + " " + String(velocidades[i]));
oled.setCursor(0, 30);
oled.println("T" + String(i+1) + " " + String(j+1));
oled.display();
////////////////////////////////////////////////////////////
//Activa el motor con la velocidad solicitada
analogWrite(enA, PWM);
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
//Rompe el ciclo al presionar la tecla Q
if (Serial.available() > 0) {
char tecla = Serial.read();
if (tecla == 'q' || tecla == 'Q') {
break;
}
}
// /////////////////////////////////////////////
Serial.print("Tiempo ");
Serial.println(j+1);
delay(1000);
}
}
//Vel incremental
if(selfijvar[i]==2)
{
for ( j = 0; j < duracion; j++) {
PWM = PWM_max * velocidades[i] / velocidadMax;
paso= PWM/duracion;
incvel=incvel+paso;
// Serial.println(paso);
// incvel*velocidadMax/PWM_max
Serial.print("Velocidad ");
float velinc=incvel*velocidadMax/PWM_max;
Serial.println(velinc);
//Activa el motor con la velocidad solicitada
analogWrite(enA, incvel);
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
//Rompe el ciclo al presionar la tecla Q
if (Serial.available() > 0) {
char tecla = Serial.read();
if (tecla == 'q' || tecla == 'Q') {
break;
}
}
/////////////////////////Pantalla///////////////////////////////////////////
oled.clearDisplay();
oled.setTextSize(2);
oled.setTextColor(SSD1306_WHITE);
oled.setCursor(0, 2); // Cambia la posición vertical según tus necesidades
oled.println("V" + String(i+1) + " " + String(velinc));
oled.setCursor(0, 30);
oled.println("T" + String(i+1) + " " + String(j+1));
oled.display();
////////////////////////////////////////////////////////////
// /////////////////////////////////////////////
Serial.print("Tiempo ");
Serial.println(j+1);
delay(1000);
}
}
}
//Fin secuencia
//////////////////////////////////////////////////////
}
}