Tenho garimpado alguns sensores no ebay e outros sites do gênero. O problema e que muitos sensores colocados à venda têm pouca ou nenhuma documentação disponível na internet. É preciso usar de engenharia reversa pra entender seu funcionamento e usá-los bem. Esta postagem mostra um desses sensores o sensor de toque humano.
Este sensor usa o comparador LM393 e tem como elemento sensor um transistor darligton MPSA13. O segredo é que a base do transistor não está ligada a nada, fica enrolada no corpo do transistor onde pode ser tocada. Ao tocar a base o transistor conduz o que através do LM393 coloca a saída digital do sensor (SD) em nível alto. Nos meus testes a saída ficou oscilando entre nivela alto e baixo quando o sensor era tocado. Foi preciso considerar isso na hora de programar.
O sensor também possui uma saída analógica (SA), direto do elemento sensor sem passar pelo comparador. Se ligada a uma entrada analógica do arduino, por exemplo, teremos um valor entre 1023 e 0. Na pratica, ao tocar no sensor o valor salta rapidamente de próximo do 1023 a próximo do 0. Um dos testes que fiz foi usar um pequeno pedaço de fio, como antena, conectado à base do transistor para aumentar sensibilidade. Nestes testes aproximar a mão de antena fazia aumentar o valor lido da saída analógica do sensor.
No experimento mostrado no vídeo a saída digital foi ligada no pino digital 3 do arduino. O comportamento seria idêntico ao de um botão se não fosse pelo fato da saída varia entre o nível alto e baixo, varias vezes por segundo, quando há o toque no elemento sensor. Para minimizar o esse efeito foi usado um laço. Enquanto a saída está em nível baixo o programa permanece nesse laço. Uma pequena mudança da saída para o nível alto faz o programa sair do laço e alterar o estado do pino 13 que, por sua vez controla o acendimento da lâmpada.
Programa
const int sensorPin = 3;
const int ledPin = 13;
int sensorState = 0;
int sensorState_aux = 0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(sensorPin, INPUT);
}
void loop(){
sensorState_aux = digitalRead(sensorPin);
delay(30);
// sem ser tocado a saida do sensor permanece em nivel baixo
// quand tocado a saída alterna entre nível baixo e alto
// para eviatar ocilacões aguarda a saída ir ao nivel alto
while( sensorState_aux != HIGH)
{
sensorState_aux = digitalRead(sensorPin);
delay(30);
}
//inverte o estado aterior do pino 13 do arduino
// se HIGH passa para LOW e vice-versa
sensorState = !sensorState;
if (sensorState == HIGH) {
digitalWrite(ledPin, HIGH);
}
else {
digitalWrite(ledPin, LOW);
}
delay(500);
}