Manual
do
Maker
.
com
Vou começar exclarecendo algo que poucas pessoas ainda tem dúvida, mas tem. Existe a board Wemos D1 Mini que vem com o firmware X. Mas o firmware pode tranquilamente ser trocado por qualquer outro. Particularmente, não gosto de programar em Lua, apesar de já ter escrito uns 2 artigos com exemplos, mas atualmente dei uma pausa no firmware MicroPython e estou voltando a utilizar Sming. O Sming é um framework para C++ que oferece uma interface de programação muito semelhante à programação na IDE de programação do Arduino, mas tem suas vantagens, uma vez que ele foi construido especificamente para ESP8266 e é otimizado. Se desejar experimentar esse firmware, e fácil. Você pode seguir esses tutoriais:
Sming framework para ESP8266 Acionando relé com Sming Conectar NetBeans ao container Sming Dicas rápidas com Sming e ESP8266 Primeiros passos com Sming dentro de um container ESP8266 a lá Arduino dentro de um container Sming
O fato de eu estar utilizando o Wemos D1 Mini não influi em nada em relação a qualquer outro módulo ESP8266, desde o ESP-01, todos devem funcionar.
A maior vantagem que vejo em utilizar o Sming é a simplicidade de programa e os recursos disponibilizados. Para ter uma ideia, o Sming é compatível com a grande maioria das bibliotecas desenvolvidas para Arduino, de modo que você apenas precisa incluir a biblioteca em seu projeto para utilizá-la. É o caso do BMP180, que sou franco em dizer; é terrívelmente complicado escrever from scratch o código para esse sensor. Para não dizer que é mentira, aqui está o meu código em Python para utilização do BMP180 com Raspberry Pi.
Estou escrevendo esse artigo porque estou com um projeto muito, mas muito interessante, só que não posso dar detalhes porque assim como o projeto desse outro artigo, está na linha de visada para um produto comercial que estou desenvolvendo em parceria com a Ye Vesta Home Brewing. Mas vamos colocar pra funcionar aqui o BMP180 de maneira fácil.
O módulo é bem baratinho e recomendo a compra na AutoCore Robótica, através desse link.
Eu utilizo o NetBeans (no link supracitado você encontrará o modo de utilizá-lo para programar o ESP8266) e é por uma razão que conquista qualquer programador; o auto-complete. É um verdadeiro pé na popa ter que escrever cada byte da chamada de uma função de um objeto. Eu gosto de iniciar a escrita e usar Ctrl+Space para escolher entre os recursos. E em algumas vezes, ver o que mais o objeto oferece de recursos, que muitas vezes nos passam despercebidos porque só utilizamos o essencial. Então, considerando que você está tomando o mesmo caminho que eu, inicie fazendo uma cópia completa do diretório do BMP180 que está dentro do container,utilizando SCP para isso:
scp -r root@172.17.0.2:/opt/sming/Pressure_BMP180 ~/NetBeansProjects/
É fundamental que você saiba quais são os pinos de qualquer board com ESP8266. No caso do Wemos D1 Mini, esse é o pinout:
Siga então os passos descritos no artigo lá mais em cima, iniciando um novo projeto a partir dos fontes existentes. Feito isso, abra o diretório app na coluna esquerda da IDE NetBeans e clique duas vezes sobre application.cpp. Pronto, agora basta fazer o upload, mas se quiser converter a saida de Pascal para PSI, adicione essas duas linhas logo após a linha de include do header BMP180:
//1 Pascal = 0,000145038 PSI
#define PSI 0.000145038
E lá no código, Após o print da variável currentPressure, adicione essa linha:
//converte para PSI
float pressure_in_psi = (float) currentPressure*PSI;
Agora você pode utilizar essa variável como desejar. O último passo; repare que quando você executar esse código, serão impressos os valores apenas uma vez, porque o código está disposto para funcionar dentro da função loop() tradicionalmente utilizado no Arduino. Porém, se você fizer um loop infinito dentro da função init, certamente receberá reset por WDT devido ao travamento das tarefas de background. Para evitar esse problema, mude o nome da função init para, por exemplo, bmp180CB. Logo abaixo dessa função, crie um novo init e inclua apenas isso (copiando e apagando do init antigo):
void init(){
Serial.begin(115200);
Serial.println("Serial inicializada. Seguindo...");
Wire.begin();
if(!barometer.EnsureConnected())
Serial.println("Could not connect to BMP180.");
// When we have connected, we reset the device to ensure a clean start.
//barometer.SoftReset();
// Now we initialize the sensor and pull the calibration data.
barometer.Initialize();
barometer.PrintCalibrationData();
Serial.print("Start reading");
getValues.initializeMs(2000,bmp180CB).start();
}
E na primeira linha antes da função bmp180CB, crie o timer:
Timer getValues;
Agora copie o código para o container (clicando com o botão direito sobre o projeto e "Upload to Sming docker") e mande gravar o firmware clicando na seta verde. Agora abra um terminal serial (eu utilizo o GTKterm, use o de sua preferência) à 115200 na ttyUSB0. Você verá uma atualização a cada 2 segundos. Simples ou não?
PSI é utilizado normalmente para equipamentos pneumáticos e incomum para medir pressão atmosférica. Mas no caso do meu projeto, a pressão que pretendo medir é de um recipiente X, por isso preciso que seja em PSI.
Um "detalhe" importante é que a medição é feita em Pascal, resultando algo como 91975 aqui em São Paulo. Para facilitar, a medição pode ser feita em hPa, que é o hectoPascal, resultando em um valor menor, uma vez que esse valor é divido por 10². A partir de então a pressão em PSI passa a fazer sentido. Nesse caso, troque a linha da variável currentPressure para:
float currentPressure = (float) barometer.GetPressure()/100.0;
Adicionando aquela conversão para PSI, coloque um print mais abaixo:
Serial.print("Pressao atual em PSI: ");
Serial.println(pressure_in_psi);
Bem, isso é mais fácil ainda. 1 bar é igual 1Pa/10^5. Como já mudamos Pascal para hectoPascal, agora é só fazer hPa/10^3. Coloque isso no código:
float pressure_in_bar = (float) currentPressure/1000.0;
Serial.print("Pressao atual em BAR: ");
Serial.println(pressure_in_bar);
E o resultado deverá parecer com isso:
Rápido e simples, agora é só transformar em projeto! O código final ficou assim:
#include <user_config.h>
#include <SmingCore/SmingCore.h>
#include <Libraries/BMP180/BMP180.h>
//1 Pascal = 0,000145038 PSI
#define PSI 0.000145038
#define BAR 0.0689476
BMP180 barometer;
Timer getValues;
void bmp180CB()
{
// Retrive the current pressure in Pascals.
float currentPressure = (float) barometer.GetPressure()/100.0;
// Print out the Pressure.
Serial.print("Pressure: ");
Serial.print(currentPressure);
Serial.print(" hPa");
//converte para PSI
float pressure_in_psi = (float) currentPressure*PSI*100.0;
float pressure_in_bar = (float) currentPressure/1000.0;
// Retrive the current temperature in degrees celcius.
float currentTemperature = barometer.GetTemperature();
// Print out the Temperature
Serial.print("\tTemperature: ");
Serial.print(currentTemperature);
Serial.print("C");
Serial.println(); // Start a new line.
Serial.print("Pressao atual em PSI: ");
Serial.println(pressure_in_psi);
Serial.print("Pressao atual em BAR: ");
Serial.println(pressure_in_bar);
}
void init(){
Serial.begin(115200);
Serial.println("Serial inicializada. Seguindo...");
Wire.begin();
if(!barometer.EnsureConnected())
Serial.println("Could not connect to BMP180.");
// When we have connected, we reset the device to ensure a clean start.
//barometer.SoftReset();
// Now we initialize the sensor and pull the calibration data.
barometer.Initialize();
barometer.PrintCalibrationData();
Serial.print("Start reading");
getValues.initializeMs(2000,bmp180CB).start();
}
Inscreva-se no nosso canal Manual do Maker no YouTube.
Também estamos no Instagram.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.