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

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

This site uses Akismet to reduce spam. Learn how your comment data is processed.