Este protótipo foi desenvolvido com o propósito de propiciar interação com estudantes de disciplinas relacionadas à matemática, notadamente a estatística. Foi denominado Med4Estat, como referência à sua função de realizar medidas lineares ( Med ), com quatro sensores simultâneos, voltados para a estatística.
Baseia-se na plataforma Arduino, neste caso um Arduino Nano, com sensores de distância ultrasom, sensor infra-vermelho, controles remotos, display LCD 16x2, módulo de RTC ( relógio de tempo real), leds ( 4 ), fiação, um Protoboard, e uma caixa de madeira construida para incorporar o proptotipo.
O Med4Estat realiza medidas lineares através de cada um dos sensores, assim que acionados pelo controle remoto, sendo os numeros de 1 a 4 correspondentes a cada sensor. No instante do acionamento, a medida é apresentada no display e ao mesmo tempo é apresentada na tela do micro, conectado através da porta USB, opção Monitor Serial do Arduino.
Com os dados apresentados no monitor, pode-se capturá-los através da opção de selecionar, copiar, colar, levando-se aqueles dados diretamente para outro aplicativo ( Excel, Word, Open Office, etc. ).
Figura 1 - Protótipo para Efetuar Medidas Lineares e disponibilizar em formato para uso no Excel
Figura 2 - Visão de um dos sensores ultra-som ( distância ) com controle remoto de acesso
Figura 4 - Arduino Nano ao fundo, conectado em uma protoboard
Figura 5 - Sensor IR para receber comandos dos controles remotos
Figura 6 - Visão do módulo RTC ( Relógio de Tempo Real )
Figura 7 - Conexão USB para conectar ao micro computador
******************* Codigo Fonte do Protótipo ****************************************
Créditos
para
www.filipeflop.com.br
www.
#include <Time.h>
#include <TimeLib.h>
#include <VirtualWire.h>
#include <stdio.h>
#include <Streaming.h>
#include <Ultrasonic.h> // biblioteca para ultrasom
//Carrega a biblioteca do RTC DS1307
#include <DS3232RTC.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <IRremote.h>
// Pino ligado ao CS do modulo
const int chipSelect = 4;
//Define os pinos para o trigger e echo - para arduino mega comecar com o 22
#define pino_echo1 2 // pino D2
#define pino_trigger1 3
#define pino_echo2 4
#define pino_trigger2 5
#define pino_echo3 6
#define pino_trigger3 7
#define pino_echo4 8
#define pino_trigger4 9
#define pinoled1 14
#define pinoled2 16
#define pinoled3 17
#define pinoled4 15
// controle de DVD programado com codigo 123
#define remoto_1 16728765
#define remoto_2 16761405
#define remoto_3 16773135
#define remoto_4 16742535
#define remoto_5 16767015
#define remoto_6 16726215
#define remoto_7 16718055
#define remoto_8 16754775
#define remoto_9 16738455
#define remoto_0 16771095
#define remoto_play 16757325
#define remoto_ok 16769565
#define remoto_close 16720095
#define PINOTRANSMISSOR 13
#define RECV_PIN 11 // o pino ligado ao sensor infravermelho
#define tempo_max 10
int tempo;
// contadores para led aceso
int led1 = 0;
int led2 = 0;
int led3 = 0;
int led4 = 0;
#define LEDMAX 20000
//Inicializa o sensor nos pinos definidos acima
Ultrasonic ultrasonic1(pino_trigger1, pino_echo1);
Ultrasonic ultrasonic2(pino_trigger2, pino_echo2);
Ultrasonic ultrasonic3(pino_trigger3, pino_echo3);
Ultrasonic ultrasonic4(pino_trigger4, pino_echo4);
// LiquidCrystal_I2C lcd(0x20,2,1,4,5,1,6,7,3, POSITIVE);
LiquidCrystal_I2C lcd(0x27 , 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
time_t t;
tmElements_t tm;
tempo = 0;
Serial.begin(9600);
// codigo utilizado uma vez para atualizar o RTC
// tm.Year = 2016 - 1970;
// tm.Month = 8;
// tm.Day = 10 ;
// tm.Hour = 23 ;
// tm.Minute = 10 ;
// tm.Second = 0 ;
// t = makeTime(tm);
// RTC.set(t);
// setTime(t);
setSyncProvider(RTC.get);
lcd.begin (16, 2);
lcd.setBacklight(HIGH);
lcd.setCursor(0, 0);
lcd.print("1#");
lcd.setCursor(8, 0);
lcd.print("2#");
lcd.setCursor(0, 1);
lcd.print("3#");
lcd.setCursor(8, 1);
lcd.print("4#");
pinMode( RECV_PIN, INPUT );
pinMode(pinoled1, OUTPUT); //Definindo pino A0 como saída.
pinMode(pinoled2, OUTPUT); //Definindo pino A1 como saída.
pinMode(pinoled3, OUTPUT); //Definindo pino A2 como saída.
pinMode(pinoled4, OUTPUT); //Definindo pino A3 como saída.
digitalWrite(pinoled1, HIGH);
digitalWrite(pinoled2, HIGH);
digitalWrite(pinoled3, HIGH);
digitalWrite(pinoled4, HIGH);
t=now();
gravamostra ( remoto_ok, t, (float) RTC.temperature() /4., 0, 0, 0, 0 );
delay (500 );
digitalWrite(pinoled1, LOW);
digitalWrite(pinoled2, LOW);
digitalWrite(pinoled3, LOW);
digitalWrite(pinoled4, LOW);
irrecv.enableIRIn(); // Inicializa o receptor
}
void loop()
{
static time_t tLast;
time_t t;
// variaveis para as informacoes do sensor, em cm e pol
float cmMsec1, inMsec1;
float cmMsec2, inMsec2;
float cmMsec3, inMsec3;
float cmMsec4, inMsec4;
long tecla_ant;
if ( led1 == LEDMAX )
digitalWrite(pinoled1, HIGH);
else if (led1 == 0)
digitalWrite(pinoled1, LOW);
if ( led2 == LEDMAX )
digitalWrite(pinoled2, HIGH);
else if (led2 == 0)
digitalWrite(pinoled2, LOW);
if ( led3 == LEDMAX )
digitalWrite(pinoled3, HIGH);
else if (led3 == 0 )
digitalWrite(pinoled3, LOW);
if ( led4 == LEDMAX )
digitalWrite(pinoled4, HIGH);
else if ( led4 == 0 )
digitalWrite(pinoled4, LOW);
if ( led1 >= 0 )
led1--;
if ( led2 >= 0)
led2--;
if ( led3 >= 0)
led3--;
if ( led4 >= 0)
led4--;
if ( irrecv.decode(&results) )
{
long microsec1 = ultrasonic1.timing();
long microsec2 = ultrasonic2.timing();
long microsec3 = ultrasonic3.timing();
long microsec4 = ultrasonic4.timing();
t = now();
float c = RTC.temperature() / 4.;
if (results.value == remoto_play )
gravamostra ( (long) remoto_ok , (time_t) t, (float) c, (long) microsec1, (long) microsec2, (long) microsec3, (long) microsec4 );
else
gravamostra ( (long) results.value, (time_t) t, (float) c, (long) microsec1, (long) microsec2, (long) microsec3, (long) microsec4 );
irrecv.resume(); // Se prepara para receber o próximo valor
tecla_ant = results.value;
}
else
{
if ( tecla_ant == remoto_play )
{
long microsec1 = ultrasonic1.timing();
long microsec2 = ultrasonic2.timing();
long microsec3 = ultrasonic3.timing();
long microsec4 = ultrasonic4.timing();
t = now();
float c = RTC.temperature() / 4.;
gravamostra ( (long) remoto_ok , (time_t) t, (float) c, (long) microsec1, (long) microsec2, (long) microsec3, (long) microsec4 );
irrecv.resume(); // Se prepara para receber o próximo valor
}
}
}
void gravamostra ( long valor, time_t t, float c, long microsec1, long microsec2, long microsec3, long microsec4 )
{
float cmMsec1;
float cmMsec2;
float cmMsec3;
float cmMsec4;
static char dados[40];
void printDateTime(time_t t);
switch ( valor )
{
case remoto_1 :
limpaimprime();
cmMsec1 = ultrasonic1.convert(microsec1, Ultrasonic::CM);
lcd.setCursor(0, 0);
lcd.print("1# ");
lcd.setCursor(3, 0);
lcd.print( cmMsec1 );
led1 = LEDMAX;
sprintf (dados, "#1; %02d/%02d/%04d;%02d:%02d:%02d;%02d.%02d;graus; %03d.%02d;cm\n", (int)day(t), (int)month(t), (int)year(t), (int)hour(t) ,(int) minute(t), (int)second(t) , (int)c, (int)( c * 100)%100, (int)cmMsec1, (int)(cmMsec1*100)%100);
Serial.print( dados );
break;
case remoto_2 :
limpaimprime();
cmMsec2 = ultrasonic2.convert(microsec2, Ultrasonic::CM);
lcd.setCursor(8, 0);
lcd.print(" 2#");
lcd.setCursor(11, 0);
lcd.print( cmMsec2 );
led2 = LEDMAX;
sprintf (dados, "#2; %02d/%02d/%04d;%02d:%02d:%02d;%02d.%02d;graus; %03d.%02d;cm\n", (int)day(t), (int)month(t), (int)year(t), (int)hour(t) ,(int) minute(t), (int)second(t) , (int)c, (int)( c * 100)%100, (int)cmMsec2, (int)(cmMsec2*100)%100);
Serial.print( dados );
break;
case remoto_3 :
limpaimprime();
cmMsec3 = ultrasonic3.convert(microsec3, Ultrasonic::CM);
lcd.setCursor(0, 1);
lcd.print("3# ");
lcd.setCursor(3, 1);
lcd.print( cmMsec3 );
led3 = LEDMAX;
sprintf (dados, "#3; %02d/%02d/%04d;%02d:%02d:%02d;%02d.%02d;graus; %03d.%02d;cm\n", (int)day(t), (int)month(t), (int)year(t), (int)hour(t) ,(int) minute(t), (int)second(t) , (int)c, (int)( c * 100)%100, (int)cmMsec3, (int)(cmMsec3*100)%100);
Serial.print( dados );
break;
case remoto_4 :
limpaimprime();
cmMsec4 = ultrasonic4.convert(microsec4, Ultrasonic::CM);
lcd.setCursor(8, 1);
lcd.print(" 4#");
lcd.setCursor(11, 1);
lcd.print( cmMsec4 );
led4 = LEDMAX;
sprintf (dados, "#4; %02d/%02d/%04d;%02d:%02d:%02d;%02d.%02d;graus; %03d.%02d;cm\n", (int)day(t), (int)month(t), (int)year(t), (int)hour(t) ,(int) minute(t), (int)second(t) , (int)c, (int)( c * 100)%100, (int)cmMsec4, (int)(cmMsec4*100)%100);
Serial.print( dados );
break;
case remoto_ok :
cmMsec1 = ultrasonic1.convert(microsec1, Ultrasonic::CM);
lcd.setCursor(0, 0);
lcd.print("1# ");
lcd.setCursor(3, 0);
lcd.print( cmMsec1 );
led1 = LEDMAX;
sprintf (dados, "#1; %02d/%02d/%04d;%02d:%02d:%02d;%02d.%02d;graus; %03d.%02d;cm\n", (int)day(t), (int)month(t), (int)year(t), (int)hour(t) ,(int) minute(t), (int)second(t) , (int)c, (int)( c * 100)%100, (int)cmMsec1, (int)(cmMsec1*100)%100);
Serial.print( dados );
cmMsec2 = ultrasonic2.convert(microsec2, Ultrasonic::CM);
lcd.setCursor(8, 0);
lcd.print(" 2#");
lcd.setCursor(11, 0);
lcd.print( cmMsec2 );
led2 = LEDMAX;
sprintf (dados, "#2; %02d/%02d/%04d;%02d:%02d:%02d;%02d.%02d;graus; %03d.%02d;cm\n", (int)day(t), (int)month(t), (int)year(t), (int)hour(t) ,(int) minute(t), (int)second(t) , (int)c, (int)( c * 100)%100, (int)cmMsec2, (int)(cmMsec2*100)%100);
Serial.print( dados );
cmMsec3 = ultrasonic3.convert(microsec3, Ultrasonic::CM);
lcd.setCursor(0, 1);
lcd.print("3# ");
lcd.setCursor(3, 1);
lcd.print( cmMsec3 );
led3 = LEDMAX;
sprintf (dados, "#3; %02d/%02d/%04d;%02d:%02d:%02d;%02d.%02d;graus; %03d.%02d;cm\n", (int)day(t), (int)month(t), (int)year(t), (int)hour(t) ,(int) minute(t), (int)second(t) , (int)c, (int)( c * 100)%100, (int)cmMsec3, (int)(cmMsec3*100)%100);
Serial.print( dados );
cmMsec4 = ultrasonic4.convert(microsec4, Ultrasonic::CM);
lcd.setCursor(8, 1);
lcd.print(" 4#");
lcd.setCursor(11, 1);
lcd.print( cmMsec4 );
led4 = LEDMAX;
sprintf (dados, "#4; %02d/%02d/%04d;%02d:%02d:%02d;%02d.%02d;graus; %03d.%02d;cm\n", (int)day(t), (int)month(t), (int)year(t), (int)hour(t) ,(int) minute(t), (int)second(t) , (int)c, (int)( c * 100)%100, (int)cmMsec4, (int)(cmMsec4*100)%100);
Serial.print( dados );
break;
case remoto_0 :
lcd.clear ();
lcd.setCursor(0,0);
lcd.print("Temp. :");
lcd.setCursor(10,0);
lcd.print ( c );
lcd.setCursor(0,1);
lcd.print ("Horario :");
sprintf (dados, "%02d:%02d", (int)hour(t) ,(int) minute(t), (int)second(t) );
lcd.setCursor (10,1);
lcd.print ( dados );
break;
default :
break;
}
}
//Mostra data e hora na serial
void printDateTime(time_t t)
{
printI00(day(t), 0);
Serial << monthShortStr(month(t)) << _DEC(year(t));
Serial << ' ';
//printTime(t);
printI00(hour(t), ':');
printI00(minute(t), ':');
printI00(second(t), ' ');
}
//Correcao para imprimir "00" ao inves de "0" caso
//o valor seja menor do que 10
void printI00(int val, char delim)
{
if (val < 10) Serial << '0';
Serial << _DEC(val);
if (delim > 0) Serial << delim;
return;
}
void limpaimprime ()
{
lcd.clear ();
lcd.setCursor(0, 0);
lcd.print("1# ");
lcd.setCursor(8, 0);
lcd.print(" 2# ");
lcd.setCursor(0, 1);
lcd.print("3# ");
lcd.setCursor(8, 1);
lcd.print(" 4# ");
}
Nenhum comentário:
Postar um comentário