Advertisement
Guest User

Untitled

a guest
Sep 21st, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.80 KB | None | 0 0
  1. #pragma config OSC=INTIO2, WDT=OFF, DEBUG=ON
  2. #include <p18F1330.h>
  3. #include <delays.h>
  4. #include <adc.h>
  5. #define GREEN_LED PORTBbits.RB5     //Define green LED as pin 11
  6. #define RED_LED PORTBbits.RB4       //Define red LED as pin 10
  7. #define PIEZO PORTAbits.AN0         //Define PIEZO as pin 1
  8. #define SWITCH PORTBbits.RB1        //Define SWITCH as pin 9
  9. #define MOTOR PORTBbits.RB0         //Define MOTOR as pin 8
  10. #define MAX_KNOCKS 8                //Maximum number of knocks allowed
  11. unsigned char knock;                //Knock in progress
  12. unsigned char CorrectKnock;         //Variable for if knock matches secret knock
  13. unsigned char i;
  14. unsigned char x;
  15. unsigned char T;                    //Time variable
  16. unsigned char KD;                   //Knock Time variable
  17. unsigned char piezo;                //Value returned from A/D converter
  18. unsigned char start;                //Knock started?
  19. unsigned char stop;                 //Knock stopped?
  20. unsigned char ProgramStart;         //Programming knock started?
  21. unsigned char ProgramStop;          //Programming knock stopped?
  22. unsigned int KnockNumber;           //Number of knocks
  23. unsigned int ProgramNumber;         //Number of programmed knocks
  24. int KnockPattern[MAX_KNOCKS];       //Knock time array
  25. int ProgrammedPattern[MAX_KNOCKS];  //Program knock time array
  26.  
  27. void unlock_door(void)              //Unlock The Door
  28. {
  29.     MOTOR=1;                        //Turn on motor to unlock door
  30.     Delay10KTCYx(200);              //Leave on long enought to unlock
  31.     MOTOR=0;                        //Turn off motor
  32. }  
  33.  
  34. void Check_Patterns(void)
  35. {
  36.     if(KnockPattern==ProgrammedPattern)
  37.     {
  38.         GREEN_LED=1;
  39.         unlock_door();
  40.         Delay10KTCYx(200);
  41.         GREEN_LED=0;
  42.     }
  43.     else
  44.     {
  45.         for(i=0;i<4;i++)
  46.         {
  47.             RED_LED=1;
  48.             Delay10KTCYx(200);
  49.             RED_LED=0;
  50.             Delay10KTCYx(200);
  51.         }
  52.     }
  53. }
  54.  
  55. int GetPiezoValue(void)             //Find Piezo Value
  56. {
  57.     piezo=0;                        //Initialize variable
  58.     ADCON0bits.GO=1;
  59.     while(ADCON0bits.GO==1);        //Wait until conversion is finished
  60.     piezo=ADRESH<<8;                //Return piezo value
  61.     piezo=piezo+ADRESL;
  62. }
  63.  
  64. void program_knock(void)            //Program Secret Knock
  65. {
  66.     T=0;
  67.     while(knock!=1);                //Wait until first knock is detected
  68.     ProgramStop=0;                  //Start programming knock
  69.     ProgramStart=1;
  70.     ProgramNumber=0;
  71.     while(ProgramStart==1)          //While programming...
  72.     {    
  73.         while(knock!=1)             //Do this until another knock is heard
  74.         {
  75.             T++;                    //Time variable counts up  
  76.             KD++;                   //Increase knock delay time
  77.             if(KD>=1000000)         //If the delay is longer than 3 seconds...
  78.             {
  79.                 ProgramStart=0;     //...Knock is over
  80.                 ProgramStop=1;  
  81.             }
  82.         }
  83.         ProgrammedPattern[ProgramNumber]=T;     //Send time value to program pattern array
  84.         ProgramNumber++;            //Increase number of program knocks
  85.         KD=0;                       //Reset knock delay time
  86.     }
  87. }
  88.  
  89. void record_timing(void)            //Listen For Knock (Record Timing Between Them)
  90. {
  91.     T=0;
  92.     while(knock!=1);                //Wait until first knock is detected
  93.     ProgramStop=0;                  //Start programming knock
  94.     ProgramStart=1;
  95.     KnockNumber=0;
  96.     while(ProgramStart==1)          //While programming...
  97.     {
  98.         while(knock!=1)             //Do this until another knock is heard
  99.         {
  100.             T++;                    //Time variable counts up
  101.             KD++;                   //Increase knock delay time
  102.             if(KD>=1000000)         //If the delay is longer than 3 seconds...
  103.             {
  104.                 ProgramStart=0;     //...Knock is over
  105.                 ProgramStop=1;
  106.                 Check_Patterns();   //Check to see if patterns match
  107.             }
  108.         }
  109.         KnockPattern[KnockNumber]=T;    //Send Time value to knock pattern array
  110.         KnockNumber++;                  //Increase number of program knocks
  111.         KD=0;                           //Reset knock delay time
  112.     }
  113. }  
  114.  
  115. void main(void)
  116. {
  117.     RED_LED=0;
  118.     GREEN_LED=0;
  119.     TRISA=0b00000100;
  120.     TRISB=0b00000000;
  121.     ADCON0bits.CHS1=0;                  //Set to channel 0 (AN0)
  122.     ADCON0bits.CHS0=0;
  123.     ADCON0bits.ADON=1;                  //Enable A/D converter
  124.     ADCON1bits.VCFG0=0;                 //Voltage reference is VDD
  125.     ADCON1bits.PCFG3=0;                 //Pin configured as RA6
  126.     ADCON1bits.PCFG2=0;                 //Pin configured as RA4
  127.     ADCON1bits.PCFG1=0;                 //Pin configured as RA1
  128.     ADCON1bits.PCFG0=1;                 //Pin configured as AN0
  129.     ADCON2bits.ADFM=1;                  //Right-justified
  130.     ADCON2bits.ACQT2=1;                 //Acquisition time set to 20 TAD
  131.     ADCON2bits.ACQT1=1;
  132.     ADCON2bits.ACQT0=1;
  133.     ADCON2bits.ADCS2=0;                 //Clock select set to FOSC/32
  134.     ADCON2bits.ADCS1=1;
  135.     ADCON2bits.ADCS0=0;
  136.     knock=0;                            //Initialize variables
  137.     start=0;                   
  138.     stop=0;
  139.     KnockNumber=0;
  140.    
  141.     while(1)
  142.     {
  143.         if(SWITCH==1)
  144.         {
  145.             while(SWITCH==1)            //Check if we're programming
  146.             {  
  147.                 RED_LED=1;              //Turn on red led to show that it is programming
  148.                 GetPiezoValue();        //Call function to check piezo
  149.                 if (1023>=piezo>=10)    //When first knock is detected...
  150.                 {
  151.                     KnockNumber++;      //increase number of sensed knocks
  152.                     start=1;            //Knock has started
  153.                     knock=1;            //Single knock in progress
  154.                     GREEN_LED=1;        //Flash LED to signify knock detection
  155.                     Delay10KTCYx(100);             
  156.                     GREEN_LED=0;
  157.                     knock=0;            //Single knock ended
  158.                     program_knock();    //...call programming function...
  159.                 }
  160.             }
  161.             RED_LED=0;
  162.         }
  163.         else                        //If we're not programming...
  164.         {
  165.             GetPiezoValue();        //Call function to check piezo
  166.             if (1023>=piezo>=10)    //When first knock is detected...
  167.             {
  168.                 KnockNumber++;      //increase number of sensed knocks
  169.                 start=1;            //Knock has started
  170.                 knock=1;            //Single knock in progress
  171.                 GREEN_LED=1;        //Flash LED to signify knock detection
  172.                 Delay10KTCYx(100);             
  173.                 GREEN_LED=0;
  174.                 knock=0;            //Single knock ended
  175.                 record_timing();    //Call timing function
  176.             }
  177.         }
  178.     }  
  179. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement