Skip to content

Instantly share code, notes, and snippets.

@j7nn7k
Last active May 2, 2019 01:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save j7nn7k/df0b6a76973374596bbe3f399afde781 to your computer and use it in GitHub Desktop.
Save j7nn7k/df0b6a76973374596bbe3f399afde781 to your computer and use it in GitHub Desktop.
Wifi thermometer powerd by arduino compatible esp8266, DTH11 sensor and Azure IoT Hub
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <WiFiUdp.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <time.h>
#include <sys/time.h>
#include <AzureIoTHub.h>
#include <AzureIoTProtocol_MQTT.h>
#include <ArduinoJson.h>
#include <DHT.h>
#define DHTTYPE DHT11
#define DHTPIN 13
DHT dht(DHTPIN, DHTTYPE);
float humidity, temperature; // Values read from sensor
#define IOT_CONFIG_CONNECTION_STRING "GET_THIS_FROM_AZURE_IOT_HUB"
#define DEVICE_ID "YOUR_DEVICES_ID"
#define WIFI_SSID "YOUR_WIFI_SSID"
#define WIFI_PW "YOUR_WIFI_PW"
#define MESSAGE_MAX_LEN 256
static bool messagePending = false;
static IOTHUB_CLIENT_LL_HANDLE iotHubClientHandle;
// Time to sleep (in seconds):
const int sleepTimeSec = 10;
void setup()
{
delay(1000);
Serial.begin(115200);
connect();
initTime();
iotHubClientHandle = IoTHubClient_LL_CreateFromConnectionString(IOT_CONFIG_CONNECTION_STRING, MQTT_Protocol);
if (iotHubClientHandle == NULL)
{
Serial.println("Failed on IoTHubClient_CreateFromConnectionString.");
while (1);
}
}
void loop()
{
if (!messagePending){
readSensorData();
char messagePayload[MESSAGE_MAX_LEN];
composeMessage(messagePayload);
queueMessage(iotHubClientHandle, messagePayload);
Serial.println("mesage queued - not sent yet");
}
IoTHubClient_LL_DoWork(iotHubClientHandle);
Serial.println("-");
delay(500);
}
void connect()
{
if (WiFi.status() == WL_CONNECTED)
{
return;
}
// Connect to WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(WIFI_SSID);
WiFi.begin(WIFI_SSID, WIFI_PW);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
}
void initTime() {
time_t epochTime;
configTime(0, 0, "pool.ntp.org", "time.nist.gov");
while (true) {
epochTime = time(NULL);
if (epochTime == 0) {
Serial.println("Fetching NTP epoch time failed! Waiting 2 seconds to retry.");
delay(2000);
} else {
Serial.print("Fetched NTP epoch time is: ");
Serial.println(epochTime);
break;
}
}
}
void readSensorData() {
delay(2000);
humidity = dht.readHumidity(); // Read humidity (percent)
temperature = dht.readTemperature(); // Read temperature as Celsius
}
void composeMessage(char *payload)
{
StaticJsonBuffer<MESSAGE_MAX_LEN> jsonBuffer;
JsonObject &root = jsonBuffer.createObject();
root["deviceId"] = DEVICE_ID;
// NAN is not the valid json, change it to NULL
if (std::isnan(temperature))
{
root["temperature"] = NULL;
}
else
{
root["temperature"] = temperature;
}
if (std::isnan(humidity))
{
root["humidity"] = NULL;
}
else
{
root["humidity"] = humidity;
}
root.printTo(payload, MESSAGE_MAX_LEN);
}
static void queueMessage(IOTHUB_CLIENT_LL_HANDLE iotHubClientHandle, char *buffer)
{
IOTHUB_MESSAGE_HANDLE messageHandle = IoTHubMessage_CreateFromByteArray((const unsigned char *)buffer, strlen(buffer));
if (messageHandle == NULL)
{
Serial.println("Unable to create a new IoTHubMessage.");
}
else
{
Serial.printf("Queueing message: %s.\r\n", buffer);
if (IoTHubClient_LL_SendEventAsync(iotHubClientHandle, messageHandle, onMessageSentCallback, NULL) != IOTHUB_CLIENT_OK)
{
Serial.println("Failed to hand over the message to IoTHubClient.");
}
else
{
messagePending = true;
Serial.println("IoTHubClient queued the message for delivery.");
}
IoTHubMessage_Destroy(messageHandle);
}
}
static void onMessageSentCallback(IOTHUB_CLIENT_CONFIRMATION_RESULT result, void *userContextCallback)
{
if (IOTHUB_CLIENT_CONFIRMATION_OK == result)
{
Serial.println("Message sent! Going to deep sleep!");
// remember to tie the RST pin to GPIO 16 on the ESP8266
// https://www.losant.com/blog/making-the-esp8266-low-powered-with-deep-sleep
ESP.deepSleep(sleepTimeSec * 1000000);
delay(5000);
}
else
{
Serial.println("Failed to send message to Azure IoT Hub");
}
messagePending = false;
}
@j7nn7k
Copy link
Author

j7nn7k commented Dec 10, 2017

Note that you have to install a couple of dependencies for the code to compile. The required dependencies are:

  • AzureIoTHub
  • AzureIoTUtility
  • AzureIoTProtocol_MQTT
  • ArduinoJson
  • DHT sensor library
  • Adafruit Unified Sensor

@Bunkr1
Copy link

Bunkr1 commented Jan 8, 2019

Jannik,

I wounder if you could help me, I tried to load your code onto Arduino IDE and I'm getting this error code? Any ideas/pointers please?
Arduino: 1.8.8 (Windows 7), Board: "NodeMCU 0.9 (ESP-12 Module), 80 MHz, Flash, Enabled, 4M (no SPIFFS), v2 Lower Memory, Disabled, None, Only Sketch, 115200"

Build options changed, rebuilding all
In file included from C:\Users\Sugden-brook\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0-beta2\libraries\ESP8266WiFi\src/WiFiClient.h:25:0,

             from C:\Users\Sugden-brook\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0-beta2\libraries\ESP8266WiFi\src/ESP8266WiFi.h:39,

             from C:\Users\Sugden-brook\Documents\Arduino\libraries\AzureIoTUtility\src\adapters\sslClient_arduino.cpp:9:

c:\users\sugden-brook\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\2.5.0-3-20ed2b9\xtensa-lx106-elf\include\c++\4.8.2\bits\random.tcc: In member function 'void std::poisson_distribution<_IntType>::param_type::_M_initialize()':

C:\Users\Sugden-brook\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0-beta2\cores\esp8266/Arduino.h:137:22: error: expected unqualified-id before '(' token

#define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))

                  ^

c:\users\sugden-brook\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\2.5.0-3-20ed2b9\xtensa-lx106-elf\include\c++\4.8.2\bits\random.tcc: In member function 'void std::binomial_distribution<_IntType>::param_type::_M_initialize()':

C:\Users\Sugden-brook\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0-beta2\cores\esp8266/Arduino.h:137:22: error: expected unqualified-id before '(' token

#define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))

                  ^

C:\Users\Sugden-brook\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0-beta2\cores\esp8266/Arduino.h:137:22: error: expected unqualified-id before '(' token

#define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))

                  ^

exit status 1
Error compiling for board NodeMCU 0.9 (ESP-12 Module).

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

@kevinunger
Copy link

Jannik,

I wounder if you could help me, I tried to load your code onto Arduino IDE and I'm getting this error code? Any ideas/pointers please?
Arduino: 1.8.8 (Windows 7), Board: "NodeMCU 0.9 (ESP-12 Module), 80 MHz, Flash, Enabled, 4M (no SPIFFS), v2 Lower Memory, Disabled, None, Only Sketch, 115200"

Build options changed, rebuilding all
In file included from C:\Users\Sugden-brook\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0-beta2\libraries\ESP8266WiFi\src/WiFiClient.h:25:0,

             from C:\Users\Sugden-brook\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0-beta2\libraries\ESP8266WiFi\src/ESP8266WiFi.h:39,

             from C:\Users\Sugden-brook\Documents\Arduino\libraries\AzureIoTUtility\src\adapters\sslClient_arduino.cpp:9:

c:\users\sugden-brook\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\2.5.0-3-20ed2b9\xtensa-lx106-elf\include\c++\4.8.2\bits\random.tcc: In member function 'void std::poisson_distribution<_IntType>::param_type::_M_initialize()':

C:\Users\Sugden-brook\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0-beta2\cores\esp8266/Arduino.h:137:22: error: expected unqualified-id before '(' token

#define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))

                  ^

c:\users\sugden-brook\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\2.5.0-3-20ed2b9\xtensa-lx106-elf\include\c++\4.8.2\bits\random.tcc: In member function 'void std::binomial_distribution<_IntType>::param_type::_M_initialize()':

C:\Users\Sugden-brook\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0-beta2\cores\esp8266/Arduino.h:137:22: error: expected unqualified-id before '(' token

#define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))

                  ^

C:\Users\Sugden-brook\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0-beta2\cores\esp8266/Arduino.h:137:22: error: expected unqualified-id before '(' token

#define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))

                  ^

exit status 1
Error compiling for board NodeMCU 0.9 (ESP-12 Module).

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

I had this error too. 'Fixed' it by using the 2.4.0 version of the ESP8266. Select this version instead of the 2.5.0 version in the arduino board manager.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment