Ajuda com interrupção externa

Ola!
Estou tentando fazer um Menu para o Arduino, pretendo alterar os programas do menu com interrupções externas, porem quando aciono a interrupção o programa até altera mas o arduino trava!
alguém pode me ajudar?

#include <LiquidCrystal.h> 



//declaração de botoes
const int botUp = 2;
const int botDown = 3;  
const int botDec= 4;  
const int botInc= 5;

int x=1;
//seta pinos lcd--RS,E,D4,D5,D6,D7
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);

String tela_1="teste 1";
String tela_2="teste 2";
String tela_3="teste 3";


void setup() {
  // BOTOES DO MENU
 pinMode(botUp, INPUT);  
 pinMode(botDown, INPUT); 
 pinMode(botDec, INPUT);  
 pinMode(botInc, INPUT); 
 attachInterrupt(0, interruptBotUp, RISING); //interrupção
 attachInterrupt(1, interruptBotDown, RISING);
 lcd.begin(16, 2); // Inicializa lcd de 2 linhas e 16 colunas
 Serial.begin(9600);
}

void loop()
{ 
  lcd.setCursor(0,0);
 lcd.print(" Arduino");
 delay(3000);
 Serial.println("vamos para o metodo que seleciona o programa");
  selectProgram();
}


void selectProgram()
{ 
  
  switch (x)
  {
    case 1://*********************** programa 1*********************************************

            
            while(1)
            {// simples programa de teste
              Serial.println("programa 1");
              lcd.clear();
              lcd.setCursor(0,0);
              lcd.print(tela_1);
              lcd.setCursor(0,1);
              lcd.print(millis()/1000);
              delay (1000);                    
            } break;
    case 2://********************** programa 2**********************************************
            while(1)
            {// simples programa de teste
              Serial.println("programa 2");
              lcd.clear();
              lcd.setCursor(0,0);
              lcd.print(tela_2);
              lcd.setCursor(0,1);
             lcd.print(millis()/1000);
              delay (1000);                    
            } break;
    case 3:// ***********************programa 3****************************************
            while(1)
            {// simples programa de teste
              Serial.println("programa 3");
              lcd.clear();
              lcd.setCursor(0,0);
              lcd.print(tela_3);
              lcd.setCursor(0,1);
              lcd.print(millis()/1000);
              delay (1000);                    
            } break;    
  }
}

void interruptBotUp()
{
  Serial.println("mudando menu");
  
    x++;
    if(x>3)
      x=1;
    selectProgram();
  }

void interruptBotDown()
{
  x--;
  if(x<1)
    x=3;
    
  selectProgram();
}

Voce não pode usar dentro de uma interrupção funçôes de outra interrupção. A função delay usa outra interrupção para atuar. Quando entrou na interruptBotDown(), todas as interrupções ficaram desabilitadas. Sugiro que vc use a interrupção para indicar ao loop() o que fazer, não fazendo acesso ao display ou comunicação serial dentro de uma interrupção.

Variaveis usadas dentro de uma função de interrupção devem ser declaradas com volatile.

Lê isto sobre interrupções

http://www.gammon.com.au/forum/?id=11488

Bom dia!!

Estou com um problema com interrupcao externa tb. Voces poderiam me ajudar ?

Eu nao sei o que acontece, mas estou utlizando as interrupcoes atraves dos pinos 2 e 3 do arduino para os sensores fim de curso de uma porta automatica. O estranho e' que qualquer variacao que tem na rede eletrica, interfere na porta.

Eu faco todo os motores pararem assim que a porta encosta no sensor, e quando encosta, faco ela recuar 2 cm.

Ontem estava com mexendo, deixei ligado, ate entao tudo OK, o motor tava la parado, normal. Ai fui ligar a luz da sala, teve alguma pequena variacao que acionou o motor.

Como resolvo essa situacao ? Estou utilizando resistores de 10k como pull Down na entrada dos pinos 2 e 3 e uma fonte chaveada de 1A ate 20 volts.

Estou utlizando o attachInterrupt... como HIGH

Obrigado galera!!

Colocares duas vezes a mesma pergunta tem o efeito contrario ao desejado... ou seja, colocas duas vezes a mesma questao, recebes 4 vezes menos respostas.

Eu que enviei errado, achei que tivesse dado erro, pois nao aparecia minha mensagem. De certa forma, me desculpe caso tenho causado ma impressao.

Obrigado novamente!

Estas a fazer algum tratamento na entrada (debounce, filtro RC ) Descreve detalhadamente como tens ligado o teu fim de curso, as resistencias e a ligaçao aos pinos.

Boa tarde, estou com um projeto de um semáforo feito no arduíno uno, precisava de ajuda em um botão. No caso, este botão irá fazer com que o led amarelo do semáforo dos veículos fique piscando, e os leds dos pedestres apague, só que não consigo incluir este botão como uma interrupção, pois, assim que eu apertá-lo, desejo que faça a situação que acabei de dizer, e ao ser pressionado de novo, volte ao estado normal. Desde já agradeço pela ajuda.

Qual é a dúvida em concreto?

O que já fizeste e onde ficaste preso?

Porque é que tens de usar interrupções para um botão?