segunda-feira, 29 de agosto de 2016

Protótipo MedEstatOne - utilizando o Arduino, realiza medidas de Temperatura, Humidade e pequenas Distâncias Lineares

Este protótipo é uma variação do Med4Estat,  adaptado para um custo menor e novas funcionalidades. Foi desenvolvido com o propósito de propiciar interação com estudantes de disciplinas relacionadas à matemática, notadamente a estatística. Foi denominado MedEstatOne, como referência à sua função de realizar medidas lineares ( Med ), com apenas um sensor ultra-som, voltados para a estatística.

Baseia-se na plataforma Arduino, neste caso um Arduino Nano, com sensor de distância ultrasom, sensor de humidade e temperatura, display 7 segmentos, módulo de RTC ( relógio de tempo real), leds ( 4 ), fiação, um Protoboard.

O MedEstatOne realiza medidas de Humidade e Temperatura com um sensor, e distâncias lineares através de um sensor ultra-som, acionado pela proximidade. 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 - visão geral - Protótipo MedEstatOne


Figura 2 - visão sensor ultra-som - Protótipo MedEstatOne


Figura 3 - visão modulo RTC e sensor Humidade e Temperatura - Protótipo MedEstatOne



Figura 4 - visão placa Arduino Nano - Protótipo MedEstatOne


Figura 5 - visão modulo semáforo - Protótipo MedEstatOne



Figura 6 - visão display sete segmentos - Protótipo MedEstatOne







//****************************************************************************
// Prototipo MedEstatOne - Autor: Arnott Ramos Caiado
//
// utilização de dicas, orientações e bibliotecas - www.filipeflop.com.br
//****************************************************************************

#include <stdio.h>
#include "DHT.h"

#include <DS3232RTC.h>
#include <Streaming.h>
#include <Time.h>

#include <Ultrasonic.h> // biblioteca do sensor ultrasonico
#include <IRremote.h>
#include <TM1637Display.h>

#include <SD.h>

// Sd2Card sDcard;

#define pinoled1 6
#define pinoled2 3
#define pinoled3 5
#define pinoled4 2
#define pinoled5 4

#define DISTMIN 5
#define DIST2   70
#define DIST3   150


//Define os pinos para o trigger e echo - para arduino mega comecar com o 22
#define pino_echo1     7
#define pino_trigger1  8

#define DHTPIN A1 // pino analogico 1 p sensor temperatura
#define DHTTYPE DHT11 // DHT 11

#define Display_CLK 14 // pinos para display 7 segmentos
#define Display_DIO 9

DHT dht(DHTPIN, DHTTYPE);

int8_t TimeDisp[] = {0x00, 0x00, 0x00, 0x00}; // Define a forma como serão mostrados os numeros no 7seg


TM1637Display display(Display_CLK, Display_DIO);

float cmMsec1 = 0;
float inMsec1 = 0;
float anterior = 0;

int RECV_PIN = 12; // o pino ligado ao sensor infravermelho

//IRrecv irrecv(RECV_PIN);

decode_results results;

File dataFile;
Ultrasonic ultrasonic1(pino_trigger1, pino_echo1);


void setup() {
  time_t t;
  tmElements_t tm;

  tm.Year = 2016 - 1970;
  tm.Month = 8;
  tm.Day = 24 ;
  tm.Hour = 14 ;
  tm.Minute = 46 ;
  tm.Second = 0 ;
 //  t = makeTime(tm);
 //  RTC.set(t);
 //  setTime(t);

  Serial.begin(9600);
  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.
  pinMode(pinoled5, OUTPUT);    //Definindo pino A3 como saída.

  //  irrecv.enableIRIn(); // Inicializa o receptor

  dht.begin();

  digitalWrite(pinoled1, HIGH);
  delay(300);

  digitalWrite(pinoled2, HIGH);
  delay(300);

  digitalWrite(pinoled3, HIGH);
  delay(300);

  digitalWrite(pinoled4, HIGH);
  delay(300);

  digitalWrite(pinoled5, HIGH);
  delay(300);

  delay (500);

  digitalWrite(pinoled5, LOW);
  delay(300);

  digitalWrite(pinoled4, LOW);
  delay(300);

  digitalWrite(pinoled3, LOW);
  delay(300);

  digitalWrite(pinoled2, LOW);
  delay(300);

  digitalWrite(pinoled1, LOW);
  delay(300);


  display.setBrightness(0xF);

  //Sincroniza a biblioteca Time com o RTC a cada 5 minutos
  setSyncProvider(RTC.get);

  if ( timeStatus() != timeSet)
    Serial << F(" Falha!");
  Serial << endl;

  // iniciasd();
}

void loop() {
  // put your main code here, to run repeatedly:
  char dados[50];
  int codigolido;
  int numero;
  static time_t tLast;
  time_t tempo, tempo_anterior;
  float c, medida, h, t;
  tmElements_t tm;


  long microsec1 = ultrasonic1.timing();
  cmMsec1 = ultrasonic1.convert(microsec1, Ultrasonic::CM);

  // if ( irrecv.decode(&results) )
  //    Serial.println ( results.value  );
  // Serial.println ( cmMsec1 );
  if ( ((anterior - cmMsec1) * ( anterior - cmMsec1 )) > 2 && (cmMsec1 < (float) 250))
  {
    // A leitura da temperatura e umidade pode levar 250ms!
    // O atraso do sensor pode chegar a 2 segundos.
    h = dht.readHumidity(); // teste - umidade como o inverso
    t = dht.readTemperature();
    // testa se retorno é valido, caso contrário algo está errado.
    if ( isnan(t) || isnan(h) )
    {
      Serial.println("Falha leitura de temperatura ou umidade do DHT");
    }

    tempo = now();
    c = RTC.temperature() / 4.;
    printDateTime(tempo);
    sprintf( dados,  " Umid: %02d.%02d : Temp S1: %02d.%02d *C : Temp S2: %02d.%02d : Dist:%03d.%02d \n", (int) h, (int) ( h * 100) % 100,  (int) t, (int) (t * 100) % 100, (int) c, (int) (c * 100) % 100 , (int)cmMsec1, (int)(cmMsec1 * 100) % 100 );
    Serial.print (dados);
    
 //   dataFile.print (dados);
//    dataFile.close();
    // Abre o arquivo
//    dataFile = SD.open("dados.txt", FILE_WRITE) ;
//    if ( !dataFile )
//      Serial.print( "Erro na abertura do arquivo");

    
    medida = cmMsec1 * 10;
    numero = (int) medida ;
    display.showNumberDec(numero, true);
  }

  anterior = cmMsec1 ;

  if ( cmMsec1 < DISTMIN )
  {
    digitalWrite(pinoled1, HIGH);
    digitalWrite(pinoled2, HIGH);
    c = RTC.temperature() / 4.;
    display.showNumberDec(c, true);
    delay(600);
    display.showNumberDec(h, true);
    delay(600);


  }
  else
  {
    digitalWrite(pinoled1, LOW );
    digitalWrite(pinoled2, LOW );
  }
  if ( cmMsec1 < DIST2 )
  {
    digitalWrite(pinoled3, HIGH);
    digitalWrite(pinoled4, HIGH);
  }
  else
  {
    digitalWrite(pinoled3, LOW );
    digitalWrite(pinoled4, LOW );
  }
  if ( cmMsec1 < DIST3 )
  {
    digitalWrite(pinoled5, HIGH);
  }
  else
  {
    digitalWrite(pinoled5, LOW );
    tempo = now();
    acendeponto( (int) tempo);
    mostratempo(tempo);
    //         acendeponto( (int) tempo);
    delay(600);
  }
}


//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 acendeponto( int numero)
{
  uint8_t segto;

  // Acende o ':' do display
  segto = 0x80 | display.encodeDigit ((numero / 100) % 10);
  display.setSegments (&segto, 1, 1);
}

void mostratempo( time_t t )
{
  int numero;
  numero = hour (t) * 100 + minute (t);
  display.showNumberDec(numero, true);
  acendeponto ( numero );

}

// Inicializa cartao Sd
  // pinMode ( 10, OUTPUT );

void iniciasd ()
{  
  if ( SD.begin( 10 ) )
  {
    // Abre o arquivo
    dataFile = SD.open("dados.txt", FILE_WRITE) ;
    if ( !dataFile )
      Serial.print( "Erro na abertura do arquivo");

  }
  else
    Serial.print ( "Erro no cartao Sd ");
    
}

Prototipo Joaninha - pequeno robot didatico

Protótipo - Joaninha - Pequeno Robot para uso didático - Explorando recursos do Arduino

Trata-se de um primeiro protótipo para explorar recursos gerais do Arduino relacionados à robotica. O tema é de grande interesse para a área de ensino, uma vez que desperta nos alunos a vontade de buscar os conhecimentos complementares necessários relacionados à Física, Matemática, Eletricidade, Mecânica, dentre outros, a fim de resolver os desafios que surgem.

Este protótipo é simples, com dois motores para movimento das rodas, um Arduino Mega, um módulo bluetooth para comunicação com Smartphones, além de alguns mecanismos mecanicos, uma caixa adaptada de porta sacos de lixo, um módulo para controle de motores.


Figura 1 - Projeto Joaninha


Figura 2 - Projeto Joaninha com proteção


Figura 3 - Projeto Joaninha - detalhe da frente - sensor e display



********************************************************************
Fonte do Programa
Autor: Arnott Ramos Caiado

bibliotecas e informações de base obtidas em
www.filipeflop.com.br


********************************************************************


#include <LedControl.h>
#include <AFMotor.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

//Carrega a biblioteca do sensor ultrassonico
#include <Ultrasonic.h>
#include <Servo.h>

//Define os pinos para o trigger e echo
#define pino_trigger 22
#define pino_echo 24

//Inicializa o sensor nos pinos definidos acima
Ultrasonic ultrasonic(pino_trigger, pino_echo);
const int buzzer = 26;

#define DIST_MINIMA 15
const int RECV_PIN = 15;
const int TKD2 = 2;

// Define o motor1 ligado a conexao 1
AF_DCMotor motor1(1);
// Define o motor2 ligado a conexao 2
AF_DCMotor motor2(2);

int CS =16;


// alfabeto com simbolos
const byte IMAGES[][8] = {
{
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B00000000
},{
  B00000000,
  B00111110,
  B01000001,
  B01010101,
  B01000001,
  B01010101,
  B01001001,
  B00111110
},{
  B00000000,
  B00111110,
  B01111111,
  B01101011,
  B01111111,
  B01101011,
  B01110111,
  B00111110
},{
  B00000000,
  B00100010,
  B01110111,
  B01111111,
  B01111111,
  B00111110,
  B00011100,
  B00001000
},{
  B00000000,
  B00001000,
  B00011100,
  B00111110,
  B01111111,
  B00111110,
  B00011100,
  B00001000
},{
  B00000000,
  B00001000,
  B00011100,
  B00101010,
  B01111111,
  B00101010,
  B00001000,
  B00011100
},{
  B00000000,
  B00001000,
  B00011100,
  B00111110,
  B01111111,
  B00111110,
  B00001000,
  B00011100
},{
  B00000000,
  B00000000,
  B00011100,
  B00111110,
  B00111110,
  B00111110,
  B00011100,
  B00000000
},{
  B11111111,
  B11111111,
  B11100011,
  B11000001,
  B11000001,
  B11000001,
  B11100011,
  B11111111
},{
  B00000000,
  B00000000,
  B00011100,
  B00100010,
  B00100010,
  B00100010,
  B00011100,
  B00000000
},{
  B11111111,
  B11111111,
  B11100011,
  B11011101,
  B11011101,
  B11011101,
  B11100011,
  B11111111
},{
  B00000000,
  B00001111,
  B00000011,
  B00000101,
  B00111001,
  B01001000,
  B01001000,
  B00110000
},{
  B00000000,
  B00001000,
  B00111110,
  B00001000,
  B00011100,
  B00100010,
  B00100010,
  B00011100
},{
  B00000000,
  B00011000,
  B00010100,
  B00010000,
  B00010000,
  B00110000,
  B01110000,
  B01100000
},{
  B00000000,
  B00001111,
  B00011001,
  B00010001,
  B00010011,
  B00110111,
  B01110110,
  B01100000
},{
  B00000000,
  B00001000,
  B00101010,
  B00011100,
  B01110111,
  B00011100,
  B00101010,
  B00001000
},{
  B00000000,
  B01100000,
  B01111000,
  B01111110,
  B01111111,
  B01111110,
  B01111000,
  B01100000
},{
  B00000000,
  B00000011,
  B00001111,
  B00111111,
  B01111111,
  B00111111,
  B00001111,
  B00000011
},{
  B00000000,
  B00001000,
  B00011100,
  B00101010,
  B00001000,
  B00101010,
  B00011100,
  B00001000
},{
  B00000000,
  B01100110,
  B01100110,
  B01100110,
  B01100110,
  B00000000,
  B01100110,
  B01100110
},{
  B00000000,
  B00111111,
  B01100101,
  B01100101,
  B00111101,
  B00000101,
  B00000101,
  B00000101
},{
  B00000000,
  B00001100,
  B00110010,
  B01001000,
  B00100100,
  B00010010,
  B01001100,
  B00110000
},{
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B01111111,
  B01111111,
  B01111111
},{
  B00000000,
  B00001000,
  B00011100,
  B00101010,
  B00001000,
  B00101010,
  B00011100,
  B00111110
},{
  B00000000,
  B00001000,
  B00011100,
  B00111110,
  B01111111,
  B00011100,
  B00011100,
  B00011100
},{
  B00000000,
  B00011100,
  B00011100,
  B00011100,
  B01111111,
  B00111110,
  B00011100,
  B00001000
},{
  B00000000,
  B00001000,
  B00001100,
  B01111110,
  B01111111,
  B01111110,
  B00001100,
  B00001000
},{
  B00000000,
  B00001000,
  B00011000,
  B00111111,
  B01111111,
  B00111111,
  B00011000,
  B00001000
},{
  B00000000,
  B00000000,
  B00000000,
  B01110000,
  B01110000,
  B01110000,
  B01111111,
  B01111111
},{
  B00000000,
  B00000000,
  B00010100,
  B00100010,
  B01111111,
  B00100010,
  B00010100,
  B00000000
},{
  B00000000,
  B00001000,
  B00011100,
  B00011100,
  B00111110,
  B00111110,
  B01111111,
  B01111111
},{
  B00000000,
  B01111111,
  B01111111,
  B00111110,
  B00111110,
  B00011100,
  B00011100,
  B00001000
},{
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B00000000
},{
  B00000000,
  B00011000,
  B00111100,
  B00111100,
  B00011000,
  B00011000,
  B00000000,
  B00011000
},{
  B00000000,
  B00110110,
  B00110110,
  B00010100,
  B00000000,
  B00000000,
  B00000000,
  B00000000
},{
  B00000000,
  B00110110,
  B00110110,
  B01111111,
  B00110110,
  B01111111,
  B00110110,
  B00110110
},{
  B00000000,
  B00001000,
  B00011110,
  B00100000,
  B00011100,
  B00000010,
  B00111100,
  B00001000
},{
  B00000000,
  B01100000,
  B01100110,
  B00001100,
  B00011000,
  B00110000,
  B01100110,
  B00000110
},{
  B00000000,
  B00111100,
  B01100110,
  B00111100,
  B00101000,
  B01100101,
  B01100110,
  B00111111
},{
  B00000000,
  B00011000,
  B00011000,
  B00011000,
  B00110000,
  B00000000,
  B00000000,
  B00000000
},{
  B00000000,
  B01100000,
  B00110000,
  B00011000,
  B00011000,
  B00011000,
  B00110000,
  B01100000
},{
  B00000000,
  B00000110,
  B00001100,
  B00011000,
  B00011000,
  B00011000,
  B00001100,
  B00000110
},{
  B00000000,
  B00000000,
  B00110110,
  B00011100,
  B01111111,
  B00011100,
  B00110110,
  B00000000
},{
  B00000000,
  B00000000,
  B00001000,
  B00001000,
  B00111110,
  B00001000,
  B00001000,
  B00000000
},{
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B00110000,
  B00110000,
  B00110000,
  B01100000
},{
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B00111100,
  B00000000,
  B00000000,
  B00000000
},{
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B01100000,
  B01100000
},{
  B00000000,
  B00000000,
  B00000110,
  B00001100,
  B00011000,
  B00110000,
  B01100000,
  B00000000
},{
  B00000000,
  B00111100,
  B01100110,
  B01101110,
  B01110110,
  B01100110,
  B01100110,
  B00111100
},{
  B00000000,
  B00011000,
  B00011000,
  B00111000,
  B00011000,
  B00011000,
  B00011000,
  B01111110
},{
  B00000000,
  B00111100,
  B01100110,
  B00000110,
  B00001100,
  B00110000,
  B01100000,
  B01111110
},{
  B00000000,
  B00111100,
  B01100110,
  B00000110,
  B00011100,
  B00000110,
  B01100110,
  B00111100
},{
  B00000000,
  B00001100,
  B00011100,
  B00101100,
  B01001100,
  B01111110,
  B00001100,
  B00001100
},{
  B00000000,
  B01111110,
  B01100000,
  B01111100,
  B00000110,
  B00000110,
  B01100110,
  B00111100
},{
  B00000000,
  B00111100,
  B01100110,
  B01100000,
  B01111100,
  B01100110,
  B01100110,
  B00111100
},{
  B00000000,
  B01111110,
  B01100110,
  B00001100,
  B00001100,
  B00011000,
  B00011000,
  B00011000
},{
  B00000000,
  B00111100,
  B01100110,
  B01100110,
  B00111100,
  B01100110,
  B01100110,
  B00111100
},{
  B00000000,
  B00111100,
  B01100110,
  B01100110,
  B00111110,
  B00000110,
  B01100110,
  B00111100
},{
  B00000000,
  B00000000,
  B00011000,
  B00011000,
  B00000000,
  B00011000,
  B00011000,
  B00000000
},{
  B00000000,
  B00000000,
  B00011000,
  B00011000,
  B00000000,
  B00011000,
  B00011000,
  B00110000
},{
  B00000000,
  B00000110,
  B00001100,
  B00011000,
  B00110000,
  B00011000,
  B00001100,
  B00000110
},{
  B00000000,
  B00000000,
  B00000000,
  B00111100,
  B00000000,
  B00111100,
  B00000000,
  B00000000
},{
  B00000000,
  B01100000,
  B00110000,
  B00011000,
  B00001100,
  B00011000,
  B00110000,
  B01100000
},{
  B00000000,
  B00111100,
  B01100110,
  B00000110,
  B00011100,
  B00011000,
  B00000000,
  B00011000
},{
  B00000000,
  B00111000,
  B01000100,
  B01011100,
  B01011000,
  B01000010,
  B00111100,
  B00000000
},{
  B00000000,
  B00111100,
  B01100110,
  B01100110,
  B01111110,
  B01100110,
  B01100110,
  B01100110
},{
  B00000000,
  B01111100,
  B01100110,
  B01100110,
  B01111100,
  B01100110,
  B01100110,
  B01111100
},{
  B00000000,
  B00111100,
  B01100110,
  B01100000,
  B01100000,
  B01100000,
  B01100110,
  B00111100
},{
  B00000000,
  B01111100,
  B01100110,
  B01100110,
  B01100110,
  B01100110,
  B01100110,
  B01111100
},{
  B00000000,
  B01111110,
  B01100000,
  B01100000,
  B01111100,
  B01100000,
  B01100000,
  B01111110
},{
  B00000000,
  B01111110,
  B01100000,
  B01100000,
  B01111100,
  B01100000,
  B01100000,
  B01100000
},{
  B00000000,
  B00111100,
  B01100110,
  B01100000,
  B01100000,
  B01101110,
  B01100110,
  B00111100
},{
  B00000000,
  B01100110,
  B01100110,
  B01100110,
  B01111110,
  B01100110,
  B01100110,
  B01100110
},{
  B00000000,
  B00111100,
  B00011000,
  B00011000,
  B00011000,
  B00011000,
  B00011000,
  B00111100
},{
  B00000000,
  B00011110,
  B00001100,
  B00001100,
  B00001100,
  B01101100,
  B01101100,
  B00111000
},{
  B00000000,
  B01100110,
  B01101100,
  B01111000,
  B01110000,
  B01111000,
  B01101100,
  B01100110
},{
  B00000000,
  B01100000,
  B01100000,
  B01100000,
  B01100000,
  B01100000,
  B01100000,
  B01111110
},{
  B00000000,
  B01100011,
  B01110111,
  B01111111,
  B01101011,
  B01100011,
  B01100011,
  B01100011
},{
  B00000000,
  B01100011,
  B01110011,
  B01111011,
  B01101111,
  B01100111,
  B01100011,
  B01100011
},{
  B00000000,
  B00111100,
  B01100110,
  B01100110,
  B01100110,
  B01100110,
  B01100110,
  B00111100
},{
  B00000000,
  B01111100,
  B01100110,
  B01100110,
  B01100110,
  B01111100,
  B01100000,
  B01100000
},{
  B00000000,
  B00111100,
  B01100110,
  B01100110,
  B01100110,
  B01101110,
  B00111100,
  B00000110
},{
  B00000000,
  B01111100,
  B01100110,
  B01100110,
  B01111100,
  B01111000,
  B01101100,
  B01100110
},{
  B00000000,
  B00111100,
  B01100110,
  B01100000,
  B00111100,
  B00000110,
  B01100110,
  B00111100
},{
  B00000000,
  B01111110,
  B01011010,
  B00011000,
  B00011000,
  B00011000,
  B00011000,
  B00011000
},{
  B00000000,
  B01100110,
  B01100110,
  B01100110,
  B01100110,
  B01100110,
  B01100110,
  B00111110
},{
  B00000000,
  B01100110,
  B01100110,
  B01100110,
  B01100110,
  B01100110,
  B00111100,
  B00011000
},{
  B00000000,
  B01100011,
  B01100011,
  B01100011,
  B01101011,
  B01111111,
  B01110111,
  B01100011
},{
  B00000000,
  B01100011,
  B01100011,
  B00110110,
  B00011100,
  B00110110,
  B01100011,
  B01100011
},{
  B00000000,
  B01100110,
  B01100110,
  B01100110,
  B00111100,
  B00011000,
  B00011000,
  B00011000
},{
  B00000000,
  B01111110,
  B00000110,
  B00001100,
  B00011000,
  B00110000,
  B01100000,
  B01111110
},{
  B00000000,
  B00011110,
  B00011000,
  B00011000,
  B00011000,
  B00011000,
  B00011000,
  B00011110
},{
  B00000000,
  B00000000,
  B01100000,
  B00110000,
  B00011000,
  B00001100,
  B00000110,
  B00000000
},{
  B00000000,
  B01111000,
  B00011000,
  B00011000,
  B00011000,
  B00011000,
  B00011000,
  B01111000
},{
  B00000000,
  B00001000,
  B00010100,
  B00100010,
  B01000001,
  B00000000,
  B00000000,
  B00000000
},{
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B01111111
},{
  B00000000,
  B00001100,
  B00001100,
  B00000110,
  B00000000,
  B00000000,
  B00000000,
  B00000000
},{
  B00000000,
  B00000000,
  B00000000,
  B00111100,
  B00000110,
  B00111110,
  B01100110,
  B00111110
},{
  B00000000,
  B01100000,
  B01100000,
  B01100000,
  B01111100,
  B01100110,
  B01100110,
  B01111100
},{
  B00000000,
  B00000000,
  B00000000,
  B00111100,
  B01100110,
  B01100000,
  B01100110,
  B00111100
},{
  B00000000,
  B00000110,
  B00000110,
  B00000110,
  B00111110,
  B01100110,
  B01100110,
  B00111110
},{
  B00000000,
  B00000000,
  B00000000,
  B00111100,
  B01100110,
  B01111110,
  B01100000,
  B00111100
},{
  B00000000,
  B00011100,
  B00110110,
  B00110000,
  B00110000,
  B01111100,
  B00110000,
  B00110000
},{
  B00000000,
  B00000000,
  B00111110,
  B01100110,
  B01100110,
  B00111110,
  B00000110,
  B00111100
},{
  B00000000,
  B01100000,
  B01100000,
  B01100000,
  B01111100,
  B01100110,
  B01100110,
  B01100110
},{
  B00000000,
  B00000000,
  B00011000,
  B00000000,
  B00011000,
  B00011000,
  B00011000,
  B00111100
},{
  B00000000,
  B00001100,
  B00000000,
  B00001100,
  B00001100,
  B01101100,
  B01101100,
  B00111000
},{
  B00000000,
  B01100000,
  B01100000,
  B01100110,
  B01101100,
  B01111000,
  B01101100,
  B01100110
},{
  B00000000,
  B00011000,
  B00011000,
  B00011000,
  B00011000,
  B00011000,
  B00011000,
  B00011000
},{
  B00000000,
  B00000000,
  B00000000,
  B01100011,
  B01110111,
  B01111111,
  B01101011,
  B01101011
},{
  B00000000,
  B00000000,
  B00000000,
  B01111100,
  B01111110,
  B01100110,
  B01100110,
  B01100110
},{
  B00000000,
  B00000000,
  B00000000,
  B00111100,
  B01100110,
  B01100110,
  B01100110,
  B00111100
},{
  B00000000,
  B00000000,
  B01111100,
  B01100110,
  B01100110,
  B01111100,
  B01100000,
  B01100000
},{
  B00000000,
  B00000000,
  B00111100,
  B01101100,
  B01101100,
  B00111100,
  B00001101,
  B00001111
},{
  B00000000,
  B00000000,
  B00000000,
  B01111100,
  B01100110,
  B01100110,
  B01100000,
  B01100000
},{
  B00000000,
  B00000000,
  B00000000,
  B00111110,
  B01000000,
  B00111100,
  B00000010,
  B01111100
},{
  B00000000,
  B00000000,
  B00011000,
  B00011000,
  B01111110,
  B00011000,
  B00011000,
  B00011000
},{
  B00000000,
  B00000000,
  B00000000,
  B01100110,
  B01100110,
  B01100110,
  B01100110,
  B00111110
},{
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B01100110,
  B01100110,
  B00111100,
  B00011000
},{
  B00000000,
  B00000000,
  B00000000,
  B01100011,
  B01101011,
  B01101011,
  B01101011,
  B00111110
},{
  B00000000,
  B00000000,
  B00000000,
  B01100110,
  B00111100,
  B00011000,
  B00111100,
  B01100110
},{
  B00000000,
  B00000000,
  B00000000,
  B01100110,
  B01100110,
  B00111110,
  B00000110,
  B00111100
},{
  B00000000,
  B00000000,
  B00000000,
  B00111100,
  B00001100,
  B00011000,
  B00110000,
  B00111100
},{
  B00000000,
  B00001110,
  B00011000,
  B00011000,
  B00110000,
  B00011000,
  B00011000,
  B00001110
},{
  B00000000,
  B00011000,
  B00011000,
  B00011000,
  B00000000,
  B00011000,
  B00011000,
  B00011000
},{
  B00000000,
  B01110000,
  B00011000,
  B00011000,
  B00001100,
  B00011000,
  B00011000,
  B01110000
},{
  B00000000,
  B00000000,
  B00000000,
  B00111010,
  B01101100,
  B00000000,
  B00000000,
  B00000000
},{
  B00000000,
  B00001000,
  B00011100,
  B00110110,
  B01100011,
  B01000001,
  B01000001,
  B01111111
},{
  B00000000,
  B11000011,
  B00000000,
  B10000001,
  B10000001,
  B01000010,
  B00100100,
  B00011000,
}

};
const int IMAGES_LEN = sizeof(IMAGES)/8;




// IRrecv irrecv(RECV_PIN);

// decode_results results;

// define os pinos para controle da MATRIX DE LEDS

#define PINO_LED_DIN 52
#define PINO_LED_CLK 51
#define PINO_LED_CS  16

LedControl myMatrix = LedControl(PINO_LED_DIN, PINO_LED_CLK, PINO_LED_CS, 1);

// Inicializa o display no endereco 0x27
// LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE);


/* PROJETO JOANINHA
 * ROBOT SEMI AUTONOMO PARA INTERAGIR COM ADULTOS E PEQUENOS PETS
 * RECIFE, JUNHO DE 2016
 * AUTOR: ARNOTT RAMOS CAIADO
 * VERSÃO: 00.01
 */

#define ESTADO_OUVIR                1
#define ESTADO_DORMIR               2
#define ESTADO_INTERAGIR_PARADO     3
#define ESTADO_INTERAGIR_MOVIMENTO  4
#define ESTADO_ACOMPANHAR           5
#define ESTADO_FUGIR                6
#define ESTADO_BRINCAR              7
#define ESTADO_VIGIAR               8
#define ESTADO_CUIDAR               9
#define ESTADO_PROCURAR             10
#define ESTADO_JOGAR                11
#define ESTADO_SEMFORCA             12

#define SEMBLANTE_IMPASSIVEL  100
#define SEMBLANTE_ALEGRE      101
#define SEMBLANTE_TRISTE      102
#define SEMBLANTE_DUVIDA      103
#define SEMBLANTE_SONO        104
#define SEMBLANTE_FOME        105
#define SEMBLANTE_LOUCO       106
#define SEMBLANTE_CANSADO     107
#define SEMBLANTE_CHARMOSO    108

#define SENTIDO_PARADO            '1'
#define SENTIDO_FRENTE            '2'
#define SENTIDO_TRAS              '3'
#define SENTIDO_CIRCULO_DIREITA   '4'
#define SENTIDO_CIRCULO_ESQUERDA  '5'
#define SENTIDO_VIRAR_DIREITA     '6'
#define SENTIDO_VIRAR_ESQUERDA    '7'
#define ACELERAR                  '+'
#define REDUZIR                   '-'
#define TOCAR_MUSICA              '8'



#define VELOCIDADE_MAX 200
#define VELOCIDADE_MIN 20
#define VELOCIDADE_ZERO 0

int VEL_AJUSTE_DIR=0;
int VEL_AJUSTE_ESQ=0;




/* Variaveis Globais */
int estado = ESTADO_DORMIR ;
int velocidade = VELOCIDADE_ZERO;
char sentido = SENTIDO_PARADO;
char sentido2 = SENTIDO_PARADO;
int sensorir=0;

#define RxD 19
#define TxD 18

#define PINO_ANALOGICO  15

SoftwareSerial blueToothSerial(TxD, RxD); // tx,rx

// Servo servo1;
// Servo servo2;

void setup() {
  // put your setup code here, to run once:  
   sentido = SENTIDO_FRENTE;
   velocidade = 150;
 
 // Serial.begin(115200);
 // Serial.begin (9600);
 //  blueToothSerial.begin(9600);

  // pinMode(15, OUTPUT);
  // pinMode(16, OUTPUT);
  // pinMode(17, OUTPUT);
     
  // digitalWrite(17,LOW);

 //   configura matriz de LEDS                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
    myMatrix.shutdown(0, false); // habilita o display
    myMatrix.setIntensity(0, 10); // define o brilho dos leds
    myMatrix.clearDisplay(0);    // limpa o display

//   servo1.attach(9);
//   servo2.attach(10);

  delay(1000);

// irrecv.enableIRIn();
 pinMode(RxD, INPUT);
 pinMode(TxD, OUTPUT);
// lcd.begin (16,2);
 parear_dispositivo();
 Serial1.begin (9600);
   
}

void loop() {
  // put your main code here, to run repeatedly:
  int i;
  float cmMsec;
  float cmMsecanterior = 0;
  long microsec = ultrasonic.timing();

  // Read user input if available.
  if ( Serial1.available())
   {
     sentido2 = (char) Serial1.read();
   }
  delay(100);


  // sensorir = analogRead ( PINO_ANALOGICO );
  // delay(100);

 // lcd.clear ();
 // lcd.setBacklight(HIGH);
 // lcd.setCursor(0,0);
 // lcd.print("JoAninha:");
 // lcd.setCursor(10,0);
 // lcd.print( sentido);
 // lcd.setCursor (13,0);
 // lcd.print ( velocidade );



//lcd.print( sensorir );
//  lcd.setCursor(0,1);
 // lcd.print("LCD e modulo I2C");


  if ( sentido2 == ACELERAR || sentido2 == REDUZIR)
    {
      if ( sentido2 == ACELERAR )
      {
       velocidade = velocidade+2;
       if ( velocidade > VELOCIDADE_MAX )
          velocidade = VELOCIDADE_MAX;
          delay(200);
          sentido2=0;
       }
      else if (sentido2 == REDUZIR )
       {
        velocidade= velocidade-2;
        if ( velocidade < VELOCIDADE_MIN )
           velocidade = VELOCIDADE_MIN;
           delay(200);
           sentido2=0;
       }
     }
   else sentido = sentido2;


 
  cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);
   // lcd.setCursor (0,1);
   // lcd.print ( cmMsec );
  if ( (( cmMsec - cmMsecanterior ) * ( cmMsec - cmMsecanterior ) / cmMsec )  > 0.2 )
     mostra_led_caracter ( cmMsec );
  cmMsecanterior = cmMsec ;
 // if ( cmMsec < 80 )
//  {
     //for ( i=0; i<180 ; i++)
    // {
    //  servo1.write( i );
    //  servo2.write( 180-i) ;
    //   delay (5);
    // }
 
 //   tone (buzzer, 1500 );
 //   delay ( cmMsec );
 //   noTone ( buzzer );

    // for ( i=0; i<180 ; i++)
    // {
    //  servo2.write( i );
    //  servo1.write( 180-i) ;
    //  delay(5);
   //  }

 
   // Aguarda 5 segundos
  //if ( cmMsec <= 100 )
  //{
  //  tone (buzzer, 1500 );
  //  delay ( cmMsec );
  //  noTone ( buzzer );
 // }
  // else
  //   noTone (buzzer);
 
 // }

  if (mover (sentido, velocidade, cmMsec ) < 0)
     {
      sentido = SENTIDO_PARADO;
      sentido2= sentido;
     }
   
  switch ( estado ) {

        case ESTADO_OUVIR :
          break;
       
        case ESTADO_DORMIR :
          break;
       
        case ESTADO_INTERAGIR_PARADO :
          break;
       
        case ESTADO_INTERAGIR_MOVIMENTO :
          break;
       
        case ESTADO_ACOMPANHAR :
          break;
       
        case ESTADO_FUGIR :
          break;
     
        case ESTADO_BRINCAR :
       
          break;

        case ESTADO_VIGIAR :
          break;
       
        case ESTADO_CUIDAR :
          break;
       
        case ESTADO_PROCURAR :
          break;

        case ESTADO_JOGAR :
          break;

        default :
          break;
      }



 noTone (buzzer);


}

int mover ( char sentido_movimento , int velocidade_movimento , float distancia )
{
  int status = 0;
  int i;
  motor1.setSpeed(velocidade_movimento);
  motor2.setSpeed(velocidade_movimento);


  switch ( sentido_movimento ) {
        case SENTIDO_FRENTE :
            if ( distancia <= DIST_MINIMA ) // NAO Continuar
            {
             motor1.setSpeed(0);
             motor2.setSpeed(0);
             for ( i=1; i <= 20 ; i++ )
             {
              tone (buzzer, 1500);
              delay(distancia);
              noTone(buzzer);
              delay(distancia);
             }
             status = -1;
            } else
            {
              motor1.run (BACKWARD);
              motor2.run (BACKWARD);
            }
            break;
     
        case SENTIDO_TRAS :
            motor1.run (FORWARD);
            motor2.run (FORWARD);
            break;
                 
        case SENTIDO_PARADO :
            velocidade_movimento=0;
            motor1.setSpeed(velocidade_movimento);
            motor2.setSpeed(velocidade_movimento);
            noTone (buzzer);
            delay (100);
            break;
     
        case SENTIDO_CIRCULO_DIREITA :
            motor2.run (FORWARD);
            motor1.run (BACKWARD);
            break;
         
        case SENTIDO_CIRCULO_ESQUERDA :
            motor1.run (FORWARD);
            motor2.run (BACKWARD);
            break;
         
        case SENTIDO_VIRAR_DIREITA :
        case SENTIDO_VIRAR_ESQUERDA :
          break;
       
        default :
        break;
    }


  return ( status );
}

void parear_dispositivo()
{
 blueToothSerial.begin(9600); // Configura o baud rate do bluetooth como 38400
 blueToothSerial.print("\r\n+STWMOD=0\r\n"); // Configura o módulo bluetooth para trabalhar como slave
 blueToothSerial.print("\r\n+STNA=ArcProg\r\n"); // Configura o nome do disopsitivo bluetooth
 blueToothSerial.print("\r\n+STOAUT=1\r\n"); // Permite que outros dispositivos encontrem o módulo bluetooth
 blueToothSerial.print("\r\n+STAUTO=0\r\n"); // Desabilita a auto conexão
 delay(2000); // Aguarda 2 segundos
 blueToothSerial.print("\r\n+INQ=1\r\n"); // Habilita modo de paridade
 delay(2000); // Aguarda 2 segundos
 blueToothSerial.flush(); // Dá um flush na serial do módulo bluetooth

}


void mostra_led_caracter( int elemento )

{
  int linha, coluna;

  myMatrix.clearDisplay(0);              // limpa a tela para o próximo quadro de animação
  // delay(10);
  for ( linha = 0; linha < 8 ; linha++ )
  {
          if ( (IMAGES[elemento][linha] & B10000000)  == B10000000 ) myMatrix.setLed (0, 7, linha , true); // coluna , linha
          if ( (IMAGES[elemento][linha] & B01000000)  == B01000000 ) myMatrix.setLed (0, 6, linha , true); // coluna , linha
          if ( (IMAGES[elemento][linha] & B00100000)  == B00100000 ) myMatrix.setLed (0, 5, linha , true); // coluna , linha
          if ( (IMAGES[elemento][linha] & B00010000)  == B00010000 ) myMatrix.setLed (0, 4, linha , true); // coluna , linha
          if ( (IMAGES[elemento][linha] & B00001000)  == B00001000 ) myMatrix.setLed (0, 3, linha , true); // coluna , linha
          if ( IMAGES[elemento][linha] & B00000100 ) myMatrix.setLed (0, 2, linha , true); // coluna , linha
          if ( IMAGES[elemento][linha] & B00000010 ) myMatrix.setLed (0, 1, linha , true); // coluna , linha
          if ( IMAGES[elemento][linha] & B00000001 ) myMatrix.setLed (0, 0, linha , true); // coluna , linha
                                         
         // lcd.setCursor (13,1);
         // lcd.print ( IMAGES[elemento][linha] );
         // delay(100);
  }
  // delay(10);
}


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#      ");
}