// JSON
#include <ArduinoJson.h>
//WiFi
#include <WiFi.h>
//const char* ssid = "VA";
//const char* password = "qwerty123";
WiFiClient espClient;
//OLED
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
//MQTT
#include <PubSubClient.h>
#define wifi_ssid "YourSSID" //wifi ssid
#define wifi_password "YourPASS" //wifi password
#define mqtt_server "" // server name or IP
#define mqtt_user "" // username
#define mqtt_password "" // password
#define mqtt_clientId ""
PubSubClient client(espClient);
// MQTT Topics
#define humidity_topic "homeassistant/humidity"
#define temperature_topic "homeassistant/temperature"
#define co2_topic "homeassistant/co2"
//DHT
#include <DHT.h>
#include <DHT_U.h>
#define DHTTYPE DHT22 // Тип датчика
#define DHTPIN 4 //К какому пину подключен датчик DHT
DHT dht (DHTPIN, DHTTYPE);
//MQ135
#include <MQ135.h>
MQ135 gasSensor = MQ135 (A0); //Датчик газа подключен к аналоговому пину
//Timer
//#include <TimeLib.h>
//#include <SimpleTimer.h>
//SimpleTimer timer;
unsigned long lastSampleTime = 0;
const long sampleDelay = 30000;
void setup() {
Serial.begin(115200);
dht.begin();
//Wire.begin( I2C_SDA_PIN, I2C_SCL_PIN );
setupWifi();
client.setServer(mqtt_server, 1883);
//timer.setInterval(5000L,sendTemps);
//lightMeter.begin(BH1750_CONTINUOUS_HIGH_RES_MODE);
//OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
delay(2000);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 10);
// Display static text
display.println("loading");
}
void sendTemps (){
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)){
return;
}
float rzero = gasSensor.getRZero();
float ppm = gasSensor.getPPM();
float rzeroc = gasSensor.getCorrectedRZero(t, h);
float ppmc = gasSensor.getCorrectedPPM(t, h);
Serial.print("Humidity: ");
Serial.println(h);
Serial.print("Temperature: ");
Serial.println(t);
Serial.print("A0: ");
Serial.println(analogRead (A0));
Serial.print("Rzero: ");
Serial.println(rzero);
Serial.print("Rzeroc: ");
Serial.println(rzeroc);
Serial.print("PPM: ");
Serial.println(ppm);
Serial.print("PPMC: ");
Serial.println(ppmc);
}
void setupWifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(wifi_ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(wifi_ssid, wifi_password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect(mqtt_clientId, mqtt_user, mqtt_password)) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
unsigned long currentMillis = millis();
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)){
return;
}
float rzero = gasSensor.getRZero();
float ppm = gasSensor.getPPM();
float rzeroc = gasSensor.getCorrectedRZero(t, h);
float ppmc = gasSensor.getCorrectedPPM(t, h);
DynamicJsonDocument doc(1024);
doc["id"] = "sensors";
doc["humid"] = h;
doc["temp"] = t;
doc["co2"] = ppm;
// Serialize JSON document
String payload;
serializeJson(doc, payload);
client.publish("homeassistant/sensors", payload.c_str());
delay(30000);
//void topic2_subscriber(String topic, String message_h) {
//Serial.println(s+"Message arrived in function 2 ["+topic+"] "+message_h);
//client.publish("ext_sensor/Humidity_Ext", String(message_h).c_str(),true);
//Serial.println(s+"Message sended in topic ext_sensor/Humidity_Ext: "+message_h);
if (currentMillis - lastSampleTime >= sampleDelay) {
lastSampleTime = currentMillis;
if (isnan(t)) {
Serial.println("Error reading temperature!");
}
else {
client.publish(temperature_topic, String(t).c_str(), true);
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" *C");
}
// Get humidity event and print its value.
if (isnan(h)) {
Serial.println("Error reading humidity!");
}
else {
client.publish(humidity_topic, String(h).c_str(), true);
Serial.print("Humidity: ");
Serial.print(h);
Serial.println("%");
}
client.publish(co2_topic, String(ppm).c_str(), true);
Serial.print("CO2: ");
Serial.print(ppm);
Serial.println("ppm");
}
//SimpleTimer.run();
// OLED
// clear display
display.clearDisplay();
// display temperature
display.setTextSize(1);
display.setCursor(0,0);
display.print("Temperature: ");
display.setTextSize(2);
display.setCursor(0,10);
display.print(t);
display.print(" ");
display.setTextSize(1);
display.cp437(true);
display.write(167);
display.setTextSize(2);
display.print("C");
// display humidity
display.setTextSize(1);
display.setCursor(0, 35);
display.print("Humidity: ");
display.setTextSize(2);
display.setCursor(0, 45);
display.print(h);
display.print(" %");
display.display();
}