ELEKTRONEK.pl

19.05.2017

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; }