If with counters

Hi everyone!

I have a problem and maybe someone can help me. The programm it's easy. The only thing that doesn't work is that when the software go to case 1, for example, keep all the outputs as high. I think that the variable contverde1 never decrease, and as a result of this the pin 8 never turn off. Maybe i have a problem with if and the conditions.

Thanks!

int contverde1;
int contverde2;

void setup() {
for (int pinNum=2; pinNum<8;pinNum++){
pinMode(pinNum, INPUT);} //Declaro como entradas pines de entrada del 2 al 7
for (int i=8; i<14;i++){
pinMode(i, OUTPUT); //Declaro como salidas pines de entrada del 8 al 13
}
digitalWrite(8,LOW);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
digitalWrite(13,LOW);
analogWrite (A0,0);
contverde1=0;
contverde2=0;
}

void loop() {
int GetSemaforo = chequeo();
switch (GetSemaforo) {
case 0: //Verde 1
analogWrite (A0,0);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
digitalWrite(13,LOW);
contverde1= 18;
if (contverde1>0)
if (contverde1<19 && contverde1>=12){
//(Envio BT);
digitalWrite (8,HIGH);
digitalWrite (9,HIGH);
digitalWrite (10,HIGH);
contverde1--;
delay (1000);}
else if (contverde1<12 && contverde1>=6){
//(Envio BT);
digitalWrite (8,LOW);
contverde1--;
delay (1000);}
else if (contverde1<6 && contverde1>0){
//(Envio BT);
digitalWrite (9,LOW);
contverde1--;
delay (1000);}
if (contverde1=0)
//(Envio BT estado incierto);
digitalWrite (10,HIGH);
delay (1000);
break;
case 1: //Amarilla 1
analogWrite (A0,0);
contverde1=18;
digitalWrite(8,LOW);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
//(Envio BT);
delay (1000);
break;
case 2: //Rojo 1
//(Envio BT);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
analogWrite (A0,0);
delay (250);
break;
case 3: //Verde 2
analogWrite (A0,0);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
contverde2=18;
if (contverde2>0)
if (contverde2<19 && contverde2>=12){
//(Envio BT);
digitalWrite (11,HIGH);
digitalWrite (12,HIGH);
digitalWrite (13,HIGH);
contverde2--;
delay (1000);}
else if(contverde2<12 && contverde2>=6){
//(Envio BT);
digitalWrite (11,LOW);
contverde2--;
delay (1000);}
else if (contverde1<6 && contverde1>0){
//(Envio BT)
digitalWrite (12,LOW);
contverde2--;
delay (1000);}
if (contverde2=0)
//(Envio BT estado incierto);
digitalWrite (13,HIGH);
delay (1000);
break;
case 4: //Amarilla 2
analogWrite (A0,0);
contverde2=18;
digitalWrite(11,LOW);
digitalWrite(12,LOW);
digitalWrite(13,LOW);
//(Envio BT);
delay (1000);
break;
default:
//(Envio BT);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
digitalWrite(13,LOW);
analogWrite(A0,255);
}
delay(1);
}
int chequeo(){
while (digitalRead(2)== HIGH && digitalRead(3)== LOW && digitalRead(4)== LOW && digitalRead(5)== LOW && digitalRead(6)== LOW && digitalRead(7)== HIGH) // Verde S1
{
return 0;
}
while (digitalRead(2)== LOW && digitalRead(3)== HIGH && digitalRead(4)== LOW && digitalRead(5)== LOW && digitalRead(6)== LOW && digitalRead(7)== HIGH) //Amarilla S1
{
return 1;
}
while (digitalRead(2)== LOW && digitalRead(3)== LOW && digitalRead(4)== HIGH && digitalRead(5)== LOW && digitalRead(6)== LOW && digitalRead(7)== HIGH) //Roja S1
{
return 2;
}
while (digitalRead(2)== LOW && digitalRead(3)== LOW && digitalRead(4)== HIGH && digitalRead(5)== HIGH && digitalRead(6)== LOW && digitalRead(7)== LOW) // Verde S2
{
return 3;
}
while (digitalRead(2)== LOW && digitalRead(3)== LOW && digitalRead(4)== HIGH && digitalRead(5)== LOW && digitalRead(6)== HIGH && digitalRead(7)== LOW) //Amarilla S2
{
return 4;
}

}

Please read the two posts at the top of this Forum by Nick Gammon about guidelines for posting here, especially the use of code tags when posting source code. It will help us help you. Also, use Ctrl-T in the IDE to format you code in a standard C manner.

what do you think this line is doing in the switch/case every loop

contverde1 = 18;

as that line is not conditional other than case 0: all the ifs that compare against contverde1 seem a little odd

 int GetSemaforo = chequeo();
  switch (GetSemaforo) {
    case 0: //Verde 1
      analogWrite (A0, 0);
      digitalWrite(11, LOW);
      digitalWrite(12, LOW);
      digitalWrite(13, LOW);
      contverde1 = 18;
      if (contverde1 > 0)
        if (contverde1 < 19 && contverde1 >= 12) {
          //(Envio BT);
          digitalWrite (8, HIGH);
          digitalWrite (9, HIGH);
          digitalWrite (10, HIGH);
          contverde1--;
          delay (1000);
        }
        else if (contverde1 < 12 && contverde1 >= 6) {
          //(Envio BT);
          digitalWrite (8, LOW);
          contverde1--;
          delay (1000);
        }
        else if (contverde1 < 6 && contverde1 > 0) {
          //(Envio BT);
          digitalWrite (9, LOW);
          contverde1--;
          delay (1000);
        }
      if (contverde1 = 0)
        //(Envio BT estado incierto);
        digitalWrite (10, HIGH);
      delay (1000);
      break;
if (contverde1 = 0)

That is a common error.

You probably meant:

if (contverde1 == 0)

analogWrite to A0 is not a good idea.

odometer:

if (contverde1 = 0)

That is a common error.

You probably meant:

if (contverde1 == 0)

For future reference, TC:
One equal sign will set a variable to a value. "a=3" will set the variable "a" to value 3.
Two equal signs compare two things. "a==3" will compare variable "a" to the value 3. Also note that "three"==3 is true* even though one is a string and the other is an integer.
Three equal signs is also a comparison. "three"===3 will return false because it compares the data types too.

*Or at least I think it should. I could be wrong. I'm good at that.

free-bee:
Three equal signs is also a comparison. "three"===3 will return false because it compares the data types too.

In javascript, yes. In c/c++, no.

Regards,
Ray L.