bool pressed = false;
int carroVermelho = 15, carroAmarelo = 2, carroVerde = 4, pedestreVerde = 5, pedestreVermelho = 18;
int button = 35;
unsigned long currentMillis = 0 , debounce = millis(), previousMillis = 0;
bool flagStart = 1, mode = 0;
bool flagcarroVermelho = 0, flagcarroAmarelo = 0, flagcarroVerde = 0, flagpedestreVerde = 0, flagpedestreVermelho = 0;
int i = 0, ledState = 0;
volatile int interruptCounter, interruptCounter2, interruptCounter3;
int totalInterruptCounter = 0, totalInterruptCounter2 = 0, totalInterruptCounter3 = 0;
int condicao = 1; //A = 1, B = 2, C = 3
hw_timer_t *My_timer = NULL; // ponteiro para a interrupção de timer
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
hw_timer_t *My_timer2 = NULL; // ponteiro para a interrupção de timer
portMUX_TYPE timerMux2 = portMUX_INITIALIZER_UNLOCKED;
hw_timer_t *My_timer3 = NULL; // ponteiro para a interrupção de timer
portMUX_TYPE timerMux3 = portMUX_INITIALIZER_UNLOCKED;
void IRAM_ATTR onTimer() {
digitalWrite(pedestreVermelho, !digitalRead(pedestreVermelho));
portENTER_CRITICAL_ISR(&timerMux);
interruptCounter++;
portEXIT_CRITICAL_ISR(&timerMux);
}
void IRAM_ATTR onTimer2() {
portENTER_CRITICAL_ISR(&timerMux2);
interruptCounter2++;
portEXIT_CRITICAL_ISR(&timerMux2);
}
void IRAM_ATTR onTimer3() {
portENTER_CRITICAL_ISR(&timerMux3);
interruptCounter3++;
portEXIT_CRITICAL_ISR(&timerMux3);
}
void IRAM_ATTR isr() {
if ((millis() - debounce) > 50) {
debounce = millis();
pressed = true;
}
}
void setup() {
Serial.begin(115200);
pinMode(carroVermelho, OUTPUT);
pinMode(carroAmarelo, OUTPUT);
pinMode(carroVerde, OUTPUT);
pinMode(pedestreVerde, OUTPUT);
pinMode(pedestreVermelho, OUTPUT);
pinMode(button, INPUT_PULLUP);
attachInterrupt(button, isr, FALLING);
My_timer = timerBegin(0, 80, true);
timerAttachInterrupt(My_timer, &onTimer, true);
timerAlarmWrite(My_timer, 1500000, true);
timerAlarmEnable(My_timer);
My_timer2 = timerBegin(1, 80, true);
timerAttachInterrupt(My_timer2, &onTimer2, true);
timerAlarmWrite(My_timer2, 7500000, true);
timerAlarmEnable(My_timer2);
My_timer3 = timerBegin(2, 80, true);
timerAttachInterrupt(My_timer3, &onTimer3, true);
timerAlarmWrite(My_timer3, 3000000, true);
timerAlarmEnable(My_timer3);
}
void loop() {
if (condicao == 1){
flagcarroVerde = 1;
flagpedestreVermelho = 1;
while(flagpedestreVermelho == 1 && flagcarroVerde == 1){
stateA();
}
}else if (condicao == 2){
flagcarroAmarelo = 1;
while(flagcarroAmarelo == 1){
stateB();
}
}else {
flagpedestreVerde = 1;
flagcarroVermelho = 1;
while(flagpedestreVerde == 1 && flagcarroVermelho == 1){
stateC();
}
}
}
void stateA(){
if(pressed){
digitalWrite(carroAmarelo,HIGH);
digitalWrite(carroVerde,LOW);
mode = timerStarted(My_timer2);
if (mode){
timerStop(My_timer2);
}
mode = timerStarted(My_timer3);
//Serial.println(mode);
if (!mode){
timerStart(My_timer3);
}
else{
if (interruptCounter3 > 0) {
portENTER_CRITICAL(&timerMux3);
interruptCounter3--;
portEXIT_CRITICAL(&timerMux3);
Serial.print("An interrupt as occurred (button). Total number: ");
Serial.println(totalInterruptCounter3);
totalInterruptCounter3++;
if (totalInterruptCounter3 > 0){
allLedsOff();
digitalWrite(carroVermelho,HIGH);
flagcarroVermelho = 1;
digitalWrite(pedestreVerde,HIGH);
flagpedestreVerde = 1;
digitalWrite(carroAmarelo,LOW);
flagcarroAmarelo = 0;
flagpedestreVermelho = 0;
flagcarroVerde = 0;
timerStop(My_timer3);
pressed = 0;
condicao = 3;
}
}
}
}else{
mode = timerStarted(My_timer2);
if (!mode){
timerStart(My_timer2);
}
timerStop(My_timer);
allLedsOff();
if(flagpedestreVermelho == 1 && flagcarroVerde == 1){
digitalWrite(pedestreVermelho,HIGH);
digitalWrite(carroVerde,HIGH);
}else{
digitalWrite(pedestreVermelho,LOW);
digitalWrite(carroVerde,LOW);
}
if (interruptCounter2 > 0) {
portENTER_CRITICAL(&timerMux2);
interruptCounter2--;
portEXIT_CRITICAL(&timerMux2);
Serial.print("An interrupt as occurred (A). Total number: ");
Serial.println(totalInterruptCounter2);
totalInterruptCounter2++;
if (totalInterruptCounter2 > 0){
flagpedestreVermelho = 0;
flagcarroVerde = 0;
interruptCounter2 = 0;
timerStop(My_timer2);
timerStop(My_timer);
timerWrite(My_timer, 0);
timerWrite(My_timer2, 0);
condicao = 2;
pressed = 0;
}
}
}
}
void stateB(){
bool mode = timerStarted(My_timer);
if (!mode){
timerStart(My_timer);
}
timerStop(My_timer2);
allLedsOff();
if (pressed && flagcarroAmarelo == 1){
bool mode = timerStarted(My_timer);
if (mode){
timerStop(My_timer);
timerRestart(My_timer3);
}
if (interruptCounter3 > 0) {
portENTER_CRITICAL(&timerMux3);
interruptCounter3--;
portEXIT_CRITICAL(&timerMux3);
Serial.print("An interrupt as occurred (Button). Total number: ");
Serial.println(totalInterruptCounter3);
totalInterruptCounter3++;
if (totalInterruptCounter3 >0){
interruptCounter3 = 0;
timerStop(My_timer3);
digitalWrite(carroVermelho,HIGH);
flagcarroVermelho = 1;
digitalWrite(carroAmarelo,LOW);
flagcarroAmarelo = 0;
digitalWrite(pedestreVerde,HIGH);
flagpedestreVerde = 1;
digitalWrite(pedestreVermelho,LOW);
flagpedestreVermelho = 1;
condicao = 1;
pressed = 0;
}
}
}else{
if(flagcarroAmarelo == 1){
digitalWrite(carroAmarelo,HIGH);
}else{
digitalWrite(carroAmarelo,LOW);
}
if (interruptCounter > 0) {
portENTER_CRITICAL(&timerMux);
interruptCounter--;
portEXIT_CRITICAL(&timerMux);
Serial.print("An interrupt as occurred (B). Total number: ");
Serial.println(totalInterruptCounter);
totalInterruptCounter++;
if (totalInterruptCounter >=3){
flagcarroAmarelo = 0;
interruptCounter = 0;
timerStop(My_timer);
timerStop(My_timer2);
timerWrite(My_timer, 0);
timerWrite(My_timer2, 0);
condicao = 3;
pressed = 0;
}
}
}
//led vermelho pedestre pisca 3 x
}
void stateC(){
bool mode = timerStarted(My_timer2);
if (!mode){
timerStart(My_timer2);
}
timerStop(My_timer);
allLedsOff();
if(flagpedestreVerde == 1 && flagcarroVermelho == 1){
digitalWrite(pedestreVerde,HIGH);
digitalWrite(carroVermelho,HIGH);
}else{
digitalWrite(pedestreVerde,LOW);
digitalWrite(carroVermelho,LOW);
}
if (interruptCounter2 > 0) {
portENTER_CRITICAL(&timerMux2);
interruptCounter2--;
portEXIT_CRITICAL(&timerMux2);
Serial.print("An interrupt as occurred (C). Total number: ");
Serial.println(totalInterruptCounter2);
totalInterruptCounter2++;
if (totalInterruptCounter2 > 0){
flagpedestreVerde = 0;
flagcarroVermelho = 0;
interruptCounter2 = 0;
timerStop(My_timer2);
timerStop(My_timer);
timerWrite(My_timer, 0);
timerWrite(My_timer2, 0);
condicao = 1;
pressed = 0;
}
}
}
void allLedsOff(){
digitalWrite(carroVermelho,LOW);
digitalWrite(carroAmarelo,LOW);
digitalWrite(carroVerde,LOW);
digitalWrite(pedestreVermelho,LOW);
digitalWrite(pedestreVerde,LOW);
}
void start(){
int i = 0;
while ((i < 6) && flagStart == 1){
currentMillis = millis();
if((currentMillis-previousMillis)>500){
previousMillis = currentMillis;
ledState = !ledState;
digitalWrite(pedestreVermelho, ledState);
digitalWrite(pedestreVerde, ledState);
digitalWrite(carroVermelho, ledState);
digitalWrite(carroAmarelo, ledState);
digitalWrite(carroVerde, ledState);
i++;
}
}
flagStart = 0;
}
void interruptbutton(){
}