Dúvida - do while

Bom dia.
Comecei a aprender Arduíno a pouco tempo, comprei um Arduíno Leonardo R3 recentemente e comecei revisando algumas funções básicas da linguagem C, pois já tinha certa experiência com outros microcontroladores.
Resumindo, ao fazer um programa para testar a função "do while", reparei que no compilador do Arduíno ela não está funcionando corretamente.
os comandos escritos dentro do "do" se repetem mesmo sem a confirmação da expressão contida no while.
Código:

/****************************LAÇO DO WHILE ********************************

  • Este laço é utilizado quando se deseja executar ao menos uma vez determinada rotina
  • antes da confirmação de um parâmetro,status,etc.
    **************************************************************************/
    //Aqui criamos as váriaveis e definimos os pinos utilizados

int led_red = 13; //Define led_red no pino 13
int led_green = 12; //Define led_green no pino 12
int led_blue = 11; //Define led_blue no pino 11
int botao = 4; //define o botão no pino 4
int cont = 0;
void setup() {
// Aqui definimos quais pinos serão utilizados como entrada e quais pinos
//serão utilizados como saída:
pinMode(led_red,OUTPUT); //Define o pino 13 como saída
pinMode(led_green,OUTPUT); //Define o pino 12 como saída
pinMode(led_blue,OUTPUT); //Define o pino 11 como saída
pinMode(botao,INPUT_PULLUP); //Define pino 4 como entrada e habilita pull up

}

void loop() {
// Aqui digitamos nosso código:

do{

digitalWrite(led_red,HIGH); //Acende o led vermelho
delay(500); //delay 0.5s
digitalWrite(led_red,LOW); //Desliga led vermelho
digitalWrite(led_green,HIGH); //Liga led verde
delay(500); //delay 0.5s
digitalWrite(led_green,LOW); //desliga led verde
digitalWrite(led_blue,HIGH); //Liga led azul
delay(500); //delay 0.5s
digitalWrite(led_blue,LOW); //desliga led azul
delay(500); //delay 0.5s

}
//Verifica se o botão está pressionado e só entao repete as instruções
//escritas no "do" - isso não acontece, acredito que por estarmos dentro da função
//void loop as instruções contidas em "do" são repetidas mesmo sem a confirmação
//do while
while(digitalRead(botao)==LOW);

Se alguém puder ajudar.
Grato.
}

Como a verificação da condição está no final do bloco que define o ciclo, é normal que as instruções sejam executadas pelo menos uma vez. Se o problema não é esse, deve verificar se a condição está mesmo a ser satisfeita (por exemplo através de outro LED ou de uma mensagem para a porta série), porque pode estar a acontecer outro problema que leve a que a leitura não seja correcta.

Obrigado pela resposta, mas o problema é realmente o contrário, os códigos dentro da instrução "do" estão sendo executados infinitamente, sem a condição dentro do "while" ser satisfeita (pressionar o botão)
Se puder simular o código vai perceber isso.
Grato.

OK, já percebi. Sabe como funciona um programa para Arduino? Sabe o que significa a palavra na língua inglesa "loop"? Se sim, pense nisso em no que disse no post anterior:

luisilva:
Como a verificação da condição está no final do bloco que define o ciclo, é normal que as instruções sejam executadas pelo menos uma vez. (...)

Já agora, veja qual é a diferença em relação a este programa:

 int led_red = 13;                              //Define led_red no pino 13
 int led_green = 12;                            //Define led_green no pino 12
 int led_blue = 11;                             //Define led_blue no pino 11
 int botao = 4;                                 //define o botão no pino 4
 int cont = 0;
void setup() {
  // Aqui definimos quais pinos serão utilizados como entrada e quais pinos
  //serão utilizados como saída:
  pinMode(led_red,OUTPUT);                      //Define o pino 13 como saída
  pinMode(led_green,OUTPUT);                    //Define o pino 12 como saída
  pinMode(led_blue,OUTPUT);                     //Define o pino 11 como saída
  pinMode(botao,INPUT_PULLUP);                  //Define pino 4 como entrada e habilita pull up

}

void loop() {
  // Aqui digitamos nosso código:

while(digitalRead(botao)==LOW){

digitalWrite(led_red,HIGH);                     //Acende o led vermelho
delay(500);                                          //delay 0.5s
digitalWrite(led_red,LOW);                      //Desliga led vermelho
digitalWrite(led_green,HIGH);                  //Liga led verde
delay(500);                                          //delay 0.5s
digitalWrite(led_green,LOW);                  //desliga led verde
digitalWrite(led_blue,HIGH);                    //Liga led azul
delay(500);                                     //delay 0.5s
digitalWrite(led_blue,LOW);                     //desliga led azul
delay(500);                                     //delay 0.5s

}
}

ou em relação a este:

 int led_red = 13;                              //Define led_red no pino 13
 int led_green = 12;                            //Define led_green no pino 12
 int led_blue = 11;                             //Define led_blue no pino 11
 int botao = 4;                                 //define o botão no pino 4
 int cont = 0;
void setup() {
  // Aqui definimos quais pinos serão utilizados como entrada e quais pinos
  //serão utilizados como saída:
  pinMode(led_red,OUTPUT);                      //Define o pino 13 como saída
  pinMode(led_green,OUTPUT);                    //Define o pino 12 como saída
  pinMode(led_blue,OUTPUT);                     //Define o pino 11 como saída
  pinMode(botao,INPUT_PULLUP);                  //Define pino 4 como entrada e habilita pull up

}

void loop() {
  // Aqui digitamos nosso código:

if (digitalRead(botao)==LOW){

digitalWrite(led_red,HIGH);                     //Acende o led vermelho
delay(500);                                          //delay 0.5s
digitalWrite(led_red,LOW);                      //Desliga led vermelho
digitalWrite(led_green,HIGH);                  //Liga led verde
delay(500);                                          //delay 0.5s
digitalWrite(led_green,LOW);                  //desliga led verde
digitalWrite(led_blue,HIGH);                    //Liga led azul
delay(500);                                     //delay 0.5s
digitalWrite(led_blue,LOW);                     //desliga led azul
delay(500);                                     //delay 0.5s

}
}

Oi, desculpe a demora em responder, as coisas andam meio corridas por aqui.
Realmente acho que não entendeu minha dúvida, mas não tem problema, continuo fuçando por aqui.
Realmente a função "do while" no Arduíno está diferente do que estou acostumado em C ou no PIC.
Pois no PIC os led's só acendem uma vez e o programa aguarda o acionamento do botão para que continuem acendendo enquanto no Arduíno eles ficam piscando sem parar mesmo sem apertar o botão.
De qualquer forma obrigado pelo tempo e pela atenção.

Grato.

Eu nao vejo nada de errado nesse do while.Se dizes que no pic e no C isso é diferente deve ser "caso isolado e unico no mundo" pois nos meus pics e no meu C isso nao acontece : :grin: )
O que o LuisSilva te respondeu explica bem o que estas a interpretar erradamente.Estas te a esquecer que tens esse do while dentro de um loop que vai repetir para sempre ate que a alimentaçao se perca.
Carrega este programa e vê:

int led_red = 13;                              //Define led_red no pino 13
int botao = 4;                                 //define o botão no pino 4
unsigned int counterInsideDoWhile = 0;
unsigned int counterLoop = 0;
void setup() {
  // Aqui definimos quais pinos serão utilizados como entrada e quais pinos
  //serão utilizados como saída:
  pinMode(led_red, OUTPUT);                     //Define o pino 13 como saída
  pinMode(botao, INPUT_PULLUP);                 //Define pino 4 como entrada e habilita pull up
  Serial.begin(9600);
}

void loop() {
  // Aqui digitamos nosso código:
  Serial.print("Loop counter: ");
  Serial.println(counterLoop++);
  do {
    Serial.print("doWhile counter: ");
    Serial.println(counterInsideDoWhile++);
    digitalWrite(led_red, HIGH);                    //Acende o led vermelho
    delay(500);
    digitalWrite(led_red, LOW); //delay 0.5s

  }
  while (digitalRead(botao) == LOW);
}

Adaptei o ligeiramente para entenderes o que se esta a passar de uma forma simples.
O que é esperado dele é que caso nao primas o teu botao o do while vai ser sempre executado pelo menos uma vez no loop a cada passagem do loop, logo o contador do loop e do "dowhile" irao estar ao mesmo valor.Quando depois primires o botao, o teu doWhile vai avaliar true e vai ficar com a contagem desfasada do loop porque ira correr ate libertares o botao, o que prova o normal comportamento do "dowhile" ele esta a correr pelo menos uma vez e recursivo se a condiçao do while estiver a ser satisfeita.
Sem carregar no botao obtens isto:

Loop counter: 0
doWhile counter: 0
Loop counter: 1
doWhile counter: 1
Loop counter: 2
doWhile counter: 2
Loop counter: 3
doWhile counter: 3
Loop counter: 4
doWhile counter: 4
Loop counter: 5
doWhile counter: 5
Loop counter: 6
doWhile counter: 6
Loop counter: 7
doWhile counter: 7
Loop counter: 8
doWhile counter: 8

Apos carregar no botao :

doWhile counter: 170//loop
Loop counter: 171 //loop
doWhile counter: 171//do while entrou em açao
doWhile counter: 172//dentro do doWhile
doWhile counter: 173//dentro do doWhile
doWhile counter: 174//dentro do doWhile
doWhile counter: 175//dentro do doWhile
doWhile counter: 176//dentro do doWhile
doWhile counter: 177//dentro do doWhile
doWhile counter: 178//dentro do doWhile
doWhile counter: 179//dentro do doWhile
doWhile counter: 180//dentro do doWhile
Loop counter: 172//Botao libertado o loop continua
doWhile counter: 181//dowhile avaliado mais uma vez mas nao executado ...
Loop counter: 173//loop

Espero que isto te abra o olhos para o que esta debaixo do teu nariz.

Embora o hugo já tenha explicado o que se passa, tenho que dizer que percebi perfeitamente a sua dúvida, mas como não responde directamente às perguntas que coloquei no post anterior (acaba por responder indirectamente, mas não sei porquê não responde directamente) acaba po mostrar perfeitamente que não sabe o que é a linguagem C nem um microcontrolador.

Tentando explicar qual era o objectivo das questões:
Sabe como funciona um programa para Arduino?
Num microcontrolador, uma coisa normal é haver um ciclo infinito que repita o programa (também chamado de while(1), porque é realizado normalmente por esta estrutura). Isto é necessário, porque o equipamento em que se coloca o microcontrolador deve estar sempre pronto a funcionar (e portanto a executar o programa), se não estiver pronto a funcionar quer dizer que está desligado (por exemplo sem energia). Sendo assim, o aspecto normal num programa de um microcontrolador é:

void main(void) 
{
   // aqui é colocada a inicialização do programa
   while (1) {
      // aqui é colocado o programa
   }
}

Não sei se durante a sua experiência com linguagem de programação C e com microcontroladores chegou a a ver uma coisa parecida com isto, mas é isto que acontece.

Isto leva-nos à 2ª questão que foi colocada mas que não responde directamente:
Sabe o que significa a palavra na língua inglesa "loop"?
A palavra "loop" em inglês pode ser traduzida para português como ciclo. Sendo assim, posso dizer-lhe que que desenvolveu o Arduino tentou simplificar um pouco as coisas pata que pudesse ser utilizado por pessoas sem formação em programação. Nesse sentido ocultou parte da estrutura dos programas em C tendo feito isto:

void main(void) 
{
   // aqui é colocada a inicialização do programa
   setup();

   while (1) {
      // aqui é colocado o programa
      loop();
   }
}

Criando estas duas funções, é muito mais fácil para uma pessoa que não tenha conhecimentos de programação perceber que dentro de uma função chamada "setup" tem que colocar as instruções de inicialização e dentro de uma função que se chama "loop" tem que colocar as instruções que vão fazer parte do seu programa e que se vão repetir infinitamente.

Sendo assim, e tendo chegado à conclusão de qual é a estrutura de um programa em C para um Arduino, o seu programa na realidade tem o seguinte aspecto:

/****************************LAÇO DO WHILE ********************************
 * Este laço é utilizado quando se deseja executar ao menos uma vez determinada rotina
 * antes da confirmação de um parâmetro,status,etc.
 **************************************************************************/
//Aqui criamos as váriaveis e definimos os pinos utilizados

int led_red = 13;                              //Define led_red no pino 13
int led_green = 12;                            //Define led_green no pino 12
int led_blue = 11;                             //Define led_blue no pino 11
int botao = 4;                                 //define o botão no pino 4
int cont = 0;

void main(void) 
{
  // Aqui definimos quais pinos serão utilizados como entrada e quais pinos
  //serão utilizados como saída:
  pinMode(led_red,OUTPUT);                      //Define o pino 13 como saída
  pinMode(led_green,OUTPUT);                    //Define o pino 12 como saída
  pinMode(led_blue,OUTPUT);                     //Define o pino 11 como saída
  pinMode(botao,INPUT_PULLUP);                  //Define pino 4 como entrada e habilita pull up

  while (1)
  {
    // Aqui digitamos nosso código:

    do{

      digitalWrite(led_red,HIGH);                     //Acende o led vermelho
      delay(500);                                          //delay 0.5s
      digitalWrite(led_red,LOW);                      //Desliga led vermelho
      digitalWrite(led_green,HIGH);                  //Liga led verde
      delay(500);                                          //delay 0.5s
      digitalWrite(led_green,LOW);                  //desliga led verde
      digitalWrite(led_blue,HIGH);                    //Liga led azul
      delay(500);                                     //delay 0.5s
      digitalWrite(led_blue,LOW);                     //desliga led azul
      delay(500);                                     //delay 0.5s

    }
    //Verifica se o botão está pressionado e só entao repete as instruções
    //escritas no "do" - isso não acontece, acredito que por estarmos dentro da função
    //void loop as instruções contidas em "do" são repetidas mesmo sem a confirmação
    //do while
    while(digitalRead(botao)==LOW);
  }
}

Agora repare no que está a fazer o seu programa. Como o ciclo "do-while" executa sempre a primeira repetição sem verificar a condição o que está contido no seu interior irá sempre ser executado. Quando essa execução termina é verificada a condição e como não é cumprida esse ciclo é terminado. No entanto, como está dentro de um ciclo infinito o "do-while" volta a ser executado e, como isto é um ciclo infinito, este comportamento irá-se repetir para sempre.

Sendo assim, a escolha do "do-while" não é a melhor neste caso. Deveria optar por um "while" ou mesmo por um "if" (que neste caso tem o mesmo comportamento).

Pessoal, vocês são nota 10, obrigado pela paciência e pelo empenho em me ajudar a entender algo tão simples. Comecei justamente pela linguagem "C" aplicada ao Arduíno, por não querer ter esse tipo de dificuldade em uma aplicação ou projeto, acredito não ter percebido que a função "do while" funcionava dessa forma devido ao uso do system ("pause") na linguagem c. Novamente, muito obrigado a todos, vou continuar me esforçando para aprender e quem sabe um dia também possa estar colaborando tanto com conteúdo, quanto tirando a dúvida dos iniciantes também.

Muito obrigado.