ultimaact

Dependencies:   mbed Adafruit_GFX DS1820

main.cpp

Committer:
davidmateos
Date:
2021-12-14
Revision:
13:d2c49ef3b2ac
Parent:
12:71ae2f729b7f
Child:
14:21cb6b2ac16b

File content as of revision 13:d2c49ef3b2ac:

#include "mbed.h"
#include "hcsr04.h"
#include "DS1820.h"


#include "Adafruit_SSD1306.h"
 
class I2CPreInit : public I2C
{
public:
    I2CPreInit(PinName sda, PinName scl) : I2C(sda, scl)
    {
        frequency(100000);
        start();
    };
};
 
 
I2CPreInit gI2C(PB_9,PB_8);
 
// an SPI sub-class that provides a constructed default
 
Adafruit_SSD1306_I2c gOled(gI2C,NC,0x78,64,128);


Serial pc(USBTX, USBRX); // tx, rx
//Serial bt(D1, D0); // tx, rx


Ticker tickerMideDistancia;
unsigned distancia=20;

HCSR04  usensor(D7,D8); //(PinName TrigPin,PinName EchoPin):
DigitalIn finalDer(D2);
DigitalIn finalIzq(D3);
DigitalOut step(D13);
DigitalOut dir(D12);
DigitalOut enable(D11);
DigitalOut  led(LED1);   
DS1820      ds1820(D10);    // substitute PA_9 with actual mbed pin name connected to the DS1820 data pin          

//gitalOut rele(A5);
                   
float       temp = 0;
int contador=0;


int x=1;
int y=0;
//if (x==1){
     //y=0;
   // }else{
      //   y=1;
     //   }

////////////////
Timer tiempo;

enum estados {cerrada, abriendose, cerrandose, abierta};
estados estado;


void mideDistancia()
{
    usensor.start();
}

void paso(int d)
{
    dir=d;
    step=1;
    wait_us(100);   // Este es el cambio de paso
    step=0;
    wait_us(900);  //Este hay que cambiar
}

void estadoCerrada()
{
   if (x==1){
    if( (finalIzq == 1) && contador <3) {
        wait(0.5);
        enable=1;
        estado=abriendose;
       // pc.printf("Distance =%d\n",distancia);
        pc.printf("Final2 pulsado\r\n");
        
       
        //distancia < 5 
    }else if(contador==3){
        y=1;
        x=0;
        }
    }
    if(x==0 &&y==0){
        pc.printf("No seleccionado programa\r\n");
        }
        
        
    if(y==1){
            if(finalIzq == 1 && finalDer==1){
                
                enable=1;
                  tiempo.reset();
      tiempo.start();
                estado=abriendose;
                }
            }
            
            
}

void estadoAbriendose()
{
    
      if(x==1){
    //pc.printf("Distance =%d\n",distancia);
    if((finalDer==1)) {
        
        estado=abierta;
        enable=0;
             
    } else  {
        gOled.clearDisplay();
  
        paso(1);
        //pc.printf("paso\n");
        
    }
    }
  //  if (distancia<4){
        //estado=cerrandose;
        
       // }
       if(y==1){
           
               
                   if(tiempo.read()<0.5){
                   paso(1);
                   }
                   else if(finalIzq==0){
                       paso(0);
                       }
                       else{
                           estado=cerrada;
                           }
                   
           }
    
   
}

void estadoCerrandose(){
     //pc.printf("Distance =%d\n",distancia);
       if(x==1){
     if((finalIzq==1)) {
        
        estado=cerrada;
        enable=0;
    } else  {
 
        paso(0);
        //pc.printf("paso\n");
        
    }
    }
     
     
}

void estadoAbierta()
{
    //pc.printf("Distance =%d\n",distancia);
    //if (finalDer==1) {
        
        
        enable=1;
        estado=cerrandose;
        pc.printf("Final1 pulsado\r\n");
        
    //}
    contador++;
    gOled.clearDisplay();
    gOled.printf("piezas transportadas %d\n",contador);
    gOled.printf("temp = %3.1f C\r\n", temp);
    gOled.display();
        gOled.setTextCursor(0,0);
          
    
   
}

int main()
{
    pc.baud(115200);
    tickerMideDistancia.attach(&mideDistancia, 0.5);
    estado=cerrada;
     gOled.begin();
    gOled.clearDisplay();
     gOled.printf("Hola\n");
     gOled.display();
      //x=(pc.getc());
    //pc.printf("Estado cerrada\n");
    if(x==1){
        gOled.clearDisplay();
     gOled.printf("Programa de transporte de piezas\n");
     gOled.display();
        }
        
        if(y==1){
        gOled.clearDisplay();
     gOled.printf("Programa de taladro\n");
     gOled.display();
        }
    tiempo.reset();
    
     int  error = 0; 
    pc.baud(115200);
    
    if(ds1820.begin()) {
        while(1) {
            
            
            ds1820.startConversion();  // start temperature conversion from analog to digital
            wait(1.0);                 // let DS1820 complete the temperature conversion 
            error = ds1820.read(temp); // read temperature from DS1820 and perform cyclic redundancy check (CRC)
            switch(error) {
            case 0:    // no errors -> 'temp' contains the value of measured temperature
                pc.printf("temp = %3.1f C\r\n", temp);
                break;
            case 1:    // no sensor present -> 'temp' is not updated
                pc.printf("no sensor present\n\r");
                break;
            case 2:    // CRC error -> 'temp' is not updated
                pc.printf("CRC error\r\n");
            } 
            led = !led;
        }
    } else
        pc.printf("No DS1820 sensor found!\r\n");
    
    
    
    
    
    while(1) {
        distancia=usensor.get_dist_cm();
        
        //calefactor
 //     rele=1;
 //     led=1;
//      wait(1.0);
 //     rele=0;
//      led=0;
 //     wait(1.0);
        //
        if(pc.readable()) {
            x=(pc.getc());
        }
        
        switch ( estado ) {
            case cerrada:
                estadoCerrada();
                break;
            case abriendose:
                estadoAbriendose();
                break;
            case abierta:
                estadoAbierta();
                break;
            case cerrandose:
                estadoCerrandose();
                break;
            default:
                break;
        }
    }
}