Kompresor + OLED + czujnik ciśnienia w instalacji + zawór + 2xDS

mareks6
Posty: 259
Rejestracja: sob sty 13, 2018 4:39 pm
Lokalizacja: Opole

Chciałem po krótce przedstawić co udało mi się wykonać z wielką pomoca kolegi elmaya (nochmals vielen Dank :-))

Jako, że żona co jakiś czas prosi mnie bym jej przedmuchał cały odkurzacz I musiałem zawsze iśc do garażu, włączyć kompresor I albo czekać na miejscu albo wrócić do domu do czasu napełnienia zbiornika, postanowiłem sobie to ułatwić poprzez zdalne włączenie kompresora. Teraz idę do garażu gdy instalacja jest już napompowana :-)

Początkowo miało byc tylko włącz, wyłącz, podgląd ciśnienia w aplikacji supla, 2x czujnik temperatury DS oraz sterowanie zaworem, wraz ze sterowaniem lokalnym, ale kolega elmaya zaproponował by lokalnie można też było zobaczyć ciśnienie w instalacji I tak doszedł do tego OLED. Efekt końcowy przeszedł moje oczekiwania I jestem z całości bardzo zadowolony.

Sterownik jest zbudowany na gotowych modułach I każdy może go zbudowac w domu.

Firmware jest troszkę nietypowy gdyż fizycznie są na schemacie 2 kanały przekaźnikowe (socket/gate) a po dodaniu do clouda widoczne są 3 kanały. Jest to spowodowane tym, iż jeden z przekaźników jest srrerowany na 2 sposoby z poziomu aplikacji supla – jednym kanałem typu Gate oraz jednym socket. Służy on do włączania kompresora na stałe (gdy ciśnienie spadnie, presostat włącza znów pompowanie) oraz jednokrotne napełnienie zbiornika. To zadanie jest zrealizowany takim drobnym mykiem od strony hardware, więc jeśli byłby ktoś zainteresowany, to narysuję w wolnej chwili I udostępnie schemat.

Sam sterownik na tym podwójnym kanale steruje w poniższy sposób:

1. Gdy kanał socket wyłączony, kanał gate włącza przekaźnik na 1 sekundę
2. Gdy kanał socket włączony, kanał gate nic nie zmienia.

Dodatkowo w sterowniku do powyższego przekaźnika przypisany jest klawisz, którego działanie tez jest niestandardowe – poniżej możliwe stany:

socket off = relay1 off

socket off, Gate activated from App = relay1 pulse
socket off, Click D5 = relay1 on
socket off, Long Click D5 = relay1 1 second pulse

socket on = relay1 on

socket on, Gate activated from App = "no change" - relay1 on
socket on, Click D5 = relay1 off
socket on, Long Click D5 = “no change" - relay1 on

Kanały do tego przekaźnika trzeba odpowiednio przypisać w Cloud, nie wiem czy u Wszystkich będzie tak samo ale u mnie wygląda to tak:
- kanał nr 3 – ustawić jako otwieranie drzwi (kanał gate) – włączanie przekaźnika na ustawiony czas
- kanał nr 4 – ustawić jako włączanie zasilania (kanał socket) – włączanie kompresora na stałe

Pozostałe elementy w cloud to już typowe rzeczy więc nie będę opisywać.

Drugi przekaźnik ustawiłem w cloud jako otwieranie bramy I docelowo będzie tam podpięty zawór (wraz z podglądem faktycznego jego stanu), który zmienia stany otwarty<→zamknięty po każdym impulsie do niego podanym. Do tego kanału nie ma fizyczego klawisza, ale w przypadku gate jak u mnie, to nie problem, bo można włącznikiem zwierać na chwilę zasilanie przekaźnika bezpośrednio.

Czujnik ciśnienia w instalacji kupiłem taki:

https://www.aliexpress.com/item/3302450 ... 4c4dmGXTeX

jest widoczny w cloud jako czujnik temperatury, ale mi ten symbol stopnia w aplikacji nie przeszkadza.

Jeśli będą zainteresowani to mogę wszystko wyjaśnić dokładnie.

Poniżej kilka fotek, schemat połączeń sterownika oraz wsad
Załączniki
Supla - Kompresor.rar
(501.55 KiB) Pobrany 145 razy
20200529_142508.jpg
20200529_142508.jpg (3.88 MiB) Przejrzano 3337 razy
12BarV2_bb.png
12BarV2_bb.png (170.92 KiB) Przejrzano 3337 razy
Ostatnio zmieniony śr cze 03, 2020 6:39 pm przez mareks6, łącznie zmieniany 2 razy.
mareks6
Posty: 259
Rejestracja: sob sty 13, 2018 4:39 pm
Lokalizacja: Opole

dodatkowe foto:
Załączniki
20200529_142928.jpg
20200529_142928.jpg (3.72 MiB) Przejrzano 3325 razy
20200528_200358.jpg
20200528_200358.jpg (3.72 MiB) Przejrzano 3335 razy
ikony.jpeg
ikony.jpeg (47.4 KiB) Przejrzano 3335 razy
Ostatnio zmieniony śr cze 03, 2020 6:33 pm przez mareks6, łącznie zmieniany 1 raz.
Awatar użytkownika
pzygmunt
Posty: 18277
Rejestracja: wt sty 19, 2016 9:26 am
Lokalizacja: Paczków
Kontakt:

Brawo
elmaya
Posty: 1482
Rejestracja: śr cze 27, 2018 5:48 pm
Lokalizacja: El Saucejo - Sevilla

ArduiniIDE code

Kod: Zaznacz cały

#include <FS.h>       // ---- esp board manager 2.4.2 --- iwip Variant V2 higher Bandwidth  -- 160Mhz
#include <OneWire.h>
#include <DallasTemperature.h> 
#include <EEPROM.h>
#include <ESP8266WiFi.h>
#define CUSTOMSUPLA_CPP
#include <CustomSupla.h>
#include <DNSServer.h>
#include <WiFiManager.h> 
#include <ArduinoJson.h>     //--------- https://github.com/bblanchon/ArduinoJson/tree/v5.13.2 ------
#include <Ticker.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <ESP8266HTTPUpdateServer.h> 
#include <Button3.h>
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

//#include "SSD1306Wire.h" //----- 0.96 Oled --- https://github.com/ThingPulse/esp8266-oled-ssd1306
//SSD1306Wire  display(0x3c, 0, 2);  // D3-SDA  D4-SCL ----- 0.96 Oled ---
#include "SH1106Wire.h" //----- 1.3 Oled ---
SH1106Wire display(0x3c, 0, 2);  // D3-SDA  D4-SCL ----- 1.3 Oled ---

#define button_PIN 12 
#define button2_PIN 14  // D5
#define TRIGGER_PIN 12  // D6    
#define relay1 13       // D7
#define relay2 101      // 
#define relay3 15       // D8
#define sensor1 5       // D1
#define sensor2 4       // D2
#define ONE_WIRE_BUS 3  // RX
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Thermometer_1, Thermometer_2;

int resolution = 12;
WiFiClient client;
WiFiManager wifiManager;
ESP8266WebServer httpServer(81);
ESP8266HTTPUpdateServer httpUpdater;
Button3 button = Button3(button_PIN);
Button3 button2 = Button3(button2_PIN);
const char* host = "supla12bar";
Ticker btn_loop;
unsigned long wifi_checkDelay = 30000;
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        
int MPX_mtbs = 5000;                // mean time between MPX update   
int mpx_zeroCal ;
unsigned long MPX_lasttime;   
double MPX_Value = 0;
double MPV_Send = -1;
double temp_1;
double temp_2;
int Term_Tipo ;
int MPX_zero_offset = 0;
int mpx_Compensation =0;
int s;                  
int timeout           = 120;
char Supla_server[40];
char Location_id[15];
char Location_Pass[34];
char MPX_Compensation[5];
char Supla_name[51];
char update_path[21] = "/update";
char update_username[21];
char update_password[21];
char termtipo[5];
byte mac[6];
bool pr_wifi = true;
bool pr_supla = true;
bool shouldSaveConfig = false;
bool initialConfig = false;
bool manual = false;
bool dimm = false;         
unsigned long dimm_milis ;
WiFiManagerParameter custom_field; 

const uint8_t logo32_glcd_bmp[] PROGMEM =  //logo supla 32
{
  0x00,0x00,0x00,0x00,0xC0,0x1F,0x00,0x00,0xE0,0x7F,0x00,0x00,
  0xF0,0x70,0x00,0x00,0x30,0xE0,0x00,0x00,0x38,0xC0,0x00,0x00,
  0x18,0xC0,0x01,0x00,0x18,0xC0,0x01,0x00,0x38,0xC0,0x00,0x00,
  0x38,0xE0,0x01,0x00,0x70,0xF0,0x07,0x00,0xE0,0x7F,0x0E,0x00,
  0xC0,0x3F,0x38,0x00,0x00,0x1F,0xE0,0x0F,0x00,0x18,0xC0,0x1F,
  0x00,0x18,0xC0,0x30,0x00,0x18,0xC0,0x30,0x00,0x30,0xC0,0x30,
  0x00,0x30,0x80,0x1F,0x00,0x30,0xC0,0x0F,0x00,0x20,0x60,0x00,
  0x00,0x60,0x20,0x00,0x00,0x60,0x30,0x00,0x00,0x40,0x18,0x00,
  0x00,0xC0,0x0D,0x00,0x00,0xC0,0x07,0x00,0x00,0x60,0x04,0x00,
  0x00,0x20,0x0C,0x00,0x00,0x20,0x0C,0x00,0x00,0x60,0x06,0x00,
  0x00,0xC0,0x03,0x00,0x00,0x00,0x00,0x00
};
const uint8_t logo16_wifi_bmp[] PROGMEM =  //logo wifi 16
{
  0x00,0x00,0x00,0x00,0xE0,0x07,0x38,0x1C,0xC4,0x23,0x72,0x4E,
  0x08,0x10,0xE4,0x27,0x10,0x0C,0x90,0x09,0x40,0x02,0x60,0x06,
  0x40,0x02,0x80,0x01,0x00,0x00,0x00,0x00
};
const uint8_t logo16_supla_bmp[] PROGMEM =  //logo supla 16
{
  0x30,0x00,0x7C,0x00,0xC4,0x00,0x86,0x00,0x84,0x00,0xDC,0x03,
  0x78,0x36,0x60,0x78,0x40,0x48,0x40,0x38,0x40,0x04,0x80,0x06,
  0x80,0x03,0x40,0x02,0xC0,0x03,0x00,0x01
};
const uint8_t logosupla24[] PROGMEM =  //logo supla 24
{
  0x00,0x00,0x00,0xF0,0x03,0x00,0xF8,0x07,0x00,0x1C,0x0C,0x00,
  0x0C,0x0C,0x00,0x0C,0x0C,0x00,0x0C,0x0C,0x00,0x1C,0x1E,0x00,
  0xF8,0x7F,0x00,0xF0,0xC3,0x01,0x00,0x03,0x1F,0x00,0x02,0x36,
  0x00,0x02,0x22,0x00,0x02,0x36,0x00,0x06,0x1E,0x00,0x04,0x01,
  0x00,0x84,0x00,0x00,0x4C,0x00,0x00,0x7C,0x00,0x00,0x3C,0x00,
  0x00,0x66,0x00,0x00,0x66,0x00,0x00,0x3C,0x00,0x00,0x18,0x00
};

void get_MPX(){
  int val = 0;
      for(int i = 0; i < 10; i++) {
      val += analogRead(A0);
      delay(1);
      }
      val = val / 10; 
  MPX_Value = map(val,MPX_zero_offset,(mpx_Compensation+MPX_zero_offset),0,1000) / 83.3;
  yield(); 
  Serial.print("bar: ");  
  Serial.println(MPX_Value,2);
  if (MPX_Value != MPV_Send){ 
    MPV_Send = MPX_Value;       
  }
   TH_Overlay();
}

void Btn_loop(){
  button.loop();  
  button2.loop();
  CustomSupla.iterateOfline();  
}
void saveConfigCallback () {
  Serial.println("Should save config");
  shouldSaveConfig = true;
}
void ondemandwifiCallback () {
          display.clear();
          display.setContrast(100, 241, 64);
          display.setTextAlignment(TEXT_ALIGN_CENTER);
          display.setFont(ArialMT_Plain_10);
          display.drawString(64, 16, "wifi config connect");
          display.drawString(64, 28, "to wifi hotspot");
          display.setFont(ArialMT_Plain_16);
          display.drawString(64, 44, "Supla_12Bar"); 
          display.display(); 
          btn_loop.detach();  
  WiFiManagerParameter custom_Supla_server("server", "Supla server", Supla_server, 40);
  WiFiManagerParameter custom_Location_id("ID", "Location_id", Location_id, 15);
  WiFiManagerParameter custom_Location_Pass("Password", "Location_Pass", Location_Pass, 34 );
  WiFiManagerParameter custom_MPX_Compensation("Compensation", "Compensation 500-1000", MPX_Compensation, 5,"required");
  WiFiManagerParameter custom_Supla_name("name", "Supla Device Name", Supla_name, 51,"required");
  WiFiManagerParameter custom_update_username("updateUsername", "update username", update_username, 21,"required");
  WiFiManagerParameter custom_update_password("updatePassword", "update password", update_password, 21,"required");
  const char* custom_radio_str = "<br><div style='text-align:center; width:100%; padding:0;'><label for='customfieldid'>DS18B20 </label><input type='radio' name='customfieldid' value='0' checked> 1 - 2<input type='radio' name='customfieldid' value='1'> 2 - 1</div>";
  new (&custom_field) WiFiManagerParameter(custom_radio_str); // custom html input  

  wifiManager.setBreakAfterConfig(true);
  wifiManager.setSaveConfigCallback(saveConfigCallback);
  wifiManager.setSaveParamsCallback(saveParamCallback);

  wifiManager.addParameter(&custom_Supla_server);
  wifiManager.addParameter(&custom_Location_id);
  wifiManager.addParameter(&custom_Location_Pass);
  wifiManager.addParameter(&custom_MPX_Compensation);
  wifiManager.addParameter(&custom_Supla_name);
  wifiManager.addParameter(&custom_update_username);
  wifiManager.addParameter(&custom_update_password);
  wifiManager.addParameter(&custom_field);

  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();

    wifiManager.setConfigPortalTimeout(timeout);

    if (!wifiManager.startConfigPortal("Supla_12Bar")) {   //    ----wifi configuration ap name---
      Serial.println("Not connected to WiFi but continuing anyway.");
    } else {     
      Serial.println("connected...yeey :)");    //if you get here you have connected to the WiFi
    }
    strcpy(Supla_server, custom_Supla_server.getValue());
    strcpy(Location_id, custom_Location_id.getValue());
    strcpy(Location_Pass, custom_Location_Pass.getValue());
    strcpy(MPX_Compensation, custom_MPX_Compensation.getValue());
    strcpy(Supla_name, custom_Supla_name.getValue());
    strcpy(update_username, custom_update_username.getValue());
    strcpy(update_password, custom_update_password.getValue());
}
String getParam(String name){
  String value;
  if(wifiManager.server->hasArg(name)) {
    value = wifiManager.server->arg(name);
      if (value == "1"){ Term_Tipo = 1;}  else { Term_Tipo = 0;}
  }
  return value;
}
void saveParamCallback(){
  Serial.println("[CALLBACK] saveParamCallback fired");
  Serial.println("PARAM customfieldid = " + getParam("customfieldid"));
  itoa(Term_Tipo ,termtipo ,10) ;
}
void TH_Overlay() {

  display.clear();

         display.setFont(Dialog_plain_36); 
         display.setTextAlignment(TEXT_ALIGN_RIGHT);
         display.drawString(75, 10, String(MPX_Value, 1)); 
         display.setFont(ArialMT_Plain_24);
         display.setTextAlignment(TEXT_ALIGN_RIGHT);
         display.drawString(114, 22, "bar"); 
         display.setFont(ArialMT_Plain_16);
         display.setTextAlignment(TEXT_ALIGN_CENTER);
         display.drawString(64, 48, String(temp_1, 1) + "ºC " + " " + String(temp_2, 1) + "ºC"); 

  if (pr_wifi == false){
               display.setFont(ArialMT_Plain_10);
               display.setTextAlignment(TEXT_ALIGN_CENTER);
               display.drawString(42, 0, "Rssi " + String(WiFi.RSSI()) + " db");     
               
     if (s == 17){            
                 
               display.drawXbm(85, 0, 24, 24, logosupla24);// ------------------------------------------------ oled supla ok --------                                 
        }else{
               display.setFont(ArialMT_Plain_16);
               display.setTextAlignment(TEXT_ALIGN_RIGHT);
               display.drawString(110, 0, "E" + String(s)); 
        }
  }

  display.display();
   
}
double get_temperature(int channelNumber, double last_val) {
   double t = -275;    

   switch(channelNumber)
          {
            case 0:
         return MPV_Send;      
                    break;
            case 1:
       if (Term_Tipo){
        t = sensors.getTempCByIndex(1);
       } else {
        t = sensors.getTempCByIndex(0);
       }
         temp_1 = t;
         Serial.print("DS18B20 1 Temp: ");
         Serial.println(t);
                    break;
            case 2:       
       if (Term_Tipo){
        t = sensors.getTempCByIndex(0);
       } else {
        t = sensors.getTempCByIndex(1);
       }
         temp_2 = t;
         Serial.print("DS18B20 2 Temp: ");
         Serial.println(t);
      sensors.requestTemperatures();
      
                    break;
          }
    return t; 
}
int supla_DigitalRead(int channelNumber, uint8_t pin) {
   if (channelNumber == 4){
    manual = digitalRead(relay1);
    return manual;
   }else{
    return digitalRead(pin); 
   }
}
void suplaDigitalWrite(int channelNumber, uint8_t pin, uint8_t val) {       

      if ( channelNumber == 4 ) {                    
          digitalWrite(relay1, val);        
          manual = val;
          TH_Overlay(); 
           return;   
      }          
      if ( channelNumber == 3 ) { 
         if (manual == false){
            digitalWrite(relay1, val);            
             return; 
         }
      }else {
          digitalWrite(pin, val);
          TH_Overlay();         
           return;        
      }
  return; 
}    
void status_func(int status, const char *msg) { 
  if (s != status){
     s=status; 
     Serial.print("status: "); 
     Serial.println(s);   
  }                                        
}
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
  Serial.println("");
}
void setup() {    //    ------------------------ Setup --------------------------

  wifi_set_sleep_type(NONE_SLEEP_T);

  Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY, 1); 
    delay(1000);
  EEPROM.begin(128);  
  pinMode(TRIGGER_PIN, INPUT_PULLUP);
    
  if (WiFi.SSID()==""){
    initialConfig = true;
  }
    display.init();
  display.flipScreenVertically();
   display.setFont(ArialMT_Plain_10);
     display.clear();
      display.setFont(ArialMT_Plain_24);
       display.drawString(33, 40, "SUPLA");
         display.drawXbm(0, 16, 32, 32,logo32_glcd_bmp );
          display.display();
           delay(2000);

  button.setClickHandler(click);
  button.setLongClickHandler(longClick);
  button.setQuintleClickHandler(quintleClick);
  button2.setClickHandler(click2);
  button2.setLongClickHandler(longClick2); 

  
    display.clear();
    display.setTextAlignment(TEXT_ALIGN_CENTER);
    display.setFont(ArialMT_Plain_10);
    display.drawString(64, 0, "mounting FS...");
    display.display();  
  
  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());
        Serial.println(jsonBuffer.size());
        //json.printTo(Serial);
        if (json.success()) {
          Serial.println("\nparsed json");
          if (json.containsKey("Supla_server")) strcpy(Supla_server, json["Supla_server"]);
          if (json.containsKey("Location_id")) strcpy(Location_id, json["Location_id"]);
          if (json.containsKey("Location_Pass")) strcpy(Location_Pass, json["Location_Pass"]);
          if (json.containsKey("MPX_Compensation")) strcpy(MPX_Compensation, json["MPX_Compensation"]);
          if (json.containsKey("Supla_name")) strcpy(Supla_name, json["Supla_name"]);         
          if (json.containsKey("update_username")) strcpy(update_username, json["update_username"]);
          if (json.containsKey("update_password")) strcpy(update_password, json["update_password"]);
          mpx_Compensation = String(MPX_Compensation).toInt();
          if (json.containsKey("termtipo")) strcpy(termtipo, json["termtipo"]);
          Term_Tipo = (String(termtipo).toInt());          
          Serial.print("Compensation: ");
          Serial.println(mpx_Compensation);
        } else {
          Serial.println("failed to load json config");          
        }
      }
    }
  } else {
    Serial.println("failed to mount FS");
  }
  
  MPX_zero_offset = EEPROM.read(1);
  Serial.print("Read zero offset: ");
  Serial.println(MPX_zero_offset);

  sensors.begin();
  Serial.println(".");
  Serial.println(".");
  sensors.begin();
  Serial.print("Locating devices...");
  Serial.print("Found ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" devices.");

  
  oneWire.reset_search();
  if (!oneWire.search(Thermometer_1)) Serial.println("Unable to find address for Thermometer 1"); else printAddress(Thermometer_1);
  if (!oneWire.search(Thermometer_2)) Serial.println("Unable to find address for Thermometer 2"); else printAddress(Thermometer_2);
  sensors.setResolution(Thermometer_1, resolution); 
  sensors.setResolution(Thermometer_2, resolution);   
  sensors.setWaitForConversion(false);
  sensors.requestTemperatures(); 

  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]};
  
  CustomSupla.addDS18B20Thermometer();
  CustomSupla.addDS18B20Thermometer();
  CustomSupla.addDS18B20Thermometer();
    CustomSupla.addRelay(relay1, false); 
    CustomSupla.addRelay(relay2, false); 
    CustomSupla.addRelay(relay3, false);
    CustomSupla.addSensorNO(sensor1, true);
    CustomSupla.addSensorNO(sensor2, true);   
  
  CustomSupla.setStatusFuncImpl(&status_func);    //   ----------------------------- Status -----------------------------
  CustomSupla.setDigitalReadFuncImpl(&supla_DigitalRead);    //            ------Send Value to server -------
  CustomSupla.setDigitalWriteFuncImpl(&suplaDigitalWrite);   //        -------  Read Value from server   ------- 
  CustomSupla.setName(Supla_name);    // Supla device name
  wifi_station_set_hostname(Supla_name);

  int LocationID = atoi(Location_id);
  CustomSupla.begin(GUID,              // Global Unique Identifier 
                    mac,               // Ethernet MAC address
                    Supla_server,      // SUPLA server address
                    LocationID,        // Location ID 
                    Location_Pass);    // Location Password
                    
 WiFi.mode(WIFI_STA);
 //btn_loop.attach_ms(40, Btn_loop);
 
 dimm_milis = millis() + 15000;
 
}

void loop() {
  
 if (WiFi.status() == WL_CONNECTED) 
  {    
    httpServer.handleClient();
 }
        
 if (s == 17){
    button.loop();  
    button2.loop();
       if (pr_supla == true){
          btn_loop.detach();
          pr_supla = false;
          Serial.println("Supla connected");        
         }        
      }else{       
         delay(25);
          if (pr_supla == false){      
          pr_supla = true;
          Serial.println("Not connected");
          btn_loop.attach_ms(80, Btn_loop);
       }
 } 
  if (millis() > MPX_lasttime + MPX_mtbs)  {    //--------------MPX callback--------------------
       get_MPX();
       MPX_lasttime = millis();
 } 
            
 int C_W_read = digitalRead(TRIGGER_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  (initialConfig)  {     
    ondemandwifiCallback () ;
    initialConfig = false; 
 }

 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["MPX_Compensation"] = MPX_Compensation;
    json["Supla_name"] = Supla_name;
    json["update_username"] = update_username;
    json["update_password"] = update_password;
    json["termtipo"] = termtipo;    
    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();
          display.clear();
          display.setTextAlignment(TEXT_ALIGN_CENTER);
          display.setFont(ArialMT_Plain_10);
          display.drawString(64, 0, "config saved");
          display.display();     
    Serial.println("config saved");
    shouldSaveConfig = false;
    WiFi.mode(WIFI_STA);
    ESP.restart();
      delay(5000);
 }
  
 if ((WiFi.status() != WL_CONNECTED) && ( pr_wifi == false)) { 
    WiFi_up();
    pr_wifi = true;
  }
  else if ((WiFi.status() == WL_CONNECTED)  && (pr_wifi)){
    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;
    MDNS.begin(host);
    httpUpdater.setup(&httpServer,update_path, update_username, update_password);
    httpServer.begin();
    MDNS.addService("http", "tcp", 81);
    Serial.printf("HTTPUpdateServer ready! Open http://%s.local:81%s in your browser and login with username '%s' and password '%s'\n", host, update_path, update_username, update_password);      
 }
 
  CustomSupla.iterate();
  delay(25);

  if (millis() > dimm_milis){ 
    if (dimm == false){
    display.setContrast(50, 50, 30);
    display.display();
    dimm = true ;     
    }    
    dimm_milis = millis() + 15000 ;
  } 
}

// 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) {
    }

CustomSuplaCallbacks supla_arduino_get_callbacks(void) {
          CustomSuplaCallbacks 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;
          return cb;
}
void click(Button3& btn) {
            dimm_milis = millis() + 15000 ;
            display.setContrast(100, 230, 60);
            dimm = false;
            TH_Overlay();  
}
void longClick(Button3& btn) {
  
           if (dimm == true){
            dimm_milis = millis() + 15000 ;
            display.setContrast(100, 230, 60);
            dimm = false;
            TH_Overlay(); 
           }
               if (digitalRead(relay3) == 1 ) {  
                  CustomSupla.relayOff(5);
                  Serial.println("BTN Switsh off relay 2");
               } else {
                  CustomSupla.relayOn(5, 0);
                  Serial.println("BTN Switsh on relay 2");
               }
}
void quintleClick(Button3& btn) {
  
    int val = 0;
      for(int i = 0; i < 10; i++) {
       val += analogRead(A0);
       delay(1);
      }
      val = val / 10;
      
      MPX_zero_offset = val;
         display.clear();
         display.setContrast(100, 241, 64);       
         display.setFont(ArialMT_Plain_24);
         display.setTextAlignment(TEXT_ALIGN_CENTER);
         display.drawString(64, 20, "MPX Call.."); 
         display.display();
         dimm = false;     
         Serial.print("Write zero offset: ");
         Serial.println(MPX_zero_offset);
         EEPROM.write(1, MPX_zero_offset); 
         EEPROM.commit();
           delay (3000);
            TH_Overlay();
          
}
void longClick2(Button3& btn) {
  
               if (manual == false){ 
                 CustomSupla.relayOn(3, 1000);
                 Serial.println("BTN Switsh on 1 second");
               } 
}
void click2(Button3& btn) {
  
           if (dimm == true){
            dimm_milis = millis() + 15000 ;
            display.setContrast(100, 230, 60);
            dimm = false;
            TH_Overlay(); 
           }
               if (digitalRead(relay1) == 1 ) {  
                  CustomSupla.relayOff(4);
                  Serial.println("BTN Switsh off relay");
               } else {
                  CustomSupla.relayOn(4, 0);
                  Serial.println("BTN Switsh on relay");
               }
}
void WiFi_up(){ // conect to wifi
 
  if (millis() > wifimilis)  {
  WiFi.begin();
  Serial.println("CONNECTING WIFI");
  wifimilis = (millis() + wifi_checkDelay) ; 
  }  
}
supla_12Bar.rar
imo & libraries
(801.52 KiB) Pobrany 166 razy
kaamil_
Posty: 34
Rejestracja: czw wrz 30, 2021 9:20 am

Czujnik ciśnienia to czujnik działający na 1wire? Dlatego są stopnie?
Podpięty jest razem z innymi czujnikami temperatury pod jeden pin?
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

kaamil_ pisze: czw cze 30, 2022 8:36 pm Czujnik ciśnienia to czujnik działający na 1wire? Dlatego są stopnie?
Podpięty jest razem z innymi czujnikami temperatury pod jeden pin?
W Supli brakuje kanału pomiarowego ogólnego przeznaczenia i często jako workaround używa się kanału temperatury. Nie ma to żadnego związku z protokołem komunikacyjnym czujnika ciśnienia.
Widzimy się na Supla Offline Party vol. 2 :!:
mareks6
Posty: 259
Rejestracja: sob sty 13, 2018 4:39 pm
Lokalizacja: Opole

kaamil_ pisze: czw cze 30, 2022 8:36 pm Czujnik ciśnienia to czujnik działający na 1wire? Dlatego są stopnie?
Podpięty jest razem z innymi czujnikami temperatury pod jeden pin?
Czujnik ciśnienia jest analogowy, czyli tak upraszczając - napięcie na wyjściu jest proporcjonalne do ciśnienia roboczego. Jest podpięty pod wejście przetwornika a/d układu ESP (zielonego gniazdo z lewej strony schematu) i nic go nie łączy z czujnikami 1wire.

Co do stopnia - kolega klew już to wytłumaczył.
Awatar użytkownika
Hrumque
Posty: 275
Rejestracja: pn cze 27, 2022 10:11 am
Lokalizacja: Opole

klew pisze: czw cze 30, 2022 8:42 pm W Supli brakuje kanału pomiarowego ogólnego przeznaczenia
Cieszymy się, że ktoś jest tego świadomy ;)

Albo może po prostu definiowanego (po stronie cloud?), obok samej wartości (liczby) akurat zmierzonej z danego kanału - osobnego stringu/zmiennej/pola "jednostka" - nie byłoby problemu z voltami ,watami, luxami, procentami, barami i tysiącem innych rzeczy które fajnie by było zrobić...
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

Hrumque pisze: pn lip 18, 2022 9:00 pm
klew pisze: czw cze 30, 2022 8:42 pm W Supli brakuje kanału pomiarowego ogólnego przeznaczenia
Cieszymy się, że ktoś jest tego świadomy ;)

Albo może po prostu definiowanego (po stronie cloud?), obok samej wartości (liczby) akurat zmierzonej z danego kanału - osobnego stringu/zmiennej/pola "jednostka" - nie byłoby problemu z voltami ,watami, luxami, procentami, barami i tysiącem innych rzeczy które fajnie by było zrobić...
"kanał definiowany po stronie Clouda", to "kanał pomiarowy ogólnego przeznaczenia"
Temat stary viewtopic.php?t=5225 i chyba każdy, kto chwilę z Suplą spędził czasu jest świadomy tego braku.
Widzimy się na Supla Offline Party vol. 2 :!:
ODPOWIEDZ

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