Transfer the data via MQTT

This commit is contained in:
coolneng 2023-04-03 03:26:12 +02:00
parent cbd7580002
commit 1ad08b06ff
Signed by: coolneng
GPG Key ID: 9893DA236405AF57
4 changed files with 63 additions and 18 deletions

View File

@ -15,5 +15,4 @@ framework = arduino
lib_deps = lib_deps =
adafruit/DHT sensor library@^1.4.4 adafruit/DHT sensor library@^1.4.4
adafruit/Adafruit Unified Sensor@^1.1.9 adafruit/Adafruit Unified Sensor@^1.1.9
build_type=debug knolleary/PubSubClient@^2.8
monitor_filters = esp8266_exception_decoder

View File

@ -7,21 +7,35 @@
DHT dht(DHTPIN, DHTTYPE); DHT dht(DHTPIN, DHTTYPE);
const int fc28_pin = A0; const int fc28_pin = A0;
// TODO Tweak threshold to get good value
const int soil_threshold = 40; const int soil_threshold = 40;
const int num_topics = 3;
const int max_connection_attempts = 60;
const char *topics[] = {"homeostasis/temperature", "homeostasis/humidity",
"homeostasis/soil_humidity"};
const char *device_id = "homeostasis";
WiFiClient wlan_client;
PubSubClient mqtt_client(wlan_client);
bool check_valid_value(float value) {
return (!isnan(value) && value >= 0 && value <= 100);
}
void setup() { void setup() {
Serial.begin(9600); Serial.begin(9600);
dht.begin(); dht.begin();
wlan_connection(60); connect_wlan(max_connection_attempts);
} }
void loop() { void loop() {
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
int analog_val = analogRead(fc28_pin); int analog_val = analogRead(fc28_pin);
int soil_percentage = map(analog_val, 0, 1023, 0, 100); int soil_percentage = map(analog_val, 0, 1023, 0, 100);
char buffer[200]; float data[] = {temperature, humidity, static_cast<float>(soil_percentage)};
sprintf(buffer, "Temperature: %.2f°C Humidity: %.2f%% Soil humidity: %i%%", if (check_valid_value(temperature) && check_valid_value(humidity)) {
dht.readTemperature(), dht.readHumidity(), soil_percentage); mqtt_transfer(mqtt_client, device_id, topics, data, num_topics);
Serial.println(buffer); }
delay(30000); disconnect_mqtt(mqtt_client, topics, num_topics);
enter_deep_sleep(false); enter_deep_sleep(false);
} }

View File

@ -1,6 +1,5 @@
#include "wlan.h" #include "wlan.h"
#include "credentials.h" #include "credentials.h"
#include <ESP8266WiFi.h>
void initial_connection() { void initial_connection() {
WiFi.begin(SSID, PSK); WiFi.begin(SSID, PSK);
@ -9,27 +8,52 @@ void initial_connection() {
WiFi.setAutoReconnect(true); WiFi.setAutoReconnect(true);
} }
void wlan_connection(int max_retries) { void connect_wlan(const int max_retries) {
if (WiFi.SSID() != SSID) if (WiFi.SSID() != SSID)
initial_connection(); initial_connection();
int retries = 0; int retries = 0;
while (WiFi.status() != WL_CONNECTED) { while (WiFi.status() != WL_CONNECTED) {
retries++;
if (retries == max_retries) if (retries == max_retries)
enter_deep_sleep(true); enter_deep_sleep(true);
retries++;
delay(1000); delay(1000);
Serial.print("."); Serial.print(".");
} }
Serial.println("WiFi connected"); Serial.println("WiFi connected");
Serial.println(WiFi.localIP());
} }
void mqtt_connection(char *server, int port, char *fingerprint) { void connect_mqtt(PubSubClient &client, const char *device_id,
WiFiClientSecure client; const char **topics, int num_topics) {
client.connect(server, port); if (!client.connected())
client.setServer(MQTT_HOST, MQTT_PORT);
if (client.connect(device_id, MQTT_USER, MQTT_PASSWORD)) {
Serial.println("MQTT connected");
for (int i = 0; i < num_topics; i++)
client.subscribe(topics[i]);
}
}
void disconnect_mqtt(PubSubClient &client, const char **topics,
int num_topics) {
Serial.println("Disconnecting MQTT");
for (int i = 0; i < num_topics; i++)
client.unsubscribe(topics[i]);
client.disconnect();
}
void mqtt_transfer(PubSubClient &client, const char *device_id,
const char **topics, float *data, int num_topics) {
connect_mqtt(client, device_id, topics, num_topics);
for (int i = 0; i < num_topics; i++) {
char buffer[50];
sprintf(buffer, "%f", data[i]);
client.publish(topics[i], buffer);
}
Serial.println("Data transferred successfully");
} }
void enter_deep_sleep(bool wifi_timeout) { void enter_deep_sleep(bool wifi_timeout) {
Serial.println("Entering deep sleep");
if (wifi_timeout) if (wifi_timeout)
WiFi.disconnect(); WiFi.disconnect();
ESP.deepSleep(SLEEP_TIME, WAKE_RF_DEFAULT); ESP.deepSleep(SLEEP_TIME, WAKE_RF_DEFAULT);

View File

@ -1,11 +1,19 @@
#ifndef WLAN_H #ifndef WLAN_H
#define WLAN_H #define WLAN_H
const int SLEEP_TIME = 480000000; #include <ESP8266WiFi.h>
#include <PubSubClient.h>
const int SLEEP_TIME = 900000000;
const int WIFI_TIMEOUT = 10000; const int WIFI_TIMEOUT = 10000;
void wlan_connection(int max_retries); void initial_connection();
void prometheus_connection(char *server, int port, char *fingerprint); void connect_wlan(const int max_retries);
void connect_mqtt(PubSubClient &client, const char *device_id,
const char **topics, int num_topics);
void disconnect_mqtt(PubSubClient &client, const char **topics, int num_topics);
void mqtt_transfer(PubSubClient &client, const char *device_id,
const char **topics, float *data, int num_topics);
void enter_deep_sleep(bool wifi_timeout); void enter_deep_sleep(bool wifi_timeout);
#endif /* WLAN_H */ #endif /* WLAN_H */