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

Nenhum comentário:

Postar um comentário