domingo, 28 de agosto de 2016

Protótipo - Medidas e Estatística ( Med4Estat ) - Apoio ao Ensino e e aprendizado da Estatística - utilizando o Arduino


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 3 - Display 16 x 2 LCD, com placa I2C para simplificar conexão ao Arduino



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