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