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