Podlewanie - czujnik wilgotności np gleby

Awatar użytkownika
QLQ
Posty: 2276
Rejestracja: ndz wrz 03, 2017 9:13 am
Lokalizacja: Koszalin

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

Kod: Zaznacz cały

#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

Kod: Zaznacz cały

#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.....
Awatar użytkownika
QLQ
Posty: 2276
Rejestracja: ndz wrz 03, 2017 9:13 am
Lokalizacja: Koszalin

Testujemy ? : :)
.
.
Screenshot_20210402-163105_SUPLA .jpg
Screenshot_20210402-163105_SUPLA .jpg (21.78 KiB) Przejrzano 6230 razy
20210402_164350.jpg
20210402_164350.jpg (487.53 KiB) Przejrzano 6230 razy
20210402_163036.jpg
20210402_163036.jpg (263.29 KiB) Przejrzano 6230 razy
jak coś nie działa to włącz zasilanie.....
Awatar użytkownika
QLQ
Posty: 2276
Rejestracja: ndz wrz 03, 2017 9:13 am
Lokalizacja: Koszalin

No tak ...jakbym napisał, że to na sonoff to by tu stadami przybiegli...
jak coś nie działa to włącz zasilanie.....
Awatar użytkownika
klew
Posty: 8178
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

QLQ pisze: sob kwie 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 :!:
Awatar użytkownika
QLQ
Posty: 2276
Rejestracja: ndz wrz 03, 2017 9:13 am
Lokalizacja: Koszalin

klew pisze: sob kwie 03, 2021 7:05 pm
QLQ pisze: sob kwie 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
Screenshot_20210403-211101_SUPLA .jpg (20.36 KiB) Przejrzano 6163 razy
20210403_210933.jpg
20210403_210933.jpg (781.2 KiB) Przejrzano 6164 razy
jak coś nie działa to włącz zasilanie.....
edm
Posty: 439
Rejestracja: pn sty 15, 2018 6:18 pm

QLQ pisze: sob kwie 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
Posty: 116
Rejestracja: pt sty 22, 2021 1:08 pm

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
Posty: 3
Rejestracja: czw sty 10, 2019 9:12 pm

Spróbuj skryptów na portalu
https://supla.fracz.com/login
gruby23
Posty: 4
Rejestracja: czw paź 29, 2020 5:14 pm

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
Awatar użytkownika
QLQ
Posty: 2276
Rejestracja: ndz wrz 03, 2017 9:13 am
Lokalizacja: Koszalin

gruby23 pisze: pn maja 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.....
ODPOWIEDZ

Wróć do „Projekty użytkowników”