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