
Dispenser automático de álcool em gel com Arduino
É 2020, e estamos enfrentando um momento difícil devido a um certo vírus que está se propagando. Diante dessa situação, comecei a perceber que assim como a procura por álcool em gel, a procura por dispensers automáticos para eles também aumentou.
Como não estudei virologia a fundo, não posso afirmar que o dispenser automático é realmente mais eficaz que o manual (eu discuto melhor sobre isso no vídeo que está ao final do artigo) . Porém, essa não é a questão principal aqui, mas sim como podemos construir um sistema automático de álcool em gel utilizando Arduino! É esse tipo de coisa que um projetista fora do comum tem que ser capaz de fazer: automatizar tudo o que quiser! E pra isso, ele sempre deve adquirir conhecimento para treinar o seu cérebro a enxergar o mundo sobre a ótica da automação!
A construção do dispenser
Pensando em deixar a construção simples para que todo mundo possa fazer sem muito esforço, resolvi utilizar um dispenser manual de álcool e fazer com que um servo motor acione a válvula. O servo motor será acionado quando a presença da mão for detectada por um sensor ultrassônico. Para colocar tudo no lugar, vamos precisar cortar alguns pedaços de madeira, e aqui estão as medidas:

Essas madeiras eu peguei de um resto de construção aqui na frente da minha casa, e você pode fazer o mesmo. Para realizar a montagem, basta ver o vídeo no final do artigo. O resultado final é assim:

Perceba que, colocando o servo motor nessa posição, ele conseguirá acionar o botão do álcool, e o sensor ultrassônico poderá detectar facilmente a mão que se aproximar.
O circuito eletrônico
Para controlar todo o sistema, vou utilizar um Arduino Nano, que é compacto e já possui um conversor USB serial que permite programá-lo diretamente pela USB.
O circuito abaixo funciona da seguinte maneira: quando o sensor ultrassônico detecta uma distância menor que 10cm, ele aciona o servo motor para bombear o álcool em gel, de acordo com o nível selecionado pelo botão. Existem 3 ajustes possíveis: mínimo, médio e máximo. Esses níveis são selecionados através de cliques no botão, que informará através de piscadas do LED qual nível o usuário selecionou. Uma piscada: nível mínimo; Duas piscadas: nível médio, Três piscadas: nível máximo. O LED também acende quando a mão é detectada, e apaga quando termina de bombear o álcool. Mesmo que o usuário permaneça com a mão em baixo do sensor ele só irá ser servido uma única vez.
Para montar o circuito eu utilizei:
- 1 – Arduino NANO
- 1 – Sensor ultrassônico HCSR04;
- 1 – Servo motor MG995;
- 1 – Push button do tipo arranha;
- 1 – Capacitor cerâmico de 100nF;
- 1 – LED auto brilho 5mm azul;
- 1 – Resistor de 220R / 1/4W;
- 1 – Fonte 5VDCx2A

O código pra ser carregado no Arduino
A única biblioteca que você irá instalar na sua IDE para compilar esse código é a ultrasonic, que você pode baixar clicando aqui.
Para instalar esse biblioteca, basta clicar em:
Sketch > Incluir Biblioteca > Adicionar biblioteca.zip > Selecione o Arquivo .zip que você baixou
Pronto, agora basta copiar e copiar e colar o código abaixo e carregar para seu Arduino:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
/* Autor: Marlon Nardi Walendorff Data: 04/10/2020 Projeto: Dispenser automático de álcool em gel com Arduino */ //==== Inclusão de bibliotecas ====// #include "Ultrasonic.h" #include <Servo.h> //==== Mapemamento de Hardware=====// #define pinButton 3 #define pinEcho 4 #define pinTrigger 5 #define pinServo 6 #define pinLED 7 //Instanciando objetos Servo servo; Ultrasonic ultrasonic(pinTrigger, pinEcho); //===== Variáveis globais ========// boolean aux1 = 0; volatile uint16_t aux2 = 0; volatile byte cicles; volatile byte i; //==== Protótipo das funções ====// uint16_t readSensorandCompare(); void alcoolTrigger(byte maxAgle, byte minAngle); void interface(); void setup() { Serial.begin(9600); servo.attach(pinServo); servo.write(100);//Posição inicial do Servo de 100° //Entradas/Saídas digitais pinMode(pinLED, OUTPUT); pinMode(pinButton, INPUT_PULLUP); //=========== Inicial interrupção externa no pino 3 e chama a função ISR0 =========// attachInterrupt(digitalPinToInterrupt(pinButton), ISR0, FALLING); }//endsetup //Interrupt Service Rotine ISR void ISR0() { aux2++; if ( aux2 > 2)aux2 = 0; if (aux2 == 0)cicles = 1; if (aux2 == 1)cicles = 2; if (aux2 == 2)cicles = 3; i = 0; }//endISR void loop() { readSensorandCompare(); interface(); delay(300); // Evita mais de um disparo por vez pois limita as leituras do sensor ultrassônico }//endloop //== Função que obtem a distância do sensor ultrassônico e compara valores para chamar outras funções ==// uint16_t readSensorandCompare() { uint16_t distanceCM = ultrasonic.convert(ultrasonic.timing(), Ultrasonic::CM); Serial.print("aux2: "); Serial.print(aux2); Serial.print(" Cicles: "); Serial.print(cicles); Serial.print(" distanceCM: "); Serial.println(distanceCM); //Se mínimo está selecionado if (distanceCM < 10 && aux1 == 0 && aux2 == 0) { alcoolTrigger(100, 80); } //Se médio está selecionado if (distanceCM < 10 && aux1 == 0 && aux2 == 1) { alcoolTrigger(100, 70); } //Se máximo está selecionado if (distanceCM < 10 && aux1 == 0 && aux2 == 2) { alcoolTrigger(100, 60); } //Permite o servo motor atuar de novo somente quando tirar a mão da frente do sensor if (distanceCM > 16 ) { aux1 = 0; } return distanceCM; } //== Função aciona o servo motor de acordo com o angulo fornecido, também aciona o LED ==// void alcoolTrigger(byte maxAgle, byte minAngle) { digitalWrite(pinLED, HIGH); servo.write(maxAgle); delay(300); servo.write(minAngle); delay(300); servo.write(maxAgle); digitalWrite(pinLED, LOW); aux1 = 1; } //==== Função que pisca o LED de acordo com a configuração feita pelo usuário: minimo, médio, máximo ====// void interface() { if ( i < cicles) { digitalWrite(pinLED, HIGH); delay(200); digitalWrite(pinLED, LOW); delay(100); i++; } } |
Vídeo com detalhes da montagem e explicação do código:

