proyrcto

Dependencies:   Adafruit_GFX mbed

main.cpp

Committer:
juankafil1
Date:
2017-12-05
Revision:
0:3168baff6399

File content as of revision 0:3168baff6399:

 #include "mbed.h"
// #include "SSD1306.h"
#include "Adafruit_SSD1306.h"
#define SDA                  PTE0
#define SCL                  PTE1
DigitalIn boton(PTB0);
DigitalIn boton1(PTB1);
DigitalOut led(LED1);
DigitalOut led1(LED3);
DigitalOut p(PTC16);
Timer x;

Serial rs232(USBTX, USBRX);
BusOut step_secuence(PTD6, PTA17,  PTA16,  PTC17);
unsigned int num_pasos,i,g=0,k,aux=0,color=1,n1=0,v1=0,a1=0,d1=0;
int grados,b=0,c=0,tiempo=0,a=0;
Timer t;
 class I2C2 : public I2C 
{
public:
    I2C2(PinName sda, PinName scl) : I2C(sda, scl) {
        frequency(400000);
        start();
    };
};

I2C2 gI2C(SDA,SCL);
Adafruit_SSD1306_I2c gOled2(gI2C, NC, 0x78, 64, 128);


void retro(int cont_pasos)   // Retroceso motor
{
    k=0;
    for (i = 0; i<=cont_pasos; i++) {
        if (k>=4) {
            k=0;
        }
        switch (k) {
            case 0:
                step_secuence=0x06;
                break;
            case 1:
                step_secuence=0x05;
          break;
            case 2:
                step_secuence=0x09;
                break;
            case 3:
                step_secuence=0x0A;
                break;
             
        }
        wait(0.2);
        ++k;
    }
}
void forward(int cont_pasos) // Avance motor
{
    k=0;
    for (i = 0; i<=cont_pasos; i++) {
        if (k>=4) {
            k=0;
        }
        switch (k) {
            case 0:
                step_secuence=0x0A;
                break;
            case 1:
                step_secuence=0x09;

                break;
                
            case 2:
                step_secuence=0x05;
                break;
            case 3:
                step_secuence=0x06;
                  
                break;
        }
        ++k;
        wait(0.2);
    }
   
}

 
 Timer Timer1;
 InterruptIn int1(PTD0);
 
unsigned int  contador=0,frec=0,conn=0,conm=0,cona=0, conN=0;
uint16_t V = 0, N = 0, A = 0, R = 0;


void ISR_PTD0(){//cuenta los  pulsos
    ++contador;}
    
void frecuencia(){
    
    contador=0;
    Timer1.start();//arranca  temporizador 
    while(Timer1.read_ms()<=10);//cuando lleve  a  10 ms pare
    Timer1.stop();//lo detengo 
    frec=100*contador;//lo multiplicamos  por 100
    Timer1.reset();}//reinicia  el timer 
    
 void  contadores(){
    if((frec>=1)&&(frec<=2000)){
       gOled2.setTextCursor(0, 16);
            gOled2.printf("esperando"); }
    else if((frec>=2100)&&(frec<=5900)){
        n1=1;
        color=2;
            rs232.printf("%d",4);
            gOled2.clearDisplay();
            gOled2.setTextCursor(0, 16);
            gOled2.printf("Detectado color Negro\n");
            conn=conn+1;//aumento  el  contador 
            N=conn;     
            gOled2.printf("Numero de cajas:\n%u",N);       
            //lcd.locate(0,1);//preparado para  pubicar
          //  wait(2);//retraso mientras  pasa  la caja 
        
             }
    else if((frec>=6000)&&(frec<=12900)){
        v1=1;
        color=3;
        rs232.printf("%d",3);
            gOled2.clearDisplay();
            gOled2.setTextCursor(0, 16);
            gOled2.printf("Detectado color\n");//publico  el color de la  frecuencia
            gOled2.printf("Violeta\n");
            conm=conm+1;//aumento  el  contador 
            V=conm;
            gOled2.printf("Numero de cajas:\n%u",V);
           // rs232.printf("violeta\n\r%d",conm);
    //        wait(2);//retraso mientras  pasa  la caja   
          
    }else if((frec>=13000)&&(frec<=24000)){
a1=1;
color=4;
            rs232.printf("%d",2);
            gOled2.clearDisplay();
            gOled2.setTextCursor(0, 16);
            gOled2.printf("Detectado color Azul\n");
            cona=cona+1;//aumento  el  contador 
            A=cona; 
            gOled2.printf("Numero de cajas:\n%u",A);
      //      wait(2);
      }    // rs232.printf("azul\n\r%d",cona);}
            
     else { 
    color=1;
    d1=1;
        uint16_t R = 0;
        rs232.printf("%d",1);
        gOled2.clearDisplay();
        gOled2.setTextCursor(0, 16);
        gOled2.printf("Caja no reconocida\n");
        conN=conN+1;
        R=conN; 
        gOled2.printf("Numero de cajas:\n%u",R);
        //wait(2);
       
            
          }     
    }
        
    void motor() {
        
               
   if(color==1){
      if(n1==1){
          forward(12);
          grados=90;
          //k=10000;
           n1=0; 
             }
        else if(v1==1){
          forward(24);
           grados=180;
          v1=0;    
              }
     else if(a1==1){        
          retro(12);
           grados=90;
           wait(2);
          a1=0;    
       } else {
        
        wait(2);  
             }       
             
  }if(color==2){
       if(d1==1){
         //while(1){
          retro(12);
           grados=90;
           wait(2);
           d1=0;
           tiempo=2150;
           
          wait(2);
          //aux=aux+1;//variable para el  while   
             }
              //aux=0; }
        else if(v1==1){
           forward(12);
            grados=90;
            wait(2);
          v1=0;
              }
     else if(a1==1){ 
          retro(24);
         grados=180;
      a1=0;     
        } else {
        wait(2); 
             }       
             
  }if(color==3){
      if(d1==1){
          forward(24);
           grados=180;
           d1=0;
           tiempo=3250;
    }
            
        else if(n1==1){    
          retro(12);
           grados=90;
           wait(2);
          n1=0;//ponemos la posicion anterior en 0
        }
     else if(a1==1){
         forward(12);
          grados=90;
          wait(2);
          a1=0;//ponemos la posicion anterior en 0      
       } else {
        wait(2);
             }       
             
  }if(color==4){
      if(d1==1){
          forward(12);
           grados=90;
           wait(2);
           d1=0;
           }
        else if(v1==1){
           retro(12);
            grados=90;
            wait(2);
          v1=0;             
              }
     else if(n1==1){
          retro(24);
           grados=180;
          n1=0;
                   } else {
        wait(2);  
             }       
             
  }
  }
  
    void receivedByte(){
     int a23=0,a2=1;
     int dato_in=rs232.getc();
     if(dato_in=='N'){
         p=1;
         frec=2400;
         }
     if(dato_in=='A'){
         p=1;
        frec= 18000;}
      if(dato_in=='V'){
          p=1;
         frec=8000;}
     if(dato_in=='D'){
         frec=32000;
          p=1;}
        contadores();
        motor();
        if(p==1){
         while(a23<=110){
             if(boton1==0){
                wait(1.5);
                p=0;
                a2=0;
                rs232.printf("%d",6);
                break;
                }a23++;
                wait(0.1);}}
         if(a2==0){
             rs232.printf("%d",5);}}
        
int main(){//clase  principal
d1=1;

    gOled2.clearDisplay();
    gOled2.display();
    gOled2.setTextCursor(10, 24);
    gOled2.printf("Iniciando presenta-cion transversal...\n\r");
    gOled2.printf("          :v");
    wait(5);
 
     while(1){
               rs232.attach(&receivedByte);
              if(boton==0){
                rs232.printf("%d",0);
                t.start();
                while(t.read_ms()<=2000);
                t.stop();
                b=b+1;
          led=0;
          p=1;
         led1=1;
        //  rs232.printf("conteo= %d \n\r", b);
           t.reset();
            
                t.start();
               while(t.read_ms()<=4500);
               t.stop();
         rs232.baud(9600);
         int1.mode(PullUp);//habilitamos resistencia de PullUp
         int1.rise(&ISR_PTD0);//si hay  flanco  de  subida se va a el programa, habilita la interrupcion  
        //gOled2.printf("Iniciando presentacion transversal...\n"); //mensaje inicial al encender la Oled
         gOled2.display();
        
         t.reset();
         p=0;
         frecuencia();
        
         t.start();
               while(t.read_ms()<=2000);
               t.stop();
         p=1;
         t.reset();
        contadores();
         motor ();
        //inicia  el sub programa  frecuenia
       //inicia el programa de los contadores y publicacion de la frecuencia
      //  rs232.printf("%dF=%d\n\r",frec,tiempo);
       
        //gOled2.clearDisplay();
    gOled2.display();
    gOled2.setTextCursor(0, 0);
    gOled2.printf("se movio%d\n",grados);
    
           while(a<=50){
            if(boton1==0){
                wait(1.5);
                p=0;
                c=c+1;
                rs232.printf("%d",6);
                break;
                }a++;
                wait(0.1);}
                a=0;
            if(b!=c){
                p=0;
                rs232.printf("%d",5);
                }
            
             
             
             
            
                
              
        
        }else
         gOled2.display();
    gOled2.setTextCursor(0, 0);
    gOled2.printf("esperando..");
        }
        }