/
mqtt-temp-sensor.ino
114 lines (89 loc) · 2.33 KB
/
mqtt-temp-sensor.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BME280.h>
#include <MQTTClient.h>
#include <ArduinoJson.h>
#include "WiFi.h"
#include "secrets.h"
Adafruit_BME280 bme ; // use I2C interface
Adafruit_Sensor *bme_temp = bme.getTemperatureSensor();
Adafruit_Sensor *bme_humidity = bme.getHumiditySensor();
WiFiClient net = WiFiClient();
MQTTClient client = MQTTClient(256);
void setupSensor() {
Serial.print("Initializing BME280 sensor...");
Wire.begin(16, 15);
if (!bme.begin()) {
Serial.println("failed");
while (1) delay(10);
}
Serial.println("OK");
}
void setupWiFi() {
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to Wi-Fi...");
while (WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print(".");
}
Serial.println("OK");
}
void setupMQTT() {
digitalWrite(LED_BUILTIN, HIGH);
if(WiFi.status() != WL_CONNECTED) {
setupWiFi();
}
client.begin(MQTT_BROKER, 31883, net);
Serial.print("Connecting to MQTT broker...");
while (!client.connect(MQTT_CLIENT_ID)) {
Serial.print(".");
delay(100);
}
if(!client.connected()){
Serial.println("fail");
return;
}
digitalWrite(LED_BUILTIN, LOW);
Serial.println("OK");
}
void publishMeasurement(const char* topic, char* measurement, float val) {
StaticJsonDocument<200> doc;
doc["time"] = millis();
doc[measurement] = val;
char jsonBuffer[512];
serializeJson(doc, jsonBuffer); // print to client
Serial.print("PUBLISH ");
Serial.print(topic);
Serial.print(" - ");
Serial.print(jsonBuffer);
Serial.print(" - ");
if(!client.publish(topic, jsonBuffer)) {
Serial.println("fail");
return;
};
Serial.println("OK");
}
void setup() {
Serial.begin(9600);
delay(1500); // extra time to allow host to connect
pinMode(LED_BUILTIN, OUTPUT);
setupSensor();
setupMQTT();
sensors_event_t temp_event, humidity_event;
bme_temp->getEvent(&temp_event);
bme_humidity->getEvent(&humidity_event);
publishMeasurement(TEMP_TOPIC, "temperature", temp_event.temperature);
publishMeasurement(HUMIDITY_TOPIC, "humidity", humidity_event.relative_humidity);
while(!client.loop()) {
Serial.print(".");
delay(1000);
}
delay(1000);
esp_sleep_enable_timer_wakeup(60000000);
esp_deep_sleep_start();
}
void loop() {
Serial.println("loop");
delay(1000);
}