Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "Wire.h"
- #include <LiquidCrystal.h>
- #define pwm PF_2
- #define MAX_LENGTH 100
- #define DS1307_ADDRESS 0x68
- byte zero = 0x00;
- String horas,minutos,segundos,horasa;
- #define TOGGLE_MOTOR_CD 350
- #define ENABLE_MOTOR PE_0
- #define VAGAS 3
- // LCD
- #define RS PM_0
- #define RW PM_1
- #define E PM_2
- #define D0 PK_0
- #define D1 PK_1
- #define D2 PK_2
- #define D3 PK_3
- #define D4 PK_4
- #define D5 PK_5
- #define D6 PK_6
- #define D7 PK_7
- #define SW1 PJ_0
- #define BLUE PH_0
- #define PINK PH_1
- #define YELLOW PH_2
- #define ORANGE PH_3
- #define BLUE2 PE_0
- #define PINK2 PE_1
- #define YELLOW2 PE_2
- #define ORANGE2 PE_3
- #define PROX_SENSOR PE_5
- bool estadoLED = false;
- #define buzz PL_4
- LiquidCrystal lcd(RS,RW,E,D0,D1,D2,D3,D4,D5,D6,D7);
- byte linhas[4] = {PL_0, PL_1, PL_2, PL_3};
- byte colunas[4] = {PM_4, PM_5, PM_6, PM_7};
- void setmotor(unsigned int step){
- switch(step&03){
- case 0:
- digitalWrite(PINK ,HIGH);
- digitalWrite(BLUE ,LOW);
- digitalWrite(ORANGE,LOW);
- digitalWrite(YELLOW,LOW);
- break;
- case 1:
- digitalWrite(PINK ,LOW);
- digitalWrite(BLUE ,LOW);
- digitalWrite(ORANGE,LOW);
- digitalWrite(YELLOW,HIGH);
- break;
- case 2:
- digitalWrite(PINK ,LOW);
- digitalWrite(BLUE ,LOW);
- digitalWrite(ORANGE,HIGH);
- digitalWrite(YELLOW,LOW);
- break;
- case 3:
- digitalWrite(PINK ,LOW);
- digitalWrite(BLUE ,HIGH);
- digitalWrite(ORANGE,LOW);
- digitalWrite(YELLOW,LOW);
- break;
- }
- }
- void setmotor2(unsigned int step){
- switch(step&03){
- case 0:
- digitalWrite(PINK2 ,HIGH);
- digitalWrite(BLUE2 ,LOW);
- digitalWrite(ORANGE2,LOW);
- digitalWrite(YELLOW2,LOW);
- break;
- case 1:
- digitalWrite(PINK2 ,LOW);
- digitalWrite(BLUE2 ,LOW);
- digitalWrite(ORANGE2,LOW);
- digitalWrite(YELLOW2,HIGH);
- break;
- case 2:
- digitalWrite(PINK2 ,LOW);
- digitalWrite(BLUE2 ,LOW);
- digitalWrite(ORANGE2,HIGH);
- digitalWrite(YELLOW2,LOW);
- break;
- case 3:
- digitalWrite(PINK2 ,LOW);
- digitalWrite(BLUE2 ,HIGH);
- digitalWrite(ORANGE2,LOW);
- digitalWrite(YELLOW2,LOW);
- break;
- }
- }
- void procM(unsigned int PARADO,unsigned int FAST){
- static unsigned int cont = 0 ;
- if(PARADO == 1){
- return;
- }
- if(!FAST){
- if(millis()&0x01){
- setmotor(cont);
- cont++;
- }
- }else{
- if(millis()&0x8){
- setmotor(cont);
- cont++;
- }
- }
- }
- byte decToBcd(byte val){
- return ( (val/10*16) + (val%10) );
- }
- byte bcdToDec(byte val) {
- return ( (val/16*10) + (val%16) );
- }
- void setDateTime(){
- byte segundo = 30;
- byte minuto = 7;
- byte hora = 14;
- byte diasemana = 3;
- byte dia = 06;
- byte mes = 06;
- byte ano = 23;
- Wire.beginTransmission(DS1307_ADDRESS);
- Wire.write(zero);
- Wire.write(decToBcd(segundo));
- Wire.write(decToBcd(minuto));
- Wire.write(decToBcd(hora));
- Wire.write(zero);
- Wire.endTransmission();
- }
- bool PMbr;
- bool PMal;
- int printahora(bool modo){
- Wire.beginTransmission(DS1307_ADDRESS);
- Wire.write(zero);
- Wire.endTransmission();
- Wire.requestFrom(DS1307_ADDRESS, 7);
- int segundo = bcdToDec(Wire.read());
- int minuto = bcdToDec(Wire.read());
- int hora = bcdToDec(Wire.read() & 0b111111); //Formato 24 horas
- if (hora <= 12) {
- PMbr = false;
- }
- if (hora > 12) {
- PMbr = true;
- }
- int diasemana = bcdToDec(Wire.read()); //0-6 -> Domingo - Sábado
- int dia = bcdToDec(Wire.read());
- int mes = bcdToDec(Wire.read());
- int ano = bcdToDec(Wire.read());
- int horaa = hora+4;
- if (horaa <= 12) {
- PMal = false;
- }
- if (horaa > 12) {
- PMal = true;
- }
- int resto = 0;
- int converte=0;
- if(horaa>23){
- resto = horaa - 24;
- horaa = resto;}
- if(modo==1 && PMbr==1){
- hora=hora-12;
- }
- if(modo==1 && PMal==1){
- horaa=horaa-12;
- }
- if(hora<10)
- horas="0"+String(hora);
- else
- horas=String(hora);
- if(horaa<10)
- horasa="0"+String(horaa);
- else
- horasa=String(horaa);
- if(minuto<10)
- minutos="0"+String(minuto);
- else
- minutos=String(minuto);
- if(segundo<10)
- segundos="0"+String(segundo);
- else
- segundos=String(segundo);
- lcd.setCursor(0,0);
- lcd.print(horas);
- lcd.print(":");
- lcd.print(minutos);
- lcd.print(":");
- lcd.print(segundos);
- lcd.print(" ");
- return minuto;
- }
- unsigned int (*proc)(char,unsigned int);
- static unsigned int printTIME;
- static unsigned int Printed;
- unsigned int record(char in, unsigned int contex){
- static char string_to_print[16];
- static unsigned int pos;
- if((in == '\n' || in == '\0') && contex != 1){
- return 0;
- }
- switch (contex){
- case 0:
- string_to_print[pos] = in;
- pos++;
- return 0;
- case 1:
- if(pos){
- lcd.setCursor(0,1);
- lcd.print(" ");
- lcd.setCursor(0,1);
- for(int i = 0 ; i < pos ; i++){
- lcd.print(string_to_print[i]);
- }
- printTIME = millis();
- pos = 0;
- Printed = 1;
- return 1;
- }
- return 0;
- }
- }
- unsigned int nullft(char,unsigned int){
- return 0;
- }
- unsigned int d7seg1 = 0;
- unsigned int d7seg2 = 0;
- unsigned int led1 = 0;
- unsigned int char_to7seg(char c){
- switch(c){
- case '0':case 0:
- return 0x7E<<1;
- case '1':case 1:
- return 0x60;
- case '2':case 2:
- return 0x6D<<1;
- case '3':case 3:
- return 0x79<<1;
- case '4':case 4:
- return 0x33<<1;
- case '5':case 5:
- return 0x5B<<1;
- case '6':case 6:
- return 0x5F<<1;
- case '7':case 7:
- return 0x70<<1;
- case '8':case 8:
- return 0x7F<<1;
- case '9':case 9:
- return 0xF6;
- case 'A': case 10:
- return 0x77<<1;
- case 'B':case 11:
- return 0x7C<<1;
- default:
- return 0x00;
- }
- }
- void setup() {
- // put your setup code here, to run once:
- Serial.begin(115200);
- pinMode(ENABLE_MOTOR,OUTPUT);
- pinMode(PH_0,OUTPUT);
- pinMode(PH_1,OUTPUT);
- pinMode(PH_2,OUTPUT);
- pinMode(PH_3,OUTPUT);
- pinMode(PINK2,OUTPUT);
- pinMode(BLUE2,OUTPUT);
- pinMode(YELLOW2,OUTPUT);
- pinMode(ORANGE2,OUTPUT);
- pinMode(pwm, OUTPUT);
- pinMode(PROX_SENSOR, INPUT);
- pinMode(PA_7,OUTPUT);
- pinMode(PA_6,OUTPUT);
- pinMode(PA_5,OUTPUT);
- pinMode(PA_4,OUTPUT);
- pinMode(PQ_3,OUTPUT);
- pinMode(PQ_2,OUTPUT);
- pinMode(PQ_1,OUTPUT);
- pinMode(PQ_0,OUTPUT);
- pinMode(PB_4,OUTPUT);
- pinMode(PB_5,OUTPUT);
- pinMode(PP_5,OUTPUT);
- pinMode(PL_4,OUTPUT);
- pinMode(buzz, OUTPUT);
- lcd.begin(16, 2);
- lcd.clear();
- lcd.setCursor(0,0);
- lcd.print(" ");
- lcd.setCursor(0,1);
- lcd.print(" ");
- lcd.clear();
- Wire.begin();
- proc = nullft;
- //setDateTime(); // caso queira ajustar a hora
- int tvagas = VAGAS;
- d7seg1 = char_to7seg((tvagas/10)%10);
- d7seg2 = char_to7seg(tvagas%10);
- led1 = 0;
- }
- char receivedChar;
- char input[MAX_LENGTH];
- unsigned int angleConvert(unsigned int angle){
- return 11.377*angle/2;
- }
- int procMs(){
- return procMs(0,0,0);
- }
- int procMs(unsigned int Modo, int M1, int M2){
- static int posM1 = 0 ;
- static int posM2 = 0 ;
- static int requestPosM1 = 0;
- static int requestPosM2 = 0;
- static unsigned int lastT = 0;
- unsigned int rtn = 0;
- if((Modo&0x01) == 1){
- if(requestPosM1 == posM1){
- requestPosM1 = angleConvert(M1);
- rtn += 1;
- }
- }
- if((Modo&0x02) == 0x02){
- if(requestPosM2 == posM2){
- requestPosM2 = angleConvert(M2);
- rtn += 2;
- }
- }
- if((micros() - lastT) > TOGGLE_MOTOR_CD){
- posM1 = posM1 + (requestPosM1 > posM1) - (requestPosM1 < posM1);
- posM2 = posM2 + (requestPosM2 > posM2) - (requestPosM2 < posM2);
- lastT = micros();
- setmotor(posM1);
- setmotor2(posM2);
- }
- return rtn;
- }
- 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;
- int d7seg1_EN = PB_4;
- int d7seg2_EN = PB_5;
- int led1_EN = PP_5;
- void procleds(){
- int current = (millis())&0x03;
- if(current == 0){
- digitalWrite(led1_EN,LOW);
- digitalWrite(d7seg2_EN,LOW);
- digitalWrite(d7seg1_EN,HIGH);
- digitalWrite(d7Sega,d7seg1&0x01);
- digitalWrite(d7Segb,(d7seg1>>1)&0x01);
- digitalWrite(d7Segc,(d7seg1>>2)&0x01);
- digitalWrite(d7Segd,(d7seg1>>3)&0x01);
- digitalWrite(d7Sege,(d7seg1>>4)&0x01);
- digitalWrite(d7Segf,(d7seg1>>5)&0x01);
- digitalWrite(d7Segg,(d7seg1>>6)&0x01);
- digitalWrite(d7Segdp,(d7seg1>>7)&0x01);
- }else if(current == 1){
- digitalWrite(d7seg1_EN,LOW);
- digitalWrite(led1_EN,LOW);
- digitalWrite(d7seg2_EN,HIGH);
- digitalWrite(d7Sega,d7seg2&0x01);
- digitalWrite(d7Segb,(d7seg2>>1)&0x01);
- digitalWrite(d7Segc,(d7seg2>>2)&0x01);
- digitalWrite(d7Segd,(d7seg2>>3)&0x01);
- digitalWrite(d7Sege,(d7seg2>>4)&0x01);
- digitalWrite(d7Segf,(d7seg2>>5)&0x01);
- digitalWrite(d7Segg,(d7seg2>>6)&0x01);
- digitalWrite(d7Segdp,(d7seg2>>7)&0x01);
- }else if(current == 2){
- digitalWrite(d7seg2_EN,LOW);
- digitalWrite(led1_EN,HIGH);
- digitalWrite(d7Sega, led1&0x01);
- digitalWrite(d7Segb, (led1>>1)&0x01);
- digitalWrite(d7Segc, (led1>>2)&0x01);
- digitalWrite(d7Segd, (led1>>3)&0x01);
- digitalWrite(d7Sege, (led1>>4)&0x01);
- digitalWrite(d7Segf, (led1>>5)&0x01);
- digitalWrite(d7Segg, (led1>>6)&0x01);
- digitalWrite(d7Segdp,(led1>>7)&0x01);
- }
- }
- static unsigned int procTimeM1;
- static unsigned int procTimeM2;
- static unsigned int M1subindo;
- static unsigned int M2subindo;
- static unsigned int BUZZERproc;
- #define returnTime 5500
- #define printSHOW 5500
- #define BUZZERtime 1500
- void pcancelartn(){
- if((millis() - procTimeM1 > returnTime) && M1subindo){
- if(procMs(1,0,0)){
- M1subindo = 0;
- tone(PL_4,6000);
- BUZZERproc = millis();
- }
- }
- if(((millis() - procTimeM2 > (returnTime-750)) && M2subindo) ||
- ((millis() - procTimeM1 > (returnTime-750)) && M1subindo) ){
- tone(PL_4,6000);
- BUZZERproc = millis();
- }
- if((millis() - procTimeM2 > returnTime) && M2subindo){
- if(procMs(2,0,0)){
- M2subindo = 0;
- }
- }
- if((millis() - printTIME > printSHOW)&& Printed){
- lcd.setCursor(0,1);
- lcd.print(" ");
- Printed = 0 ;
- }
- if((millis() - BUZZERproc) > BUZZERtime){
- digitalWrite(PL_4,LOW);
- noTone(PL_4);
- }
- }
- void loop() {
- int i = 0;
- static int cont = 0;
- static int carros = 0;
- int tvagas = 0;
- char c;
- printahora(1);
- if (Serial.available()) {
- c = Serial.read();
- lcd.setCursor(0,1);
- switch (c){
- case '\b':
- proc = record;
- break;
- case 'S':
- carros--;
- tvagas = (VAGAS - carros) < 0 ? 0 :(VAGAS - carros) ;
- d7seg1 = char_to7seg((tvagas/10)%10);
- d7seg2 = char_to7seg(tvagas%10);
- proc(c,0);
- if(proc == nullft){
- procTimeM1 = millis();
- if(procMs(1,95,0)){
- M1subindo = 1;
- }
- }
- break;
- case 'E':
- carros++;
- tvagas = (VAGAS - carros) < 0 ? 0 :(VAGAS - carros) ;
- d7seg1 = char_to7seg((tvagas/10)%10);
- d7seg2 = char_to7seg(tvagas%10);
- proc(c,0);
- if(proc == nullft){
- procTimeM2 = millis();
- if(procMs(2,0,95)){
- M2subindo = 1;
- }
- }
- break;
- case 'Z':
- proc(c,0);
- procMs(3,0,0);
- break;
- case '\n':case '\r':
- if(proc(c,1)){
- proc = nullft;
- }
- break;
- default:
- proc(c,0);
- }
- }
- procMs();
- pcancelartn();
- procleds();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement