Utilizando um botão para enviar informações para o Raspberry

Fala galera!

Hoje vou demonstrar um processo bem interessante, a parte IN do GPIO.

Como explicado anteriormente em posts, os pinos do Raspberry podem ser utilizados tanto para saída de dados (acender LED , ligar motores e etc), tanto para entrada de informações (botões potenciômetros e etc).

Uma coisa interessante para se utilizar são botões iguais campainha que você aperta e ele volta ao estado original e o circuito só é fechado quando acionado.

No Raspberry podemos capturar esses eventos de forma simples e fácil utilizando métodos próprios e funções de call back, ou seja funções que são executadas a partir de uma ação.

Podemos capturar 3 tipos de ações do botão:

  1.  AO CLICAR (GPIO.FALLING)
  2. AO SOLTAR (GPIO.RISING)
  3. AMBOS (GPIO.BOTH)

no caso do 3 a função de call back será executada 2 vezes caso não seja tratado.

Iremos fazer o seguinte exemplo:

  1.  3 LEDS
  2.  1 Botão
  3.  4 Resistores

O intuito será que ao apertar na primeira vez, acende 1 LED, na segunda 2 LEDs , terceira 3 LEDs e na quarta apague tudo.

 

Então temos o seguinte protótipo:

DSC_0082Utilizaremos os pinos contando sempre no modo BOARD , ou seja contando diretamente na pinagem, desconsiderando os numeros de GPIO

Raspberry-Pi-GPIO-Layout-Revision-2

Para esse exemplo utilizaremos:

  1. pino 11 para o botão
  2. pino 12 para o led1
  3. pino 13 para o led2
  4. pino 15 para o led3

 

Utilizaremos o seguinte código explicado:

import RPi.GPIO as GPIO;   
import time;
import datetime; 
qtdApertado  = 0;     

def apertarBotao(channel):
  global qtdApertado;
  qtdApertado = qtdApertado + 1 ;
  if qtdApertado == 1:
    GPIO.output(12,1);
  if qtdApertado == 2:
    GPIO.output(13,1);
  if qtdApertado == 3:
    GPIO.output(15,1);
  if qtdApertado == 4:
    GPIO.output(12,0);
    GPIO.output(13,0);
    GPIO.output(15,0);	
    qtdApertado = 0;

def main(): 
  GPIO.setmode(GPIO.BOARD); 
  GPIO.setwarnings(False);  
  GPIO.cleanup(); 
  GPIO.setup(11,GPIO.IN,pull_up_down=GPIO.PUD_UP); 
  GPIO.setup(12, GPIO.OUT); 
  GPIO.setup(13, GPIO.OUT); 
  GPIO.setup(15, GPIO.OUT); 
  GPIO.setup(16, GPIO.OUT);
  GPIO.output(12,0);
  GPIO.output(13,0);
  GPIO.output(15,0);	
  GPIO.output(16,0);	 
  GPIO.add_event_detect(11,GPIO.FALLING, bouncetime=1000 , callback=apertarBotao);
  while (True):				
    time.sleep(.5);
    
if __name__ == "__main__":
   main()pyt

Temos as funções :

apertarBotao e a main.

A main é a principal do nosso sistema, nela iremos  colocar os valores iniciais para cada pino e identificar se ele será entrada ou saída.

Na linha 34 informamos que um call back apertarBotao deve ser adicionado quando o botão for apertado, no caso do FALLING. Também existe uma instrução chamada bouncetime, que informa que o intervalo de apertar o botão será de 1000ms ou 1 segundo, esse valor pode ser aumentado ou diminuído de acordo com a sua necessidade.

 

Feito isso, o seu sistema irá rodar basicamente igual ao vídeo abaixo:

 

Espero que tenham gostado, e até a próxima!