
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);
}
O Journal no Linux para a guarda e consulta de logs do sistema
A evolução do Linux e as mudanças que se fazem necessárias desde o seu lançamento
Maquina modesta - a vez dos navegadores ferrarem o usuario
Fscrypt: protegendo arquivos do seu usuário sem a lentidão padrão de criptograr o disco
Sway no Arch Linux: configuração Inicial sem enrolação
Resolvendo o bloqueio do Módulo Warsaw no Arch Linux (Porta 30900)
Continuando meus tópicos anteriores (0)
Saída de loop após teste de if. (2)
Governo da França vai trocar Windows por Linux (9)
Warsaw não é reconhecido no Google Chrome 147.0.7727.55 [RESOLVIDO] (9)









