Lidando com uma Fonte de Sinal
O circuito a seguir é uma versão simplificada de um sistema mais complexo. Para fins de teste, o temporizador 555 foi adicionado para servir como uma fonte de sinal de teste com frequências definidas pelos resistores em série. Cada sinal arbitrário é indicado por um botão e o Arduino precisa ser capaz de distinguir qual botão foi pressionado. Infelizmente, pode haver apenas 3 botões e mais não podem ser adicionados. É aqui que ocorre o problema. Como você pode indicar com segurança qual botão foi pressionado sem interferir na forma de onda arbitrária?
A princípio, meu pensamento original era fazer com que o Arduino fizesse uma amostra do sinal com base nessa amostra, o Arduino seria capaz de dizer qual botão é pressionado.
Quando o botão 1 no rosa é pressionado, o Arduino recebe uma amostra do sinal a seguir.
843
848
849
849
849
849
// Time 0 when button is pushed
532
414
500
373
463
346
425
370
386
476
346
442
642
788
Movendo a entrada
// At t = 0 the Serial Monitor reads zero
998
998
998
998
998
0
0
0
0
0
998
0
0
0
0
0
0
0
0
0
998
0
0
0
0
998
0
0
0
998
998
998
0
998
0
0
0
998
0
0
0
0
Mover a entrada analógica não torna mais fácil distinguir qual botão foi pressionado. É por isso que decidi perguntar à comunidade como lidar com isso. Eu tentei usar um relé e simplesmente codificar todos os casos, mas o resultado é um sistema não muito robusto e vulnerável a quebrar facilmente com o tempo.
Respostas
Existe uma maneira fácil de conseguir a leitura de vários botões usando uma única entrada analógica.
Tudo o que você precisa fazer é criar alguns divisores de voltagem em diferentes voltagens que podem ser lidos usando analogRead. O último resistor, R6, no diagrama abaixo garante que o pino leia 0 quando nenhum botão for pressionado (ou seja, resistor pull-down). No diagrama abaixo, conecte Vcc a 5V no Arduino.
Experimente, você deve ser capaz de obter valores bem espaçados para botões diferentes!
Depois de um ou dois dias trabalhando neste problema, descobri que é melhor evitar o uso de pinos analógicos e ficar longe da interface direta com o 555 Timer. Esta é uma versão simplificada de um circuito mais complexo e o 555 Timer representa alguma fonte de sinal arbitrária. Por exemplo, no rádio móvel, você aperta um botão para enviar uma determinada frequência. Esse é o conceito aqui, apenas as frequências ainda não podem ser ajustadas. Agora que foi esclarecido que o 555 Timer foi colocado no circuito para fins de depuração, aqui está a melhor solução que encontrei para este problema. Primeiro, descobri que é possível ler a partir do pino analógico do Arduino, mas não é fácil. Isso deixa muito espaço para erro, sendo que a forma de onda é arbitrária com alguma frequência aleatória. Portanto, optei por usar os pinos digitais no Arduino.
const int D_pin10 = 10;
const int D_pin9 = 9;
const int D_pin8 = 8;
int led = 13;
void setup()
{
pinMode(D_pin10 , INPUT); // pin 10 is an input
pinMode(D_pin9 , INPUT); // pin 10 is an input
pinMode(D_pin8, INPUT); // pin 10 is an input
pinMode(led, OUTPUT);
}
void loop()
{
int High_Low10 =0;
int High_Low9 =0;
int High_Low8 =0;
High_Low10 = digitalRead(D_pin10);
High_Low9 = digitalRead(D_pin9);
High_Low8 = digitalRead(D_pin8);
if(High_Low10 == HIGH)
{
digitalWrite(led, HIGH);
}
else if(High_Low9 == HIGH)
{
digitalWrite(led, HIGH);
}
else if(High_Low8 == HIGH)
{
digitalWrite(led, HIGH);
}
else
{
digitalWrite(led, LOW);
}
delay(1000);
}