Advertisement
orneto

catraca c

Jun 23rd, 2023 (edited)
921
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 12.14 KB | None | 0 0
  1. #include "Wire.h"
  2. #include <LiquidCrystal.h>
  3.  
  4. #define pwm PF_2
  5.  
  6. #define MAX_LENGTH 100
  7.  
  8. #define DS1307_ADDRESS 0x68
  9. byte zero = 0x00;
  10. String horas,minutos,segundos,horasa;
  11.  
  12. #define TOGGLE_MOTOR_CD 350
  13.  
  14. #define ENABLE_MOTOR PE_0
  15.  
  16. #define VAGAS 3
  17.  
  18. //                                      LCD  
  19. #define RS PM_0
  20. #define RW PM_1
  21. #define E PM_2
  22. #define D0 PK_0
  23. #define D1 PK_1
  24. #define D2 PK_2
  25. #define D3 PK_3
  26. #define D4 PK_4
  27. #define D5 PK_5
  28. #define D6 PK_6
  29. #define D7 PK_7
  30. #define SW1 PJ_0
  31.  
  32. #define BLUE PH_0
  33. #define PINK PH_1
  34. #define YELLOW PH_2
  35. #define ORANGE PH_3
  36.  
  37.  
  38. #define BLUE2 PE_0
  39. #define PINK2 PE_1
  40. #define YELLOW2 PE_2
  41. #define ORANGE2 PE_3
  42.  
  43. #define PROX_SENSOR PE_5
  44.  
  45. bool estadoLED = false;
  46.  
  47. #define buzz PL_4
  48.  
  49. LiquidCrystal lcd(RS,RW,E,D0,D1,D2,D3,D4,D5,D6,D7);  
  50.  
  51. byte linhas[4] = {PL_0, PL_1, PL_2, PL_3};
  52. byte colunas[4] = {PM_4, PM_5, PM_6, PM_7};
  53.  
  54. void setmotor(unsigned int step){
  55.   switch(step&03){
  56.     case 0:
  57.       digitalWrite(PINK  ,HIGH);
  58.       digitalWrite(BLUE  ,LOW);
  59.       digitalWrite(ORANGE,LOW);
  60.       digitalWrite(YELLOW,LOW);
  61.       break;
  62.     case 1:
  63.       digitalWrite(PINK  ,LOW);
  64.       digitalWrite(BLUE  ,LOW);
  65.       digitalWrite(ORANGE,LOW);
  66.       digitalWrite(YELLOW,HIGH);
  67.       break;
  68.     case 2:
  69.       digitalWrite(PINK  ,LOW);
  70.       digitalWrite(BLUE  ,LOW);
  71.       digitalWrite(ORANGE,HIGH);
  72.       digitalWrite(YELLOW,LOW);
  73.       break;
  74.     case 3:
  75.       digitalWrite(PINK  ,LOW);
  76.       digitalWrite(BLUE  ,HIGH);
  77.       digitalWrite(ORANGE,LOW);
  78.       digitalWrite(YELLOW,LOW);
  79.       break;
  80.   }
  81. }
  82. void setmotor2(unsigned int step){
  83.   switch(step&03){
  84.     case 0:
  85.       digitalWrite(PINK2  ,HIGH);
  86.       digitalWrite(BLUE2  ,LOW);
  87.       digitalWrite(ORANGE2,LOW);
  88.       digitalWrite(YELLOW2,LOW);
  89.       break;
  90.     case 1:
  91.       digitalWrite(PINK2  ,LOW);
  92.       digitalWrite(BLUE2  ,LOW);
  93.       digitalWrite(ORANGE2,LOW);
  94.       digitalWrite(YELLOW2,HIGH);
  95.       break;
  96.     case 2:
  97.       digitalWrite(PINK2  ,LOW);
  98.       digitalWrite(BLUE2  ,LOW);
  99.       digitalWrite(ORANGE2,HIGH);
  100.       digitalWrite(YELLOW2,LOW);
  101.       break;
  102.     case 3:
  103.       digitalWrite(PINK2  ,LOW);
  104.       digitalWrite(BLUE2  ,HIGH);
  105.       digitalWrite(ORANGE2,LOW);
  106.       digitalWrite(YELLOW2,LOW);
  107.       break;
  108.   }
  109. }
  110.  
  111. void procM(unsigned int PARADO,unsigned int FAST){
  112.   static unsigned int cont = 0 ;
  113.   if(PARADO == 1){
  114.     return;
  115.   }
  116.   if(!FAST){
  117.   if(millis()&0x01){
  118.     setmotor(cont);
  119.     cont++;
  120.   }
  121.  
  122.   }else{
  123.     if(millis()&0x8){
  124.     setmotor(cont);
  125.     cont++;
  126.   }
  127.   }
  128. }
  129.  
  130. byte decToBcd(byte val){
  131.   return ( (val/10*16) + (val%10) );
  132. }
  133. byte bcdToDec(byte val)  {
  134.   return ( (val/16*10) + (val%16) );
  135. }
  136.  
  137. void setDateTime(){
  138.   byte segundo = 30;
  139.   byte minuto = 7;
  140.   byte hora = 14;
  141.   byte diasemana = 3;
  142.   byte dia = 06;
  143.   byte mes = 06;
  144.   byte ano = 23;
  145.   Wire.beginTransmission(DS1307_ADDRESS);
  146.   Wire.write(zero);
  147.   Wire.write(decToBcd(segundo));
  148.   Wire.write(decToBcd(minuto));
  149.   Wire.write(decToBcd(hora));
  150.   Wire.write(zero);
  151.   Wire.endTransmission();
  152. }
  153. bool PMbr;
  154. bool PMal;
  155.  
  156. int printahora(bool modo){
  157.   Wire.beginTransmission(DS1307_ADDRESS);
  158.   Wire.write(zero);
  159.   Wire.endTransmission();
  160.   Wire.requestFrom(DS1307_ADDRESS, 7);
  161.   int segundo = bcdToDec(Wire.read());
  162.   int minuto = bcdToDec(Wire.read());
  163.   int hora = bcdToDec(Wire.read() & 0b111111);    //Formato 24 horas
  164.    if (hora <= 12) {
  165.       PMbr = false;
  166.    }
  167.    if (hora > 12) {
  168.       PMbr = true;
  169.    }
  170.   int diasemana = bcdToDec(Wire.read());             //0-6 -> Domingo - Sábado
  171.   int dia = bcdToDec(Wire.read());
  172.   int mes = bcdToDec(Wire.read());
  173.   int ano = bcdToDec(Wire.read());
  174.   int horaa = hora+4;
  175.    if (horaa <= 12) {
  176.       PMal = false;
  177.    }
  178.    if (horaa > 12) {
  179.       PMal = true;
  180.    }
  181.   int resto = 0;
  182.   int converte=0;
  183.  
  184.   if(horaa>23){
  185.     resto = horaa - 24;
  186.     horaa = resto;}
  187.   if(modo==1 && PMbr==1){
  188.     hora=hora-12;
  189.   }
  190.   if(modo==1 && PMal==1){
  191.     horaa=horaa-12;
  192.   }
  193.   if(hora<10)
  194.     horas="0"+String(hora);
  195.   else
  196.     horas=String(hora);
  197.     if(horaa<10)
  198.     horasa="0"+String(horaa);
  199.   else
  200.     horasa=String(horaa);
  201.   if(minuto<10)
  202.     minutos="0"+String(minuto);
  203.   else
  204.     minutos=String(minuto);
  205.   if(segundo<10)
  206.     segundos="0"+String(segundo);
  207.   else
  208.     segundos=String(segundo);
  209.  
  210.   lcd.setCursor(0,0);
  211.   lcd.print(horas);
  212.   lcd.print(":");
  213.   lcd.print(minutos);
  214.   lcd.print(":");
  215.   lcd.print(segundos);
  216.   lcd.print("      ");
  217.   return minuto;
  218. }
  219.  
  220.  
  221. unsigned int (*proc)(char,unsigned int);
  222.  
  223. static unsigned int printTIME;
  224. static unsigned int Printed;
  225. unsigned int record(char in, unsigned int contex){
  226.    static char string_to_print[16];
  227.    static unsigned int pos;
  228.    if((in == '\n' || in == '\0') && contex != 1){
  229.     return 0;
  230.    }
  231.    switch (contex){
  232.     case 0:
  233.        string_to_print[pos] = in;
  234.        pos++;
  235.        return 0;
  236.     case 1:
  237.        if(pos){
  238.           lcd.setCursor(0,1);
  239.           lcd.print("                    ");
  240.           lcd.setCursor(0,1);
  241.           for(int i = 0 ; i < pos ; i++){
  242.              lcd.print(string_to_print[i]);
  243.           }
  244.           printTIME = millis();
  245.           pos = 0;
  246.           Printed = 1;
  247.           return 1;
  248.        }
  249.        return 0;
  250.    }
  251. }
  252.  
  253. unsigned int nullft(char,unsigned int){
  254.   return 0;
  255. }
  256.  
  257.  
  258. unsigned int d7seg1 = 0;
  259. unsigned int d7seg2 = 0;
  260. unsigned int led1 = 0;
  261. unsigned int char_to7seg(char c){
  262.   switch(c){
  263.     case '0':case 0:
  264.        return 0x7E<<1;
  265.     case '1':case 1:
  266.        return 0x60;
  267.     case '2':case 2:
  268.        return 0x6D<<1;
  269.     case '3':case 3:
  270.        return 0x79<<1;
  271.     case '4':case 4:
  272.        return 0x33<<1;
  273.     case '5':case 5:
  274.        return 0x5B<<1;
  275.     case '6':case 6:
  276.        return 0x5F<<1;
  277.     case '7':case 7:
  278.        return 0x70<<1;
  279.     case '8':case 8:
  280.        return 0x7F<<1;
  281.     case '9':case 9:
  282.        return 0xF6;
  283.     case 'A': case 10:
  284.         return 0x77<<1;
  285.     case 'B':case 11:
  286.         return 0x7C<<1;
  287.     default:
  288.         return 0x00;
  289.   }
  290. }
  291.  
  292.  
  293. void setup() {
  294.   // put your setup code here, to run once:
  295.       Serial.begin(115200);
  296.       pinMode(ENABLE_MOTOR,OUTPUT);
  297.       pinMode(PH_0,OUTPUT);
  298.       pinMode(PH_1,OUTPUT);
  299.       pinMode(PH_2,OUTPUT);
  300.       pinMode(PH_3,OUTPUT);
  301.       pinMode(PINK2,OUTPUT);
  302.       pinMode(BLUE2,OUTPUT);
  303.       pinMode(YELLOW2,OUTPUT);
  304.       pinMode(ORANGE2,OUTPUT);
  305.       pinMode(pwm, OUTPUT);
  306.       pinMode(PROX_SENSOR, INPUT);
  307.  
  308.       pinMode(PA_7,OUTPUT);
  309.       pinMode(PA_6,OUTPUT);
  310.       pinMode(PA_5,OUTPUT);
  311.       pinMode(PA_4,OUTPUT);
  312.       pinMode(PQ_3,OUTPUT);
  313.       pinMode(PQ_2,OUTPUT);
  314.       pinMode(PQ_1,OUTPUT);
  315.       pinMode(PQ_0,OUTPUT);
  316.      
  317.       pinMode(PB_4,OUTPUT);
  318.       pinMode(PB_5,OUTPUT);
  319.       pinMode(PP_5,OUTPUT);
  320.  
  321.       pinMode(PL_4,OUTPUT);
  322.    
  323.       pinMode(buzz, OUTPUT);
  324.       lcd.begin(16, 2);
  325.       lcd.clear();
  326.       lcd.setCursor(0,0);
  327.       lcd.print("               ");
  328.       lcd.setCursor(0,1);
  329.       lcd.print("               ");
  330.       lcd.clear();
  331.       Wire.begin();
  332.       proc = nullft;
  333.       //setDateTime(); // caso queira ajustar a hora
  334.         int tvagas = VAGAS;
  335.         d7seg1 = char_to7seg((tvagas/10)%10);
  336.         d7seg2 = char_to7seg(tvagas%10);
  337.         led1 = 0;
  338.        
  339. }
  340. char receivedChar;
  341. char input[MAX_LENGTH];
  342.  
  343. unsigned int angleConvert(unsigned int angle){
  344.   return 11.377*angle/2;
  345. }
  346.  
  347.  
  348. int procMs(){
  349.   return procMs(0,0,0);
  350. }
  351.  
  352. int procMs(unsigned int Modo, int M1, int M2){
  353.   static int posM1 = 0 ;
  354.   static int posM2 = 0 ;
  355.   static int requestPosM1 = 0;
  356.   static int requestPosM2 = 0;
  357.  
  358.   static unsigned int lastT = 0;
  359.   unsigned int rtn = 0;
  360.   if((Modo&0x01) == 1){
  361.     if(requestPosM1 ==  posM1){
  362.       requestPosM1 = angleConvert(M1);
  363.       rtn += 1;
  364.     }
  365.   }
  366.   if((Modo&0x02) == 0x02){
  367.     if(requestPosM2 ==  posM2){
  368.       requestPosM2 = angleConvert(M2);
  369.       rtn += 2;
  370.     }
  371.   }
  372.  
  373.   if((micros() - lastT) > TOGGLE_MOTOR_CD){
  374.     posM1 = posM1 + (requestPosM1 > posM1) - (requestPosM1 < posM1);
  375.     posM2 = posM2 + (requestPosM2 > posM2) - (requestPosM2 < posM2);
  376.     lastT = micros();
  377.     setmotor(posM1);
  378.     setmotor2(posM2);
  379.   }
  380.   return rtn;
  381. }
  382.  
  383.  
  384. int d7Sega = PA_7,d7Segb = PA_6,d7Segc = PA_5,d7Segd = PA_4,d7Sege = PQ_3,d7Segf = PQ_2,d7Segg = PQ_1,d7Segdp = PQ_0;
  385. int d7seg1_EN = PB_4;
  386. int d7seg2_EN = PB_5;
  387. int led1_EN  = PP_5;
  388.  
  389. void procleds(){
  390.   int current = (millis())&0x03;
  391.  
  392.   if(current == 0){
  393.       digitalWrite(led1_EN,LOW);
  394.       digitalWrite(d7seg2_EN,LOW);
  395.       digitalWrite(d7seg1_EN,HIGH);
  396.       digitalWrite(d7Sega,d7seg1&0x01);
  397.       digitalWrite(d7Segb,(d7seg1>>1)&0x01);
  398.       digitalWrite(d7Segc,(d7seg1>>2)&0x01);
  399.       digitalWrite(d7Segd,(d7seg1>>3)&0x01);
  400.       digitalWrite(d7Sege,(d7seg1>>4)&0x01);
  401.       digitalWrite(d7Segf,(d7seg1>>5)&0x01);
  402.       digitalWrite(d7Segg,(d7seg1>>6)&0x01);
  403.       digitalWrite(d7Segdp,(d7seg1>>7)&0x01);
  404.   }else if(current == 1){
  405.       digitalWrite(d7seg1_EN,LOW);
  406.       digitalWrite(led1_EN,LOW);
  407.       digitalWrite(d7seg2_EN,HIGH);
  408.       digitalWrite(d7Sega,d7seg2&0x01);
  409.       digitalWrite(d7Segb,(d7seg2>>1)&0x01);
  410.       digitalWrite(d7Segc,(d7seg2>>2)&0x01);
  411.       digitalWrite(d7Segd,(d7seg2>>3)&0x01);
  412.       digitalWrite(d7Sege,(d7seg2>>4)&0x01);
  413.       digitalWrite(d7Segf,(d7seg2>>5)&0x01);
  414.       digitalWrite(d7Segg,(d7seg2>>6)&0x01);
  415.       digitalWrite(d7Segdp,(d7seg2>>7)&0x01);
  416.   }else if(current == 2){
  417.       digitalWrite(d7seg2_EN,LOW);
  418.       digitalWrite(led1_EN,HIGH);
  419.       digitalWrite(d7Sega,   led1&0x01);
  420.       digitalWrite(d7Segb, (led1>>1)&0x01);
  421.       digitalWrite(d7Segc, (led1>>2)&0x01);
  422.       digitalWrite(d7Segd, (led1>>3)&0x01);
  423.       digitalWrite(d7Sege, (led1>>4)&0x01);
  424.       digitalWrite(d7Segf, (led1>>5)&0x01);
  425.       digitalWrite(d7Segg, (led1>>6)&0x01);
  426.       digitalWrite(d7Segdp,(led1>>7)&0x01);
  427.   }
  428. }
  429.  
  430. static unsigned int procTimeM1;
  431. static unsigned int procTimeM2;
  432.  
  433. static unsigned int M1subindo;
  434. static unsigned int M2subindo;
  435.  
  436. static unsigned int BUZZERproc;
  437. #define returnTime 5500
  438. #define printSHOW 5500
  439. #define BUZZERtime 1500
  440. void pcancelartn(){
  441.   if((millis() - procTimeM1 > returnTime)  && M1subindo){
  442.      if(procMs(1,0,0)){
  443.       M1subindo = 0;
  444.       tone(PL_4,6000);
  445.       BUZZERproc = millis();
  446.      }
  447.   }
  448.  
  449.   if(((millis() - procTimeM2 > (returnTime-750))  && M2subindo)    ||
  450.      ((millis() - procTimeM1 > (returnTime-750))  && M1subindo) ){
  451.       tone(PL_4,6000);
  452.       BUZZERproc = millis();
  453.   }
  454.   if((millis() - procTimeM2 > returnTime)  && M2subindo){
  455.     if(procMs(2,0,0)){
  456.       M2subindo = 0;
  457.      }
  458.   }
  459.  
  460.   if((millis() - printTIME > printSHOW)&& Printed){
  461.     lcd.setCursor(0,1);
  462.     lcd.print("                ");
  463.     Printed = 0 ;
  464.   }
  465.  
  466.   if((millis() - BUZZERproc) > BUZZERtime){
  467.     digitalWrite(PL_4,LOW);
  468.     noTone(PL_4);
  469.   }
  470.  
  471.  
  472. }
  473.  
  474.  
  475. void loop() {
  476.   int i = 0;
  477.   static int cont = 0;
  478.   static int carros = 0;
  479.   int tvagas = 0;
  480.   char c;
  481.   printahora(1);
  482.   if (Serial.available()) {
  483.     c = Serial.read();
  484.     lcd.setCursor(0,1);
  485.     switch (c){
  486.         case '\b':    
  487.           proc = record;  
  488.         break;
  489.        case 'S':
  490.         carros--;
  491.          tvagas = (VAGAS - carros) < 0 ? 0 :(VAGAS - carros) ;
  492.         d7seg1 = char_to7seg((tvagas/10)%10);
  493.          d7seg2 = char_to7seg(tvagas%10);
  494.         proc(c,0);
  495.         if(proc == nullft){
  496.           procTimeM1 = millis();
  497.           if(procMs(1,95,0)){
  498.             M1subindo = 1;
  499.           }
  500.         }
  501.        break;
  502.        case 'E':
  503.          carros++;
  504.          tvagas = (VAGAS - carros) < 0 ? 0 :(VAGAS - carros) ;
  505.          d7seg1 = char_to7seg((tvagas/10)%10);
  506.          d7seg2 = char_to7seg(tvagas%10);
  507.         proc(c,0);
  508.         if(proc == nullft){
  509.           procTimeM2 = millis();
  510.           if(procMs(2,0,95)){
  511.             M2subindo = 1;
  512.           }
  513.         }
  514.        break;
  515.        case 'Z':
  516.           proc(c,0);
  517.         procMs(3,0,0);
  518.         break;
  519.        case '\n':case '\r':
  520.          if(proc(c,1)){
  521.             proc = nullft;
  522.          }
  523.         break;
  524.         default:
  525.         proc(c,0);
  526.            
  527.        }  
  528.     }
  529.     procMs();
  530.     pcancelartn();
  531.     procleds();
  532. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement