- Componentes necessários
- APDS9960 RGB e Sensor de Gestos
- Diagrama de circuito
- Explicação do código
- Testando a elevação sem toque controlada por gestos
Nesta época de pandemia Corona, os elevadores se tornaram um lugar de alto risco, onde todos tocam nos mesmos botões. Em muitos lugares, as pessoas descobriram truques para evitar o contato com os botões do elevador, como usar papel para bombear, palitos de dente ou lenços higiênicos para pressionar os botões do elevador.
Portanto, na continuação de nossos projetos anteriores de segurança Corona, como máquina desinfetante automática, monitoramento de temperatura sem contato e detector de distância social, aqui vamos construir um protótipo de elevador controlado por gestos usando o Arduino Nano.
Este elevador sem contato está usando Arduino Nano, um sensor de gestos APDS9960 e um módulo de display OLED. Com este painel de controle baseado em gestos, você pode controlar facilmente seu elevador fazendo um gesto com a mão. O Sensor APDS9960 é usado para ler os gestos. Os gestos PARA CIMA e PARA BAIXO são usados para definir o número do andar, o gesto para a esquerda é para fechar a porta do elevador e mover o elevador de acordo com o número do andar e o gesto para a direita é usado para abrir a porta.
Componentes necessários
- Arduino Nano
- Módulo de exibição OLED
- APDS9960 RGB e Sensor de Gestos
- Tábua de pão
- Jumper Wires
APDS9960 RGB e Sensor de Gestos
O Módulo de Detecção de Gestos e RGB APDS9960 é uma pequena placa breakout que vem com um sensor APDS-9960 embutido, filtros de bloqueio de UV e IV, quatro diodos separados sensíveis a direções diferentes e uma interface compatível com I2C. Este sensor pode ser usado para luz ambiente e medição de cor, detecção de proximidade e detecção de gestos sem toque. Possui alcance de detecção de gestos de 10 a 20 cm e pode ser usado para controlar microcontrolador, robô e em muitos outros projetos.
Características:
- Tensão operacional: 2,4 V a 3,6 V
- Faixa de operação: 4-8 pol. (10-20 cm).
- Interface I2C (endereço I2C: 0x39).
- Sensor de luz ambiente e cor RGB, proximidade
- Detecção e detecção de gestos em um módulo óptico
- Interface compatível com modo rápido de barramento I2C com taxas de dados de até 400 kHz.
Diagrama de circuito
O diagrama de circuito para elevador sem contato usando APDS9960 é fornecido abaixo.
Estamos conectando o Arduino Nano com o sensor APDS9960 e display OLED. Os pinos VCC e GND do sensor APDS9960 e do visor OLED são conectados a 3,3 V e GND do Arduino. Enquanto os pinos SCL e SDA do sensor APDS9960 e display OLED estão conectados aos pinos A5 e A4 do Arduino, respectivamente.
Pin OLED e APDS9960 |
Pin Arduino Nano |
VCC |
3,3v |
GND |
GND |
SCL |
A5 |
SDA |
A4 |
Esta é a aparência da configuração completa para elevador controlado por gestos usando Arduino:
Para saber mais sobre o display OLED e sua interface com outros microcontroladores, siga o link.
Explicação do código
O código completo para elevador sem contato usando APDS9960 é fornecido no final da página. Aqui estamos explicando algumas partes importantes do código. Neste programa, usaremos as bibliotecas APDS9960 e Adafruit_SH1106 . A biblioteca APDS9960 pode ser baixada do Arduino IDE. Para baixar a biblioteca, vá para Sketch> Library Manager> Search e digite Arduino APDS9960. Enquanto a biblioteca Adafruit_SH1106 pode ser baixada aqui.
Portanto, como de costume, inicie o código incluindo todas as bibliotecas necessárias. Adafruit_SH1106.h é a versão modificada da biblioteca original Adafruit.
#incluir
Nas próximas linhas, defina as variáveis para armazenar o andar atual e o número do andar onde o usuário deseja ir.
floornum int = 0; int currentfloor = 0;
Depois disso, insira os bitmaps para as imagens de seta para cima, seta para baixo, abrir porta e fechar porta. O código HEX para uma imagem pode ser gerado usando um conversor como Image2cpp. Para saber mais sobre como usar Image2cpp, siga este tutorial do gerador de código QR do Arduino.
const unsigned char up PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, …………………………… ………………………………………………………..}; const unsigned char down PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, …………………………… ………………………………………………………..}; const unsigned char dooropen PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xc0, 0x1f, 0xff, 0xff, 0xe0,, ………………………… …………………………………………………………..};
Na função setup () , inicialize o Monitor Serial a uma taxa de transmissão de 9600 para fins de depuração. Então, nas próximas linhas, inicialize o display OLED e o sensor APDS9960 com o método begin () da seguinte maneira:
Serial.begin (9600); if (! APDS.begin ()) {Serial.println ("Erro ao inicializar o sensor APDS9960!"); } Serial.println ("Detectando gestos…"); display.begin (SH1106_SWITCHCAPVCC, 0x3C);
Depois de inicializar a tela e o sensor, limpe o buffer de tela com o método clearDisplay () e defina o tamanho e a cor da fonte usando os métodos display.setTextSize () e display.setTextColor () .
display.setTextSize (2); display.setTextColor (WHITE); display.clearDisplay (); display.display ();
Dentro do loop void () , verifique constantemente se algum gesto foi feito. Se sim, então leia os valores do gesto e verifica qual é o gesto (PARA CIMA, PARA BAIXO, À DIREITA, À ESQUERDA) e imprime a leitura correspondente no monitor serial. Os gestos PARA CIMA e PARA BAIXO são usados para definir o número do andar onde o usuário deseja ir. O gesto para a esquerda é fechar a porta do elevador e movê-lo de acordo com o número do andar enquanto o gesto para a direita é usado para abrir a porta.
if (APDS.gestureAvailable ()) {int gesto = APDS.readGesture (); switch (gesto) {case GESTURE_UP: Serial.println ("Gesto UP detectado"); display.clearDisplay (); floornum ++; home1 (); pausa; case GESTURE_DOWN: Serial.println ("Gesto PARA BAIXO detectado"); display.clearDisplay (); floornum -; home1 (); pausa; case GESTURE_LEFT: Serial.println ("Gesto LEFT detectado"); display.clearDisplay (); começar(); pausa; case GESTURE_RIGHT: Serial.println ("Gesto PARA A DIREITA detectado"); display.clearDisplay (); home1 (); pausa; padrão: break; }
A função home1 () é usada para desenhar a tela inicial de um elevador. Isso consiste em uma seta para cima, uma seta para baixo, abrir porta, sinais de fechar porta e o número do andar atual. A função drawBitmap () é usada para desenhar as imagens no display OLED. A sintaxe da função drawBitmap () é fornecida a seguir:
drawBitmap (int16_t x, int16_t y, bitmap, int16_t w, int16_t h, cor);
Onde:
int16_t x, int16_t y são coordenadas X e Y do display OLED
o bitmap é o nome do bitmap
int16_t w, int16_t h são a altura e o peso da imagem.
void home1 () {display.setCursor (101,23); display.println (floornum); display.drawBitmap (23, 0, uparrow, 40, 18, WHITE); display.drawBitmap (26, 46, downarrow, 40, 18, BRANCO); display.drawBitmap (0, 15, porta aberta, 29, 30, BRANCO); display.drawBitmap (60, 15, closedoor, 29, 30, WHITE); display.display (); }
A função start () é usada para mover o elevador para cima ou para baixo. Para isso, o nº do andar atual é comparado com o nº do andar onde o usuário deseja ir. Se o número do andar for maior que o número do andar atual. então o elevador se moverá para cima e se o número do andar for menor do que o atual no. então o elevador se moverá para baixo. O elevador irá parar quando o atual andar nº. e no andar são os mesmos.
void start () {while (floornum> currentfloor) {Serial.println ("going UP"); currentfloor ++; display.drawBitmap (0, 0, up, 100, 64, WHITE); display.setCursor (101,23); display.println (currentfloor); display.display (); display.clearDisplay (); atraso (2000); } while (floornum <currentfloor) {Serial.println ("going Down"); currentfloor--; display.drawBitmap (0, 0, down, 100, 64, WHITE); display.setCursor (101,23); display.println (currentfloor); display.display (); display.clearDisplay (); atraso (2000); } if (floornum == currentfloor) {Serial.println ("Atingido"); display.clearDisplay (); home1 (); Serial.print (currentfloor); }}
Testando a elevação sem toque controlada por gestos
Assim que o hardware e o código estiverem prontos, conecte o Arduino Nano ao laptop e carregue o código completo fornecido abaixo. Como você pode ver, por padrão, o OLED exibirá a IU do elevador.
Agora acene com a mão para cima ou para baixo, como mostrado no vídeo abaixo, para definir o chão onde você deseja ir. Em seguida, faça o gesto para a esquerda para reconhecer o elevador para ir para aquele andar. Se quiser parar o elevador, faça o gesto certo com a mão.
O vídeo de trabalho completo e o código para este projeto são fornecidos abaixo. Espero que você tenha gostado de construir este projeto. Se você tiver alguma dúvida em relação a este projeto, deixe-as na seção de comentários.