Enviado em 16/07/2019 - 22:48h
/*
Modos:
1- Normal
2- Amarelo Piscante
3- Manual
Estados:
1- 1Vd - 2Vm
2- 1Am - 2Vm
3- 1Vm - 2Vd
4- 1Vm - 2Am
Velocidades:
1-Rápido
2-Normal
3-Lento
*/
#include <EEPROM.h>
#define pin1Vm 10
#define pin1Am 9
#define pin1Vd 7
#define pin2Vm 6
#define pin2Am 5
#define pin2Vd 4
#define pinpedver 11
#define pinpedvm 13
#define botao 3
#define buzzer 8
#define pressionado 0
#define ligado 0
#define delayV1 5;
#define delayV1Am 1;
#define delayV2 20;
#define delayV2Am 6;
#define delayV3 80;
#define delayV3Am 12;
byte modo;
byte estado;
byte velocidade;
byte modoAnt;
byte estadoAnt;
byte startMode;
byte startVelo;
byte pisca;
int delayControl;
int cicloSemaforo;
String comando;
char serialBuff;
void setup() {
pinMode(pin1Vm, OUTPUT); //Pino Vermelho - Semaforo 1
pinMode(pin1Am, OUTPUT); //Pino Amarelo - Semaforo 1
pinMode(pin1Vd, OUTPUT); //Pino Verde - Semaforo 1
pinMode(pin2Vm, OUTPUT); //Pino Vermelho - Semaforo 2
pinMode(pin2Am, OUTPUT); //Pino Amarelo - Semaforo 2
pinMode(pin2Vd, OUTPUT); //Pino Verde - Semaforo 2
pinMode(pinpedver, OUTPUT); //Pino Verde - Semaforo pedestre
pinMode(pinpedvm, OUTPUT); //Pino Vermelho - Semaforo pedestre
pinMode(buzzer, OUTPUT); //Buzzer
pinMode(pressionado, OUTPUT); //botão pressionado
pinMode(botao, OUTPUT); //botão pressionado
//Lê modo de inicio e grava o próximo modo de inicio na EEPROM
startMode = EEPROM.read(0);
if (startMode == 0){
EEPROM.write(0, 1);
} else {
EEPROM.write(0, 0);
}
//Lê modo de inicio e grava o próximo modo de inicio na EEPROM
startVelo = EEPROM.read(1);
if ((startVelo < 1) || (startVelo > 3)) {
startVelo = 2; //Velocidade Inicial = Normal
EEPROM.write(1, 2);
}
//Inicia as variaveis
modo = startMode + 1;
estado = 1;
velocidade = startVelo;
pisca = 0;
delayControl = 0;
cicloSemaforo = 0;
modoAnt = 99; //Força a primeira execução
estadoAnt = 99; //Força a primeira execução
comando = "";
Serial.begin(9600);
}
void loop() {
if (delayControl < 49) { //Executa 49 ciclos sem atividade, porém recebendo comandos. As atividades são executadas apenas no ciclo 50.
while (Serial.available() > 0) {
serialBuff = Serial.read();
comando = comando + serialBuff;
}
if (comando != "") {
if ((comando.substring(0,1) == "V") || (comando.substring(0,1) == "v")) { //Velocidade
if (comando.substring(1,2) == "1") { velocidade = 1; } //Rápido
if (comando.substring(1,2) == "2") { velocidade = 2; } //Normal
if (comando.substring(1,2) == "3") { velocidade = 3; } //Lento
cicloSemaforo = 0;
EEPROM.write(1, velocidade);
}
if ((comando.substring(0,1) == "M") || (comando.substring(0,1) == "m")) { //Modo
if (comando.substring(1,2) == "1") { modo = 1; } //Normal
if (comando.substring(1,2) == "2") { modo = 2; } //Amarelo Piscante
if (comando.substring(1,2) == "3") { modo = 3; } //Manual
cicloSemaforo = 0;
delayControl = 50;
estadoAnt = 99; //Força a execução
}
if (comando.substring(0,1) == "*") { //Muda o estado do semáforo
estado++;
if (estado > 6) { estado = 1; }
delayControl = 50; //Força a execução imediata
}
comando = "";
}
delayControl++;
} else {
if ((modo == 1) || (modo == 3)) { //Modo Automático ou Manual
if (modo != modoAnt) { //Inicia o estado para quando o modo for alterado para normal (também é executado quando iniciado)
estado = 1;
cicloSemaforo = 0;
}
if (cicloSemaforo > 0) { //Conta os ciclos para mudar de fase
cicloSemaforo--;
} else {
if (modo == modoAnt) { //Inicia o estado para quando o modo for alterado para normal (também é executado quando iniciado)
if (modo == 1) { //Se for modo Automático
estado++;
if (estado > 6) { estado = 1; }
}
}
//Atualiza o tempo do ciclo
if ((estado == 1) || (estado == 3)) {
switch (velocidade) {
case 1: //Rápido
cicloSemaforo = delayV1;
break;
case 2: //Normal
cicloSemaforo = delayV2;
break;
default: //Lento
cicloSemaforo = delayV3;
break;
}
} else {
switch (velocidade) {
case 1: //Rápido
cicloSemaforo = delayV1Am;
break;
case 2: //Normal
cicloSemaforo = delayV2Am;
break;
default: //Lento
cicloSemaforo = delayV3Am;
break;
}
}
}
//Processa o Estado
if (estado != estadoAnt) {
switch (estado) {
case 1: //1Vd - 2Vm // Primeira Mudança - 1: verde, 2: vermelho
digitalWrite(pin1Vm, LOW);
digitalWrite(pin1Am, LOW);
digitalWrite(pin2Vd, LOW);
digitalWrite(pin2Am, LOW);
digitalWrite(pin1Vd, HIGH);
digitalWrite(pin2Vm, HIGH);
digitalWrite(pinpedvm, HIGH);
break;
case 2: //1Am - 2Vm // Segundo sinal, 1: amarelo, 2:vermelho
digitalWrite(pin1Vm, LOW);
digitalWrite(pin1Vd, LOW);
digitalWrite(pin2Vd, LOW);
digitalWrite(pin2Am, LOW);
digitalWrite(pin1Am, HIGH);
digitalWrite(pin2Vm, HIGH);
digitalWrite(pinpedvm, HIGH);
break;
case 3: //1Vm - 2Vd// Terceiro sinal, 1: vermelho, 2:verde
digitalWrite(pin1Vd, LOW);
digitalWrite(pin1Am, LOW);
digitalWrite(pin2Am, LOW);
digitalWrite(pin2Vm, LOW);
digitalWrite(pin1Vm, HIGH);
digitalWrite(pin2Vd, HIGH);
digitalWrite(pinpedvm, HIGH);
break;
case 4: //1Vm - 2Am// Quarto sinal, 1: vermelho, 2: amarelo
digitalWrite(pin1Vd, LOW);
digitalWrite(pin1Am, LOW);
digitalWrite(pin2Vd, LOW);
digitalWrite(pin2Vm, LOW);
digitalWrite(pin1Vm, HIGH);
digitalWrite(pin2Am, HIGH);
digitalWrite(pinpedvm, HIGH);
break;
case 5: //1Vm - 2Vm // Quinto sinal, 1: vermelho, 2: vermelho, semáforo pedestre verde e buzina ligada
digitalWrite(pin1Vd, LOW);
digitalWrite(pin1Am, LOW);
digitalWrite(pin2Vd, LOW);
digitalWrite(pin2Vm, HIGH);
digitalWrite(pin1Vm, HIGH);
digitalWrite(pin2Am, LOW);
digitalWrite(pinpedvm, LOW);
digitalWrite(pinpedver, HIGH);
tone(buzzer, 440, 300); // play tone 57 (A4 = 440 Hz)
digitalWrite(11, LOW);
delay(1000); // Wait for 1000 millisecond(s
tone(buzzer, 494, 300); // play tone 59 (B4 = 494 Hz)
digitalWrite(11, LOW);
delay(buzzer); // Wait for 1000 millisecond(s
tone(8, 523, 300); // play tone 60 (C5 = 523 Hz)
break;
case 6: //1Vm - 2Vm // Quinto sinal, 1: amarelo, 2: vermelho, semáforo pedestre vermelho e buzzer tocando
digitalWrite(pin1Vd, LOW);
digitalWrite(pin1Am, HIGH);
digitalWrite(pin2Vd, LOW);
digitalWrite(pin2Vm, HIGH);
digitalWrite(pin1Vm, LOW);
digitalWrite(pin2Am, LOW);
digitalWrite(pinpedvm, HIGH);
digitalWrite(pinpedver, LOW);
break;
}
estadoAnt = estado;
}
}
if (modo == 2) { //Modo Piscante
digitalWrite(pin1Vm, LOW);
digitalWrite(pin1Vd, LOW);
digitalWrite(pin2Vm, LOW);
digitalWrite(pin2Vd, LOW);
if (pisca == 0) {
digitalWrite(pin1Am, LOW);
digitalWrite(pin2Am, LOW);
pisca = 1;
} else {
digitalWrite(pin1Am, HIGH);
digitalWrite(pin2Am, HIGH);
pisca = 0;
}
}
delayControl = 0;
modoAnt = modo;
}
delay(10);
}
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Flatpak: remover runtimes não usados e pacotes
Mudar o gerenciador de login (GDM para SDDM e vice-versa) - parte 2
Ubuntu 24.04 e problemas de acesso à rede VPN [RESOLVIDO] (9)
big linux sem audio como resolver (1)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta