Podlewanie - czujnik wilgotności np gleby

User avatar
QLQ
Posts: 2279
Joined: Sun Sep 03, 2017 9:13 am
Location: Koszalin

Post

Projekt NA 100% przyda się do podlewania ogrodu / ew kwiatów w domu


Odświeżę trochę temat. Nasz kolega @elmaya zrobił doskonały projekt pod czujnik wilgotności gleby ! Przypadkowo natknąłem się na niego na wersji hiszpańskiej naszego forum. Mam ten zaszczyt , że mogę to Wam przedtawić i przetłumaczyć:
https://es-forum.supla.org/viewtopic.php?f=70&t=7522


Tłumaczenie:
"Dla wszystkich zainteresowanych testowaniem pojemnościowego czujnika wilgotności gleby
Używamy kanału temperatury i wilgotności. // obecnie projkekt po mojej prośbie jest przerobiony na samą wilgotność

Temperatura pokazuje odczyt czujnika analogowego "Nie jest to konieczne, ale nie ma niezależnego kanału dla wilgotności, więc używamy go" pokazuje wartość około 700 w stanie suchym (0%) i około 250 w szklance wody (100 %).
Wilgotność wykazuje wilgotność gleby od 0% do 100%.
Wymaga kalibracji w celu poprawnego odczytu "

Led = D4 "Led włączony do wemos / nodemcu"
Szybkie miganie „0,5 s” = brak połączenia / łączenia.
Powolne miganie „1,5 s” = WiFiConfig.
Wył. = Podłączony Ok.

Przycisk = D3:
Naciśnij i przytrzymaj przez co najmniej 5 sekund, aby uzyskać WiFiConfig. (Nazwa WiFiAP „CSM_Probe”)
KALIBRACJA:
3 kliknięcia, aby skalibrować i zapisać wartość czujnika przy minimalnej wilgotności 0% „wystawionej na działanie powietrza”
Dioda LED mignie 3 razy. Wartość w tym momencie zostaje zapisana

2 kliknięcia, aby skalibrować i zapisać wartość czujnika dla maksymalnej 100% wilgotności „zanurzonej w wodzie”
Dioda LED mignie 2 razy. Wartość w tym momencie zostaje zapisana.

Dla arduino wymagane są biblioteki:

CSM.h
CSM.rar
Skopiuj do: ...\ libraries \ SuplaDevice \ src \ supla \ sensor”

„hygro_meter.h” i „hygro_meter.cpp”
hygro_meter.rar
Skopiuj : .... libraries \ SuplaDevice \ src \ supla \ sensor”.

pozostałe biblioteki do projkektu gdyby ktoś z Was potrzebował są tu: https://es-forum.supla.org/download/file.php?id=16366
(oczywiście na nowych SuplaDevice)

DO WYBORU:

Kod źródłowy na kanale temperatury ( pokazuje wartość z pinu A0) i wilgotności

Binarka do wgrania przez FlashDownloadTool : https://es-forum.supla.org/download/file.php?id=13866

Code: Select all

#include "LittleFS.h" // LittleFS is declared 
#include <WiFiManager.h>
#include <ArduinoJson.h> //--------- V6 ------ 
#include <EEPROM.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPUpdateServer.h>
#include <ESP8266TrueRandom.h>
#include <Button3.h>
#include <Ticker.h> 
#include <SuplaDevice.h>  
#include <supla/sensor/CSM.h>
#include <supla/network/esp_wifi.h>
Supla::ESPWifi wifi("", "");  //------ Do not change----wifimanager takes care------

extern "C"
{
#include "user_interface.h"
}

//#define D0 16  //no internal pullup resistor
//#define D1  5
//#define D2  4
//#define D3  0  //must not be pulled low during power on/reset, toggles value during boot
//#define D4  2  //must not be pulled low during power on/reset, toggles value during boot
//#define D5 14
//#define D6 12
//#define D7 13
//#define D8 15  //must not be pulled high during power on/reset

#define status_led 2   // D4
#define wificonfig_pin 0  // D3  WiFiconfig 

char Supla_server[81]=("Unknown server address");
char Email[81]=("Unknown email address");                        
char Supla_name[51];
char Supla_status[51];
int C_W_state = HIGH; 
int last_C_W_state = HIGH;
unsigned long time_last_C_W_change = 0; 
long C_W_delay = 5000;                      // config delay 5 seconds        
bool shouldSaveConfig = false;
bool initialConfig = false; 
char GUID[SUPLA_GUID_SIZE];
char AUTHKEY[SUPLA_AUTHKEY_SIZE];
byte uuidNumber[16];
int s;
bool starting = true; 
bool Tik = true;
Button3 buttonA = Button3(wificonfig_pin);
ESP8266WebServer httpServer(81);
ESP8266HTTPUpdateServer httpUpdater;
WiFiManager wifiManager;
Ticker ticker;

Supla::Sensor::CSM *CSM1 = nullptr;

void tick() {
  int state = digitalRead(status_led);  
  digitalWrite(status_led, !state);     
}
void saveConfigCallback () {          
  Serial.println("Should save config");
  shouldSaveConfig = true;
}
void ondemandwifiCallback () {
 ticker.attach(1.5, tick);
   WiFiManagerParameter custom_Supla_server("server", "supla server", Supla_server, 81,"required");
   WiFiManagerParameter custom_Email("email", "Email", Email, 81,"required");
   WiFiManagerParameter custom_Supla_name("name", "Supla Device Name", Supla_name, 51,"required");
   WiFiManagerParameter custom_html_id21("<div><h4> - Supla State -   ");
   WiFiManagerParameter custom_html_id22( Supla_status);
   WiFiManagerParameter custom_html_id23( "</h4></div>");

   wifiManager.setBreakAfterConfig(true);
   wifiManager.setSaveConfigCallback(saveConfigCallback);
  
   wifiManager.addParameter(&custom_Supla_server);
   wifiManager.addParameter(&custom_Email);
   wifiManager.addParameter(&custom_Supla_name);
   wifiManager.addParameter(&custom_html_id21);
   wifiManager.addParameter(&custom_html_id22);
   wifiManager.addParameter(&custom_html_id23);

   wifiManager.setCustomHeadElement("<style>html{ background-color: #01DF3A;}</style><div class='s'><svg version='1.1' id='l' x='0' y='0' viewBox='0 0 200 200' xml:space='preserve'><path d='M59.3,2.5c18.1,0.6,31.8,8,40.2,23.5c3.1,5.7,4.3,11.9,4.1,18.3c-0.1,3.6-0.7,7.1-1.9,10.6c-0.2,0.7-0.1,1.1,0.6,1.5c12.8,7.7,25.5,15.4,38.3,23c2.9,1.7,5.8,3.4,8.7,5.3c1,0.6,1.6,0.6,2.5-0.1c4.5-3.6,9.8-5.3,15.7-5.4c12.5-0.1,22.9,7.9,25.2,19c1.9,9.2-2.9,19.2-11.8,23.9c-8.4,4.5-16.9,4.5-25.5,0.2c-0.7-0.3-1-0.2-1.5,0.3c-4.8,4.9-9.7,9.8-14.5,14.6c-5.3,5.3-10.6,10.7-15.9,16c-1.8,1.8-3.6,3.7-5.4,5.4c-0.7,0.6-0.6,1,0,1.6c3.6,3.4,5.8,7.5,6.2,12.2c0.7,7.7-2.2,14-8.8,18.5c-12.3,8.6-30.3,3.5-35-10.4c-2.8-8.4,0.6-17.7,8.6-22.8c0.9-0.6,1.1-1,0.8-2c-2-6.2-4.4-12.4-6.6-18.6c-6.3-17.6-12.7-35.1-19-52.7c-0.2-0.7-0.5-1-1.4-0.9c-12.5,0.7-23.6-2.6-33-10.4c-8-6.6-12.9-15-14.2-25c-1.5-11.5,1.7-21.9,9.6-30.7C32.5,8.9,42.2,4.2,53.7,2.7c0.7-0.1,1.5-0.2,2.2-0.2C57,2.4,58.2,2.5,59.3,2.5z M76.5,81c0,0.1,0.1,0.3,0.1,0.6c1.6,6.3,3.2,12.6,4.7,18.9c4.5,17.7,8.9,35.5,13.3,53.2c0.2,0.9,0.6,1.1,1.6,0.9c5.4-1.2,10.7-0.8,15.7,1.6c0.8,0.4,1.2,0.3,1.7-0.4c11.2-12.9,22.5-25.7,33.4-38.7c0.5-0.6,0.4-1,0-1.6c-5.6-7.9-6.1-16.1-1.3-24.5c0.5-0.8,0.3-1.1-0.5-1.6c-9.1-4.7-18.1-9.3-27.2-14c-6.8-3.5-13.5-7-20.3-10.5c-0.7-0.4-1.1-0.3-1.6,0.4c-1.3,1.8-2.7,3.5-4.3,5.1c-4.2,4.2-9.1,7.4-14.7,9.7C76.9,80.3,76.4,80.3,76.5,81z M89,42.6c0.1-2.5-0.4-5.4-1.5-8.1C83,23.1,74.2,16.9,61.7,15.8c-10-0.9-18.6,2.4-25.3,9.7c-8.4,9-9.3,22.4-2.2,32.4c6.8,9.6,19.1,14.2,31.4,11.9C79.2,67.1,89,55.9,89,42.6z M102.1,188.6c0.6,0.1,1.5-0.1,2.4-0.2c9.5-1.4,15.3-10.9,11.6-19.2c-2.6-5.9-9.4-9.6-16.8-8.6c-8.3,1.2-14.1,8.9-12.4,16.6C88.2,183.9,94.4,188.6,102.1,188.6z M167.7,88.5c-1,0-2.1,0.1-3.1,0.3c-9,1.7-14.2,10.6-10.8,18.6c2.9,6.8,11.4,10.3,19,7.8c7.1-2.3,11.1-9.1,9.6-15.9C180.9,93,174.8,88.5,167.7,88.5z'/></svg>");
   wifiManager.setMinimumSignalQuality(8);
   //wifiManager.setShowStaticFields(true); // force show static ip fields
   //wifiManager.setShowDnsFields(true);    // force show dns field always
   wifiManager.setConfigPortalTimeout(180);

   if (!wifiManager.startConfigPortal("CSM_Probe")) { Serial.println("Not connected to WiFi but continuing anyway.");} else { Serial.println("connected...yeey :)");}                
    strcpy(Supla_server, custom_Supla_server.getValue());
    strcpy(Email, custom_Email.getValue());
    strcpy(Supla_name, custom_Supla_name.getValue()); 
    if(strcmp(Supla_server, "get_new_guid_and_authkey") == 0){
      Serial.println("new guid & authkey.");
      EEPROM.write(300, 0);
      EEPROM.commit();
      ESP.reset(); 
    }
    WiFi.softAPdisconnect(true);   //  close AP
    ticker.detach();
    digitalWrite(status_led, HIGH);    
}
void status_func(int status, const char *msg) {    //    ------------------------ Status --------------------------
  if (s != status){
    s = status; 
      if (s != 10){
        strcpy(Supla_status, msg); 
  }  }            
}
void guid_authkey(void) {
  if (EEPROM.read(300) != 60){
    int eep_gui = 301;

    ESP8266TrueRandom.uuid(uuidNumber);

    String uuidString = "";
    for (int i = 0; i < 16; i++) {
      int topDigit = uuidNumber[i] >> 4;
      int bottomDigit = uuidNumber[i] & 0x0f;
      uuidString += "0123456789abcdef"[topDigit];
      uuidString += "0123456789abcdef"[bottomDigit];
    }
    int length_uuid = uuidString.length();
    for (int i = 0; i < length_uuid; ++i) {
      EEPROM.put(eep_gui + i, uuidString[i]);
    }

    int eep_aut = 341;

    ESP8266TrueRandom.uuid(uuidNumber);

    String uuidString2 = "";
    for (int i = 0; i < 16; i++) {
      int topDigit = uuidNumber[i] >> 4;
      int bottomDigit = uuidNumber[i] & 0x0f;
      uuidString2 += "0123456789abcdef"[topDigit];
      uuidString2 += "0123456789abcdef"[bottomDigit];
    }
    int length_uuid2 = uuidString2.length();
    for (int i = 0; i < length_uuid2; ++i) {
      EEPROM.put(eep_aut + i, uuidString2[i]);
    }
    EEPROM.write(300, 60);
    EEPROM.commit();
  }
  read_guid();
  read_authkey();
  Serial.print("GUID : ");Serial.println(read_guid()); 
  Serial.print("AUTHKEY : ");Serial.println(read_authkey()); 
}

String read_guid(void) {
  String read_eeprom = "";
  int i, ii = 0;
  int eep_star = 301;
  int end_guid = eep_star + SUPLA_GUID_SIZE;
  String temp_read = "0x";
  for (i = eep_star; i < end_guid + 16;  i = i + 1) {
    temp_read += char(EEPROM.read(i));
    read_eeprom += char(EEPROM.read(i));
    if ( (i % 2) == 0) {
      char *_guid = strcpy((char*)malloc(temp_read.length() + 1), temp_read.c_str());
      GUID[ii] = strtoul( _guid, NULL, 16);
      temp_read = "0x";
      ii++;
    }
  }
  return read_eeprom;
}
String read_authkey(void) {
  String read_eeprom = "";
  int i, ii = 0;
  int eep_star = 341;
  int end_authkey = eep_star + SUPLA_AUTHKEY_SIZE;
  String temp_read = "0x";
  for (i = eep_star; i < end_authkey + 16;  i = i + 1) {
    temp_read += char(EEPROM.read(i));
    read_eeprom += char(EEPROM.read(i));
    if ( (i % 2) == 0) {
      char *_authkey = strcpy((char*)malloc(temp_read.length() + 1), temp_read.c_str());
      AUTHKEY[ii] = strtoul( _authkey, NULL, 16);
      temp_read = "0x";
      ii++;
    }
  }
  return read_eeprom;
}

void setup() {

   wifi_set_sleep_type(NONE_SLEEP_T); 
    
  Serial.begin(115200);  
  pinMode(wificonfig_pin, INPUT_PULLUP);
  pinMode(status_led,OUTPUT); 
  ticker.attach(0.5, tick);
  
  EEPROM.begin(1024);
  if (EEPROM.read(300) != 60){initialConfig = true;} 
  guid_authkey();

  if (WiFi.SSID()==""){ initialConfig = true;} 

  buttonA.setClickHandler(click);
  buttonA.setDoubleClickHandler(doubleClick);
  buttonA.setTripleClickHandler(tripleClick);

  if (LittleFS.begin()) {  // ------------------------- wificonfig read -----------------
    Serial.println("mounted file system");
    if (LittleFS.exists("/config.json")) {
      Serial.println("reading config file");
       File configFile = LittleFS.open("/config.json", "r");
      if (configFile) {
        Serial.println("opened config file");
         size_t size = configFile.size();
         std::unique_ptr<char[]> buf(new char[size]);
         configFile.readBytes(buf.get(), size);
        DynamicJsonDocument json(1024);
        DeserializationError deserializeError = deserializeJson(json, buf.get());
        serializeJsonPretty(json, Serial);
        if (!deserializeError) {Serial.println("\nparsed json");         
          if (json.containsKey("Supla_server")) strcpy(Supla_server, json["Supla_server"]);
          if (json.containsKey("Email")) strcpy(Email, json["Email"]);
          if (json.containsKey("Supla_name")) strcpy(Supla_name, json["Supla_name"]);       
        } else {
          Serial.println("failed to load json config");
           initialConfig = true;
        }
        configFile.close(); 
      }
    }
   } else {
    Serial.println("failed to mount FS");
  }
   wifi_station_set_hostname(Supla_name);
   
  WiFi.mode(WIFI_STA); // Force to station mode because if device was switched off while in access point mode it will start up next time in access point mode.

  SuplaDevice.setStatusFuncImpl(&status_func);
  SuplaDevice.setName(Supla_name);
  wifi.enableSSL(false); 
   
  CSM1 = new Supla::Sensor::CSM(A0,100); // pin, EEPROM offset

     SuplaDevice.begin(GUID,Supla_server,Email,AUTHKEY);
        
}

void loop() {
   if (initialConfig == true){ondemandwifiCallback();}

   int C_W_read = digitalRead(wificonfig_pin);{  
   if (C_W_read != last_C_W_state) {            
     time_last_C_W_change = millis();
   }
   if ((millis() - time_last_C_W_change) > C_W_delay) {     
     if (C_W_read != C_W_state) {     
       C_W_state = C_W_read;       
       if (C_W_state == LOW) {
        ondemandwifiCallback () ;
       }
     }
    }
   last_C_W_state = C_W_read;            
 }
  
  if (shouldSaveConfig == true) { // ------------------------ wificonfig save --------------
    Serial.println(" config...");  
    DynamicJsonDocument json(1024);
    json["Supla_server"] = Supla_server;
    json["Email"] = Email;
    json["Supla_name"] = Supla_name;
    File configFile = LittleFS.open("/config.json", "w");
    if (!configFile) {
      Serial.println("failed to open config file for writing");
    }
    serializeJsonPretty(json, Serial);
    serializeJson(json, configFile);
    configFile.close();
    Serial.println("Config written successfully");
    shouldSaveConfig = false;
    initialConfig = false;
    ticker.detach();
    digitalWrite(status_led, HIGH);  
    WiFi.mode(WIFI_STA);   
    delay(5000);
    ESP.restart();     
  }
  
   buttonA.loop();     
   SuplaDevice.iterate();
   delay(25);

   if (WiFi.status() == WL_CONNECTED){
    if (starting){
      httpUpdater.setup(&httpServer, "/update", "admin", "pass");
      httpServer.begin(); 
      starting = false;         
     }
    httpServer.handleClient();
   }else if (Tik == false){
    ticker.attach(0.5, tick);
    Tik = true;
   }

  if (s == 17){
    if ((Tik == true) && (WiFi.status() == WL_CONNECTED)){
      ticker.detach();
      digitalWrite(status_led, HIGH); 
      Tik = false;
      }     
  }
}

void click(Button3& btn) {

}
void doubleClick(Button3& btn) {
  CSM1->storeMax();
  ticker.detach();
  Tik = false;
  digitalWrite(status_led, HIGH); 
  delay(200);
  digitalWrite(status_led, LOW); 
  delay(200);
  digitalWrite(status_led, HIGH); 
  delay(200);
  digitalWrite(status_led, LOW); 
  delay(200);
  digitalWrite(status_led, HIGH); 
}
void tripleClick(Button3& btn) {
  CSM1->storeMin();
  ticker.detach();
  Tik = false;
  digitalWrite(status_led, HIGH); 
  delay(200);
  digitalWrite(status_led, LOW); 
  delay(200);
  digitalWrite(status_led, HIGH); 
  delay(200);
  digitalWrite(status_led, LOW); 
  delay(200);
  digitalWrite(status_led, HIGH); 
  delay(200);
  digitalWrite(status_led, LOW); 
  delay(200);
  digitalWrite(status_led, HIGH);  
}
void longClick(Button3& btn) {

}
Kod źródłowy na tylko na kanale wilgotności:

Binarka do wgrania przez FlashTool: https://es-forum.supla.org/download/file.php?id=16366

Code: Select all

#define supla_lib_config_h_  // silences debug messages
#include "LittleFS.h" // LittleFS is declared 
#include <WiFiManager.h>
#include <ArduinoJson.h> //--------- V6 ------ 
#include <EEPROM.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPUpdateServer.h>
#include <ESP8266TrueRandom.h>
#include <Button3.h>
#include <SuplaDevice.h> 
#include <supla/sensor/hygro_meter.h>
  #include <supla/network/esp_wifi.h>
  Supla::ESPWifi wifi("ssid", "pass");

extern "C"
{
#include "user_interface.h"
}

//#define D0 16  //no internal pullup resistor
//#define D1  5
//#define D2  4
//#define D3  0  //must not be pulled low during power on/reset, toggles value during boot
//#define D4  2  //must not be pulled low during power on/reset, toggles value during boot
//#define D5 14
//#define D6 12
//#define D7 13
//#define D8 15  //must not be pulled high during power on/reset

#define status_led 2   // D4
#define wificonfig_pin 0  // D3  WiFiconfig 

char Supla_server[81]=("Unknown server address");
char Email[81]=("Unknown email address");                        
char Supla_name[51];
char Supla_status[51];
char Router_SSID[32];
char Router_Pass[64]; 
int C_W_state = HIGH; 
int last_C_W_state = HIGH;
unsigned long time_last_C_W_change = 0; 
long C_W_delay = 10000;                      // config delay 10 seconds        
bool shouldSaveConfig = false;
bool initialConfig = false; 
char GUID[SUPLA_GUID_SIZE];
char AUTHKEY[SUPLA_AUTHKEY_SIZE];
byte uuidNumber[16];
int s;
bool starting = true; 
Button3 buttonA = Button3(wificonfig_pin);
ESP8266WebServer httpServer(81);
ESP8266HTTPUpdateServer httpUpdater;
WiFiManager wifiManager;

class CSM: public Supla::Sensor::HygroMeter {
  public:
    CSM(int pin, int eepAdresse) {
    _pin = pin;
    eep_ofset = eepAdresse;
    }

    double getHumi() {
      int _value = analogRead(_pin);
      int value = map(_value, max_value, min_value, 100,0);
      value = constrain(value, 0, 100);
      return value; 
    }

    void onInit() {
      EEPROM.get(eep_ofset,min_value);
      if ((min_value < 0) || (min_value >1023)) min_value = 1023;
      supla_log(LOG_DEBUG, "load min CSM value %d", min_value);
      EEPROM.get(eep_ofset + 5,max_value);
      if ((max_value < 0) || (max_value >1023)) max_value = 0;
      supla_log(LOG_DEBUG, "load max CSM value %d", max_value);
      channel.setNewValue(TEMPERATURE_NOT_AVAILABLE, getHumi());
    }

  void storeMin() {
    min_value = analogRead(_pin);
    supla_log(LOG_DEBUG, "save min CSM value %d", min_value);
    EEPROM.put(eep_ofset, min_value);
    EEPROM.commit();
  }
  void storeMax() {
    max_value = analogRead(_pin);
    supla_log(LOG_DEBUG, "save max CSM value %d", max_value);
    EEPROM.put(eep_ofset + 5, max_value);
    EEPROM.commit();
  }  

    protected:
      int8_t _pin;
      int eep_ofset;
      int min_value;
      int max_value;

};

CSM *CSM1 = nullptr;

void saveConfigCallback () {          
  Serial.println("Should save config");
  shouldSaveConfig = true;
}
void ondemandwifiCallback () {
 digitalWrite(status_led, LOW);
   WiFiManagerParameter custom_Supla_server("server", "supla server", Supla_server, 81,"required");
   WiFiManagerParameter custom_Email("email", "Email", Email, 81,"required");
   WiFiManagerParameter custom_Supla_name("name", "Supla Device Name", Supla_name, 51,"required");
   WiFiManagerParameter custom_Supla_status("status", "Supla Last State", Supla_status, 51,"readonly");

   wifiManager.setBreakAfterConfig(true);
   wifiManager.setSaveConfigCallback(saveConfigCallback);
  
   wifiManager.addParameter(&custom_Supla_server);
   wifiManager.addParameter(&custom_Email);
   wifiManager.addParameter(&custom_Supla_name);
   wifiManager.addParameter(&custom_Supla_status);

   wifiManager.setCustomHeadElement("<style>html{ background-color: #01DF3A;}</style><div class='s'><svg version='1.1' id='l' x='0' y='0' viewBox='0 0 200 200' xml:space='preserve'><path d='M59.3,2.5c18.1,0.6,31.8,8,40.2,23.5c3.1,5.7,4.3,11.9,4.1,18.3c-0.1,3.6-0.7,7.1-1.9,10.6c-0.2,0.7-0.1,1.1,0.6,1.5c12.8,7.7,25.5,15.4,38.3,23c2.9,1.7,5.8,3.4,8.7,5.3c1,0.6,1.6,0.6,2.5-0.1c4.5-3.6,9.8-5.3,15.7-5.4c12.5-0.1,22.9,7.9,25.2,19c1.9,9.2-2.9,19.2-11.8,23.9c-8.4,4.5-16.9,4.5-25.5,0.2c-0.7-0.3-1-0.2-1.5,0.3c-4.8,4.9-9.7,9.8-14.5,14.6c-5.3,5.3-10.6,10.7-15.9,16c-1.8,1.8-3.6,3.7-5.4,5.4c-0.7,0.6-0.6,1,0,1.6c3.6,3.4,5.8,7.5,6.2,12.2c0.7,7.7-2.2,14-8.8,18.5c-12.3,8.6-30.3,3.5-35-10.4c-2.8-8.4,0.6-17.7,8.6-22.8c0.9-0.6,1.1-1,0.8-2c-2-6.2-4.4-12.4-6.6-18.6c-6.3-17.6-12.7-35.1-19-52.7c-0.2-0.7-0.5-1-1.4-0.9c-12.5,0.7-23.6-2.6-33-10.4c-8-6.6-12.9-15-14.2-25c-1.5-11.5,1.7-21.9,9.6-30.7C32.5,8.9,42.2,4.2,53.7,2.7c0.7-0.1,1.5-0.2,2.2-0.2C57,2.4,58.2,2.5,59.3,2.5z M76.5,81c0,0.1,0.1,0.3,0.1,0.6c1.6,6.3,3.2,12.6,4.7,18.9c4.5,17.7,8.9,35.5,13.3,53.2c0.2,0.9,0.6,1.1,1.6,0.9c5.4-1.2,10.7-0.8,15.7,1.6c0.8,0.4,1.2,0.3,1.7-0.4c11.2-12.9,22.5-25.7,33.4-38.7c0.5-0.6,0.4-1,0-1.6c-5.6-7.9-6.1-16.1-1.3-24.5c0.5-0.8,0.3-1.1-0.5-1.6c-9.1-4.7-18.1-9.3-27.2-14c-6.8-3.5-13.5-7-20.3-10.5c-0.7-0.4-1.1-0.3-1.6,0.4c-1.3,1.8-2.7,3.5-4.3,5.1c-4.2,4.2-9.1,7.4-14.7,9.7C76.9,80.3,76.4,80.3,76.5,81z M89,42.6c0.1-2.5-0.4-5.4-1.5-8.1C83,23.1,74.2,16.9,61.7,15.8c-10-0.9-18.6,2.4-25.3,9.7c-8.4,9-9.3,22.4-2.2,32.4c6.8,9.6,19.1,14.2,31.4,11.9C79.2,67.1,89,55.9,89,42.6z M102.1,188.6c0.6,0.1,1.5-0.1,2.4-0.2c9.5-1.4,15.3-10.9,11.6-19.2c-2.6-5.9-9.4-9.6-16.8-8.6c-8.3,1.2-14.1,8.9-12.4,16.6C88.2,183.9,94.4,188.6,102.1,188.6z M167.7,88.5c-1,0-2.1,0.1-3.1,0.3c-9,1.7-14.2,10.6-10.8,18.6c2.9,6.8,11.4,10.3,19,7.8c7.1-2.3,11.1-9.1,9.6-15.9C180.9,93,174.8,88.5,167.7,88.5z'/></svg>");
   wifiManager.setMinimumSignalQuality(8);
   //wifiManager.setShowStaticFields(true); // force show static ip fields
   //wifiManager.setShowDnsFields(true);    // force show dns field always
   wifiManager.setConfigPortalTimeout(180);

   if (!wifiManager.startConfigPortal("CSM_Probe")) { Serial.println("Not connected to WiFi but continuing anyway.");} else { Serial.println("connected...yeey :)");}                
    strcpy(Supla_server, custom_Supla_server.getValue());
    strcpy(Email, custom_Email.getValue());
    strcpy(Supla_name, custom_Supla_name.getValue());
    wifiManager.getWiFiSSID().toCharArray(Router_SSID, 33);
    wifiManager.getWiFiPass().toCharArray(Router_Pass, 65); 
    if(strcmp(Supla_server, "get_new_guid_and_authkey") == 0){
      Serial.println("new guid & authkey.");
      EEPROM.write(300, 0);
      EEPROM.commit();
      ESP.reset(); 
    }
    WiFi.softAPdisconnect(true);   //  close AP
}
void status_func(int status, const char *msg) {    //    ------------------------ Status --------------------------
  if (s != status){
    s = status; 
      if (s != 10){
        strcpy(Supla_status, msg); 
  }  }            
}
void guid_authkey(void) {
  if (EEPROM.read(300) != 60){
    int eep_gui = 301;

    ESP8266TrueRandom.uuid(uuidNumber);

    String uuidString = "";
    for (int i = 0; i < 16; i++) {
      int topDigit = uuidNumber[i] >> 4;
      int bottomDigit = uuidNumber[i] & 0x0f;
      uuidString += "0123456789abcdef"[topDigit];
      uuidString += "0123456789abcdef"[bottomDigit];
    }
    int length_uuid = uuidString.length();
    for (int i = 0; i < length_uuid; ++i) {
      EEPROM.put(eep_gui + i, uuidString[i]);
    }

    int eep_aut = 341;

    ESP8266TrueRandom.uuid(uuidNumber);

    String uuidString2 = "";
    for (int i = 0; i < 16; i++) {
      int topDigit = uuidNumber[i] >> 4;
      int bottomDigit = uuidNumber[i] & 0x0f;
      uuidString2 += "0123456789abcdef"[topDigit];
      uuidString2 += "0123456789abcdef"[bottomDigit];
    }
    int length_uuid2 = uuidString2.length();
    for (int i = 0; i < length_uuid2; ++i) {
      EEPROM.put(eep_aut + i, uuidString2[i]);
    }
    EEPROM.write(300, 60);
    EEPROM.commit();
  }
  read_guid();
  read_authkey();
  Serial.print("GUID : ");Serial.println(read_guid()); 
  Serial.print("AUTHKEY : ");Serial.println(read_authkey()); 
}

String read_guid(void) {
  String read_eeprom = "";
  int i, ii = 0;
  int eep_star = 301;
  int end_guid = eep_star + SUPLA_GUID_SIZE;
  String temp_read = "0x";
  for (i = eep_star; i < end_guid + 16;  i = i + 1) {
    temp_read += char(EEPROM.read(i));
    read_eeprom += char(EEPROM.read(i));
    if ( (i % 2) == 0) {
      char *_guid = strcpy((char*)malloc(temp_read.length() + 1), temp_read.c_str());
      GUID[ii] = strtoul( _guid, NULL, 16);
      temp_read = "0x";
      ii++;
    }
  }
  return read_eeprom;
}
String read_authkey(void) {
  String read_eeprom = "";
  int i, ii = 0;
  int eep_star = 341;
  int end_authkey = eep_star + SUPLA_AUTHKEY_SIZE;
  String temp_read = "0x";
  for (i = eep_star; i < end_authkey + 16;  i = i + 1) {
    temp_read += char(EEPROM.read(i));
    read_eeprom += char(EEPROM.read(i));
    if ( (i % 2) == 0) {
      char *_authkey = strcpy((char*)malloc(temp_read.length() + 1), temp_read.c_str());
      AUTHKEY[ii] = strtoul( _authkey, NULL, 16);
      temp_read = "0x";
      ii++;
    }
  }
  return read_eeprom;
}

void setup() {

   wifi_set_sleep_type(NONE_SLEEP_T); 
    
  Serial.begin(115200);  
  pinMode(wificonfig_pin, INPUT_PULLUP);
  pinMode(status_led,OUTPUT); 
  digitalWrite(status_led, HIGH);  
  
  EEPROM.begin(1024);
  if (EEPROM.read(300) != 60){initialConfig = true;} 
  guid_authkey();

  if (WiFi.SSID()==""){ initialConfig = true;} 

  buttonA.setClickHandler(click);
  buttonA.setDoubleClickHandler(doubleClick);
  buttonA.setTripleClickHandler(tripleClick);

  if (LittleFS.begin()) {  // ------------------------- wificonfig read -----------------
    Serial.println("mounted file system");
    if (LittleFS.exists("/config.json")) {
      Serial.println("reading config file");
       File configFile = LittleFS.open("/config.json", "r");
      if (configFile) {
        Serial.println("opened config file");
         size_t size = configFile.size();
         std::unique_ptr<char[]> buf(new char[size]);
         configFile.readBytes(buf.get(), size);
        DynamicJsonDocument json(1024);
        DeserializationError deserializeError = deserializeJson(json, buf.get());
        serializeJsonPretty(json, Serial);
        if (!deserializeError) {Serial.println("\nparsed json");         
          if (json.containsKey("Supla_server")) strcpy(Supla_server, json["Supla_server"]);
          if (json.containsKey("Email")) strcpy(Email, json["Email"]);
          if (json.containsKey("Supla_name")) strcpy(Supla_name, json["Supla_name"]);
          if (json.containsKey("Router_SSID")) strcpy(Router_SSID, json["Router_SSID"]);
          if (json.containsKey("Router_Pass")) strcpy(Router_Pass, json["Router_Pass"]);       
        } else {
          Serial.println("failed to load json config");
           initialConfig = true;
        }
        configFile.close(); 
      }
    }
   } else {
    Serial.println("failed to mount FS");
  }
   wifi_station_set_hostname(Supla_name);
   
  WiFi.mode(WIFI_STA); 

  SuplaDevice.setStatusFuncImpl(&status_func);
  wifi.setSsid(Router_SSID);
  wifi.setPassword(Router_Pass);
  SuplaDevice.setName(Supla_name);
  wifi.enableSSL(false);  
  CSM1 = new CSM(A0,100);

     SuplaDevice.begin(GUID,Supla_server,Email,AUTHKEY);
        
}

void loop() {
   if (initialConfig == true){ondemandwifiCallback();}

   int C_W_read = digitalRead(wificonfig_pin);{  
   if (C_W_read != last_C_W_state) {            
     time_last_C_W_change = millis();
   }
   if ((millis() - time_last_C_W_change) > C_W_delay) {     
     if (C_W_read != C_W_state) {     
       C_W_state = C_W_read;       
       if (C_W_state == LOW) {
        ondemandwifiCallback () ;
       }
     }
    }
   last_C_W_state = C_W_read;            
 }
  
  if (shouldSaveConfig == true) { // ------------------------ wificonfig save --------------
    Serial.println(" config...");  
    DynamicJsonDocument json(1024);
    json["Supla_server"] = Supla_server;
    json["Email"] = Email;
    json["Supla_name"] = Supla_name;
    json["Router_SSID"] = Router_SSID;
    json["Router_Pass"] = Router_Pass;
    File configFile = LittleFS.open("/config.json", "w");
    if (!configFile) {
      Serial.println("failed to open config file for writing");
    }
        serializeJsonPretty(json, Serial);
        serializeJson(json, configFile);
    configFile.close();
    Serial.println("Config written successfully");
    shouldSaveConfig = false;
    initialConfig = false; 
    WiFi.mode(WIFI_STA);   
    delay(5000);
    ESP.restart();     
  }
  
   buttonA.loop();     
   SuplaDevice.iterate();
   delay(25);

   if (WiFi.status() == WL_CONNECTED){
    if (starting){
      httpUpdater.setup(&httpServer, "/update", "admin", "pass");
      httpServer.begin(); 
      starting = false;         
     }
    httpServer.handleClient();
   }
}

void click(Button3& btn) {

}
void doubleClick(Button3& btn) {
  CSM1->storeMax();
  digitalWrite(status_led, HIGH); 
  delay(100);
  digitalWrite(status_led, LOW); 
  delay(100);
  digitalWrite(status_led, HIGH); 
  delay(100);
  digitalWrite(status_led, LOW); 
  delay(50);
  digitalWrite(status_led, HIGH); 
}
void tripleClick(Button3& btn) {
  CSM1->storeMin();
  digitalWrite(status_led, HIGH); 
  delay(100);
  digitalWrite(status_led, LOW); 
  delay(100);
  digitalWrite(status_led, HIGH); 
  delay(100);
  digitalWrite(status_led, LOW); 
  delay(100);
  digitalWrite(status_led, HIGH); 
  delay(100);
  digitalWrite(status_led, LOW); 
  delay(50);
  digitalWrite(status_led, HIGH);  
}
void longClick(Button3& btn) {

}
jak coś nie działa to włącz zasilanie.....
User avatar
QLQ
Posts: 2279
Joined: Sun Sep 03, 2017 9:13 am
Location: Koszalin

Post

Testujemy ? : :)
.
.
Screenshot_20210402-163105_SUPLA .jpg
20210402_164350.jpg
20210402_163036.jpg
You do not have the required permissions to view the files attached to this post.
jak coś nie działa to włącz zasilanie.....
User avatar
QLQ
Posts: 2279
Joined: Sun Sep 03, 2017 9:13 am
Location: Koszalin

Post

No tak ...jakbym napisał, że to na sonoff to by tu stadami przybiegli...
jak coś nie działa to włącz zasilanie.....
User avatar
klew
Posts: 8355
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

QLQ wrote: Sat Apr 03, 2021 7:03 pm No tak ...jakbym napisał, że to na sonoff to by tu stadami przybiegli...
Sonoffa lepiej nie używaj. Jeszcze przeniesie potencjał 230 V na glebę i uziemi kwiatka ;)
Widzimy się na Supla Offline Party vol. 2 :!:
User avatar
QLQ
Posts: 2279
Joined: Sun Sep 03, 2017 9:13 am
Location: Koszalin

Post

klew wrote: Sat Apr 03, 2021 7:05 pm
QLQ wrote: Sat Apr 03, 2021 7:03 pm No tak ...jakbym napisał, że to na sonoff to by tu stadami przybiegli...
Sonoffa lepiej nie używaj. Jeszcze przeniesie potencjał 230 V na glebę i uziemi kwiatka ;)
@Klew to taka ironia była. Sonoffa to ja mam ale w takiej wer:
Screenshot_20210403-211101_SUPLA .jpg
20210403_210933.jpg
You do not have the required permissions to view the files attached to this post.
jak coś nie działa to włącz zasilanie.....
edm
Posts: 440
Joined: Mon Jan 15, 2018 6:18 pm

Post

QLQ wrote: Sat Apr 03, 2021 7:03 pm No tak ...jakbym napisał, że to na sonoff to by tu stadami przybiegli...
Przyglądam się i kibicuje projektowi.
Mam wszystkie potrzebne podzespoły tylko obecnie zdrowia i czasu brak.
Jak będziesz miał jakieś informacje po testach, proszę podziel się nimi tutaj.
Z pewnością się przydadzą.
Wziąłem udział w Supla Offline Party 2023 :D
maxio2011
Posts: 116
Joined: Fri Jan 22, 2021 1:08 pm

Post

Czujnik uaktywniony testowany dłuższy czas... poprawnie działa pytanie jak uzależnić wskazania wilgotności od włączania podlewania

np. spadek wilgotności poniżej 90% załącza elektrozawór ?
gerardcool
Posts: 3
Joined: Thu Jan 10, 2019 9:12 pm

Post

Spróbuj skryptów na portalu
https://supla.fracz.com/login
gruby23
Posts: 4
Joined: Thu Oct 29, 2020 5:14 pm

Post

Dzięki QLQ,. Działa super...ale przydało by się więcej ;) czyli wilgotność z czujnika pojemnościowego + temperatura z ds1820 + załączanie podlewania od wartości wilgotności jak to maxio2011 zauważył... chyba bez wejścia w Arduino się nie obejdzie. skąd pobrać biblioteki CSM i hygro_meter ? pozdro
User avatar
QLQ
Posts: 2279
Joined: Sun Sep 03, 2017 9:13 am
Location: Koszalin

Post

gruby23 wrote: Mon May 31, 2021 10:08 am Dzięki QLQ,. Działa super...ale przydało by się więcej ;) czyli wilgotność z czujnika pojemnościowego + temperatura z ds1820 + załączanie podlewania od wartości wilgotności jak to maxio2011 zauważył... chyba bez wejścia w Arduino się nie obejdzie. skąd pobrać biblioteki CSM i hygro_meter ? pozdro
Biblioteki parę postów do góry. Dziękować należy @elmaya bo ja to tylko tu na naszym pl przedstawiłem.
jak coś nie działa to włącz zasilanie.....

Return to “Projekty użytkowników”