remoteMe
Published © Apache-2.0

Read temperature, humidity and pressure using ESP / Wemo...

Read temperature, pressure and humidity. And display return data on the WebPage, or store it into RemoteMe cloud and display as a chart

BeginnerProtip2,958
Read temperature, humidity and pressure using ESP / Wemo...

Things used in this project

Hardware components

NodeMCU ESP8266 Breakout Board
NodeMCU ESP8266 Breakout Board
×1
Wemos D1 Mini
Espressif Wemos D1 Mini
×1

Software apps and online services

remoteMe.org

Story

Read more

Schematics

Connections

Green wire is needed to self wakeup arduino

Code

arduino.ino - data on request

Arduino
#include <stdint.h>
#include "SparkFunBME280.h"

#include "Wire.h"
#include "SPI.h"

#define WIFI_NAME ""
#define WIFI_PASSWORD ""
#define DEVICE_ID 204
#define DEVICE_NAME "temperatureOnRequest"
#define TOKEN ""

#include <ArduinoHttpClient.h>
#include <RemoteMe.h>
#include <ESP8266WiFi.h>

#include <ESP8266WiFiMulti.h>


ESP8266WiFiMulti WiFiMulti;
RemoteMe& remoteMe = RemoteMe::getInstance(TOKEN, DEVICE_ID);

BME280 mySensor;

// the setup function runs once when you press reset or power the board
void setup() {
	
	mySensor.settings.commInterface = I2C_MODE;
	mySensor.settings.I2CAddress = 0x76;


	//***Operation settings*****************************//

	//runMode can be:
	//  0, Sleep mode
	//  1 or 2, Forced mode
	//  3, Normal mode
	mySensor.settings.runMode = 3; //Forced mode

								   //tStandby can be:
								   //  0, 0.5ms
								   //  1, 62.5ms
								   //  2, 125ms
								   //  3, 250ms
								   //  4, 500ms
								   //  5, 1000ms
								   //  6, 10ms
								   //  7, 20ms
	mySensor.settings.tStandby = 0;

	//filter can be off or number of FIR coefficients to use:
	//  0, filter off
	//  1, coefficients = 2
	//  2, coefficients = 4
	//  3, coefficients = 8
	//  4, coefficients = 16
	mySensor.settings.filter = 0;

	//tempOverSample can be:
	//  0, skipped
	//  1 through 5, oversampling *1, *2, *4, *8, *16 respectively
	mySensor.settings.tempOverSample = 1;

	//pressOverSample can be:
	//  0, skipped
	//  1 through 5, oversampling *1, *2, *4, *8, *16 respectively
	mySensor.settings.pressOverSample = 1;

	//humidOverSample can be:
	//  0, skipped
	//  1 through 5, oversampling *1, *2, *4, *8, *16 respectively
	mySensor.settings.humidOverSample = 1;
	delay(10);  //Make sure sensor had enough time to turn on. BME280 requires 2ms to start up.         Serial.begin(57600);

	mySensor.begin();

	//--------
	WiFiMulti.addAP(WIFI_NAME, WIFI_PASSWORD);
	while (WiFiMulti.run() != WL_CONNECTED) {
		delay(100);
	}

	remoteMe.setUserSyncMessageListener(onUserSyncMessage);
	remoteMe.setupTwoWayCommunication();

	remoteMe.sendRegisterDeviceMessage(DEVICE_NAME);

	
}


void onUserSyncMessage(uint16_t senderDeviceId, uint16_t dataSize, uint8_t* data, uint16_t &returnDataSize, uint8_t *&returnData)
{
	uint16_t pos = 0;

	returnDataSize = 12;//3 data each float so 4 bytes
	returnData = (uint8_t*)malloc(returnDataSize);
	

	RemoteMeMessagesUtils::putFloat(returnData,pos, (mySensor.readTempC()));
	RemoteMeMessagesUtils::putFloat(returnData, pos, (mySensor.readFloatPressure() ));
	RemoteMeMessagesUtils::putFloat(returnData, pos, (mySensor.readFloatHumidity() ));
	
}


void loop()
{
	remoteMe.loop();
}

javascript- data on request

JavaScript
var remoteme;

function setup(){

	remoteme = new RemoteMe({
		automaticlyConnectWS: true,
		automaticlyConnectWebRTC:false,
		webSocketConnectionChange: webSocketConnectionChange,
		webRTCConnectionChange: undefined,
		mediaConstraints: {'mandatory': {'OfferToReceiveAudio': false, 'OfferToReceiveVideo': false}}
	});
}


function readDataNow(){
	remoteme.sendUserSyncMessageWebSocket(temperatureArduinoDeviceId,[],onResponse);
}


function onResponse(output){
	var data = new RemoteMeData(output);


	var temp = data.popFloat32();

	var pressure = data.popFloat32();
	var humm = data.popFloat32();
	$("#tempOut").html(temp.toFixed(2)+" C");
	$("#pressOut").html((pressure/100).toFixed(2)+" hPa");
	$("#hummOut").html(humm.toFixed(2)+" %");


}

function webSocketConnectionChange(state){

	if (state==WebsocketConnectingStatusEnum.CONNECTED){
		readDataNow();
	}
}

html - data on request

HTML
<html>
<head>
    <meta charset="UTF-8">
    <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>

    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.3/css/bootstrap.min.css" integrity="sha384-Zug+QiDoJOrZ5t4lssLdxGhVrurbmBWopoEl+M6BdEfwnCJZtKxi1KgxUyJq13dy" crossorigin="anonymous">
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.3/js/bootstrap.min.js" integrity="sha384-a5N7Y/aK3qNeh15eJKGWxsqtnX/wWdSZSKp+81YjTmS15nvnvxKHuzaWwXHDli+4" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>


    <script src="https://cdn.rawgit.com/remoteme/webPageTemplates/master/base/remoteMe_1_03.js"></script>
    <script src="https://cdn.rawgit.com/remoteme/webPageTemplates/master/base/remoteMeMessages_1_02.js"></script>
    <script src="https://cdn.rawgit.com/remoteme/webPageTemplates/master/base/adapter.js"></script>
    <script src="https://cdn.rawgit.com/remoteme/webPageTemplates/master/base/control.js"></script>
    <script src="https://cdn.rawgit.com/remoteme/webPageTemplates/master/base/gauge.js"></script>
    <script src="https://cdn.rawgit.com/remoteme/webPageTemplates/master/base/operationTimer.js"></script>



    <script>

		var thisDeviceId=####deviceId#;
		var temperatureArduinoDeviceId=204;

    </script>
    <script src="script.js"></script>


    <link rel="stylesheet" type="text/css" href="styles.css">
</head>

<body>



<div id="output" style="width:100%;height:80px">
    
    <table>
        <tr>
            <td>
                Temperature
            </td>
            <td class="out" id="tempOut">
                ...
            </td>
        </tr>
        <tr>
            <td>
                Humidity
            </td>
            <td class="out" id="hummOut">
                ...
            </td>
        </tr>
        <tr>
            <td>
                Pressure
            </td>
            <td class="out" id="pressOut">
                ...
            </td>
        </tr>
        <tr>
            <td colspan="2"> <button onClick='readDataNow()'>Refresh</button>
                </td>
        </tr>
    </table>
   
</div>


<script>
	setup();
</script>
</body>
</html>

styles data on request

CSS
table{
    font-size:40pt;
    margin:20pt;

}
table td{
    color:gray;
    padding-right:50pt;

}

table td.out{
    color:black;
}
button{
    width: 100%;
}

arduino - data into database

Arduino
#define WIFI_NAME "ania24"
#define WIFI_PASSWORD "tuchowkrakow"
#define DEVICE_ID 2045
#define DEVICE_NAME "Weather Station"
#define TOKEN "~5335_Xy7sIFKNpSVj("

#define WEBPAGE_DEVICE_ID 1001


#include <stdint.h>
#include "SparkFunBME280.h"

#include "Wire.h"
#include "SPI.h"



#include <ArduinoHttpClient.h>
#include <RemoteMe.h>
#include <ESP8266WiFi.h>

#include <ESP8266WiFiMulti.h>

ESP8266WiFiMulti WiFiMulti;
RemoteMe& remoteMe = RemoteMe::getInstance(TOKEN, DEVICE_ID);

BME280 mySensor;





void sort(double a[], int size) {
    for(int i=0; i<(size-1); i++) {
        for(int o=0; o<(size-(i+1)); o++) {
                if(a[o] > a[o+1]) {
                    double t = a[o];
                    a[o] = a[o+1];
                    a[o+1] = t;
                }
        }
    }
}



// the setup function runs once when you press reset or power the board
void setup() {
  
  Serial.begin(9600);
 while(!Serial){
  ;
  }

  
  
  //--------
  
  WiFiMulti.addAP(WIFI_NAME, WIFI_PASSWORD);
  while (WiFiMulti.run() != WL_CONNECTED) {
    delay(100);
  }


    remoteMe.setupTwoWayCommunication();


    remoteMe.sendRegisterDeviceMessage(DEVICE_NAME);

  

    mySensor.settings.commInterface = I2C_MODE;
    mySensor.settings.I2CAddress = 0x76;
  
  
    //***Operation settings*****************************//
  
    //runMode can be:
    //  0, Sleep mode
    //  1 or 2, Forced mode
    //  3, Normal mode
    mySensor.settings.runMode = 3; //Forced mode
  
                     //tStandby can be:
                     //  0, 0.5ms
                     //  1, 62.5ms
                     //  2, 125ms
                     //  3, 250ms
                     //  4, 500ms
                     //  5, 1000ms
                     //  6, 10ms
                     //  7, 20ms
    mySensor.settings.tStandby = 0;
  
   
    mySensor.settings.filter = 4;
  
   
    mySensor.settings.tempOverSample = 5;
    mySensor.settings.pressOverSample = 5;
    mySensor.settings.humidOverSample = 5;
   
   
   mySensor.begin();
 

  
}

void loop(){
  
  
  double temp[10];
  double pressure[10];
  double humm[10];
  for(int i=0;i<9;i++){
    temp[i]= mySensor.readTempC();
    pressure[i]= mySensor.readFloatPressure();
    humm[i]= mySensor.readFloatHumidity();
    delay(100);
  }

  sort(temp,10);
  sort(humm,10);
  sort(pressure,10);




    remoteMe.sendAddDataMessage(1, RemotemeStructures::_5M, 0, temp[5]);
    remoteMe.sendAddDataMessage(2, RemotemeStructures::_5M, 0, pressure[5]);
    remoteMe.sendAddDataMessage(3, RemotemeStructures::_5M, 0,humm[5]);

    remoteMe.disconnect();
  
    ESP.deepSleep(1e6*60*4);//4min

  
}

javascript - data into database

JavaScript
var remoteme;

function setup(){

	


	remoteme = new RemoteMe({
		automaticlyConnectWS: false,
		automaticlyConnectWebRTC:false,
		webSocketConnectionChange: undefined,
		webRTCConnectionChange: undefined,
		mediaConstraints: {'mandatory': {'OfferToReceiveAudio': false, 'OfferToReceiveVideo': false}}
	});
	createChart();
}







function createChart(){

   var yestarday=moment().subtract(1, 'days').format("DD.MM.YYYY HH:mm");
   var now=moment().format("DD.MM.YYYY HH:mm");


	var url =`/api/rest/v1/data/get/dd.MM.yyyy HH:mm/${yestarday}/${now}/1,2,3/`;

	$.get(url, function(data, status){




		var trace1 = {
			x: data[0].datas,
			y:  data[0].value,
			name: "temperature",
			type: "area"
		};
		var trace2 = {
			x: data[1].datas,
			y:  data[1].value,
			name: "pressure",
			yaxis: "y2",
			type: "scatter"
		};
		var trace3 = {
			x: data[2].datas,
			y:  data[2].value,
			name: "humidity",
			yaxis: "y3",
			type: "scatter"
		};

		var data = [trace1, trace2, trace3];
		var layout = {
			title: "temperature humidity pressure",
			xaxis:{
				categoryorder: "category ascending"
			},
			yaxis: {

				title: "C",
				titlefont: {color: "#1f77b4"},
				tickfont: {color: "#1f77b4"}
			},
			yaxis2: {

				title: "PSI",
				titlefont: {color: "#ff7f0e"},
				tickfont: {color: "#ff7f0e"},
				anchor: "free",
				overlaying: "y",
				side: "left",
				position: 0.05
			},
			yaxis3: {

				title: "%Humm",
				titlefont: {color: "#d62728"},
				tickfont: {color: "#d62728"},
				anchor: "x",
				overlaying: "y",
				side: "right"
			}
		};

		Plotly.newPlot('chartDiv', data,layout);

	});

}

html - data into database

HTML
<html>
<head>
    <meta charset="UTF-8">
    <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>

    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.3/css/bootstrap.min.css" integrity="sha384-Zug+QiDoJOrZ5t4lssLdxGhVrurbmBWopoEl+M6BdEfwnCJZtKxi1KgxUyJq13dy" crossorigin="anonymous">
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.3/js/bootstrap.min.js" integrity="sha384-a5N7Y/aK3qNeh15eJKGWxsqtnX/wWdSZSKp+81YjTmS15nvnvxKHuzaWwXHDli+4" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>


    <script src="https://cdn.rawgit.com/remoteme/webPageTemplates/master/base/remoteMe_1_03.js"></script>
    <script src="https://cdn.rawgit.com/remoteme/webPageTemplates/master/base/remoteMeMessages_1_02.js"></script>
    <script src="https://cdn.rawgit.com/remoteme/webPageTemplates/master/base/adapter.js"></script>
    <script src="https://cdn.rawgit.com/remoteme/webPageTemplates/master/base/control.js"></script>
    <script src="https://cdn.rawgit.com/remoteme/webPageTemplates/master/base/gauge.js"></script>
    <script src="https://cdn.rawgit.com/remoteme/webPageTemplates/master/base/operationTimer.js"></script>
    <script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
    <script src="https://momentjs.com/downloads/moment.min.js"></script>


    <script>

		var thisDeviceId=####deviceId#;
		var temperatureArduinoDeviceId=2045;

    </script>
    <script src="script.js"></script>


</head>

<body>



<div id="chartDiv" style="width:100%; height:400px;border:1px solid gray" >
</div>
<script>
	setup();
</script>
</body>
</html>

Credits

remoteMe
0 projects • 2 followers

Comments