ARDUINO
NANO MINI ESTAÇÃO METEOROLOGICA E RELOGIO
Meça temperatura, pressão, humidade
relativa, altitude e ainda tenha um relogio disponivel.
Uma boa pedida para seu shack.

A estação mini meteorologica mostrando a temperatura e a
humidade do ar, o sensor é montado externamente (sobre a caixa
na foto).

Agora mostrando a pressão em miliBar e a altititude em
relação ao nível do mar.

O relogio é mostrado por mais tempo (cerca de 2 minutos), depois
a pressão e finalmente a temperatura (estes por cerca de 30
segundos) e volta a mostrar a hora.
Esquema :

Usei alguns shields que tinha aqui no shack, o RTC que é o
relogio (um shield meio antigo), o MP180 para medir pressão e
altitude e o DHT11 para medir temperatura e umidade relativa.

foto : Montagem tipo sandwich, a esquerda o modulo do relogio, no
centro o arduino nano e logo atraz o sensor de pressão.
A montagem é simples.
O sketch tambem é simples.
Como fiz outro deste, para meu genro chileno, alterei os dias para
espanhol, estes dias estão com o sinal // que desabilita a linha
do programa e considera como comentario, para mudar para espanhol
é só retirar o sinal // da linha espanhola e incluir no
comado identico em portugues (são 10 linhas 5 e 5).

foto : o sensor de pressão esta em primeiro plano e a direita o
modulo do relogio.

foto : muitos jumpers, sem RF a coisa fica mais facil de fazer, as tres
chaves para acert de hora estão montadas na placa a esquerda,
para ajuste é necessario abrir a caixa.
Existe tambem a possibilidade de mostrar a pressão em miliBar
(mBar), apesar que o default é em Pascal (Pa). Tambem coloquei
duas linhas para este comando é só desabilitar as duas
(do Pascal) e habilitar as outras duas (em miliBar).
Montei em uma caixa plastica, usada para acondicionar alimentos,
escolhi uma com plastico duro (as tampas são mais flexiveis).

foto: Caixa aberta como tudo montado, a esquerda o sensor de
temperatura e humidade, a alimentação vem de uma fonte
que tinha na sucata de 9V 1A. As chaves de ajuste do relogio
estão a direita da foto.
Ajuste do relógio :
Para ajustar data (dia,mes ano, dia da semana) ou para ajustar a hora
(hora, minuto e segundo), coloquei tres botões de acionamento
instantaneo, quando o display esta mostrando a temperatura,
mantenha pressionado P1 (ligado em A1 no arduino) aparece no display :
dia/mes/ano P2
hora/minuto/segundo P3
Acionando P2 ajuste de data
P2 adiciona 1
P3 diminui 1
P1 confirma e grava.
passa para o proximo (na sequencia dia, mes, ano,
dia da semana).
apos o dia da semana volta para o normal
Acionando P3 ajuste de hora
P2
adiciona 1
P3 diminui 1
P1 confirma e grava.
passa para o proximo (na sequencia hora, minuto,
segundo).
apos o ajuste de segundo volta para o normal
Programa :
Aqui publico este sketch,
para quem for montar, gosta estudar ou para quem quiser modificar.
Quem quiser que eu grave este ou outro sketch do meu site, em um
arduino, é só escrever que combinamos como fazer.
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
#include <DS1302.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP085.h>
#include "DHT.h"
#include <LiquidCrystal.h>
//LiquidCrystal lcd(RS-4, En-6, D5-11, D6-12, D7-13, D8-14) pinos do LCD
// Pino R/W5 do lCD para terra e pinos 7, 8 9 e 10 desligados
//LiquidCrystal lcd(13, 12, 11, 10, 9, 8);//pinos coorespondentes do
arduino D13, D12 etc.
// estes pinos podem ser alterados em função do layout
LiquidCrystal lcd(13, 12, 8, 9, 10, 11);//pinos coorespondentes do
arduino D13 , D12 etc.
DS1302 rtc(2, 3, 4); // RST do rtc ao D2 ard. e data rtc ao D3 e CLK ao
D4 ard.
#define DHTPIN 5 // pino sinal do DHT11 ao D5 do arduino
//#define DHTTYPE DHT11// tem dois tipos semelhantes 0 11 e o 22
#define DHTTYPE DHT22 //
DHT dht(DHTPIN, DHTTYPE);//seta pino de entrada e tipo de sensor usado
Adafruit_BMP085 bmp180; // seta sensor de pressão usado
Time t;
int P1 = A1; //Chave 1 ligado a A1 inicia ajuste e finaliza
int P2 = A2; //Chave 2 ligada a A2 incrementa valores
int P3 = A3; //Chave 3 ligada a A3 decrementa valores
int menu = 0; // define a vaiavel de controle menu como int e valor zero
int adutc; // define a vaiavel de adição da
diferença entre horario e UTC
int fim = 0;
int ac = 0;
char* diavelho;
void setup()
{
rtc.halt(false);
rtc.writeProtect(false);
Serial.begin(9600);
dht.begin();
bmp180.begin();
lcd.begin (16, 2);
pinMode(P1, INPUT);
pinMode(P2, INPUT);
pinMode(P3, INPUT);
// rtc.setDOW(SUNDAY);
// Salva o dia da semana como SUNDAY
// rtc.setTime(15, 4, 0); // Salva a
hora 15:04:00 (Formato 24hr)
// rtc.setDate(3, 2, 2017); // Salva a data
como dia 3 de fevereiro de 2017
}
void loop()
{
if (digitalRead(A1))
{
while (fim == 0) {
menu = 1;
ajuste();
}
}
fim = 0;
// lê a temperatura ou humidade relativa que leva cerca de
250 millisegundos
int8_t h = dht.readHumidity();
// Lê a temperature as Celsius (default)
int16_t t = dht.readTemperature();
ac = 0;
lcd.clear();//limpa a tela
while (ac < 3000) { // ac acumulador de vezes que esta rotina
é executda
data (); // subrotina para escrever a data
hora (); // subrotina para escrever a hora
ac++;
}
lcd.setCursor(0, 0); // Coloca o cursor no primeira linha
posição zero - inicial
lcd.print("
");// limpa a primeira linha escrevendo espaços em branco
lcd.setCursor(0, 0); // volta ao inicio da linha
lcd.print("Altit.: "); // escreve no inicio da linha deixa um
espaço para o valor
lcd.print(bmp180.readAltitude()); // Lê a altitude
lcd.print(" m");// apos ao valor da altitude deixa um
espaço e escreve m
lcd.setCursor(0, 1);// cursor no inicio da segunda linha
lcd.print("
"); // escreve espaços em braco limpando o que estava escrito
lcd.setCursor(0, 1);
lcd.print("Press.: "); // escreve press
//lcd.print(bmp180.readPressure());// lê a pressão
em Pascal
lcd.print((bmp180.readPressure()) / 100); // lê a
pressão em Pascal converte para milibar
//lcd.print(" Pa"); // coloca a unidade de pressão Pascal
lcd.print(" mBar");// se quiser em milibar
delay(7000); // deixa 7 segundos na tela
lcd.clear();// limpa a tela
lcd.setCursor(0, 0);// cursor no inicio da primeira linha
lcd.print("Temp. : ");// escreve
lcd.print(t);// escreve o valor da temperatura em graus Celsius
lcd.print((char)223);// coloca o simbolo de grau-temperatura
lcd.print("C"); //e a letra C de centigrados
lcd.setCursor(0, 1);// cursor no inicio da segunda linha
lcd.print("Hum. : ");// escreve humidade
lcd.print(h);// valor da humidade
lcd.print("%");// escreve o sinbolo de %
delay (7000);//deixa 5 segundos na tela
}
// subrotina data() recupera o dia da semana e traduz para o portugues
// alem de colocar na tela
void data () {
lcd.setCursor(0, 0); // seta o cursor na primeira linha coluna
zero
char* dia = (rtc.getDOWStr());// recupera o dia da semana
if (dia == ("Sunday")) { //compara de for Sunday escreve DOM
lcd.print("DOM");
}
if (dia == ("Monday")) {
lcd.print("SEG");
// lcd.print("LUN"); // aqui em espamhol
}
if (dia == ("Tuesday")) {
lcd.print("TER");
//lcd.print("MAR");
}
if (dia == ("Wednesday")) {
lcd.print("QUA");
//lcd.print("MIE");
}
if (dia == ("Thursday")) {
lcd.print("QUI");
//lcd.print("JUE");
}
if (dia == ("Friday")) {
lcd.print("SEX");
//lcd.print("VIE");
}
if (dia == ("Saturday")) {
lcd.print("SAB");
}
lcd.print(" "); // dá um espaço
lcd.print(rtc.getDateStr());// e recupera a data e imprime.
diavelho = dia ;
}
void hora() // subrotina hora coloca a hora na segunda linha
{
lcd.setCursor(0, 1);// seta o cursor na segunda linha coluna zero
lcd.print(rtc.getTimeStr());// recupera o hora e imprime
}
void ajuste ()// ajusta dia ou hora
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Ajuste h/m/s P3 ");
lcd.setCursor(0, 1);
lcd.print("d/m/a P2 ");
delay(2000);
while ((digitalRead(A2)) || (digitalRead(A3))) {
if (digitalRead(A2)) {
(menu = 4);
ajustedia (); //vai para ajuste do dia
}
if (digitalRead(A3)) {
while (menu <= 3)
{
if (menu == 1)
{
ajustehora();
}
if (menu == 2)
{
ajusteminuto();
}
if (menu == 3)
{
ajustesegundo();
}
}
}
}
}
void ajustehora ()
{
t = rtc.getTime();
int hora = (t.hour);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("B2=+1 B3=-1 ");
lcd.setCursor(0, 1);
lcd.print("B1=CFM HORA= ");
delay(500);
while (menu == 1)
{
// lcd.print("HORA ");
if (digitalRead(A2))
{
hora = hora + 1 ;
delay(100);
if (hora == 24) {
hora = 0;
}
}
if (digitalRead(A3))
{
if (hora == 0) {
hora = 24;
}
hora = hora - 1 ;
delay(100);
}
lcd.setCursor(13, 1);
lcd.print(" ");
lcd.setCursor(13, 1);
lcd.print(hora);
delay(1000);
//menu-3;
if (digitalRead(A1))
{
t = rtc.getTime();
rtc.setTime(hora, t.min , t.sec );
lcd.setCursor(0, 1);
lcd.print("gravando hora ");
lcd.print(hora);
delay(1000);
menu = 2;
while (digitalRead(A1)) {}
}
}
}
void ajusteminuto()
{
t = rtc.getTime();
int minut = (t.min);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("B2=+1 B3=-1 ");
lcd.setCursor(0, 1);
lcd.print("B1=CFM Min.= ");
delay(500);
while (menu == 2)
{
if (digitalRead(A2))
{
minut = minut + 1 ;
delay(100);
if (minut == 60) {
minut = 0;
}
}
if (digitalRead(A3))
{
if (minut == 0) {
minut = 60;
}
minut = minut - 1 ;
delay(100);
}
lcd.setCursor(13, 1);
lcd.print(" ");
lcd.setCursor(13, 1);
lcd.print(minut);
delay(500);
if (digitalRead(A1))
{
t = rtc.getTime();
rtc.setTime(t.hour, minut , t.sec );
lcd.setCursor(0, 1);
lcd.print("GRAVANDO MIN. ");
lcd.print(minut);
delay(1000);
while (digitalRead(A1)) {}
menu = 3;
}
}
}
void ajustesegundo()
{
t = rtc.getTime();
int seg = (t.sec);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("B2=+1 B3=-1 ");
lcd.setCursor(0, 1);
lcd.print("B1=CFM SEG.= ");
delay(500);
while (menu == 3)
{
if (digitalRead(A2))
{
seg = seg + 1 ;
delay(100);
if (seg == 60) {
seg = 0;
}
}
if (digitalRead(A3))
{
if (seg == 0) {
seg = 60;
}
seg = seg - 1 ;
delay(100);
}
lcd.setCursor(13, 1);
lcd.print(" ");
lcd.setCursor(13, 1);
lcd.print(seg);
delay(1000);
if (digitalRead(A1))
{
t = rtc.getTime();
rtc.setTime(t.hour, t.min , seg );
lcd.setCursor(0, 1);
lcd.print("GRAVANDO SEG. ");
lcd.print(seg);
delay(1000);
while (digitalRead(A1)) {}
menu = 4;
fim = 1;
}
}
}
void ajustedia()
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("B2=+1 B3=-1 ");
int dia = 15 ;
int mes = 6;
int ano = 2018;
int dias = 7;
char* dsemana = "DOM.";
char* dweek = "SUNDAY";
while (menu == 4)
{
lcd.setCursor(0, 1);
lcd.print("B1=CFM DIA = ");
if (digitalRead(A2))
{
dia = dia + 1 ;
// delay(100);
if (dia == 32) {
dia = 1;
}
}
if (digitalRead(A3))
{
if (dia == 1 ) {
dia = 32;
}
dia = dia - 1 ;
}
lcd.setCursor(13, 1);
lcd.print(" ");
lcd.setCursor(13, 1);
lcd.print(dia);
delay(500);
if (digitalRead(A1))
{
menu = 5;
}
}
while (menu == 5)
{
lcd.setCursor(0, 1);
lcd.print("B1=CFM MES = ");
if (digitalRead(A2))
{
mes = mes + 1 ;
// delay(100);
if (mes == 13) {
mes = 1;
}
}
if (digitalRead(A3))
{
if (mes == 1 ) {
mes = 13;
}
mes = mes - 1 ;
// delay(100);
}
lcd.setCursor(13, 1);
lcd.print(" ");
lcd.setCursor(13, 1);
lcd.print(mes);
delay(500);
if (digitalRead(A1))
{
while (digitalRead(A1)) {}
menu = 6;
}
}
while (menu == 6)
{
lcd.setCursor(0, 1);
lcd.print("B1=CFM ANO = ");
if (digitalRead(A2))
{
ano = ano + 1 ;
// delay(100);
}
if (digitalRead(A3))
{
ano = ano - 1 ;
// delay(100);
}
lcd.setCursor(13, 1);
lcd.print(" ");
lcd.setCursor(12, 1);
lcd.print(ano);
delay(1000);
while (digitalRead(A1) == 0) {}
if (digitalRead(A1))
{
rtc.setDate(dia, mes, ano);
while (digitalRead(A1)) {}
menu = 7;
}
}
while (menu == 7)
{
lcd.setCursor(0, 1);
lcd.print("B1 dia sem =");
if (dias == 7) {
(dweek = ("Sunday"));
dsemana = "DOM";
}
if (dias == 1) {
dweek = "Monday" ;
dsemana = "SEG";
//dsemana = "LUN";// em espamhol
}
if (dias == 2) {
dweek = "Tuesday";
dsemana = ("TER");
//dsemana = "MAR";
}
if (dias == 3) {
dweek = "Wednesday";
dsemana = ("QUA");
//dsemana = "MIE";
}
if (dias == 4) {
dweek = "Thursday" ;
dsemana = ("QUI");
//dsemana = "JUE";
}
if (dias == 5) {
dweek = "Friday";
dsemana = ("SEX");
//dsemana = "VIE";
}
if (dias == 6) {
dweek = "Saturday";
dsemana = ("SAB");
}
if (digitalRead(A2))
{
dias = dias + 1 ;
if (dias == 8) {
dias = 1;
delay(100);
}
}
if (digitalRead(A3))
{
dias = dias - 1 ;
if (dias == 0 ) {
dias = 7;
}
delay(100);
}
lcd.setCursor(12, 1);
lcd.print(" ");
lcd.setCursor(13, 1);
lcd.print(dsemana);
delay(1000);
if (digitalRead(A1))
{
rtc.setDOW(dias);
while (digitalRead(A1)) {}
menu = 8;
}
}
fim = 1;
}
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
73 de py2ohh miguel
jul 2018