Oszczędzanie poboru prądu przez wemosa mini

Masz pomysł na funkcjonalność lub koncepcję na rozwój projektu. Opisz wszystko tutaj.
piomar2
Posty: 369
Rejestracja: pt kwie 26, 2019 5:32 pm
Lokalizacja: Bukowice

Witajcie!

Muszę zweryfikować tego posta, ponieważ pojawiły się pewne problemy z oprogramowaniem. Mam nadzieję, że teraz będzie ok.

Kiedyś @PioKar zgłosił potrzebę oszczędzania energii przez wemosa, który mierzył napięcie a sam był zasilany z akumulatorka. Zastosował prosty programik, który "usypiał" wemosa. Okazało się, że można bez utraty synchronizacji z cloudem ustawić czas "usypiania" na max 2 minuty bez utraty ciągłości wykresów i zerwania połączenia. Wemos w trakcie aktywności pobiera około 80 mA a kiedy "śpi" to niecałe 7 mA. Dlatego im dłuższy czas "snu" to mniejsze zużycie energii ale konsekwencją są rzadsze pomiary. Czasami pomiary temperatury wystarczy robić co kilka minut.
Opis:
Programy wgrywamy przy ustawieniach DOUT i 32Mbit lub kompilujemy źródło i wgrywamy przez arduino,
TEMP_VOLT_dal.jpg
TEMP_VOLT_dal.jpg (383.16 KiB) Przejrzano 5150 razy
TEMP_dal
- wgrywamy program,
- zapali się niebieska dioda,
- resetujemy wemosa i podłączamy się do wifi "TEMP_dal "
- wypełniamy tabelkę configu a czas snu ustawiamy na "0" !!! ,
- zapisujemy i czekamy aż komp wróci sam do swojego wifi,
- naciskamy reset,
- rejestrujemy w cloudzie i tworzymy link bezpośredni (read). Zapisujemy na boku.
- naciskamy reset, puszczamy i zaraz potem
- zwieramy na około 10 sek D3 do masy,
- zapali się niebieska dioda,
- wchodzimy ponownie do configu i dopisujemy jeszcze raz swoje wifi, hasło do niego oraz czas snu wemosa w sekundach (max 999)
- zapisujemy i czekamy aż komp wróci sam do swojego wifi.
- naciskamy reset,

Kod: Zaznacz cały

//TEMP_dal


#include <FS.h>  // ---- esp board manager 2.4.2 
#include <ESP8266WiFi.h>
#define SUPLADEVICE_CPP
#include <SuplaDevice.h>
#include <math.h>
#include <DNSServer.h>
#include <WiFiManager.h> 
#include <ArduinoJson.h> //-- https://github.com/bblanchon/ArduinoJson/tree/v5.13.2 --
#include <EEPROM.h>
#include <ESP8266WebServer.h>
#include <ESPEFC.h> 
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>

extern "C"
{
#include "user_interface.h"
}
#define config_pin 0    // D3  wifi config 10 sek
#define status_led 2    // D4  status Led 
bool pr_wifi = true;
bool start = true;           
int s;             
unsigned long wifi_checkDelay = 20000;
unsigned long wifimilis;
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
WiFiClient client;
ESP8266WebServer httpServer(81);
ESPEFC httpUpdater;
const char* update_path = "/";
char Supla_server[80];
char Location_id[15];
char Location_Pass[34];
//char Supla_name[51];
byte mac[6];
bool shouldSaveConfig = false;
bool initialConfig = false;
int timeout = 180;          // seconds to run the wifi config
int spanie;
char T_Link_1[3]; 

OneWire oneWire(4);// DS18B20
DallasTemperature sensors(&oneWire);

double get_temperature(int channelNumber, double last_val) {

    double t = -275;
      if ( sensors.getDeviceCount() > 0 )
      {
       sensors.requestTemperatures();
     t = sensors.getTempCByIndex(0);
      };
    Serial.println(t);
      return t;  
}

void saveConfigCallback () {  //callback notifying us of the need to save config
  Serial.println("Should save config");
  shouldSaveConfig = true;
}
void ondemandwifiCallback () {
  digitalWrite(status_led, LOW);
  httpServer.stop();
  WiFiManagerParameter custom_Supla_server("server", "supla server", Supla_server, 80);
  WiFiManagerParameter custom_Location_id("ID", "Location id", Location_id, 15);
  WiFiManagerParameter custom_Location_Pass("Password", "Location Pass", Location_Pass, 34);
  WiFiManagerParameter custom_T_Link_1("Linka", "Czas spania w sek", T_Link_1, 3);
 
  WiFiManager wifiManager;
  wifiManager.setBreakAfterConfig(true);
  wifiManager.setSaveConfigCallback(saveConfigCallback);
  
  wifiManager.addParameter(&custom_Supla_server);
  wifiManager.addParameter(&custom_Location_id);
  wifiManager.addParameter(&custom_Location_Pass);
  wifiManager.addParameter(&custom_T_Link_1);

  wifiManager.setCustomHeadElement("<style>html{ background-color: #01DF3E;}</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.setConfigPortalTimeout(timeout);

    if (!wifiManager.startConfigPortal("TEMP_dal")) {
      Serial.println("Not connected to WiFi but continuing anyway.");
    } else {
      
      Serial.println("connected...yeey :)");  //if you get here you have connected to the WiFi
    }
    //read updated parameters
    strcpy(Supla_server, custom_Supla_server.getValue());
    strcpy(Location_id, custom_Location_id.getValue());
    strcpy(Location_Pass, custom_Location_Pass.getValue());
    strcpy(T_Link_1, custom_T_Link_1.getValue());
    
   
    WiFi.softAPdisconnect(true);   //  close AP
}
     
void status_func(int status, const char *msg) {     //- Status -
 s=status;                                          //- to check if we are registered and ready before restore from memory
}
void setup() { 
  
  Serial.begin(115200);
    
  sensors.begin();
  sensors.setResolution(12);//rozdzielczość DS-a
  
  delay(200);
  pinMode(status_led,OUTPUT);
  
  if (WiFi.SSID()==""){
    initialConfig = true;
  } 
  
  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.

   uint8_t mac[WL_MAC_ADDR_LENGTH];
   WiFi.macAddress(mac);
   char GUID[SUPLA_GUID_SIZE] = {mac[WL_MAC_ADDR_LENGTH - 6], mac[WL_MAC_ADDR_LENGTH - 5], mac[WL_MAC_ADDR_LENGTH - 4], mac[WL_MAC_ADDR_LENGTH - 3],                                
                                 mac[WL_MAC_ADDR_LENGTH - 2], mac[WL_MAC_ADDR_LENGTH - 1], mac[WL_MAC_ADDR_LENGTH - 1], mac[WL_MAC_ADDR_LENGTH - 2], 
                                 mac[WL_MAC_ADDR_LENGTH - 3], mac[WL_MAC_ADDR_LENGTH - 4], mac[WL_MAC_ADDR_LENGTH - 5], mac[WL_MAC_ADDR_LENGTH - 6]};
          
  SuplaDevice.addDS18B20Thermometer();

  if (SPIFFS.begin()) {
    Serial.println("mounted file system");
    if (SPIFFS.exists("/config.json")) {
      Serial.println("reading config file");
      File configFile = SPIFFS.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);
        DynamicJsonBuffer jsonBuffer;         
        JsonObject& json = jsonBuffer.parseObject(buf.get());
        json.printTo(Serial);   //print config data to serial on startup
        if (json.success()) {
          Serial.println("\nparsed json");

          strcpy(Supla_server, json["Supla_server"]);
          strcpy(Location_id, json["Location_id"]);
          strcpy(Location_Pass, json["Location_Pass"]);
          strcpy(T_Link_1, json["T_Link_1"]); 
        } else {
          Serial.println("failed to load json config");
          initialConfig = true;
        }
      }
    }
  } else {
    Serial.println("failed to mount FS");
  }
   wifi_station_set_hostname("TEMP_dal");
  SuplaDevice.setStatusFuncImpl(&status_func); 
  SuplaDevice.setName("TEMP_dal");

  int LocationID = atoi(Location_id);
  SuplaDevice.begin(GUID,              // Global Unique Identifier 
                    mac,               // Ethernet MAC address
                    Supla_server,      // SUPLA server address
                    LocationID,        // Location ID 
                    Location_Pass);    // Location Password    
digitalWrite(status_led, HIGH);  
}

void loop() {
  
   spanie = atoi(T_Link_1);
   
  if (initialConfig){
    ondemandwifiCallback () ;
  }
  if (shouldSaveConfig) {
    Serial.println("saving config");
    DynamicJsonBuffer jsonBuffer;
    JsonObject& json = jsonBuffer.createObject();
    json["Supla_server"] = Supla_server;
    json["Location_id"] = Location_id;
    json["Location_Pass"] = Location_Pass;
    json["T_Link_1"] = T_Link_1;
   
    File configFile = SPIFFS.open("/config.json", "w");
    if (!configFile) {
     Serial.println("failed to open config file for writing");
    }
    json.prettyPrintTo(Serial);
    json.printTo(configFile);
    configFile.close();
    Serial.println("config saved");
    shouldSaveConfig = false;
    initialConfig = false; 
    WiFi.mode(WIFI_STA);
    ESP.restart();
    delay(5000); 
  }
  if (WiFi.status() != WL_CONNECTED) { 
    WiFi_up();
  }
   int C_W_read = digitalRead(config_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) {     
       Serial.println("Triger sate changed");
       C_W_state = C_W_read;       
       if (C_W_state == LOW) {
        ondemandwifiCallback () ;
       }
     }
    }
   last_C_W_state = C_W_read;            
   }
   
   if (WiFi.status() == WL_CONNECTED){
    SuplaDevice.iterate();      
    if (pr_wifi == true){
    Serial.println("");
    Serial.println("CONNECTED");
    Serial.print("local IP: ");
    Serial.println(WiFi.localIP());
    Serial.print("subnetMask: ");
    Serial.println(WiFi.subnetMask());
    Serial.print("gatewayIP: ");
    Serial.println(WiFi.gatewayIP());
     long rssi = WiFi.RSSI();
    Serial.print("Signal Strength (RSSI): ");
    Serial.print(rssi);
    Serial.println(" dBm"); 
     pr_wifi = false;       
     httpUpdater.setup(&httpServer, update_path);
     httpServer.begin();
     //*************************************************
   if (digitalRead(0)==LOW)  {
    spanie=0;
    }
  if (spanie>0){
   ilespanie();
  }
  //****************************************************
   }
    if (pr_wifi == false){
     httpServer.handleClient(); 
     yield();
    }
   }
  }
// Supla.org ethernet layer
    int supla_arduino_tcp_read(void *buf, int count) {
        _supla_int_t size = client.available();       
        if ( size > 0 ) {
            if ( size > count ) size = count;
            return client.read((uint8_t *)buf, size);
        };    
        return -1;
    };    
    int supla_arduino_tcp_write(void *buf, int count) {
        return client.write((const uint8_t *)buf, count);
    };    
    bool supla_arduino_svr_connect(const char *server, int port) {
          return client.connect(server, 2015);
    }    
    bool supla_arduino_svr_connected(void) {
          return client.connected();
    }    
    void supla_arduino_svr_disconnect(void) {
         client.stop();
    }    
    void supla_arduino_eth_setup(uint8_t mac[6], IPAddress *ip) {
    }

SuplaDeviceCallbacks supla_arduino_get_callbacks(void) {
          SuplaDeviceCallbacks cb;          
          cb.tcp_read = &supla_arduino_tcp_read;
          cb.tcp_write = &supla_arduino_tcp_write;
          cb.eth_setup = &supla_arduino_eth_setup;
          cb.svr_connected = &supla_arduino_svr_connected;
          cb.svr_connect = &supla_arduino_svr_connect;
          cb.svr_disconnect = &supla_arduino_svr_disconnect;
          cb.get_temperature = &get_temperature;
          cb.get_temperature_and_humidity = NULL;
          cb.get_rgbw_value = NULL;
          cb.set_rgbw_value = NULL;         
          return cb;
}

void WiFi_up(){ // conect to wifi
 
  if (millis() > wifimilis)  {
  WiFi.begin();
  delay(500);
  pr_wifi = true;
  Serial.println("CONNECTING WIFI"); 
  wifimilis = (millis() + wifi_checkDelay) ;
  }
}
 void ilespanie(){
       delay(50);
ESP.deepSleep(spanie* 1000 * 1000);
 }

VOLT_dal
- wgrywamy program,
- zapali się niebieska dioda,
- resetujemy wemosa i podłączamy się do wifi "VOLT_dal "
- wypełniamy tabelkę configu a czas snu ustawiamy na "0" !!! ,
- zapisujemy i czekamy aż komp wróci sam do swojego wifi,
- naciskamy reset,
- rejestrujemy w cloudzie i tworzymy link bezpośredni (read). Zapisujemy na boku.
- naciskamy reset, puszczamy i zaraz potem
- zwieramy na około 10 sek D3 do masy,
- zapali się niebieska dioda,
- wchodzimy ponownie do configu i dopisujemy jeszcze raz swoje wifi, hasło do niego oraz czas snu wemosa w sekundach (max 999)
- zapisujemy i czekamy aż komp wróci sam do swojego wifi.
- naciskamy reset,

Kod: Zaznacz cały

//VOLT_dal

#include <FS.h>  // ---- esp board manager 2.4.2 
#include <ESP8266WiFi.h>
#define SUPLADEVICE_CPP
#include <SuplaDevice.h>
#include <math.h>
#include <DNSServer.h>
#include <WiFiManager.h> 
#include <ArduinoJson.h> //-- https://github.com/bblanchon/ArduinoJson/tree/v5.13.2 --
#include <EEPROM.h>
#include <ESP8266WebServer.h>
#include <ESPEFC.h> 
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>

extern "C"
{
#include "user_interface.h"
}
#define config_pin 0    // D3  wifi config 10 sek
#define status_led 2    // D4  status Led 
bool pr_wifi = true;
bool start = true;           
int s;             
unsigned long wifi_checkDelay = 20000;
unsigned long wifimilis;
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
WiFiClient client;
ESP8266WebServer httpServer(81);
ESPEFC httpUpdater;
const char* update_path = "/";
char Supla_server[80];
char Location_id[15];
char Location_Pass[34];
byte mac[6];
bool shouldSaveConfig = false;
bool initialConfig = false;
int timeout = 180;          // seconds to run the wifi config
int spanie;
char T_Link_1[3]; 
int analogInput = 0;
float vout = 0.0;
float vin = 0.0;
float R1 = 100000.0; // R1 - 100K
float R2 = 10000.0; // R2 - 10K
int value = 0;


OneWire oneWire(4);// DS18B20
DallasTemperature sensors(&oneWire);

double get_temperature(int channelNumber, double last_val) {

   double t = -275;
      value = analogRead(analogInput);
      vout = (value * 3.3) / 1024.0;
      vin = vout / (R2/(R1+R2)); 
        if (vin<0.09) {
            vin=0.0;
            } 
        t=vin;
        Serial.println(t);
      return t;  
}

void saveConfigCallback () {  //callback notifying us of the need to save config
  Serial.println("Should save config");
  shouldSaveConfig = true;
}
void ondemandwifiCallback () {
  digitalWrite(status_led, LOW);
  httpServer.stop();
  WiFiManagerParameter custom_Supla_server("server", "supla server", Supla_server, 80);
  WiFiManagerParameter custom_Location_id("ID", "Location id", Location_id, 15);
  WiFiManagerParameter custom_Location_Pass("Password", "Location Pass", Location_Pass, 34);
  WiFiManagerParameter custom_T_Link_1("Linka", "Czas spania w sek", T_Link_1, 3);
 
  WiFiManager wifiManager;
  wifiManager.setBreakAfterConfig(true);
  wifiManager.setSaveConfigCallback(saveConfigCallback);
  
  wifiManager.addParameter(&custom_Supla_server);
  wifiManager.addParameter(&custom_Location_id);
  wifiManager.addParameter(&custom_Location_Pass);
  wifiManager.addParameter(&custom_T_Link_1);

  wifiManager.setCustomHeadElement("<style>html{ background-color: #01DF3E;}</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.setConfigPortalTimeout(timeout);

    if (!wifiManager.startConfigPortal("VOLT_dal")) {
      Serial.println("Not connected to WiFi but continuing anyway.");
    } else {
      
      Serial.println("connected...yeey :)");  //if you get here you have connected to the WiFi
    }
    //read updated parameters
    strcpy(Supla_server, custom_Supla_server.getValue());
    strcpy(Location_id, custom_Location_id.getValue());
    strcpy(Location_Pass, custom_Location_Pass.getValue());
    strcpy(T_Link_1, custom_T_Link_1.getValue());
    
   
    WiFi.softAPdisconnect(true);   //  close AP
}
     
void status_func(int status, const char *msg) {     //- Status -
 s=status;                                          //- to check if we are registered and ready before restore from memory
}
void setup() { 
  
  Serial.begin(115200);
    
  sensors.begin();
  sensors.setResolution(12);//rozdzielczość DS-a
  
  delay(200);
  pinMode(status_led,OUTPUT);
  
  if (WiFi.SSID()==""){
    initialConfig = true;
  } 
  
  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.

   uint8_t mac[WL_MAC_ADDR_LENGTH];
   WiFi.macAddress(mac);
   char GUID[SUPLA_GUID_SIZE] = {mac[WL_MAC_ADDR_LENGTH - 6], mac[WL_MAC_ADDR_LENGTH - 5], mac[WL_MAC_ADDR_LENGTH - 4], mac[WL_MAC_ADDR_LENGTH - 3],                                
                                 mac[WL_MAC_ADDR_LENGTH - 2], mac[WL_MAC_ADDR_LENGTH - 1], mac[WL_MAC_ADDR_LENGTH - 1], mac[WL_MAC_ADDR_LENGTH - 2], 
                                 mac[WL_MAC_ADDR_LENGTH - 3], mac[WL_MAC_ADDR_LENGTH - 4], mac[WL_MAC_ADDR_LENGTH - 5], mac[WL_MAC_ADDR_LENGTH - 6]};
          
  SuplaDevice.addDS18B20Thermometer();

  if (SPIFFS.begin()) {
    Serial.println("mounted file system");
    if (SPIFFS.exists("/config.json")) {
      Serial.println("reading config file");
      File configFile = SPIFFS.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);
        DynamicJsonBuffer jsonBuffer;         
        JsonObject& json = jsonBuffer.parseObject(buf.get());
        json.printTo(Serial);   //print config data to serial on startup
        if (json.success()) {
          Serial.println("\nparsed json");

          strcpy(Supla_server, json["Supla_server"]);
          strcpy(Location_id, json["Location_id"]);
          strcpy(Location_Pass, json["Location_Pass"]);
          strcpy(T_Link_1, json["T_Link_1"]); 
        } else {
          Serial.println("failed to load json config");
          initialConfig = true;
        }
      }
    }
  } else {
    Serial.println("failed to mount FS");
  }
   wifi_station_set_hostname("VOLT_dal");
  SuplaDevice.setStatusFuncImpl(&status_func); 
  SuplaDevice.setName("VOLT_dal");

  int LocationID = atoi(Location_id);
  SuplaDevice.begin(GUID,              // Global Unique Identifier 
                    mac,               // Ethernet MAC address
                    Supla_server,      // SUPLA server address
                    LocationID,        // Location ID 
                    Location_Pass);    // Location Password    
digitalWrite(status_led, HIGH);  
}

void loop() {
  
   spanie = atoi(T_Link_1);
   
  if (initialConfig){
    ondemandwifiCallback () ;
  }
  if (shouldSaveConfig) {
    Serial.println("saving config");
    DynamicJsonBuffer jsonBuffer;
    JsonObject& json = jsonBuffer.createObject();
    json["Supla_server"] = Supla_server;
    json["Location_id"] = Location_id;
    json["Location_Pass"] = Location_Pass;
    json["T_Link_1"] = T_Link_1;
   
    File configFile = SPIFFS.open("/config.json", "w");
    if (!configFile) {
     Serial.println("failed to open config file for writing");
    }
    json.prettyPrintTo(Serial);
    json.printTo(configFile);
    configFile.close();
    Serial.println("config saved");
    shouldSaveConfig = false;
    initialConfig = false; 
    WiFi.mode(WIFI_STA);
    ESP.restart();
    delay(5000); 
  }
  if (WiFi.status() != WL_CONNECTED) { 
    WiFi_up();
  }
   int C_W_read = digitalRead(config_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) {     
       Serial.println("Triger sate changed");
       C_W_state = C_W_read;       
       if (C_W_state == LOW) {
        ondemandwifiCallback () ;
       }
     }
    }
   last_C_W_state = C_W_read;            
   }
   
   if (WiFi.status() == WL_CONNECTED){
    SuplaDevice.iterate();      
    if (pr_wifi == true){
    Serial.println("");
    Serial.println("CONNECTED");
    Serial.print("local IP: ");
    Serial.println(WiFi.localIP());
    Serial.print("subnetMask: ");
    Serial.println(WiFi.subnetMask());
    Serial.print("gatewayIP: ");
    Serial.println(WiFi.gatewayIP());
     long rssi = WiFi.RSSI();
    Serial.print("Signal Strength (RSSI): ");
    Serial.print(rssi);
    Serial.println(" dBm"); 
     pr_wifi = false;       
     httpUpdater.setup(&httpServer, update_path);
     httpServer.begin();
     //*************************************************
   if (digitalRead(0)==LOW)  {
    spanie=0;
    }
  if (spanie>0){
   ilespanie();
  }
  //****************************************************
   }
    if (pr_wifi == false){
     httpServer.handleClient(); 
     yield();
    }
   }
  }
// Supla.org ethernet layer
    int supla_arduino_tcp_read(void *buf, int count) {
        _supla_int_t size = client.available();       
        if ( size > 0 ) {
            if ( size > count ) size = count;
            return client.read((uint8_t *)buf, size);
        };    
        return -1;
    };    
    int supla_arduino_tcp_write(void *buf, int count) {
        return client.write((const uint8_t *)buf, count);
    };    
    bool supla_arduino_svr_connect(const char *server, int port) {
          return client.connect(server, 2015);
    }    
    bool supla_arduino_svr_connected(void) {
          return client.connected();
    }    
    void supla_arduino_svr_disconnect(void) {
         client.stop();
    }    
    void supla_arduino_eth_setup(uint8_t mac[6], IPAddress *ip) {
    }

SuplaDeviceCallbacks supla_arduino_get_callbacks(void) {
          SuplaDeviceCallbacks cb;          
          cb.tcp_read = &supla_arduino_tcp_read;
          cb.tcp_write = &supla_arduino_tcp_write;
          cb.eth_setup = &supla_arduino_eth_setup;
          cb.svr_connected = &supla_arduino_svr_connected;
          cb.svr_connect = &supla_arduino_svr_connect;
          cb.svr_disconnect = &supla_arduino_svr_disconnect;
          cb.get_temperature = &get_temperature;
          cb.get_temperature_and_humidity = NULL;
          cb.get_rgbw_value = NULL;
          cb.set_rgbw_value = NULL;         
          return cb;
}

void WiFi_up(){ // conect to wifi
 
  if (millis() > wifimilis)  {
  WiFi.begin();
  delay(500);
  pr_wifi = true;
  Serial.println("CONNECTING WIFI"); 
  wifimilis = (millis() + wifi_checkDelay) ;
  }
}
 void ilespanie(){
       delay(50);
ESP.deepSleep(spanie* 1000 * 1000);
 }

BAZA
- wgrywamy program,
- resetujemy wemosa i podłączamy się do wifi "BAZA",
- wypełniamy tabelkę configu (w linku wpisujemy zapamiętany link z "VOLT_dal" lub "TEMP_dal",
- zapisujemy i czekamy aż komp wróci sam do swojego wifi,
- naciskamy reset,
- rejestrujemy w cloudzie.
- powtórne wejście do configu D3 do masy około 20 sek.

Kod: Zaznacz cały


//BAZA
//
//w linku wpisac link bezposredni do TEMP_dal lub VOLT_dal

#include <FS.h>  // ---- esp board manager 2.4.2 --- iwip Variant V2 higher Bandwidth
#include <WiFiClientSecure.h>
#include <ESP8266WiFi.h>
#define SUPLADEVICE_CPP
#include <SuplaDevice.h>
#include <math.h>
#include <DNSServer.h>
#include <WiFiManager.h> 
#include <ArduinoJson.h> //-- https://github.com/bblanchon/ArduinoJson/tree/v5.13.2 --
#include <EEPROM.h>
#include <ESP8266WebServer.h>
#include <ESPEFC.h> 
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>

const char* host = "svr.supla.org";
const int httpsPort = 443;

extern "C"
{
#include "user_interface.h"
}
#define config_pin 0    // D3  wifi config 10 sek
#define status_led 2    // D4  status Led 

char D_Link_1[61];
bool pr_wifi = true;
bool start = true;           
int s;             
unsigned long wifi_checkDelay = 20000;
unsigned long wifimilis;
int C_W_state = HIGH; 
int last_C_W_state = HIGH;
unsigned long time_last_C_W_change = 0; 
long C_W_delay = 2000;  // config delay 10 seconds
WiFiClient client;
ESP8266WebServer httpServer(81);
ESPEFC httpUpdater;
const char* update_path = "/";
char Supla_server[80];
char Location_id[15];
char Location_Pass[34];
byte mac[6];
String url = "/direct/xx/xxxxxxxxx/xxx";
bool shouldSaveConfig = false;
bool initialConfig = false;
int timeout = 180;          // seconds to run the wifi config
unsigned long link_delay = 5000; 
float temp1;

OneWire oneWire(2);// DS18B20
DallasTemperature sensors(&oneWire);

double get_temperature(int channelNumber, double last_val) {

    double t = -275;
      if ( sensors.getDeviceCount() > 0 )
      {
       sensors.requestTemperatures();
     t = sensors.getTempCByIndex(0);
      };
      direct_Link();
      Serial.println (temp1);
      t=temp1;
      return t;  
}

void saveConfigCallback () {  //callback notifying us of the need to save config
  Serial.println("Should save config");
  shouldSaveConfig = true;
}
void ondemandwifiCallback () {
  digitalWrite(status_led, LOW);
  httpServer.stop();
  
  WiFiManagerParameter custom_Supla_server("server", "supla server", Supla_server, 80);
  WiFiManagerParameter custom_Location_id("ID", "Location id", Location_id, 15);
  WiFiManagerParameter custom_Location_Pass("Password", "Location Pass", Location_Pass, 34);
  WiFiManagerParameter custom_D_Link_1("Linka", "Link_z_TEMP_dal lub VOLT_dal", D_Link_1, 61);
 
  WiFiManager wifiManager;
  wifiManager.setBreakAfterConfig(true);
  wifiManager.setSaveConfigCallback(saveConfigCallback);
  
  wifiManager.addParameter(&custom_Supla_server);
  wifiManager.addParameter(&custom_Location_id);
  wifiManager.addParameter(&custom_Location_Pass);
  wifiManager.addParameter(&custom_D_Link_1);

  wifiManager.setCustomHeadElement("<style>html{ background-color: #01DF3E;}</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.setConfigPortalTimeout(timeout);

    if (!wifiManager.startConfigPortal("BAZA")) {
      Serial.println("Not connected to WiFi but continuing anyway.");
    } else {
      
      Serial.println("connected...yeey :)");  //if you get here you have connected to the WiFi
    }
    //read updated parameters
    strcpy(Supla_server, custom_Supla_server.getValue());
    strcpy(Location_id, custom_Location_id.getValue());
    strcpy(Location_Pass, custom_Location_Pass.getValue());
    strcpy(D_Link_1, custom_D_Link_1.getValue());
   
    WiFi.softAPdisconnect(true);   //  close AP
}        

void status_func(int status, const char *msg) {     //    ------- Status --------------------------
 s=status;                                          //    -- to check if we are registered and ready before restore from memory
}
void setup() {  //------- Setup ----------------

  wifi_set_sleep_type(NONE_SLEEP_T);

  Serial.begin(115200);
  sensors.begin();
  
  sensors.setResolution(12);//rozdzielczość DS-a
  delay(200);
  pinMode(status_led,OUTPUT);
 
   if (WiFi.SSID()==""){
    initialConfig = true;
  } 
  
  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.

   uint8_t mac[WL_MAC_ADDR_LENGTH];
   WiFi.macAddress(mac);
   char GUID[SUPLA_GUID_SIZE] = {mac[WL_MAC_ADDR_LENGTH - 6], mac[WL_MAC_ADDR_LENGTH - 5], mac[WL_MAC_ADDR_LENGTH - 4], mac[WL_MAC_ADDR_LENGTH - 3],                                
                                 mac[WL_MAC_ADDR_LENGTH - 2], mac[WL_MAC_ADDR_LENGTH - 1], mac[WL_MAC_ADDR_LENGTH - 1], mac[WL_MAC_ADDR_LENGTH - 2], 
                                 mac[WL_MAC_ADDR_LENGTH - 3], mac[WL_MAC_ADDR_LENGTH - 4], mac[WL_MAC_ADDR_LENGTH - 5], mac[WL_MAC_ADDR_LENGTH - 6]};
    
  SuplaDevice.addDS18B20Thermometer();

  if (SPIFFS.begin()) {
    Serial.println("mounted file system");
    if (SPIFFS.exists("/config.json")) {
      Serial.println("reading config file");
      File configFile = SPIFFS.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);
        DynamicJsonBuffer jsonBuffer;         
        JsonObject& json = jsonBuffer.parseObject(buf.get());
        json.printTo(Serial);   //print config data to serial on startup
        if (json.success()) {
        Serial.println("\nparsed json");

          strcpy(Supla_server, json["Supla_server"]);
          strcpy(Location_id, json["Location_id"]);
          strcpy(Location_Pass, json["Location_Pass"]);       
          strcpy(D_Link_1, json["D_Link_1"]);
          
           host = Supla_server;
              url = D_Link_1;
        } else {
          Serial.println("failed to load json config");
          initialConfig = true;
        }
      }
    }
  } else {
    Serial.println("failed to mount FS");
  }
  wifi_station_set_hostname("BAZA");  

  SuplaDevice.setStatusFuncImpl(&status_func); 
  SuplaDevice.setName("BAZA");

  int LocationID = atoi(Location_id);
  SuplaDevice.begin(GUID,              // Global Unique Identifier 
                    mac,               // Ethernet MAC address
                    Supla_server,      // SUPLA server address
                    LocationID,        // Location ID 
                    Location_Pass);    // Location Password 
                       
digitalWrite(status_led, HIGH);                      
}

void loop() {
 
  if (initialConfig){
    ondemandwifiCallback () ;
  }
  if (shouldSaveConfig) {
    Serial.println("saving config");
    DynamicJsonBuffer jsonBuffer;
    JsonObject& json = jsonBuffer.createObject();
    
    json["Supla_server"] = Supla_server;
    json["Location_id"] = Location_id;
    json["Location_Pass"] = Location_Pass;
    json["D_Link_1"] = D_Link_1;
   
    File configFile = SPIFFS.open("/config.json", "w");
    if (!configFile) {
      Serial.println("failed to open config file for writing");
    }
    json.prettyPrintTo(Serial);
    json.printTo(configFile);
    configFile.close();
    Serial.println("config saved");
    shouldSaveConfig = false;
    initialConfig = false; 
    WiFi.mode(WIFI_STA);
    ESP.restart();
    delay(5000); 
  }
  if (WiFi.status() != WL_CONNECTED) { 
    WiFi_up();
  }
   int C_W_read = digitalRead(config_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) {     
       Serial.println("Triger sate changed");
       C_W_state = C_W_read;       
       if (C_W_state == LOW) {
        ondemandwifiCallback () ;
       }
     }
    }
   last_C_W_state = C_W_read;            
   }
   
   if (WiFi.status() == WL_CONNECTED){
   
    SuplaDevice.iterate(); 
  
    if (pr_wifi == true){
    Serial.println("");
    Serial.println("CONNECTED");
    Serial.print("local IP: ");
    Serial.println(WiFi.localIP());
    Serial.print("subnetMask: ");
    Serial.println(WiFi.subnetMask());
    Serial.print("gatewayIP: ");
    Serial.println(WiFi.gatewayIP());
     long rssi = WiFi.RSSI();
    Serial.print("Signal Strength (RSSI): ");
    Serial.print(rssi);
    Serial.println(" dBm"); 
     pr_wifi = false;       
     httpUpdater.setup(&httpServer, update_path);
     httpServer.begin();
     delay(50);
    }
    if (pr_wifi == false){
     httpServer.handleClient(); 
     yield();
    
    }
  }
}
// Supla.org ethernet layer
    int supla_arduino_tcp_read(void *buf, int count) {
        _supla_int_t size = client.available();       
        if ( size > 0 ) {
            if ( size > count ) size = count;
            return client.read((uint8_t *)buf, size);
        };    
        return -1;
    };    
    int supla_arduino_tcp_write(void *buf, int count) {
        return client.write((const uint8_t *)buf, count);
    };    
    bool supla_arduino_svr_connect(const char *server, int port) {
          return client.connect(server, 2015);
    }    
    bool supla_arduino_svr_connected(void) {
          return client.connected();
    }    
    void supla_arduino_svr_disconnect(void) {
         client.stop();
    }    
    void supla_arduino_eth_setup(uint8_t mac[6], IPAddress *ip) {
    }

SuplaDeviceCallbacks supla_arduino_get_callbacks(void) {
          SuplaDeviceCallbacks cb;          
          cb.tcp_read = &supla_arduino_tcp_read;
          cb.tcp_write = &supla_arduino_tcp_write;
          cb.eth_setup = &supla_arduino_eth_setup;
          cb.svr_connected = &supla_arduino_svr_connected;
          cb.svr_connect = &supla_arduino_svr_connect;
          cb.svr_disconnect = &supla_arduino_svr_disconnect;
          cb.get_temperature = &get_temperature;
          cb.get_temperature_and_humidity = NULL;
          cb.get_rgbw_value = NULL;
          cb.set_rgbw_value = NULL;         
          return cb;
}

void WiFi_up(){ // conect to wifi
 
  if (millis() > wifimilis)  {
  WiFi.begin();
  delay(500);
  pr_wifi = true;
  Serial.println("CONNECTING WIFI"); 
  wifimilis = (millis() + wifi_checkDelay) ;
  }
}
 void direct_Link() {
  WiFiClientSecure client;
  Serial.print("connecting to ");
  Serial.println(host);
  if (!client.connect(host, httpsPort)) {
    Serial.println("connection failed -----------");
    return;
  }
  Serial.print("requesting URL: ");
  Serial.println(url);
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "User-Agent: ESP8266\r\n" +
               "Connection: close\r\n\r\n");
  Serial.println("request sent");
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    if (line == "\r") {
      Serial.println("headers received");
      break;
    }
  }
   String line = client.readStringUntil('\n');
  if (line.indexOf("true") >0) {
    yield();
  Serial.println("reply was:  ");Serial.println("==========");  
   Serial.println(line);
  Serial.println("==========");Serial.println("closing connection");
    DynamicJsonBuffer jsonBuffer;
  JsonObject& root = jsonBuffer.parseObject(line);
  temp1 = root["temperature"];    
 } 
}
Aby nie "śmiecić" w aplikacji telefonu "VOLT_dal" lub "TEMP_dal" (zależy co wybraliśmy) można wyłączyć "Pokaż w urządzeniach klienckich" w cloudzie. Wynik mierzonego napięcia lub temperatury mamy w BAZIE, odświeżany co czas, który ustawiliśmy w configu VOLT_dal lub TEMP_dal.



Jak ktoś ma ochotę na testowanie to zapraszam... :)
Załączniki
oszczedzanie.zip
(838.68 KiB) Pobrany 166 razy
Ostatnio zmieniony wt kwie 14, 2020 6:34 am przez piomar2, łącznie zmieniany 1 raz.
piomar2
Posty: 369
Rejestracja: pt kwie 26, 2019 5:32 pm
Lokalizacja: Bukowice

Poprawiona wersja powyżej...
Ostatnio zmieniony wt kwie 14, 2020 6:36 am przez piomar2, łącznie zmieniany 1 raz.
wandre
Posty: 28
Rejestracja: wt lut 04, 2020 8:49 pm

piomar2 pisze: sob kwie 11, 2020 9:15 am Dokładam programik do rozwiązania powyżej tyle, że przekazującego do BAZY wartość napięcia z woltomierza. Program BAZA bez zmian (oczywiście trzeba wpisać link do VOLT.dal).



VOLT_dal.jpg


Kod: Zaznacz cały

//wemos D1 mini
//A0 - pomiar napięcia (max 3,2 V na A0)
//Dzielnik 90k+10k(potencjometr)/10k (max 30 V)
//D0 połączony z RST rezystorem 470om
// D3  wifi config 10 sek

#include <FS.h>  // ---- esp board manager 2.4.2 
#include <ESP8266WiFi.h>
#define SUPLADEVICE_CPP
#include <SuplaDevice.h>
#include <math.h>
#include <DNSServer.h>
#include <WiFiManager.h> 
#include <ArduinoJson.h> //-- https://github.com/bblanchon/ArduinoJson/tree/v5.13.2 --
#include <EEPROM.h>
#include <ESP8266WebServer.h>
#include <ESPEFC.h> 
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>

extern "C"
{
#include "user_interface.h"
}
#define config_pin 0    // D3  wifi config 10 sek
#define status_led 2    // D4  status Led 
bool pr_wifi = true;
bool start = true;           
int s;             
unsigned long wifi_checkDelay = 20000;
unsigned long wifimilis;
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
WiFiClient client;
ESP8266WebServer httpServer(81);
ESPEFC httpUpdater;
const char* update_path = "/";
char Supla_server[80];
char Location_id[15];
char Location_Pass[34];
byte mac[6];
bool shouldSaveConfig = false;
bool initialConfig = false;
int timeout = 180;          // seconds to run the wifi config
int spanie;
char T_Link_1[3]; 
int analogInput = 0;
float vout = 0.0;
float vin = 0.0;
float R1 = 100000.0; // R1 - 100K
float R2 = 10000.0; // R2 - 10K
int value = 0;


OneWire oneWire(2);// DS18B20
DallasTemperature sensors(&oneWire);
//--------------------------------------------------------------
double get_temperature(int channelNumber, double last_val) {

    double t = -275;
      value = analogRead(analogInput);
      vout = (value * 3.3) / 1024.0;
      vin = vout / (R2/(R1+R2)); 
        if (vin<0.09) {
            vin=0.0;
            } 
        t=vin;
        Serial.println(t);
    return t;  
}

void saveConfigCallback () {  //callback notifying us of the need to save config
  Serial.println("Should save config");
  shouldSaveConfig = true;
}
void ondemandwifiCallback () {
  digitalWrite(status_led, LOW);
  httpServer.stop();
  WiFiManagerParameter custom_Supla_server("server", "supla server", Supla_server, 80);
  WiFiManagerParameter custom_Location_id("ID", "Location id", Location_id, 15);
  WiFiManagerParameter custom_Location_Pass("Password", "Location Pass", Location_Pass, 34);
  WiFiManagerParameter custom_T_Link_1("Linka", "Czas spania w sek", T_Link_1, 3);
 
  WiFiManager wifiManager;
  wifiManager.setBreakAfterConfig(true);
  wifiManager.setSaveConfigCallback(saveConfigCallback);
  
  wifiManager.addParameter(&custom_Supla_server);
  wifiManager.addParameter(&custom_Location_id);
  wifiManager.addParameter(&custom_Location_Pass);
  wifiManager.addParameter(&custom_T_Link_1);

  wifiManager.setCustomHeadElement("<style>html{ background-color: #01DF3E;}</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.setConfigPortalTimeout(timeout);

    if (!wifiManager.startConfigPortal("VOLT_dal")) {
      Serial.println("Not connected to WiFi but continuing anyway.");
    } else {
      
      Serial.println("connected...yeey :)");  //if you get here you have connected to the WiFi
    }
    //read updated parameters
    strcpy(Supla_server, custom_Supla_server.getValue());
    strcpy(Location_id, custom_Location_id.getValue());
    strcpy(Location_Pass, custom_Location_Pass.getValue());
    strcpy(T_Link_1, custom_T_Link_1.getValue());
    
   
    WiFi.softAPdisconnect(true);   //  close AP
}
     
void status_func(int status, const char *msg) {     //- Status -
 s=status;                                          //- to check if we are registered and ready before restore from memory
}
void setup() { 
  
  Serial.begin(115200);
    
  sensors.begin();
  sensors.setResolution(12);//rozdzielczość DS-a
  
  delay(200);
  pinMode(status_led,OUTPUT);
  
  if (WiFi.SSID()==""){
    initialConfig = true;
  } 
  
  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.

   uint8_t mac[WL_MAC_ADDR_LENGTH];
   WiFi.macAddress(mac);
   char GUID[SUPLA_GUID_SIZE] = {mac[WL_MAC_ADDR_LENGTH - 6], mac[WL_MAC_ADDR_LENGTH - 5], mac[WL_MAC_ADDR_LENGTH - 4], mac[WL_MAC_ADDR_LENGTH - 3],                                
                                 mac[WL_MAC_ADDR_LENGTH - 2], mac[WL_MAC_ADDR_LENGTH - 1], mac[WL_MAC_ADDR_LENGTH - 1], mac[WL_MAC_ADDR_LENGTH - 2], 
                                 mac[WL_MAC_ADDR_LENGTH - 3], mac[WL_MAC_ADDR_LENGTH - 4], mac[WL_MAC_ADDR_LENGTH - 5], mac[WL_MAC_ADDR_LENGTH - 6]};
          
  SuplaDevice.addDS18B20Thermometer();

  if (SPIFFS.begin()) {
    Serial.println("mounted file system");
    if (SPIFFS.exists("/config.json")) {
      Serial.println("reading config file");
      File configFile = SPIFFS.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);
        DynamicJsonBuffer jsonBuffer;         
        JsonObject& json = jsonBuffer.parseObject(buf.get());
        json.printTo(Serial);   //print config data to serial on startup
        if (json.success()) {
          Serial.println("\nparsed json");

          strcpy(Supla_server, json["Supla_server"]);
          strcpy(Location_id, json["Location_id"]);
          strcpy(Location_Pass, json["Location_Pass"]);
          strcpy(T_Link_1, json["T_Link_1"]); 
        } else {
          Serial.println("failed to load json config");
          initialConfig = true;
        }
      }
    }
  } else {
    Serial.println("failed to mount FS");
  }
   wifi_station_set_hostname("VOLT_dal");
  SuplaDevice.setStatusFuncImpl(&status_func); 
  SuplaDevice.setName("VOLT_dal");

  int LocationID = atoi(Location_id);
  SuplaDevice.begin(GUID,              // Global Unique Identifier 
                    mac,               // Ethernet MAC address
                    Supla_server,      // SUPLA server address
                    LocationID,        // Location ID 
                    Location_Pass);    // Location Password    
digitalWrite(status_led, HIGH);  
}

void loop() {
   spanie = atoi(T_Link_1);
   
  if (initialConfig){
    ondemandwifiCallback () ;
  }
  if (shouldSaveConfig) {
    Serial.println("saving config");
    DynamicJsonBuffer jsonBuffer;
    JsonObject& json = jsonBuffer.createObject();
    json["Supla_server"] = Supla_server;
    json["Location_id"] = Location_id;
    json["Location_Pass"] = Location_Pass;
    json["T_Link_1"] = T_Link_1;
   
    File configFile = SPIFFS.open("/config.json", "w");
    if (!configFile) {
     Serial.println("failed to open config file for writing");
    }
    json.prettyPrintTo(Serial);
    json.printTo(configFile);
    configFile.close();
    Serial.println("config saved");
    shouldSaveConfig = false;
    initialConfig = false; 
    WiFi.mode(WIFI_STA);
    ESP.restart();
    delay(5000); 
  }
  if (WiFi.status() != WL_CONNECTED) { 
    WiFi_up();
  }
   int C_W_read = digitalRead(config_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) {     
       Serial.println("Triger sate changed");
       C_W_state = C_W_read;       
       if (C_W_state == LOW) {
        ondemandwifiCallback () ;
       }
     }
    }
   last_C_W_state = C_W_read;            
   }
   
   if (WiFi.status() == WL_CONNECTED){
    SuplaDevice.iterate();      
    if (pr_wifi == true){
    Serial.println("");
    Serial.println("CONNECTED");
    Serial.print("local IP: ");
    Serial.println(WiFi.localIP());
    Serial.print("subnetMask: ");
    Serial.println(WiFi.subnetMask());
    Serial.print("gatewayIP: ");
    Serial.println(WiFi.gatewayIP());
     long rssi = WiFi.RSSI();
    Serial.print("Signal Strength (RSSI): ");
    Serial.print(rssi);
    Serial.println(" dBm"); 
     pr_wifi = false;       
     httpUpdater.setup(&httpServer, update_path);
     httpServer.begin();
  if (spanie>0){
   ilespanie();
  }
   }
    if (pr_wifi == false){
     httpServer.handleClient(); 
     yield();
    }
   }
  }
// Supla.org ethernet layer
    int supla_arduino_tcp_read(void *buf, int count) {
        _supla_int_t size = client.available();       
        if ( size > 0 ) {
            if ( size > count ) size = count;
            return client.read((uint8_t *)buf, size);
        };    
        return -1;
    };    
    int supla_arduino_tcp_write(void *buf, int count) {
        return client.write((const uint8_t *)buf, count);
    };    
    bool supla_arduino_svr_connect(const char *server, int port) {
          return client.connect(server, 2015);
    }    
    bool supla_arduino_svr_connected(void) {
          return client.connected();
    }    
    void supla_arduino_svr_disconnect(void) {
         client.stop();
    }    
    void supla_arduino_eth_setup(uint8_t mac[6], IPAddress *ip) {
    }

SuplaDeviceCallbacks supla_arduino_get_callbacks(void) {
          SuplaDeviceCallbacks cb;          
          cb.tcp_read = &supla_arduino_tcp_read;
          cb.tcp_write = &supla_arduino_tcp_write;
          cb.eth_setup = &supla_arduino_eth_setup;
          cb.svr_connected = &supla_arduino_svr_connected;
          cb.svr_connect = &supla_arduino_svr_connect;
          cb.svr_disconnect = &supla_arduino_svr_disconnect;
          cb.get_temperature = &get_temperature;
          cb.get_temperature_and_humidity = NULL;
          cb.get_rgbw_value = NULL;
          cb.set_rgbw_value = NULL;         
          return cb;
}

void WiFi_up(){ // conect to wifi
 
  if (millis() > wifimilis)  {
  WiFi.begin();
  delay(500);
  pr_wifi = true;
  Serial.println("CONNECTING WIFI"); 
  wifimilis = (millis() + wifi_checkDelay) ;
  }
}
 void ilespanie(){
       delay(50);
ESP.deepSleep(spanie* 1000 * 1000);
 }

Witam. Soft załadowany , czas ustawiony na 999s.
Taka mała aczkolwiek oczywista uwaga, kalibrację trzeba zrobić zanim się wpisze długi czas uśpienia :).
Za kilka dni zdam relację, na razie wszystko OK. Pozdrawiam.
wandre
6x Sonoff Basic, 3x Sonoff Pow_R2, 1x ESP12, 3x Wemos d1 mini
wandre
Posty: 28
Rejestracja: wt lut 04, 2020 8:49 pm

Witam ponownie. Dzisiaj przy zmianie napięcia akumulatora Baza nie rejestruje tej zmiany. Gdy restartuje Volt_dal to Baza zczytuje aktualne napięcie. Wydaje mi się że VOLT_dal nie wybudza się po tych 999 s, bo napięcie na Bazie się nie zmienia. Gdy zrestartuje Bazę tak żeby czekała na pierwszy odczyt to cały czas pokazuje 0.0. Zmieniłem na wszelki wypadek Wemosa Volt_dal na innego ale jest to samo.
Spróbuję jeszcze z krótszym czasem.

Przy czasie 300 s jest to samo, odczyt Bazy aktualizuje się tylko przy resecie Volt_dal. Czyli się chyba nie wybudza

Postanowiłem jeszcze sprawdzić co dzieje się na porcie szeregowym (putty).
Po restarcie modułu Volt_dal wszystko wygląda ok. Po ustawieniu na czas uśpienia np 60s wszysto jest wporządku do momentu pierwszego wybudzenia, lecą wtedy na ekranie śmieci i Wemos się zawiesza bo póżniej już nic się nie dzieje.

[▒▒▒l`▒g▒mounted file system
reading config file
opened config file
{"Supla_server":"*************","Location_id":"*****","Location_Pass":"****","T_Link_1":"60"}
parsed json
0.11

CONNECTED
local IP: 192.168.****
subnetMask: *****
gatewayIP: ****
Signal Strength (RSSI): -71 dBm
▒▒▒80▒
▒▒▒
8▒▒8▒
▒>▒▒6>28▒▒▒▒▒>▒▒▒<6▒8▒▒▒▒▒6>▒2▒22▒▒▒▒]
wandre
6x Sonoff Basic, 3x Sonoff Pow_R2, 1x ESP12, 3x Wemos d1 mini
PioKar
Posty: 411
Rejestracja: czw maja 03, 2018 5:56 am

piomar2 pisze: sob mar 21, 2020 3:03 pm Witajcie!

Muszę zweryfikować tego posta, ponieważ pojawiły się pewne problemy z oprogramowaniem. Mam nadzieję, że teraz będzie ok.

No mi się nie udało uruchomić.
Wersja volt.
Tuż po włączeniu nadajnika link pokazuje to co cloud.
Czyli link działa.
Mam porównanie do wersji z jednym wemosem który łączy się co 110 sekund.
I w tym wypadku mam ostatnie połączenie co 2 minuty.
Natomiast w tej wersji ostatnie połączenie jest w chwili połączenie wemosa po raz pierwszy i potem juz nic.
Czas ustawiłem na teście 180 sekund.
I wygląda to tak że po włączeniu jest przez 2 minutu on line a potem na czerwono i już nic się nie zmienia.
Wgrywałem bin bo arduino żąda uporządkowania bibliotek ale na to na razie nie mam siły.
W tej chwili mam bazę on line bez odczytów a nadajnik na czerwono.
Testy zrobiłem ponieważ wdzięczny jestem za to co dostałem do tej pory.
Pozdrawiam
ps: mam już te dwie sztuki postawione pod ten projekt więc z chęcią mogę testować.
Podsyłaj w wolnej chwili bin-y i będę meldować.
I na koniec tylko jedna wskazówka.
Ten soft z usypianiem co 110 sek który kiedyś dla mnie zrobiłeś.
Czasem w cloud jest na czerwono ale potem robi się na zielono i generalnie jest ok.
Ten nowy soft jak się zaczerwieni to juz tak go trzyma.
Jutro ten nowy soft ustawię tak jak stary na 110 sekund i napisze czy jest jakaś zmiana.
piomar2
Posty: 369
Rejestracja: pt kwie 26, 2019 5:32 pm
Lokalizacja: Bukowice

A Masz zwarte D0 z RST? U mnie VOLT_dal chodzi od wczoraj i wysyła do BAZY. Ustawione na 999

Zrób tak. Włącz "VOLT.dal" i poczekaj aż w cloudzie zrobi się na czerwono (około 2 min).
Następnie dopiero włącz BAZĘ. Powinna wskazywać "0". Po upływie ustawionego czasu (ja sprawdzałem na 999 sek) "VOLT.dal" zrobi się na zielono i po chwili powinna pojawić się wartość w BAZIE. Po około 2 min BAZA dalej pamięta ostatnią wartość, a "VOLT.dal" robi się na czerwono. I znowu, po po upływie ustawionego, czasu zrobi się na 2 minuty na zielono i przekaże kolejną wartość do BAZY.

Możesz również na porcie szeregowym podpatrzeć, czy "VOLT_dal" budzi się i wysyła dane.
Ostatnio zmieniony wt kwie 14, 2020 4:46 pm przez piomar2, łącznie zmieniany 1 raz.
PioKar
Posty: 411
Rejestracja: czw maja 03, 2018 5:56 am

piomar2 pisze: wt kwie 14, 2020 3:51 pm A Masz zwarte D0 z RST? Taki jest efekt gdy nie ma zworki. U mnie VOLT_dal chodzi od wczoraj i wysyła do BAZY.
Wiesz co mam :)
Ale rezystor tylko wsadziłem w "damskie bloki", ale teraz zabolcuję, zresetuje i napiszę.
PioKar
Posty: 411
Rejestracja: czw maja 03, 2018 5:56 am

piomar2 pisze: wt kwie 14, 2020 3:51 pm A Masz zwarte D0 z RST? U mnie VOLT_dal chodzi od wczoraj i wysyła do BAZY. Ustawione na 999
Dałem nowy opornik, zablokowałem dodatkowymi pinami.
Przez chwilę baza pokazazywała to co nadajnik.
A teraz mam nadajnik na czerwono a bazę na 0.
Jutro wrócimy do tematu.
wandre
Posty: 28
Rejestracja: wt lut 04, 2020 8:49 pm

Witam. Wgrałem poprawioną wersję Volt_dal, najpierw z pliku bin, później z Arduino. W obu przypadkach, tak jak poprzednio wszystko jest wporządku do czasu pierwszego wybudzenia. Mam zware D0 z RST rezystorem 470om. Przy starcie przez kilka sekund układ pobiera około 70mA, po tym czasie spada pobór do 0,7mA, następnie podczas pierwszego wybudzenia prąd wzrasta do 35mA i tak już zostaje.
Na porcie szeregowym tak jak poprzednio. Najpierw ok a przy pierwszym wybudzeniu lecą śmieci i już nic dalej. Porównałem kod i widzę że pijawiła się dodatkowa funkcja warunkowa "if (digitalRead(0)==LOW) { spanie=0; }" ale jeszcze tego nie ogarniam. Będę jeszcze próbował. Pozdrawiam. :)
wandre
6x Sonoff Basic, 3x Sonoff Pow_R2, 1x ESP12, 3x Wemos d1 mini
piomar2
Posty: 369
Rejestracja: pt kwie 26, 2019 5:32 pm
Lokalizacja: Bukowice

Koledzy. U mnie wszystko działa już 2 dobę ok. Ta funkcja "if (digitalRead(0)==LOW) { spanie=0; }" pozwala po podaniu masy na D3, na wejście do configu (jak spanie>0 to idzie spać, wcześniej był to problem z wejściem do configu). Dlatego po wgraniu programu do wemosa w configu ustawiamy "0" bo jest to też warunek rejestracji w cloudzie). U mnie pobór prądu około 0,2 mA jak śpi i na moment wzrasta do około 70 mA po przebudzeniu i wysłaniu danych i ponownie spada do 0,2 mA. Jeżeli uważnie przejrzycie poprawiony post i schemat (D0 i RST jest zwarte dutem a nie rezystorem) i "przebrniecie" przez instalację to będzie ok. Ja dla sprawdzenia kilka razy zresetowałem BAZĘ, która do ponownego wysłania danych przez VOLT pokazuje "0" i jak odbierze to pokazuje zmierzoną wartość. Życzę powodzenia
ODPOWIEDZ

Wróć do „Pomysły i koncepcje”