Utilizando Monitor Serial Gráfico do Arduino
Olá, tudo bem? Hoje vamos conhecer uma função da IDE do Arduino muito interessante. Estou falando sobre o monitor serial gráfico do Arduino. Bastante utilizado para representar os dados enviados para a serial do Arduino de uma forma gráfica. Então, você quer saber como utilizar essa função? Continue aqui comigo!
Por que utilizar o Monitor Serial Gráfico do Arduino?
A resposta dessa pergunta pode ser o fato que de existem programas os quais precisam necessariamente de uma interface, seja ela gráfica ou não, para poder saber o que está acontecendo naquele exato momento.
Em outras palavras, seria o resultado do monitoramento de um sensor. Contudo, nem sempre é possível adicionar um display ao projeto.
Isso porque o display dá um trabalho adicional de ser implementado no código e no circuito além de representar um custo a mais. Por esse motivo, a utilização do monitor serial se torna mais viável nos casos mais simples de análise de variação de algum sensor.
Então, no projeto de hoje onde vamos representar a leitura do sensor de umidade, o monitor serial gráfico será importante, ele mostrará de uma forma mais clara e direta, visualmente falando, os dados lidos pelo sensor e, isso pode nos auxiliar na correção de bugs.
Funcionamento do Projeto
O funcionamento desse projeto será bastante simples, pois iremos trabalhar apenas com o sensor de umidade e temperatura DHT11 (ainda não tem o seu sensor? Relaxa, clicando nesse link você vai poder adquirir o seu, aproveite!) e o monitor serial gráfico.
Na verdade, os componentes e o circuito já foram apresentados no blog, basta entrar no post sobre o sensor de umidade e temperatura DHT11:
Mas resumindo, a ideia de hoje vai ser de pegar os valores lidos pelo sensor e transformar isso em algo gráfico. No caso seria a plotagem de um gráfico que varia no tempo, mostrando a oscilação da leitura feita pelo sensor.
Componentes Utilizados
- 1x Arduino de sua preferência
- 1x DHT11 Sensor de Umidade e Temperatura
- 1x Resistor de 10K
- 1x Protoboard
- Alguns Jumper’s
Montagem do Circuito
A seguir está a ligação do nosso projeto de hoje. Primeiramente, é importante que você desligue o cabo USB do seu Arduino e realize as ligações com ele desligado, combinado? Depois é só ligar novamente!
Fonte: AutoCore Robótica
Código do Projeto Comentado
Para o código que vamos utilizar hoje, é necessário que você tenha instalado em seu computador a biblioteca do sensor DHT11. Isso porque facilita na hora de criar o código pois ele já vem com algumas funções bem fáceis de utilizar. Então basta clicar na imagem abaixo e descompactar o arquivo, renomeando para “DHT” e copiando a pasta para as “libraries” do seu Arduino.
Depois de realizar a instalação da biblioteca, basta abrir a sua IDE do Arduino e copiar o seguinte código:
/* Projeto: Utilização do Monitor Serial Gráfico Autor: Danilo Nogueira - AutoCore Robótica Data: 23/09/2018 Domínio Público. */ #include <idDHT11.h> int idDHT11pino = 2; //Porta Digital do Arduino onde o pino do sinal do sensor DHT esta conectado int idDHT11intNumber = 0; //Número da interrupção respectiva à porta definida void dht11_wrapper(); // Declaração da funcão de controle da interrupção. void loopDHT(); // Atualiza a leitura do sensor idDHT11 DHT11(idDHT11pin, idDHT11intNumber, dht11_wrapper); //Instanciação do Objeto de Controle do Sensor void setup() { // Iniciando a serial com velocidade de 9600 Serial.begin(9600); Serial.println("Inicio do Programa"); } //Variaveis utilizadas para calcular as temperaturas do Sensor DHT11 float temperaturaC; float umidade; void loop() { loopDHT(); // Função que atualiza o sensor // Aqui estamos mostrando na serial as temperaturas calculadas Serial.print("Temperatura Celcius: "); Serial.println( temperaturaC ); delay(100); Serial.print("Umidade Relativa: "); Serial.println( umidade ); delay(100); Serial.println(); } void dht11_wrapper() { DHT11.isrCallback(); } void loopDHT(){ // Função que vai calcular as temperaturas #define tempoLeitura 1000 static unsigned long delayLeitura = millis() + tempoLeitura + 1; static bool request = false; if ((millis() - delayLeitura) > tempoLeitura) { if (!request) { DHT11.acquire(); request = true; } } if (request && !DHT11.acquiring()) { request = false; int result = DHT11.getStatus(); // Caso ocorra algum erro ele será escrito na serial switch (result) { case IDDHTLIB_OK: Serial.println("Leitura OK"); break; case IDDHTLIB_ERROR_CHECKSUM: Serial.println("Erro\n\r\tErro Checksum"); break; case IDDHTLIB_ERROR_ISR_TIMEOUT: Serial.println("Erro\n\r\tISR Time out"); break; case IDDHTLIB_ERROR_RESPONSE_TIMEOUT: Serial.println("Erro\n\r\tResponse time out"); break; case IDDHTLIB_ERROR_DATA_TIMEOUT: Serial.println("Erro\n\r\tData time out erro"); break; case IDDHTLIB_ERROR_ACQUIRING: Serial.println("Erro\n\r\tAcquiring"); break; case IDDHTLIB_ERROR_DELTA: Serial.println("Erro\n\r\tDelta time to small"); break; case IDDHTLIB_ERROR_NOTSTARTED: Serial.println("Erro\n\r\tNao iniciado"); break; default: Serial.println("Erro Desconhecido"); break; } // Aqui vamos armazenar o valor das temperaturas na variáveis para mostrar o loop float valor = DHT11.getCelsius(); if (!isnan(valor)) { temperaturaC = valor; } valor = DHT11.getHumidity(); if (!isnan(valor)) { umidade = valor; } delayLeitura = millis(); } }
Ativando o Monitor Serial Gráfico do Arduino
Agora que vem a mágica! Após realizar o upload do código, verifica se os dados do sensor estão sendo mostrados no monitor serial e caso esteja, basta entrar em “Ferramentas -> Plotter Serial”, ou apenas clicando ao mesmo tempo as teclas “Ctrl + Shift + L”. Como mostra a imagem a seguir:
Fonte: AutoCore Robótica
Resultado do Projeto
Por fim, deixo para você um vídeo do nosso canal no Youtube, onde mostro o resultado do projeto em funcionamento. Caso tenha ficado alguma dúvida não hesite em mandar mensagem combinado?
Mas e ai? Gostou? Caso tenha ficado algo incompleto para você, comenta abaixo
Dicas? Dúvidas? Idéias de post? Críticas? Só comentar também!
Forte abraço!
Como passar o gráfico que está no Serial Monitor para um display gráfico?
Olá Gustavo, isso é uma ótima ideia para futuros post! 😉
Mas respondendo a sua pergunta, o display gráfico é como uma folha de papel em branco, onde você vai utilizar os comandos da biblioteca para desenhar!
Assim, pesquisando na documentação [link abaixo] você pode encontrar o comando “drawLine”, o qual é configurado da seguinte forma:
u8g.drawLine(x1, y1, x2, y2);
Basicamente, imagine que o gráfico vai iniciar em (0,0), depois o sensor fez uma leitura de 55 e depois 40. Dessa forma, você escreve:
u8g.drawLine(0, 0, 10, 55);
u8g.drawLine(10, 55, 20, 40);
Observe que eu coloquei um intervalo de 10 no eixo X, e então fazemos isso até percorrer o display inteiro (64), quando acabar, limpamos ele e começamos do (0,0) novamente! Ficou claro?
Link da Biblioteca (u8glib): https://github.com/olikraus/u8glib/wiki/userreference#drawline
Abraços!