Automatyczny reset - da się?

Masz pomysł na funkcjonalność lub koncepcję na rozwój projektu. Opisz wszystko tutaj.
Post Reply
t0mek
Posts: 42
Joined: Sat Dec 02, 2017 11:24 am

Sat Jul 13, 2019 4:38 pm

Witam!
jeżeli dubluję temat to przepraszam ale nie znalazłem tego.
Chodzi mi o automatyczny reset np routera, serwera itp.
Można byłoby dodać w automacie schodowym taką funkcjonalność : cały czas włączony a po kliknięciu wyłącza zasilanie na zadaną ilość sekund - taka jakby odwrócona logika. ?
ps wiem że jest watchdog od @Zybi ale na początku działał na kanale Gate. nie wiem jak teraz, no i hardware trochę się pozmieniał.
Pozdrawiam
Tomek
mareks6
Posts: 99
Joined: Sat Jan 13, 2018 4:39 pm

Mon Jul 15, 2019 3:32 am

Tylko czy do tego jest potrzebna supla? Jeśli wystarczy Ci takie coś co działa lokalnie to wystarczy odpowiedni układ zrobiony na scalaku NE555.

Zrobiłem sobie kiedyś taki na szynę DIN do rozdzielnicy. Zmieściło się w pojedynczym module (jak bezpiecznik 1F) i działa dokładnie jak potrzebujesz - po naciśnięciu klawisza monostabilnego przerywa obwód 240V na 10s.

Jeśli umiesz robić samemu płytki jednostronne to mogę Ci w, wolnej chwili podesłać projekt z programu Eagle.
piomar2
Posts: 48
Joined: Fri Apr 26, 2019 5:32 pm
Location: Bukowice

Mon Jul 15, 2019 6:06 am

Rozwiązanie markas6 jest dobre ale niestety działa tylko lokalnie. Co jeżeli system zawiesi się jak jesteś na wakacjach? Polecam zdecydowanie rozwiązanie resetu systemu zdalne, z niezależnego układu GSM. Kolega QLQ mocno działa w temacie... Ja u siebie mam takie rozwiązanie i sprawdza się w 100%. Jak coś nie gra to wysyłasz sms-a i po kłopocie.

pozdrawiam
piomar2
mareks6
Posts: 99
Joined: Sat Jan 13, 2018 4:39 pm

Mon Jul 15, 2019 8:39 am

No oczywiście że tak jest, dlatego zaznaczyłem że moje rozwiązanie działa tylko lokalnie. Akurat w, moim przypadku to nie problem bo zawsze jest ktoś w, domu więc w, każdej chwili mogę zadzwonić do teścia że ma iść nacisnąć przycisk ;)
Ale takie coś się może zdarzyć max raz w roku bo prawie cały czas jest żona w, domu i sama wie kiedy trzeba zresetować :P
piomar2
Posts: 48
Joined: Fri Apr 26, 2019 5:32 pm
Location: Bukowice

Mon Jul 15, 2019 9:39 am

Zdecydowanie lepszym rozwiązaniem jest człowiek :D Tylko nie może bać się techniki. Moja "połówka" z daleka od niej niestety a chałupa przesycona pilotami, suplą itd, itd. Na szczęście ja prawie cały czas już w domciu.

pozdrawiam
piomar2
elmaya
Posts: 194
Joined: Wed Jun 27, 2018 5:48 pm
Location: Sevilla

Mon Jul 15, 2019 11:04 am

Image

Dioda LED alarmu D1: LOW = połączenie OK. HIGH = brak połączenia.
Dioda stanu D4: flash 0,2 = konfiguracja.flash 0.8 = brak WiFi.flash 5.0 = Normalny
TRIGGER PIN D3: konfiguracja.
Relay D2: normalny NISKI. Zresetuj 5 sekund WYSOKI

System ping co 30 sekund do www.google.com (można zmienić w konfiguracji Wifi), jeśli jest w porządku. Alarm Led gaśnie.
Jeśli nie ma połączenia(przez 15 minut)dioda Led alarmu włącza się i liczy czas na resetowanie.

unsigned long reset_delay = 900000; 15 minut = 15 x 60 x 1000

i Zresetuj, jeśli nie ma wifi

Code: Select all

#include <FS.h>       // ---- esp board manager 2.4.2 --- iwip Variant V2 higher Bandwidth
#include <ESP8266Ping.h>
#include <WiFiClientSecure.h>
#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <WiFiManager.h>     //--------- https://github.com/tzapu/WiFiManager/tree/0.14 -------------
#include <ArduinoJson.h>     //--------- https://github.com/bblanchon/ArduinoJson/tree/v5.13.2 ------
#include <Ticker.h>     
Ticker ticker;
WiFiManager wifiManager;  

#define alarm_led   5  //D1     // High if no net connection (Dodatkowa dioda LED(czerwona) przez rezystor 330 ohm do masy.) GIPO5
#define Relay       4  //D2     // High for 5 seconds on reset ( Przekaźnik ) GIPO 4
#define TRIGGER_PIN 0  //D3     // wifi config ( Do masy ) GIPO0
#define onboard_led 2  //D4     // Status Led  (Dioda wemosa d1 mini.) GIPO2

char host[40] = "www.google.com";
bool shouldSaveConfig = false;
bool initialConfig = false;
bool net_ok = false;
unsigned long reset_delay = 900000;   // 900000 --- Reset Delay in miliseconds --- ( Czas 15 min - do resetu. )
unsigned long time_last = 30000;
unsigned long time_last_chek;
unsigned long Chek_delay = 30000;       //  Ping co 30 sek. --- Ping Delay ---
int timeout           = 120; // Wifi manager timeout
int C_W_state = HIGH;            
int last_C_W_state = HIGH;       
unsigned long time_last_C_W_change = 0;   
long C_W_delay = 3000;               // config delay 3 seconds  ------------ opóźnienie konfiguracji 3 sekund
 

void tick()
{
  int state = digitalRead(onboard_led);  
  digitalWrite(onboard_led, !state);     
}
void saveConfigCallback () {
  Serial.println("Should save config");
  shouldSaveConfig = true;
}
void ondemandwifiCallback () {
  ticker.attach(0.2, tick);

  WiFiManagerParameter custom_host("host", "host", host, 40);

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

  wifiManager.addParameter(&custom_host);

  wifiManager.setMinimumSignalQuality();

    wifiManager.setConfigPortalTimeout(timeout);

    if (!wifiManager.startConfigPortal("AutoReset")) {
      Serial.println("failed to connect and hit timeout");
      delay(3000);
      ESP.restart();
      delay(5000);
    }
    Serial.println("connected...yeey :)");

    strcpy(host, custom_host.getValue());  
}
void check_host (){
  
  Serial.print("Pinging host ");
  Serial.println(host);

  if(Ping.ping(host)) {
    Serial.println("Success!!");
    
    digitalWrite(onboard_led, LOW);              // Mrugnięcie podczas pinga.
    delay(100);                                  //        - II -
    digitalWrite(onboard_led, HIGH);             //        - II -
   
    digitalWrite(alarm_led, LOW);
    time_last = millis();
    net_ok = true;
  } else {
    digitalWrite(alarm_led, HIGH);
    Serial.println("Error :(");
    net_ok = false;
  }
}


void setup() {
  Serial.begin(115200);

   pinMode(TRIGGER_PIN, INPUT_PULLUP);
   pinMode(onboard_led, OUTPUT);
   pinMode(Relay, OUTPUT);
   pinMode(alarm_led, OUTPUT);
   
  ticker.attach(0.8, tick);

    if (WiFi.SSID()==""){   
    initialConfig = true;
  }
  //read configuration from FS json
  Serial.println("mounting FS...");
  
  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();
        // Allocate a buffer to store contents of the file.
        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");

          strcpy(host, json["host"]);

        } else {
          Serial.println("failed to load json config");
          
        }
      }
    }
  } else {
    Serial.println("failed to mount FS");
  } 
  WiFi.mode(WIFI_STA);
}

void loop() {
    
  if (initialConfig){    //   ----------enter WiFi configuration if there is no data in memory---------------
    ondemandwifiCallback () ;
    initialConfig = false; 
  }
  
  checkButton();           //   ------------------------------------ NEW Settings delay 3" --------------------------------------
  
  if (shouldSaveConfig) {
    Serial.println("saving config");
    DynamicJsonBuffer jsonBuffer;
    JsonObject& json = jsonBuffer.createObject();
    json["host"] = host;

    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;
    WiFi.mode(WIFI_STA);
    ticker.detach();
    digitalWrite(onboard_led, HIGH);
    ESP.restart();
    delay(5000); 
    }
  
  if (WiFi.status() != WL_CONNECTED) 
   {
    ticker.attach(0.8, tick);
    WiFi_up();
   }
  if ((millis() - time_last_chek) > Chek_delay) {    
      check_host();
      time_last_chek = millis();
    }
  if  (net_ok == false){
   
   if ((millis() - time_last) > reset_delay) {
     Serial.println("Reset");
     digitalWrite(Relay, HIGH);
     delay(5000);                             // Czas włączenia przekaźnika
     digitalWrite(Relay, LOW);
     time_last = millis();
     }
    }
    yield();   
}
void checkButton(){    //   ------------------------------------ NEW Settings delay 3" --------------------------------------
  // check for button press
  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) {     
       C_W_state = C_W_read;       
       if (C_W_state == LOW) {
        Serial.println("Triger config");
      ondemandwifiCallback () ;
       }
     }    
    }
   last_C_W_state = C_W_read;            
   }
}
void WiFi_up() 

{
  WiFi.begin(); 

  for (int x = 20; x > 0; x--) 
  {
    if (WiFi.status() == WL_CONNECTED) 
    {
      break;                           
    }
    else                                 
    {
      checkButton();    //   ------------------------------------ NEW Settings delay 3" --------------------------------------
      Serial.print(".");                
      delay(200);                      
    }

  }

  if (WiFi.status() == WL_CONNECTED)
  {
  //  ticker.attach(5.0, tick);  // 5.0 sek dioda ON i 5.0 sek dioda OFF podczas połączenia z WiFi
   
    ticker.detach();                                // Dioda wyłączona podczas połączenia z wifi ( źeby mrugneła podczas pingowania ).
      if (digitalRead(onboard_led == LOW)) {        //                          - II -
          digitalWrite(onboard_led, HIGH);          //                          - II -
          }                                         //                          - II -
           
    Serial.println("");
    Serial.println("Connected");
    Serial.println("Adres IP: ");
    Serial.print(WiFi.localIP());
    Serial.print(" / ");
    Serial.print(WiFi.subnetMask());
    Serial.print(" / ");
    Serial.println(WiFi.gatewayIP());
    long rssi = WiFi.RSSI();
    Serial.print("(RSSI): ");
    Serial.print(rssi);
    Serial.println(" dBm");
    time_last = millis();
  }
  else    
  {
    Serial.println("");
    Serial.println("connection failed");
    net_ok = false;                                // new
  }
}
reset_router_v3.rar
compiled firmware
(322.74 KiB) Downloaded 10 times
Patryk
Posts: 281
Joined: Mon Jan 07, 2019 7:51 pm

Mon Jul 15, 2019 11:56 am

Działa idealnie !!!
Od czasu zabudowy, zero problemów z internetem  ( poza miejscem zamieszkania ).
Osobiście to wpiąłem między zasilacz routera, a router. Żeby nie stosować dodatkowego zasilacza.
Zdjecie poniżej.
Ps.
Na obecną chwilę zrobił bym to na Yunshan - ie, ale wtedy to były moje początki.
Dzięki !!! @elmaya
Attachments
Screenshot_20190426-183201.png
Screenshot_20190426-183201.png (2.84 MiB) Viewed 230 times
t0mek
Posts: 42
Joined: Sat Dec 02, 2017 11:24 am

Mon Jul 15, 2019 2:47 pm

I tyle w temacie. Dzięki :D
Pozdrawiam
Tomek
Post Reply