quinta-feira, 31 de julho de 2014

Melhorias no projeto

Olá pessoal,

O objetivo do projeto de acionamento de AC com infravermelho foi cumprido e foram efetuados diversos testes. Nestes pude observar que o projeto poderia ser melhorado nos seguintes itens:
1) Posição do led emissor: no post anterior mostrei como ficou o posicionamento dos componentes na caixa e o led emissor ficou posicionado na parte frontal superior da caixa e nos testes pude observar que dependendo da posição o acionamento não se dava. Isto teria que ser corrigido para se evitar que em uma situação de queda de energia momentânea o ar condicionado fosse desligado e não fosse reacionado.
2) Alerta de alta temperatura: no projeto o alerta é realizado por meio de indicação visual no display LCD e por alarme sonoro. O grande problema é que não há registro quando ocorreu o problema ou mesmo aviso por outro meio e seria interessante que o sistema avisasse quando houve o aumento da temperatura e se caso não houvesse o resfriamento pudéssemos constatar que houve um problema no reacionamento ou mesmo no aparelho de ar condicionado e pudéssemos ir até o local para averiguar.
3) O RTC a princípio seria para fornecer data e hora para registro dos acionamentos e só estava servindo para mostrar a data e hora no display. Seria melhor reavaliar se era necessário o componente.

Depois de pensar nessas melhorias e como implementá-las decidi fazer algumas mudanças:
1) Resolvi que o led emissor não deveria ficar fixo como estava e que ele deveria ser posicionado com maior liberdade e isso poderia ser resolvido com fio jumpers macho-fêmea em que o led emissor seria conectado no lado fêmea do jumper e o lado macho do jumper seria conectado na protoboard. O led emissor poderia ser fixado com fita dupla face em um local de melhor visada para o aparelho de ar condicionado.
Vejam as fotos como fiz:

  
Fios jumper macho-fêmea

  
Fita dupla face pequena
Cole os lados fêmeas dos jumpers na fita dupla face





Coloque o led emissor infrared no jumper (este led é  um comum e é só para ilustrar)


Pinos dos fios jumpers (lado macho)

Conectar na protoboard ou no Arduino (no projeto é no pino 9 do Arduino)

Com isso era só fazer um pequeno furo na caixa e deixar o led emissor IR fora da caixa fixando-o em uma superfície que pudesse ter o melhor posicionamento, passar os fios jumper por esse furo e conectar os pinos na protoboard ou no Arduino.


2) Vi que havia necessidade de haver comunicação do Arduino com algum sistema para emitir avisos ou mesmo registrar os acionamentos. O aviso poderia ser por e-mail ou por SMS. Isso seria resolvido com um módulo de rede (shield Ethernet) para enviar o e-mail ou um módulo GSM (shield GSM para enviar SMS). O registro do acionamento poderia ser realizado no próprio Arduino ou por um sistema externo (pelo e-mail ou por outro meio de comunicação). Uma outra opção seria utilizar um sistema de monitoramento via protocolo SNMP. Decidi comprar um shield Ethernet e um shield GSM para implementar estas funções.
3) Não havia mais necessidade do módulo RTC e poderia ser utilizado em outros projetos caso o registro dos acionamentos fosse realizado por e-mail ou SNMP.

Veremos nos próximos posts como estas mudanças foram implementadas.

Até mais

segunda-feira, 28 de julho de 2014

Organizar os componentes - montagem em caixa

Olá pessoal,

No post anterior implementamos a primeira versão do projeto de acionamento automático de ar condicionado via infravermelho e hoje vamos ver como organizar toda a bagunça. Quando tudo estava funcionando me perguntei: como vou organizar as placas, protoboard, fios e componentes? A primeira coisa que pensei foi nas caixas de tomadas ou de disjuntores. Isso me custou uma ida às grandes lojas de material de construção, especificamente na parte de materiais elétricos. Uma caixa que me chamou a atenção foi esta:



É um quadro do sistema VDI da Tigre. Comprei uma caixa 30x30.




Consegui alojar todos os componentes no suporte interno (peça preta da imagem). Fixei com fita dupla face. Fiz alguns furos com furadeira e desbastei com uma lima pequena.  Ficou bom! Dêem uma olhada no vídeo abaixo (perdoem-me pelo barulho do ambiente):





Agora este vídeo mostra o funcionamento (perdoem-me pelo barulho do ambiente):




No próximo post vamos ver algumas considerações sobre o projeto e melhorias que podem ser realizadas no projeto.

Até mais!



Juntando tudo - projeto de acionamento automático de ar condicionado

Olá pessoal,

Hoje vamos ver a integração de todos os componentes que já vimos para implementar o projeto de acionamento automático de ar condicionado. É importante frisar que foram adicionados componentes ao projeto que não foram pensados anteriormente e que vão acrescentar mais algumas funcionalidades. No projeto original estavam previstos os componentes conforme relatei em post anterior: Projeto 1 - Acionamento de ar condicionado via infravermelho. Adicionei mais dois componentes: o Tiny RTC DS1307 e o alto-falante.

Esquema de ligação:



O esquema de ligação acima não aparece os pinos de ligação de cada componente mas segui o mesmo padrão que coloquei nos posts sobre cada um dos componentes. É só seguir as ligações de cada componente apresentado.

O sketch:

Segue abaixo sketch com comentários:


#include<dht11.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <IRremote.h>
#include <SPI.h>
#include <Ethernet.h>
#include <String.h>
#include "RTClib.h"

// Objeto irsend para emissor infrared 
IRsend irsend;

// Objeto rtc (relogio de tempo real)
RTC_DS1307 rtc;

//codigo rawcode capturado do ar condiconado via IRRecvDump
unsigned int rawCode[92] = {8950,4300,650,500,700,450,650,1600,650,500,600,1650,700,450,650,500,650,500,650,450,600,1700,600,550,550,550,600,1700,600,500,600,550,600,550,600,550,600,500,700,450,600,550,600,550,600,500,600,550,600,550,600,550,550,550,600,550,600,550,600,550,550,550,600,550,600,550,600,500,600,550,650,500,600,550,600,500,600,550,600,550,600,550,550,1700,600,550,600,550,550,1700,700};

float sinVal;
int toneVal;

// Objeto LCD com 2 linhas e 16 caracteres por linha
LiquidCrystal_I2C lcd(0x20,16,2);  

//objeto sensor para DHT11 (sensor de temperatura)
dht11 sensor;

void setup() {
    Serial.begin(9600);  // Inicia conexao serial para monitoramento
    lcd.begin(16,2);          // inicializa o lcd 
    lcd.backlight();
    pinMode(8,OUTPUT);  //pino 8 para saida do alto falante
    #ifdef AVR
        Wire.begin();
    #else
        Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
    #endif
  
    rtc.begin();  //inicia o objeto rtc

    //Verifica se o RTC esta funcionando
    if (! rtc.isrunning()) {
       Serial.println("RTC is NOT running!");
       // Ajusta o rtc para a data e hora em que o sketch foi compilado
    }

}

void loop() {
    DateTime now = rtc.now(); // carrega a data e hora do RTC
    
    Serial.print("Lendo sensor: ");
    int chk = sensor.read(2);  //le a temperatura
    //Verifica o status do DHT11
    switch(chk) {
        case DHTLIB_OK:
            Serial.println("OK");
            break;
        case DHTLIB_ERROR_CHECKSUM:
            Serial.println("Erro no checksum");
            break;
        case DHTLIB_ERROR_TIMEOUT:
            Serial.println("Tempo esgotado");
            break;
        default:
            Serial.println("Erro desconhecido");
    }
    // Monitora a umidade e temperatura para a conexao serial
    Serial.print("Umidade (%): ");
    Serial.println(sensor.humidity);
    Serial.print("Temperatura (graus Celsius): ");
    Serial.println(sensor.temperature);
    
    // Carrega os valores de temperatura e umidade do sensor nas variaveis correspondentes
    int menorValorTemp = sensor.temperature;  
    int valorUmidade = sensor.humidity;  
    
    //Se a temperatura for maior que 26 graus Celsius
    if (menorValorTemp > 21) {
      
          // Exibe o valor da temperatura lida pelo sensor
          lcd.clear();  //limpa o display do LCD.     
          lcd.print("Temp: ");  //imprime a string no display do LCD.                 
          lcd.print(menorValorTemp); // imprime a temperatura no LCD
          lcd.write(B11011111); //Simbolo de graus celsius
          lcd.print("C");
          lcd.setCursor(0,1);  //posiciona o cursor na coluna 0 linha 1 do LCD.
          lcd.print("TEMP. ALTA!"); //Imprime a string no display do LCD.
         
          //Envia sinal sonoro para o pino 8 - alto falante
          for (int x=0; x<180; x++) {
            // converte graus para radianos e depois obtem o valor do seno
            sinVal = (sin(x*(3.1416/180)));
            toneVal = 2000+(int(sinVal*1000));
            tone(8, toneVal);
            delay(2);
          }
         
         // Aciona o ar condicionado novamente 
         irsend.sendRaw(rawCode,92,38);  // envia o codigo IR para ligar o AC     
         //Aguarda 5 minutos para enviar novamente o codigo IR caso a temperatura nao baixe
         delay(60000);          
    }
    else
    { 
          // Temperatura normal  
          lcd.clear();  //limpa o display do LCD.     
          lcd.print("Temp: ");  //imprime a string no display do LCD.                 
          lcd.print(menorValorTemp); // Imprime o valor da temperatura
          lcd.write(B11011111); //Simbolo de graus celsius
          lcd.print("C");
          //Exibindo valor da leitura da umidade no display LCD.
          lcd.setCursor(0,1);  //posiciona o cursor na coluna 0 linha 1 do LCD.
          lcd.print("Umidade: ");  //imprime a string no display do LCD.       
          lcd.print(valorUmidade); // Imprime o valor da umidade
          lcd.print("%");
          delay(5000);
          
          //Exibe a data e hora no LCD
          lcd.clear();
          lcd.print("DATA: ");
          lcd.print(now.day(), DEC);
          lcd.print('/');
          lcd.print(now.month(), DEC);
          lcd.print('/');
          lcd.print(now.year(), DEC);
          lcd.setCursor(0,1);
          lcd.print("HORA: ");
          lcd.print(now.hour(), DEC);
          lcd.print(':');
          lcd.print(now.minute(), DEC);
          lcd.print(':');
          lcd.print(now.second(), DEC);
          delay(2000);
          noTone(8);
    
    }
  
  delay(2000);
}



Acabei incluindo o RTC por conta de poder registrar data e hora dos acionamentos em um cartão SD ou qualquer coisa parecida. O alto-falante será para emitir alerta sonoro caso a temperatura aumente. Bom pessoal, esta é a primeira versão do projeto. Funcionou muito bem porém os componentes estão não estão acomodados apropriadamente e precisamos pensar em colocá-los em um painel ou caixa. Vamos ver isso no próximo post.

Até mais!





domingo, 27 de julho de 2014

Alto falante no Arduino

Olá pessoal,

Hoje vamos ver como utilizar um alto falante ou buzzer no Arduino. Em relação ao projeto o alto falante servirá para emitir um aviso sonoro quando a temperatura estiver acima do programado. Vamos lá!


Esquema de ligação:



O alto falante está ligado no pino 8 do Arduino. Pode ser utilizado alto falantes ou buzzers de PC.

Código de exemplo:

void setup () {
      pinMode(8,OUTPUT);

}

void loop() {
          //Envia sinal sonoro para o pino 8 - alto falante
          for (int x=0; x<180; x++) {
            // converte graus para radianos e depois obtem o valor do seno
            //Serial.print("Toca o som");
             sinVal = (sin(x*(3.1416/180)));
             toneVal = 2000+(int(sinVal*1000));
             tone(8, toneVal);
             delay(2);
          }

}

Utilizando a função tone você passa como parâmetro o pino de saída (neste caso é o 8) e o valor do tom.
Simples assim!
No próximo post vamos começar a implementar o projeto de acionamento de ar condicionado.

Até a próxima!!




sábado, 26 de julho de 2014

Emissor e receptor infravermelho

Olá pessoal,

Hoje vamos ver o funcionamento do emissor e receptor infravermelho e será de importância vital para o projeto de acionamento automático de ar condicionado. Não preciso comentar muito sobre a utilização de leds emissores infrared (tem bastante material na Internet explicando o funcionamento) e este tipo de acionamento remoto está presente em quase todos os aparelhos eletrônicos. O que é mais interessante é que existe uma biblioteca para Arduino que permite capturar os códigos dos controles remotos dos aparelhos e reproduzí-los através de um led emissor infrared. Vamos ver os passos para se fazer isso:

1) Baixar a biblioteca IRRemote (http://github.com/shirriff/Arduino-IRremote) e instalá-la:

2) Esquema de ligação:



Fonte: GRobotronics Learning

Emissor infravermelho:


Receptor infravermelho:


Neste circuito há o led receptor que está ligado da seguinte forma:

Pino 1 do receptor --> pino 11 do Arduino (fio azul da imagem)
Pino 2 do receptor --> Ground do Arduino (fio preto da imagem)
Pino 3 do receptor -->  5V do Arduino (fio vermelho da imagem)

Já o led emissor está ligado assim:

Positivo do led --> pino 9 do Arduino (fio branco da imagem)
Negativo do led --> Ground do Arduino (fio preto da imagem)

Há um resistor de 100 ohms em série no ground do emissor IR. 

Cabe aqui uma observação: verificar no arquivo IRRemoteInt.h na pasta da biblioteca IRRemote, aproximadamente na linha 69 se o pino que está sendo usado é mesmo o pino 9. Veja o trecho deste arquivo:

// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, etc
#else
  #define IR_USE_TIMER1   // tx = pin 9
  //#define IR_USE_TIMER2     // tx = pin 3
#endif


No meu caso estou usando o Arduino Uno e também já testei no Arduino Duemilanove. Não sei ainda o porquê mas eu usava o TIMER2 (pino 3) e não funcionou. Aí mudei para o TIMER1 e funcionou certinho.

Testando o circuito RECEPTOR infravermelho:

Primeiro, vamos utilizar o exemplo IRRecvDump que já vem com a biblioteca:

#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Inicia o receptor
}

// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
// void * to work around compiler issue
//void dump(void *v) {
//  decode_results *results = (decode_results *)v
void dump(decode_results *results) {
  int count = results->rawlen;
  if (results->decode_type == UNKNOWN) {
    Serial.print("Unknown encoding: ");
  } 
  else if (results->decode_type == NEC) {
    Serial.print("Decoded NEC: ");
  } 
  else if (results->decode_type == SONY) {
    Serial.print("Decoded SONY: ");
  } 
  else if (results->decode_type == RC5) {
    Serial.print("Decoded RC5: ");
  } 
  else if (results->decode_type == RC6) {
    Serial.print("Decoded RC6: ");
  }
  else if (results->decode_type == PANASONIC) {
    Serial.print("Decoded PANASONIC - Address: ");
    Serial.print(results->panasonicAddress,HEX);
    Serial.print(" Value: ");
  }
  else if (results->decode_type == JVC) {
     Serial.print("Decoded JVC: ");
  }
  Serial.print(results->value, HEX);
  Serial.print(" (");
  Serial.print(results->bits, DEC);
  Serial.println(" bits)");
  Serial.print("Raw (");
  Serial.print(count, DEC);
  Serial.print("): ");

  for (int i = 0; i < count; i++) {
    if ((i % 2) == 1) {
      Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
    } 
    else {
      Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
    }
    Serial.print(" ");
  }
  Serial.println("");
}


void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    dump(&results);
    irrecv.resume(); // Receive the next value
  }
}


Basta apontar um controle remoto para o receptor IR, apertar um botão e acompanhar no Monitor Serial. Lá veremos o respectivo código IR do botão do controle remoto decodificado. Há duas formas de se usar o código IR: quando o circuito receptor consegue decodificar ele vai mostrar a marca (Sony, NEC, etc) e um código reduzido. Por exemplo o botão de Power das TV Sony o código IR para ligar é o A90 (em hexadecimal). Há também possibilidade de se utilizar o código Rawcode que também é mostrado no Monitor Serial. Isto é especialmente útil quando não se consegue utilizar o código reduzido. No caso do projeto do ar condicionado tive que utilizar o código rawcode. Você deve pegar todo o código rawcode e separar cada número por vírgula e deixá-los todos positivos e colocar em uma array unsigned int. 
Veja este exemplo de saída do Monitor Serial:


Fonte: Blog Microcontrolandos

Nesta imagem você vê a marca (NEC) e o código reduzido (807608F7) em hexadecimal e o tamanho (32 bits). Logo abaixo você tem o rawcode (linha Raw (68): onde 68 é o número de elementos) composto de vários números positivos e negativos.

Dica para usar o rawcode: copie a linha do rawcode com os números negativos e positivos e cole-a em um software de planilha. Em uma linha teremos cada célula que conterá um elemento do rawcode. Modifique as células com valores negativos para valores positivos. Depois com todos os números positivos salve a planilha no formato .csv (valores separados por vírgula). Abra o arquivo .csv com um editor de textos. Todos os números estarão separados por vírgulas e basta copiar a linha para o trecho do código que conterá a array. Certifique-se que não há espaços entre os números e entre as vírgulas.


Veja este exemplo da variável que contém o código rawcode do ar condicionado que capturei:

unsigned int powerOn[92] = {8950,4300,650,500,700,450,650,1600,650,500,600,1650,700,450,650,500,650,500,650,450,600,1700,600,550,550,550,600,1700,600,500,600,550,600,550,600,550,600,500,700,450,600,550,600,550,600,500,600,550,600,550,600,550,550,550,600,550,600,550,600,550,550,550,600,550,600,550,600,500,600,550,650,500,600,550,600,500,600,550,600,550,600,550,550,1700,600,550,600,550,550,1700,700};


Criei uma array de 92 elementos contendo o código de power on do ar condicionado. Notem que todos os elementos estão positivos e estes foram capturados com o circuito de recepção IR e com o sketch IRRemote.

Testando o circuito EMISSOR infravermelho:

A biblioteca IRRemote tem um exemplo chamado IRsendDemo. Se você tem uma TV Sony pode testar diretamente com este exemplo:


#include <IRremote.h>

IRsend irsend;

void setup()
{
  Serial.begin(9600);
}

void loop() {
  if (Serial.read() != -1) {
    for (int i = 0; i < 3; i++) {
      irsend.sendSony(0xa90, 12); // Sony TV power code
      delay(40);
    }
  }
}


Resumindo a brincadeira: capture os códigos de IR com o receptor IR e com o sketch IRRecvDump e para testar o emissor basta enviar o código IR com alguma função send<>  do objeto irsend (do tipo IRsend). No caso do exemplo acima utilizamos a função sendSony passando como parâmetro o código IR(0xa90) e o tamanho em bits do código(12). Note que esse código foi enviado três vezes para conseguir ligar a TV (alguns códigos exigem que sejam acionados mais de uma vez).
No caso de envio de códigos IR como rawcode você deve usar a funçao sendraw como neste exemplo:

irsend.sendRaw(powerOn,92,38);

Onde powerOn é a variável unsigned int contendo o rawcode do botão liga do ar condicionado que capturei, 92 é a quantidade de elementos do rawcode e 38 é a frequência em Hz).

Dica sobre o EMISSOR infravermelho: se você observar que o emissor não aciona em distâncias um pouco maiores experimente retirar o resistor do esquema ou diminuir o valor da resistência. Retirei o resistor e funcionou tranquilamente.

No próximo post vamos mostrar como executar sons utilizando um buzzer ou alto-falante de PC e depois vamos juntar todos os componentes para implementar o projeto de acionamento de ar condicionado via infravermelho.

Até a próxima,



sexta-feira, 25 de julho de 2014

Utilizando o RTC DS1307 junto com o display LCD


Olá pessoal,

Neste post vou apresentar mais um componente porém não faz parte do projeto de acionamento de ar condicionado. Trata-se de um componente RTC (Real Time Clock ou Relógio de Tempo Real) que permite ter a informação de data e hora em tempo real para ser utilizado em alarmes ou de executar ações programadas em horários específicos.
Uma bateria de lítio garante que os dados sejam preservados mesmo sem alimentação externa, e é acionada automaticamente em caso de falta de energia no módulo.


Bom, vamos lá:

Componente utilizado: Tiny RTC Module DS1307

Esquema de ligação:


Fonte: Blog FilipeFlop

Utilize a biblioteca RTClib. Está disponível em: https://github.com/adafruit/RTClib.  É necessário ajustar a data e hora do componente. Execute o seguinte código para ajustar a data e hora sempre que precisar:



#include "RTClib.h"


// Objeto rtc (relogio de tempo real)
RTC_DS1307 rtc;



void setup () {
      rtc.begin();  //inicia o objeto rtc

     // Verifica se o RTC esta funcionando
     if (! rtc.isrunning()) {
           Serial.print("RTC is NOT running!");
     }
     else
     { 
         rtc.adjust(DateTime(__DATE__, __TIME__)); // Ajusta o rtc para a data e hora em que o sketch foi compilado
     }
}


void loop() {
    DateTime now = rtc.now();

    Serial.print(now.day(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.year(), DEC);
      
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();


}

Acompanhe no Monitor Serial se a data e hora foi acertada.


Utilizando junto com o LCD Display:


Uma vez acertada a data e hora no sketch anterior, o código seguinte exibe a data e hora no display LCD:



#include "RTClib.h"
#include <LiquidCrystal_I2C.h>


LiquidCrystal_I2C lcd(0x20,16,2);  // set the LCD address to 0x20 for a 16 chars and 2 line display



// Objeto rtc (relogio de tempo real)
RTC_DS1307 rtc;


void setup () {
      rtc.begin();  //inicia o objeto rtc

     // Verifica se o RTC esta funcionando
     if (! rtc.isrunning()) {
           Serial.print("RTC is NOT running!");
     }
     else
     { 
           rtc.adjust(DateTime(__DATE__, __TIME__)); // Ajusta o rtc para a data e hora em que o sketch foi compilado
     }
     lcd.begin(16,2); // inicializa o lcd 
     lcd.backlight();
       

}


void loop() {
          DateTime now = rtc.now();
          lcd.clear();
          lcd.print("DATA: ");
          lcd.print(now.day(), DEC);
          lcd.print('/');
          lcd.print(now.month(), DEC);
          lcd.print('/');
          lcd.print(now.year(), DEC);
          lcd.setCursor(0,1);
          lcd.print("HORA: ");
          lcd.print(now.hour(), DEC);
          lcd.print(':');
          lcd.print(now.minute(), DEC);
          lcd.print(':');
          lcd.print(now.second(), DEC);
          delay(2000);
}

segunda-feira, 21 de julho de 2014

Utilizando o DHT11

Olá pessoal,

Dando à continuidade ao projeto tinha que aprender a utilizar o sensor de temperatura DHT11. No projeto o sensor  vai monitorar a temperatura em tempo real e mostrar no display LCD. 

 Optei por adquirir o DHT11:



O esquema de ligação é este:


Utilize a biblioteca dht11 disponível em: http://www.seucurso.com.br/downloads/DHT11.zip .  Este código faz a leitura de temperatura e umidade:


#include<dht11.h>
#include <Wire.h>
 

dht11 sensor; //objeto do tipo dht11
 

void setup() {
     Serial.begin(9600);

}
 

void loop() {
       Serial.print("Lendo sensor: ");
       int chk = sensor.read(2); // sensor faz a leitura no pino 2

       // Testa se a leitura foi bem sucedida 
       switch(chk) {
             case DHTLIB_OK:
                    Serial.println("OK");
                    break;
            case DHTLIB_ERROR_CHECKSUM:
                   Serial.println("Erro no checksum");
                   break;
            case DHTLIB_ERROR_TIMEOUT:
                   Serial.println("Tempo esgotado");
                   break;
            default:
                   Serial.println("Erro desconhecido");
      } 

  
     // Se a leitura foi bem sucedida, mostra a umidade e temperatura na Serial
     Serial.print("Umidade (%): ");
     Serial.println((float)sensor.humidity, 2);
     Serial.print("Temperatura (graus Celsius): ");
     Serial.println((float)sensor.temperature, 2);

 }


O Monitor Serial é bastante útil para verificar como o software está rodando e permite fazer alguns diagnósticos e mostrar valores de sensores.
No próximo post vamos integrar o display LCD com o DHT11, fazendo com que a temperatura seja visualizada no display e também na Serial.