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:
19 Comentários
Alisson
Muito obg e parabéns simples mas muito bem pensado! E obg por compartilhar ótimo pra quem está aprendendo! Como eu;)
marlonnardi
Obrigado Alisson!
Antônio ewerton
Professor o senhor sempre me supreedendo… parabéns
Djalma
Ótimo projeto ainda não vi nem um automático sempre vejo de pisar no pedal pra dispeçar o álcool, essa projeto é muito bom é so incrementar uma carenagem pra proteger e pronto.👍
Parabéns professor.
marlonnardi
Obrigado Djalma!
marlonnardi
Bora comentar ai galera!
Antonio Sette Filho
Bom dia Professor! ja comprei os mateirias, assim que colocar em funcionamento mando fotos para seu arquivo. muito obrigado!
Carlos Leonardo de Alcântara Almeida
Boa noite Professor. O senhor poderia me enviar o código para mim por e-mail?
Copiando e colando está dando erro.
Obrigado
marlonnardi
O código está correto Carlos, verifique se você instalou todas as bibliotecas.
Munxone Manuel
Olá bom dia, sou ou Munxone, e falo a partir de Angola Província de Luanda, estou há poucos dias a ver os teus vídeos e gostei muito do que vi, e eu gostaria muito de participar nesta conferência que será dia 5 de novembro. Agora eu não sei se fosse participar do curso mesmo estando aqui em Angola?
marlonnardi
Olá Munxone, creio que a hortmart, que é por onde entregamos o curso, aceita vendas para o seu País. Por enquanto o Curso está em português e será um prazer recebe-lo.
Munxone Manuel
Olá, daqui fala o Munxone Manuel, falo apartir de Angola província de Luanda(África), gostei muito deste vídeo, e vou procurar fazer. E eu gostaria muito de poder participar da conferência que será no dia 5 de novembro, para aprender a fazer a minha própria programação sem copiar de outros.
marlonnardi
Olá Munxone, creio que a hortmart, que é por onde entregamos o curso, aceita vendas para o seu País. Por enquanto o Curso está em português e será um prazer recebe-lo.
Jackson Cristiano Ferreira
Posso estar usando o outro Arduino convencional.
Ou tem q ser o nano
marlonnardi
Pode usar qualquer outro
Wolney Fernando Zini
Ótimo, funcionou perfeitamente, projeto super bem explicado estou aprendendo muito, eu também tenho um módulo infravermelho, como eu poderia fazer pra funcionar com o módulo infravermelho?
DINOZOR A DA SILVA
Marlon, parabéns pelo projeto. Entretanto seria possível editar uma versão que ao invés de variar o curso do servo para dosar, variar o numero de acionamentos mediante os cliques no botão.?
Digo isso pq pretendo usar com outra aplicação que preciso que seja aplicado “n” vezes digamos de 1 a 5.
Se puder gerar um novo codigo..agradeço.
Jackson Barros
Boa Tarde professor!!
Professor posso usar esse mesmo código em um arduino uno, estou iniciando agora com no mundo do arduino.
Jackson Barros
Boa Tarde professor!!
Professor posso usar esse mesmo código em um Arduíno uno?
Estou iniciando agora com no mundo do Arduíno.