TODO FUNCIONA

Dependencies:   mbed Adafruit_GFX DS1820

main.cpp

Committer:
daniferca
Date:
2021-12-17
Revision:
5:757013f46517
Parent:
4:c691dac74f1b
Child:
6:7e83bf7215d7

File content as of revision 5:757013f46517:

//Include de librerías//
#include "mbed.h"
#include "hcsr04.h"
#include "DS1820.h"
#include "Adafruit_SSD1306.h"
/////////////////////////////

// Configuración pantalla OLED
class I2CPreInit : public I2C
{
public:
    I2CPreInit(PinName sda, PinName scl) : I2C(sda, scl)
    {
        frequency(100000);
        start();
    };
};

I2CPreInit gI2C(PB_9,PB_8);

Adafruit_SSD1306_I2c gOled(gI2C,NC,0x78,64,128);
//////////////////////////////////////////////

Serial pc(USBTX, USBRX); 

//DECLARACIÓN INPUTS Y OUTPUTS

Ticker tickerMideDistancia;//El lector de distancia esta en desuso aunque este declarado
unsigned distancia=20;     //El lector de distancia esta en desuso aunque este declarado
AnalogIn adc_temp(ADC_TEMP);// Temperatura de CPU
HCSR04  usensor(D7,D8);    //(PinName TrigPin,PinName EchoPin):
DigitalIn finalDer(D2);    //Final de carrera DERECHA
DigitalIn finalIzq(D3);    //Final de carrera IZQUIERDA
DigitalIn boton(D5);       //Boton para iniciar el programa seleccionado
DigitalIn switcher(D9);    //Interruptor para indicar que programa usar
DigitalOut step(D13);      //Variable paso del motor stepper
DigitalOut dir(D12);       //Variable de dirección del motor stepper (1 == derecha, 2== izquierda)
DigitalOut enable(D11);    //Variable enable del motor stepper
DigitalOut  led(LED1);     //Led de output de la tarjeta
DigitalOut myLed1 (D4);    //Indicador programa Taladro seleccionado
DigitalOut myLed2 (D6);    //Indicador programa Transportador de Piezas seleccionado
PwmOut     dirBMotor(A3);  //Motor DC

DS1820      ds1820(D10);   //Sensor de temperatura DS1820 montado sobre el husillo, esta en desuso



float temp = 0;
int contador=0;            //Contador de Piezas e Impactos del Taladro
int FUNCIONAR=0;           //Variable que de comienzo al programa en funcion del boton


int x=0;                   //Variable abilitadora programa Transportador de Piezas, en funcion del interruptor
int y=0;                   //Variable abilitadora programa Taladro, en funcion del interruptor

Timer tiempo;              //Temprizador para las acciones del taladro

enum estados {cerrada, abriendose, cerrandose, abierta}; // Enumeración de los 4 estados del programa
estados estado;


void paso(int d)    //FUNCIÓN PASO DEL MOTOR (Si int d==1, dir=1)
{
    dir=d;
    step=1;
    wait_us(100);   // Cambio de paso
    step=0;
    wait_us(900);  //Este hay que cambiar
}

void estadoCerrada() //Estado "cerrada", posición de inicio y reposo
{
    
    if (x==1) {          //Entrada al PROGRAMA 1:  Transportador de Piezas
        
        if((finalIzq == 1) && (FUNCIONAR==1) && contador==0) {     //Inicio en funcion del Final de Carrera de la Izquierda y del Boton
            
            wait(0.5);                                             //Tiempo de espera para descargar la Pieza
            enable=1;
            estado=abriendose;

            gOled.clearDisplay();                                  // Mensaje en la pantalla OLED
            gOled.printf("Programa Transporte");
            gOled.display();
            gOled.setTextCursor(0,0);

            }
            
        else if (contador>0){                                      // El contador cuenta los ciclos de transporte realizados, si este es mayor que 3 se detiene y no vuelve a salir a no ser que se pulse el boton de inicio
            
            wait(0.5);                                             //Tiempo de espera para descargar la Pieza
            enable=1;
            estado=abriendose;
            
            
            }
    }

    if(y==1) {          //Entrada al Programa: Taladro
        
        if((finalIzq == 1) && (FUNCIONAR==1)) {    //Inicio en funcion del Final de Carrera de la Izquierda y del Boton
        enable=1;
        estado=abriendose;
        
        gOled.clearDisplay();                      //Mensaje pantalla OLED
        gOled.printf("Programa Taladro");
        gOled.display();
        gOled.setTextCursor(0,0);
        //dirBMotor=0.5;
        }

       
        else if (contador>0){                      //Una vez se alcanza la posicion para taladrar, el contador es mayor de 0 y no parara/cumplira esta condicion hasta que al final del programa se iguale el contador a 0 
    
        estado=abriendose;   
        
        
            
        }
        
        
        
        tiempo.reset();
        tiempo.start(); 
    }


}

void estadoAbriendose()
{

    if(x==1) {          //Entrada al Transportador de Piezas

        if((finalDer==1)) {

            estado=abierta;
            enable=0;

            } 
        
        
        else if (FUNCIONAR>1){
            
            estado=abierta;
            
        }
        
            
        else  {
            
            gOled.clearDisplay();

            paso(1);

            }
    }


    if(y==1) {          //Entrada al Taladro


        if(tiempo.read() > 4 ){
        
        contador++;
        estado=abierta;
        enable=0;
        
        }
        
        else if ((contador>0)  && (tiempo.read() > 0.6)){
    
        contador++;
        
        estado=abierta;
        enable=0;   
        
        }
        
        else  {
        
        paso(1);    
        
        
        }

    }


}

void estadoCerrandose()
{

    if(x==1) {          //Entrada al Transportador de Piezas
        
        if(finalIzq==1 && contador<3 && FUNCIONAR==1) {            //Bucle hasta hasta que el contador alcance 3

            estado=cerrada;
            enable=0;
        } 
        
        else if ((finalIzq==1)&& contador>2) {       //Cuando el contador alcance 3, se terminara el programa
            
        estado = cerrada;
        enable = 0; 
        contador=0;
        FUNCIONAR=0;  
        
        }
        
        else if ((finalIzq==1) && (FUNCIONAR>1)) {       //
            
        estado = cerrada;
        enable = 0; 
        contador=0;
        FUNCIONAR=0;  
            
            }
        
        else  {                                      //Activar/Mantener movimiento

            paso(0);            

        }
    }
    
    if (y==1){          //Entrada al Taladro
        
        if((tiempo.read() > 0.6) && contador<7 ){    //Recorrido limitado por tiempo y contador(menor que 7) para taladro
        
        estado=cerrada;
        
        }


        else if ((contador>6)&& (finalIzq==1)){      //Cuando el contador alcance 7 se pulse el final de carrera de la izquierda, se terminara el programa
    
        estado = cerrada;
        enable = 0; 
        contador=0;  
        FUNCIONAR=0;
        //dirBMotor=0.0;
        
        }
         
    
        else {
        
        paso(0);                                     //Activar/Mantener movimiento
        
        }
        
    }

}

void estadoAbierta()
{
        
        if(x==1){          //Entrada al Transportador de Piezas
            
            contador++;    //Contador Piezas
            
            
            gOled.clearDisplay();
            gOled.printf("Piezas Transportadas = %d\n",contador);
            gOled.display();
            gOled.setTextCursor(0,0);
            

                }
                
        if (y==1){         //Entrada al Taladro
        
            gOled.clearDisplay();
            gOled.printf("Impactos Taladro = %d\n",contador);
            gOled.printf("temp = %3.1f C\r\n", adc_temp.read()*100);
            gOled.display();
            gOled.setTextCursor(0,0);
            pc.printf("ADC Temp = %f\n", (adc_temp.read()*100));
        
                }            
    
    
    tiempo.reset();
    tiempo.start(); 

    enable=1;
    estado=cerrandose;

}




int main()
{
    pc.baud(115200);
    estado=cerrada;
    dirBMotor=0.4;
    gOled.begin();
    gOled.clearDisplay();
    gOled.printf("Hola\n");
    gOled.display();
    ds1820.begin();
        ds1820.startConversion();

    if (boton == 1){
        
        FUNCIONAR=1;
        
        }
    
    
    
    if(x==1) {
        gOled.clearDisplay();
        gOled.printf("Programa: Transporte de Piezas\n");
        gOled.display();
    }

    if(y==1) {
        gOled.clearDisplay();
        gOled.printf("Programa: Taladro\n");
        gOled.display();
    }
    tiempo.reset();

    pc.baud(115200);

    while(1) {    
        
       
        
        if (switcher ==0){       //Programa Transportador de Piezas
            
            y=0;
            x=1;
        
            myLed1=1;   
            myLed2=0;
        
            }
            
        else if (switcher==1){   //Programa Taladro
            
            y=1;
            x=0;
            
            myLed1=0;
            myLed2=1;
            
            }
        
        if (boton==1){
            
            FUNCIONAR++;
        
            }
    

        switch ( estado ) {
            case cerrada:
                estadoCerrada();
                break;
            case abriendose:
                estadoAbriendose();
                break;
            case abierta:
                estadoAbierta();
                break;
            case cerrandose:
                estadoCerrandose();
                break;
            default:
                break;
        }

     

    }

}