Sterownik do szklarni
Aktualne funkcje:
- podlewanie
- temperatura
- wilgotność
Całość poskładana na płytce uniwersalnej:
- zasilacz Hi-Link 5V
- regulator na 3,3V
- ESP-12
- moduł przekaźnika
- czujnik BME280
Opis podłączeń:
Programator (od lewej, góra):
TX – NC – RST – +3,3V
GND – GPIO2 – GPIO0 – RX
Bluetooth (do monitorowania seriala)(od lewej):
NC – +3,3V – GND – TX – RX – NC
Śrubowe (od lewej):
GPIO5 (SDA) – GPIO4 (SDC) – +3,3V – GND – +5V – GPIO13 – GPIO12 – GPIO14 – GPIO16
/* ESP_Szklarnia_v1
*
* MQTT/SUB
* szklarnia/rel -> OFF/ON = wyłącz/włącz podlewanie
*
* MQTT.PUB
* szklarnia/rel/pot -> OFF/ON = potwierdzenie stanu podlewania
* szklarnia/tmp -> temperatura
* szklarnia/hum -> wilgotność
*
*
*/
#include
#include
#include
#include
BlueDot_BME280 bme280 = BlueDot_BME280();
const char* ssid = "SSID";
const char* password = "HASLO";
const char* mqtt_server = "192.168.10.20";
const char* mqtt_client = "ESP_Szklarnia_thr";
const char* mqtt_user = "mqtt_uzytkownik";
const char* mqtt_pass = "mqtt_haslo";
long czas = 1000; //co ile ma być odczyt z czujników w milisekundach
int licznik = 60; //co ile odczytów wysyłamy MQTT
WiFiClient espClient;
PubSubClient client(espClient);
long last_czas = 0;
float tmp_p, tmp_s, tmp_o, hum_p, hum_s, hum_o;
int licz = 1;
int s_rel, l_rel;
char bufor[10];
String message="";
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, 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_client, mqtt_user, mqtt_pass)) {
Serial.println("connected");
// Once connected, publish an announcement...
// client.publish("outTopic", "hello world");
// ... and resubscribe
client.subscribe("szklarnia/rel");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void setup() {
pinMode(BUILTIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an output
pinMode(13, OUTPUT); // Initialize the BUILTIN_LED pin as an output
Serial.begin(115200);
Serial.println(F("ESP_Szklarnia_tmp_hum_rel"));
Wire.pins(5, 4); ///sda 5 i sdc 4
Wire.begin(5, 4);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
bme280.parameter.communication = 0; //Set to 0 for I2C (default value)
bme280.parameter.I2CAddress = 0x76; //Available by connecting the SDO pin to ground
bme280.parameter.sensorMode = 0b11; //In normal mode the sensor measures continually (default value)
bme280.parameter.IIRfilter = 0b101; //factor 16 (default value)
bme280.parameter.humidOversampling = 0b101; //factor 16 (default value)
bme280.parameter.tempOversampling = 0b101; //factor 16 (default value)
bme280.parameter.pressOversampling = 0b101; //factor 16 (default value)
bme280.parameter.pressureSeaLevel = 1013.25; //default value of 1013.25 hPa
bme280.parameter.tempOutsideCelsius = 15; //default value of 15°C
if (bme280.init() != 0x60) { Serial.println(F("BME280\t\tERROR")); while(1); }
else { Serial.println(F("BME280\t\tSTART")); }
//digitalWrite(13,HIGH);
//delay(2000);
//digitalWrite(13,LOW);
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Wiadomosc [");
Serial.print(topic);
Serial.print("] '");
for (int i=0;i<length;i++) {
Serial.print((char)payload[i]);
}
Serial.print("' dlugosc=");
Serial.println(length);
if (strcmp (topic,"szklarnia/rel") == 0) {
Serial.print(F("Przekaznik:\t"));
for (int i=0;i<length;i++) { message += (char)payload[i]; } Serial.println(message); if(message == "ON"){digitalWrite(13,HIGH);Serial.println(F("Przekaźnik ON"));} if(message == "OFF"){digitalWrite(13,LOW);Serial.println(F("Przekaźnik OFF"));} message=""; } } void loop() { if (!client.connected()) { reconnect(); } client.loop(); long now = millis(); if (now - last_czas > czas) {
last_czas = now;
tmp_p = bme280.readTempC();
hum_p = bme280.readHumidity();
tmp_s = (tmp_s + tmp_p);
hum_s = (hum_s + hum_p);
Serial.println("Parametr:\tAktualny:\tSuma");
Serial.print(F("Tmp:\t"));Serial.print(tmp_p);Serial.print(F("\t"));Serial.println(tmp_s);
Serial.print(F("Hum:\t"));Serial.print(hum_p);Serial.print(F("\t"));Serial.println(hum_s);
licz++;
Serial.print(F("Licznik:\t"));Serial.print(licz);Serial.print(F("/"));Serial.println(licznik);
if(licz == licznik){
tmp_s = (tmp_s + tmp_p)/licz;
hum_s = (hum_s + hum_p)/licz;
Serial.println(F("Średnie:\t"));
Serial.print(F("Tmp:\t"));Serial.println(tmp_s);
Serial.print(F("Hum:\t"));Serial.println(hum_s);
if(tmp_s != tmp_o){
tmp_o = tmp_s;
Serial.print(F("MQTT_tmp:\t"));
Serial.println(tmp_s);
dtostrf(tmp_o , 0, 1, bufor);
client.publish("szklarnia/tmp", bufor, true);
}
if(hum_s != hum_o){
hum_o = hum_s;
Serial.print(F("MQTT_hum:\t"));
Serial.println(hum_s);
dtostrf(hum_o , 0, 0, bufor);
client.publish("szklarnia/hum", bufor, true);
}
tmp_s = 0;
hum_s = 0;
licz = 1;
}
}
//POTWIERDZENIE STANU WYJSC
s_rel = digitalRead(13);
if(s_rel != l_rel){
if(s_rel==1){client.publish("szklarnia/rel/pot", "ON", true);}
else{client.publish("szklarnia/rel/pot", "OFF", true);}
}
l_rel = s_rel;
}