GSM Shield

O teu código deveria ter ficado parecido a isto:

//fora da loop...
const unsigned int pinoBotao = 12; 
unsigned char botaoAntes = 0;
unsigned char botao = 0;

//dentro da loop...

botao = digitalRead(pinoBotao);

if ((botao == 1) && (botao != botaoAntes)) {//contacto activou e anteriormente o botao nao estava activo.
   //mete aqui o teu codigo de envio de mensagem.

}
botaoAntes = botao;

Nota que eu não uso em lado algum uma variável Botão. Uso sim uma variável botao que está definida e tem de de ser definida fora de qualquer função.
Acho que estás a confundir as duas coisas. A variável pinoBotao contém o pino que tu queres ler. A variável botao contém o estado do pino indicado em pinoBotao. Ou seja, pinoBotao será sempre 12, mas o estado do pino indicado na variavel botao pode ser 1 ou 0.

Coloca aqui o teu código como tens agora e a gente indica o que poderá estar mal... mas sinto que estás já perto do que pretendes.