Home Temperature and Pressure on your phone with NodeMCU, BMP180, IFTTT and Numerous app

Recently I built a simple sensor reader with a NodeMCU (ESP8266) and Bosch BMP180, both bought on AliExpress. Here you find the NodeMCU and here you find the BMP180 I bought.


##How to?

###Firmware

First, you need to flash the firmware to NodeMCU, a light one that you can build on this site, because the library of BMP180 has some problem with memory. If you want you can use with ESP8266Flasher this firmware(nodemcu-master-9-modules-2015-12-06-15-30-14-float.bin) I built the 6th of December.

###Connection of pins

Connect the 3v3 pin of BMP180 to the 3v3 pin of NodeMCU (it’s 5v tollerant, but I didn’t try it), connect the ground, and use D2 for sda and D3 for scl.

###Script

Flashed the firmware open either LUALoader or ESPlorer and flash BMP180.lua, the library, and init.lua, the script, to the NodeMCU: you can download here bmp180.lua and init.lua. The BMP180 library is the javierjanez library you can find on GitHub.

NodeMCU-BMP180

Here you find the simple Fritzing project.

OSS = 1 -- oversampling setting (0-3)
SDA_PIN = 2 -- sda pin, GPIO2 that is D2 (Put your sensor here, for example on pin 1 and 2 doesn't work, who knows why)
SCL_PIN = 3 -- scl pin, GPIO0 that is D3

--
--wifi.setmode(wifi.STATION)
--wifi.sta.config(SSID,password)
wifi.sta.connect()
tmr.alarm(1, 5000, 1, function() 
    if wifi.sta.getip()== nil then
        print('IP unavaiable, waiting...') 
    else
        tmr.stop(1)
        print('IP is '..wifi.sta.getip())
    end
 end)


port = 80
gpio.mode(1, gpio.OUTPUT)

function sendData()
bmp180 = require("bmp180")
bmp180.init(SDA_PIN, SCL_PIN)
bmp180.read(OSS)

t = bmp180.getTemperature()/10
p = bmp180.getPressure()/100

--press = p/100
-- temperature in degrees Celsius  and Farenheit
--print("Temperature: "..(t/10))--"."..(t%10).." deg C")
--print("Temperature: "..(9 * t / 50 + 32).."."..(9 * t / 5 % 10).." deg F")
--print(..(t / 10)..)
-- pressure in differents units
--print("Pressure: "..(p).." Pa")
--print("Pressure: "..(p / 100).."."..(p % 100).." hPa")
--print("Pressure: "..(p / 100))--"."..(p % 100).." mbar")
--print(..(p / 100)..)
print(p)
print(t)
--print("Pressure: "..(p * 75 / 10000).."."..((p * 75 % 10000) / 1000).." mmHg")

-- release module
bmp180 = nil
package.loaded["bmp180"]=nil
  
--connection to Maker Channel IFTTT

conn = net.createConnection(net.TCP, 0) 
-- show the retrieved web page

conn:on("receive", function(conn, payload) 
                       success = true
                       print(payload) 
                       end) 

-- once connected, request page (send parameters to a php script)
--send pressure
conn:on("connection", function(conn, payload) 
                       print('\nConnected') 
                       conn:send("GET /trigger/MakerEvent/with/key/YOURKEY?value1="
                        ..p
						.."&value2="
						..t
						.." HTTP/1.1\r\n" 
                        .."Host: maker.ifttt.com\r\n" 
                        .."Connection: close\r\n"
                        .."Accept: */*\r\n" 
                        .."User-Agent: Mozilla/4.0 "
                        .."(compatible; esp8266 Lua; "
                        .."Windows NT 5.1)\r\n" 
                        .."\r\n")
                       end) 

-- when disconnected, let it be known
conn:on("disconnection", function(conn, payload) print('\nDisconnected') end)	   
conn:connect(80,'maker.ifttt.com') 
end  --end della function sendData

-- send data every X ms to maker channel
tmr.alarm(0, 15000, 1, function() sendData() end )

The script read the pressure and the temperature every 15 seconds and send them to the Maker Channel of IFTTT, that you can set up at this link, just add your Maker Event and your key to the script.

Written on December 8, 2015