/******************************************************************************* * * Projeto I11 - Controle de visitantes - Arduino * Data: 11/03/2021 * Autor: Angelo Luis Ferreira * http://squids.com.br/arduino * *******************************************************************************/ #include //Carrega a biblioteca lcd com I2C //Define os pinos que serão utilizados para ligação ao display LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE); // hardware - conexões const byte pinoFotoEntradaSala = A1; // Pino analógico conectado ao fototransistor const byte pinoFotoSaidaSala = A2; // Pino analógico conectado ao fototransistor const byte pinoLedVerde = 12; // led verde const byte pinoLedVermelho = 11; // led vermelho const byte pinoBuzzer = 7; // buzzer const byte pinoButton = 3; // push button // variáveis int toneVal = 0; int toneAdjustment = 2000; float sinVal; int entrada = 0; int saida = 0; int contaSala = 0; int limite = 10; byte e = 0; // controle entrada byte s = 0; // controle saíd // ===================================================================================================== // configuração inicial void setup(){ Serial.begin(9600); //Inicialização do monitor serial lcd.begin(16, 2); // Define o display com 16 colunas e 2 linhas lcd.clear(); pinMode(pinoFotoEntradaSala, INPUT); //Define o pino como entrada no Arduino pinMode(pinoFotoSaidaSala, INPUT); //Define o pino como entrada no Arduino pinMode(pinoLedVerde, OUTPUT); // Define o pino como saída do Arduino pinMode(pinoLedVermelho, OUTPUT); // Define o pino como saída do Arduino pinMode(pinoButton, INPUT_PULLUP); // Defino o pino de entrada Arduino com pullup interno noTone(pinoBuzzer); // interrompe o tom // acende led verde acendeLed(); // mostra no lcd lcd.clear(); show(); } // ====================================================================================================== // loop infinito void loop(){ entra(); // verifica acesso a entrada sai(); // verificar acesso a saída if (e == 2) { entrada++; show(); } if (s == 2) { saida++; show(); } // verifica se número de visitantes é maior que o limite if (contaSala > limite) sirene(); // verifica se os dois sensores foram ativados if (s == 1 || e == 1) { // apenas um sensor foi ativoado ajustaSensores(); } else zera(); // zera tudo se pressionar o botão } // FUNÇÕES ============================================================================================ // ajusta sensores void ajustaSensores() { apagaLeds(); if (!digitalRead(pinoButton)) { e = 0; s = 0; acendeLed(); while (!digitalRead(pinoButton)) {} delay(50); monitora(); } } // acessa sensor de entrada (primeiro sensor ao entrar) void entra() { // verifica sensor de entrada if (digitalRead(pinoFotoEntradaSala)) { while (digitalRead(pinoFotoEntradaSala)) {} // aguarda passar pelo sensor delay(50); if (e == 0 && s == 0) { e = 1; } else if (e == 0 && s == 1) { s = 2; } else { e = 1; s = 0; } monitora(); } } // acessa sensor de saída (primeiro sensor ao sair) void sai() { // verifica sensor de saida if (digitalRead(pinoFotoSaidaSala)) { while (digitalRead(pinoFotoSaidaSala)) {} // aguarda passar pelo sensor delay(50); if (s == 0 && e == 0) { s = 1; } else if (s == 0 && e == 1) { e = 2; } else { e = 0; s = 1; } monitora(); } } // zera tudo ao pressionar o botão void zera() { if (!digitalRead(pinoButton)) { e = 0; s = 0; entrada = 0; saida = 0; contaSala = 0; show(); while (!digitalRead(pinoButton)) {} delay(50); monitora(); } } // mostra no lcd void show() { calcula(); tone(pinoBuzzer, 500); lcd.clear(); // mostra número de pessoas dentro da sala lcd.setCursor(0,0); lcd.print("Na Sala: "); lcd.setCursor(9,0); lcd.print(contaSala); if (contaSala >= limite) { lcd.setCursor(13,0); lcd.print("LOT"); if (contaSala > limite) sirene(); } else { lcd.setCursor(12,0); lcd.print("L:"); lcd.setCursor(14,0); lcd.print(limite - contaSala); } noTone(pinoBuzzer); // interrompe o tom // mostra número de pessoas que entraram lcd.setCursor(0,1); lcd.print("Ent: "); lcd.setCursor(5,1); lcd.print(entrada); // mostra número de pessoas que sairam lcd.setCursor(9,1); lcd.print("Sai: "); lcd.setCursor(14,1); lcd.print(saida); apagaLeds(); delay(500); acendeLed(); e = 0; s = 0; } // calucla o número de visitantes na sala void calcula() { // calcula o número de visitantes dentro da sala contaSala = entrada - saida; if (contaSala < 0) { contaSala = 0; saida = entrada; } } // acende led Verde ou vermelho void acendeLed() { if (contaSala >= limite) { digitalWrite(pinoLedVermelho, 1); } else { digitalWrite(pinoLedVerde, 1); } } // apaga leds void apagaLeds() { digitalWrite(pinoLedVerde, LOW); digitalWrite(pinoLedVermelho, LOW); } // função sirene void sirene(){ //tocar 5 ciclos tone(pinoBuzzer, 100); delay(0); noTone(pinoBuzzer); // interrompe o tom } // monitora "s" e "e" void monitora() { Serial.print(e); Serial.print(" | "); Serial.println(s); }