Trena Eletrônica

 

Trena Eletrônica Arduino

 

 

Há alguns dias resolvi trocar o rodapé da minha casa e tive que medir tudo usando uma trena comum, precisando contar com a colaboração de outra pessoa e somando tudo de cabeça. Uma trena digital ajudaria bastante, mas não sei se o preço compensaria. Então resolvi montar uma Trena Digital Arduino, usando um sensor ultrassônico para calcular a distância e um laser para orientar o alvo.

 

 

 

Incluí um botão para somar as medidas e outro botão para escolher considerar a distância a partir do sensor ou considerar a distância incluindo o comprimento total do dispositivo, ideal para medições de parede a parede, além do botão para disparar a medição, obviamente.

O equipamento funciona bem, mas somente ficou pronto depois que o rodapé já tinha sido instalado...

 

Seguem os equipamentos necessários:

 

1 Arduino

1 Sensor Ultrassônico

1 Laser

1 Portenciômetro 200k

3 Botões ou chaves momentâneas

3 resistores de 300^

1 LCD Nokia 5110

 

Esquema:

 

Bibliotecas utilizadas:

 

Ultrasonic.h

Adafruit_GFX.h

Adafruit_PCD8544.h

 

E o código:

 

//////////////////////////////////////////////////////

//      Projeto: Trena Eletrônica        //

//      Autor: Charles    Set/2013      //

/////////////////////////////////////////////////////

 

#include   <Ultrasonic.h>

#include   <Adafruit_GFX.h>

#include   <Adafruit_PCD8544.h>

 

#define   TRIGGER_PIN  A2

#define   ECHO_PIN     A3

 

Ultrasonic   ultrasonic(TRIGGER_PIN, ECHO_PIN);

 

float dist;

float tot;

 

int bot_mede = 8;

int sbot_mede;

int bot_tot = 9;

int sbot_tot;

int bot_modo = 10;

int sbot_modo;

int modo = 1;

int laser = 11;

int pot = A4;

int contraste = 30;

 

// 7-clk 6-Din 5-DC   4-CE 3-Rst 2-Bl

Adafruit_PCD8544   display = Adafruit_PCD8544(7, 6, 5, 4, 3);

 

void setup()

{

pinMode(bot_mede, INPUT);

pinMode(bot_tot, INPUT);

pinMode(bot_modo, INPUT);

pinMode(laser, OUTPUT);

pinMode(pot, INPUT);

 

display.begin();

display.setContrast(30); //Ajusta o contraste do display

display.clearDisplay();

display.setTextColor(BLACK);

display.setTextSize(2); //Seta o tamanho do texto

display.setCursor(12,2);

display.print("TRENA");

display.setTextColor(WHITE, BLACK);

display.setTextSize(1); //Seta o tamanho do texto

display.setCursor(0,20);

display.print(" Digital ");

display.drawRoundRect(0,30,83,18,1, BLACK); //box tot

display.setTextColor(BLACK);

display.setCursor(3,35);

display.print("v a s s i l i");

display.display();

delay(1500);

}

 

void loop()

{

 

contraste = analogRead(pot);

contraste = map(contraste, 0,255,20,53);

display.setContrast(contraste); //Ajusta o contraste do display

tela();

delay(100);

 

sbot_mede = digitalRead(bot_mede);

if (sbot_mede == HIGH)

{

digitalWrite(laser, HIGH);

distancia();

tela();

delay(800);

digitalWrite(laser, LOW);

}

 

sbot_tot = digitalRead(bot_tot);

if (sbot_tot == HIGH)

{

tot = tot + dist;

tela();

delay(400);

}

 

sbot_modo =   digitalRead(bot_modo);

if (sbot_modo == HIGH)

{

modo = -modo;

distancia();

tela();

delay(400);

}

 

void tela()

{

display.clearDisplay();

display.fillRoundRect(0,0,83,18,1, BLACK); //box medida

display.drawRoundRect(0,20,41,28,1, BLACK); //box tot

display.drawRoundRect(43,20,41,28,1, BLACK); //box modo

display.setTextSize(2); //Seta o tamanho do texto

display.setTextColor(WHITE, BLACK);

display.setCursor(2,2);

display.print(dist);

display.setCursor(5,22);

display.setTextColor(BLACK);

display.setTextSize(1); //Seta o tamanho do texto

display.print("Total");

display.setCursor(2,35);

 

if (tot >= 999) {display.print(tot/100); display.print("m");}

 

else display.print(tot);

 

display.drawRect(45,35,15,8,BLACK);

display.fillRect(53,36,5,6,BLACK);

display.drawCircle(48,37,1,BLACK);

display.drawCircle(48,40,1,BLACK);

display.drawLine(61,37,61,40,BLACK);

display.drawLine(63,37,63,40,BLACK);

display.drawLine(65,37,65,40,BLACK);

 

if (modo == 1) display.fillRect(59,25,20,4,BLACK); //modo1

if (modo == -1) display.fillRect(45,25,35,4,BLACK); //modo2

 

display.display();

}

 

void distancia()

{

long microsec = ultrasonic.timing(); //distância

dist =   ultrasonic.convert(microsec, Ultrasonic::CM);   //converte para cm

if (modo == -1) dist = dist + 13; // adicionar o tamanho do dispositivo

}

 

Observações:

  1. Sinceramente não consegui resolver o problema com o contraste do LCD Nokia 5110 usando a biblioteca Adafruit, então a solução foi colocar o potenciômetro para ajuste manual.
  2. Segundo do datasheet, o sensor ultrassônico tem um alcance de até 4,5 m e precisão de 2mm, mas para isso, o sensor precisa ficar bem imóvel.
  3. No meu exemplo eu incluí uma bateria de 9v, mas para não comprometer os componentes, sobretudo o sensor ultrassônico, que trabalha a 5V, achei melhor colocar um controlador de tensão L7805, que reduz a tensão para 5V, através do seguinte esquema:  L7805.png
  4. Incluí também uma chave liga/desliga, onde o negativo da bateria foi conectado no GND
    do Arduino e o positivo em um dos polos da chave e o outro polo da chave na
    entrada 5V do Arduino.
  5. Outro desafio foi alinhar o laser com o sensor ultrassônico, mas com um pouco de paciência dá para conseguir um acerto satisfatório.

 

Boas medições!

Charles

 

 

 


13/10/2014 - 20h
Pessoal,

Muitas pessoas estão reclamando que não estão conseguindo replicar o projeto da trena. Então montei um arquivo compactado com o sketch e as bibliotecas utilizadas. Vamos ver se funciona assim, segue link abaixo:

trena.zip

Load Previous Comments
  • cassio teles

    amigo quanto voce gastou

  • Marcelo selestino

    Bom dia amigo queria informação sobre o funcionamento laser qual sua real utilidade? E também queria saber onde encontro aquele tipo de laser?

  • Denis

    Eu ainda não entendi a utilidade do laser se tem o sensor ultrassonico