123

Dependencies:   TM1638 mbed HCSR04

main.cpp

Committer:
lucem1n
Date:
2019-03-02
Revision:
0:6f4090a07409
Child:
1:63541cb7c9d0

File content as of revision 0:6f4090a07409:

#include "mbed.h"
#include "IR_Def.h"
#include "hcsr04.h"

#define CAT0_PIN PC_1     // 11 PC_3        переставили с катодом 7
#define CAT1_PIN PC_3     // 7  PC_2        переставили с катодом 6
#define CAT2_PIN PB_0     // 4 PF_5         переставили с катодом 5
#define CAT3_PIN PC_2     // 2   PA_0       переставили с катодом 4
#define CAT4_PIN PA_4     // 1 PF_10
#define CAT5_PIN PA_1    // 10 PF_2    
#define CAT6_PIN PC_0    // 5  PD_5
#define CAT7_PIN PF_1    // 3 PH_0

#define ANO0_PIN PB_4     // 12 PC_0
#define ANO1_PIN PB_5     // 9 PF_3
#define ANO2_PIN PB_3     // 8 PB_0
#define ANO3_PIN PB_10     // 6 PA_3

//------------------------------------
// Hyperterminal configuration
// 9600 bauds, 8-bit data, no parity
//------------------------------------
Serial pc(SERIAL_TX, SERIAL_RX);  
InterruptIn IR(PC_12);
DigitalOut myled(LED1);
Timer T;  
Ticker  system_clock;  
Ticker pult;                                             //This will be used to increment a counter every msec inside it's ISR
Ticker display;                   
Ticker distancee;
Ticker muzika;
AnalogOut Da(PA_5);
//DigitalOut myled(LED2);
DigitalOut cathodes[8] = {
  DigitalOut(CAT0_PIN), 
  DigitalOut(CAT1_PIN), 
  DigitalOut(CAT2_PIN), 
  DigitalOut(CAT3_PIN), 
  DigitalOut(CAT4_PIN), 
  DigitalOut(CAT5_PIN), 
  DigitalOut(CAT6_PIN), 
  DigitalOut(CAT7_PIN), 
};
DigitalOut anodes[4] = {
  DigitalOut(ANO0_PIN), 
  DigitalOut(ANO1_PIN), 
  DigitalOut(ANO2_PIN), 
  DigitalOut(ANO3_PIN), 
};

int p = 0;
int o=0;
void IR_ISR();                                                      //ISR for decoding the IR signal
void dummy_ISR();                                                   //Required so that 'IR_ISR' is not called on both rising and falling edges of IR signal at the same time
void sys_tick(); 
int v=0;
uint8_t state = 0;                       //State variable for IR state machine
uint8_t Rx_count = 0;                                //Counter to count no. of bits received
uint32_t Rx_buf = 0;                 //To store recevied IR data
char Rx_flag = 0;                    //Flag which indicates that a valid IR command was received
uint32_t Rx_rep_count = 0;           //To keep track of how many repeat pulses are received
uint32_t Rx_rep_timeout_count = 0;   //Timer which clears the previously received IR command, once it reaches the set limit
uint32_t T_buf = 0;                  //Buffer to hold value of timer T
char Rx_ignore_rep_flag = 0;         //0 => Do not ignore repeat pulses 

uint8_t digits[] = {0x03, 0x9F, 0x25, 0x0D, 0x99, 0x49,  0x41, 0x1F, 0x01, 0x09, 0xFD, 0x91,0x89, 0x83};
//DigitalOut trig(PA_3);
//DigitalIn echo(PD_7);
HCSR04  usensor(PB_13,PB_14);
unsigned int dist=0;
int flag1, flag2, flag3 = 0;
int i,j,k,m,size=0;

void fireUpSign(int signNum){
  anodes[signNum] = 1;
}

void shutDownSign(int signNum){
  anodes[signNum] = 0;
}
void setDigit(int digit){
  for(int isd=0; isd < 8; isd++){
     ((digits[digit] & (1<<(7-isd))) > 0) ? cathodes[isd] =1 : cathodes[isd] =0;
  }  
}
void fireUpAllSigns(){
  fireUpSign(0);
  fireUpSign(1);
  fireUpSign(2);
  fireUpSign(3);
}

void shutDownAllSigns(){
  shutDownSign(0);
  shutDownSign(1);
  shutDownSign(2);
  shutDownSign(3);
}
void ddisplay ()
{
            setDigit(p); 
            fireUpSign(3); 
            wait_us(3000);
            shutDownAllSigns();
            setDigit(i); 
            fireUpSign(2); 
            wait_us(3000);
            shutDownAllSigns();
            setDigit(j);
            fireUpSign(1);
            wait_us(3000); 
            shutDownAllSigns();
            setDigit(k);
            fireUpSign(0);
            wait_us(3000); 
            shutDownAllSigns();
            //IR.fall(&IR_ISR);
            //IR.rise(&dummy_ISR); 
            if(i>9)
                {
                j++;
                i=0;
                }
            if(j>9)
            {
                k++;
                j=0;
                i=0;
                }
                /*if(i == 1)
                {
                    myled = !myled;
                    wait_ms(300);
                    i = 0;
                }*/
    }
void ddistance ()
{
    usensor.start();
    dist=usensor.get_dist_cm();
    //IR.fall(&IR_ISR);
    //IR.rise(&dummy_ISR); 
    }  
    
void sys_tick()
{
    if(Rx_rep_timeout_count < 0xFFFF) { //Do not increment counter beyond 0xFFFF to prevent roll-over
        ++Rx_rep_timeout_count;       //Increment this counter every 1msec.
    }
}

void ppult ()
{
                  //  if(o==0)
     // {
    //IR.mode(PullNone);
    //wait_ms(20);
  // IR.fall(&IR_ISR);
  // IR.rise(&dummy_ISR); 
//    }           
} 
    
int main()
{
    int verh;
    int nij;
    while(1) {  
           //if (o==0)
      // {
      // display.attach(&ddisplay, 0.02);   
     //  distancee.attach(&ddistance, 0.02);
      // pult.attach(&ppult, 2);
      ddisplay ();
      ddistance();
    //   }
        verh = 80;
        nij = 10; 
        if(dist >verh)
            {
            flag1=1;
            }
        if(flag1==1 && dist < nij)
            {
            flag2=1;
            }
        if (flag1==1 && flag2==1 && dist>verh)
        {
            flag3=1;
            }   
        if( flag1==1 && flag2==1 && flag3==1)
            {
            flag1=0;
            flag2=0;
            flag3=0;
            i++;
            }
     if (v==1)
                { 
               // pc.printf(" RX= %x " , Rx_buf);

 
        if(Rx_buf == 0xbf40ff00)
    {
        //pc.printf("5");
        p=0;
        j=0;
        i=0;
        k=0;
        
      }
    
        if(Rx_buf == 0xf609ff00)
    {
       i++;
            if(i>9)
                {
                j++;
                i=0;
                }
            if(j>9)
            {
                k++;
                j=0;
                i=0;
                }
       {
           }
       // pc.printf("9");
      }
    
        if(Rx_buf == 0xf807ff00)
    {
       //pc.printf("7");
        if (p>9)
        {
            p=0;
            }
            else
            {
                p++;
                }
      }
    
        if(Rx_buf == 0xe619ff00)
    {
      if(i==0 && j==0 && k==0 && (i+j+k)-p<0 && i-p<0)
        {
           i=0;
           j=0;
           k=0;
           p=0;
            }  
      if(i>=p)
      {
          i=i-p;
          }
      else if(i<p)
      {
           if(j==0)
           {
               k=k-1;
               j=j+10-(p-i);
               i=i+10;
               i=i-p;
               }
            else if(j!=0)
            {
                i=i+10;
                i=i-p;
                j=j-1;
                }
        }
    
        
       //pc.printf("0");
      }
      v=0;
      }
    
    // if(o==0)
    // {
    //IR.mode(PullNone);
    wait_ms(10);
   IR.fall(&IR_ISR);
   IR.rise(&dummy_ISR); 
    //}  
 }
}

void dummy_ISR()
{
    //Do nothing
}

void IR_ISR()
{
    o=1;
    display.detach();
    distancee.detach();
    //pult.detach();
    if(state == 0) {
        T.stop();               //Stop timer
        T.reset();              //Reset timer
        T.start();              //Start timer
        IR.rise(&IR_ISR);       //Set IR interrupt to occur on rising edge
        IR.fall(&dummy_ISR);
        state = 1;              //Go to next state
        Rx_count = 0;           //Clear the received bits counter
    } else if(state == 1) {
        
        T.stop();                          //Stop timer
        T_buf = (uint32_t)T.read_us();     //Read timer
        T.reset();                         //Reset timer
        T.start();                         //Start timer
        IR.fall(&IR_ISR);                  //Set IR interrupt to occur on falling edge
        IR.rise(&dummy_ISR);
 
        if(T_buf <= IR_9000us_UL && T_buf >= IR_9000us_LL) {  //Check for preamble start pulse(9ms)
            state = 2;  //Go to next state
        } else {
            state = 0; //Reset the state machine
        }
    } else if(state == 2) {
    
        T.stop();                          //Stop timer
        T_buf = (uint32_t)T.read_us();     //Read the value in timer
        T.reset();                         //Reset timer
        T.start();                         //Start timer
        IR.fall(&IR_ISR);                  //Set IR interrupt to occur on falling edge
        IR.rise(&dummy_ISR);
 
        if(T_buf <= IR_4500us_UL && T_buf >= IR_4500us_LL) { //Check for preamble space(4.5ms)
        
            state = 3;                  //Go to next state
            Rx_rep_timeout_count = 0;   //Reset counter
            Rx_rep_count = 0;           //Reset the repeat pulse counter
        } else if(T_buf <= IR_2250us_UL && T_buf >= IR_2250us_LL) { //Check for repeat pulse(2.25ms)
            state = 0;                      //Reset the state machine
 
            if(Rx_rep_count < 0xFFFF) {
                if(Rx_rep_timeout_count < IR_rep_timeout_ms) {  //Only increment the repeat pulse counter if the delay between two successive repeat pulses is less than 135msec.
                    Rx_rep_timeout_count = 0;                   //Reset the counter everytime a valid repeat pulse is received
                    ++Rx_rep_count;
                } else {                                         //Invald repeat pulse received
                    Rx_rep_count = 0;                            //Reset counter
                    Rx_flag = 0;                                 //Clear the flag to indicate that an IR command was not received
                    Rx_buf = 0;                                  //Clear the previously received command
                }
            }
            goto ahead;                    //Repeat the previous command
        } else { //Wrong pulse
            Rx_rep_count = 0;     //Reset counter
            state = 0;                       //Reset the state machine
        }
    } else if(state == 3) {
        T.stop();                      //Stop timer
        T_buf = T.read_us();          //Read the value in timer
        T.reset();                     //Reset timer
        T.start();                     //Start timer
        IR.fall(&IR_ISR);              //Set IR interrupt to occur on falling edge
        IR.rise(&dummy_ISR);
v=1 ;
 
        if(T_buf <= IR_1_UL_us && T_buf >= IR_1_LL_us) { //Check if bit is '1'(2.25ms)
            ++Rx_count;              //Increment the bit counter
            Rx_buf >>= 1;
            Rx_buf |= 0x80000000;     //Shift in a '1' from the left side
            
            state = 3;               //Remain in current state
        } else if(T_buf <= IR_0_UL_us && T_buf >= IR_0_LL_us) { //Check if bit is '0'(1.12ms)
            ++Rx_count;         //Increment the bit counter
            Rx_buf >>= 1;        //Shift in a '0' from the left side
            state = 3;          //Remain in current state
        } else { //Invalid data received
            Rx_count = 0;//Reset the bit counter
            state = 0;   //Reset state m/c

        }
 
        if(Rx_count == 32) { //Check if all 32 bits have been received
            state = 0; 
                 //Reset state m/c
 
ahead:
 
            if(!((Rx_rep_count > 0) && (Rx_ignore_rep_flag == 1))) {
                Rx_flag = 1;                             //Set this flag for repeat pulses only if repeat pulses are to be considered
            }
            Rx_rep_timeout_count = 0;         //Reset the counter everytime a valid command is received
        }
    }
     o=0;
}