Automatizace ovládání vrat

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
johnyhol
Příspěvky: 33
Registrován: 07 pro 2017, 21:17

Automatizace ovládání vrat

Příspěvek od johnyhol » 14 dub 2018, 23:03

Zdravím všechny, potřeboval bych poradit s jedním projektem na kterém právě pracuji. Jedná se o úpravu automatizace ovládání vjezdových vrat u otce ve firmě pomocí desky SonOff. Původně je vše řízeno stykači, časovými relé a spínacími hodinami na din lištu. Takže poměrně složité a neúčelné zapojení, které stejně neplní všechny požadované funkce. Momentálně funguje pouze manuální ovládání z vrátnice bez automatického zavření (tlačítko pro otevření/zavření) a automatické otevření při výjezdu z firmy s automatickým zavřením po 1 min. (ovládáno průjezdem fotobuňkami před vraty uvnitř firmy + časovým relé pro zavření).
Myšlenka je taková, že veškeré řízení převezme právě SonOff (ovládání, čas a vzdálené ovládání).

Požadované funkce:
1) automatické zavření vrat po určité době (cca. 20s) tj. po průjezdu vozidel (pokud není nic v prostoru fotobuněk mezi vraty) - funkční při všech případech otevření (tlačítko vrátnice, PC, fotobuňky uvnitř firmy)
2) automatické otevření vrat při výjezdu z firmy (při průjezdu fotobuňkami před vraty uvnitř firmy) a automatické zavření viz. bod 1)
3) funkčnost automatického otevírání pouze během pracovní doby (např. 6:00-16:00h a jen v pracovní dny) - spínací hodiny
4) vzdálené ovládání vrat z kanceláře přes PC (např. přes Cayenne portal) - s tím bych si už možná poradil
5) reakce na překážku ve vjezdu při zavírání vrat (reakce na fotobuňky mezi vraty)

Podařilo se mi pro začátek sestrojit kód (viz. níže), který se zatím pouze zaměřuje na požadovanou automatiku (body 1, 2 a 5) a nějak funguje, ale nedaří se mi ukončit zavírání vrat tzn. že pokud doběhne program do konce tak se mi podaří otevřít vrata i vyvoláním překážky mezi vraty (sepnutím fotobuněk), protože to stále reaguje jako při zavírání vrat. Prosím tedy pro začátek o radu jak tento problém vyřešit, případně jak to celé napsat jinak.

Tady je můj kód:

Kód: Vybrat vše

#include <ESP8266WiFi.h>

const char* ssid = "nazevsite";
const char* password = "heslo";

#define RELE 12 // rele motor
#define LED 13 // LED motor
#define tlacitkoOvladani 0 // tlacitko ovládání
#define fotobunkyVrata 14 // fotobunky vrata
//#define koncovySpinac 5 // koncovy spinac vrata

int smycka1 = 0; // pomocna smycka - cekani na otevreni vrat a prujezd aut
int smycka1max = 20; // max.pomocne smycky

void setup(){

  Serial.begin(9600); 
  delay(5000);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Cekani na pripojeni
  while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
  }
        Serial.println("");
        Serial.print("Pripojeno k: ");
        Serial.println(ssid);
        Serial.print("IP adresa: ");
        Serial.println(WiFi.localIP());
  
        Serial.println("NASTAVUJI VSTUPY/VYSTUPY");
        pinMode(12, OUTPUT);
        digitalWrite(12, HIGH); // vypni rele
        pinMode(13, OUTPUT);
        digitalWrite(13, HIGH); // vypni LED
        Serial.println("VYPINAM VYSTUPY");
  
        pinMode(0, INPUT_PULLUP);
        pinMode(14, INPUT_PULLUP);
       //pinMode(5, INPUT);

}

void loop(){
  
  if  (digitalRead(0) == LOW){  // je stlacene tlacitko ovladani
      Serial.println("tlacitko sepnuto");
      digitalWrite(12, LOW); // sepni rele vrata (otevri)
      digitalWrite(13, LOW); // rozsvit LED
      Serial.println("oteviram vrata ...");
      delay(1000); // pockej 1s
      digitalWrite (12, HIGH); // vypni rele
      digitalWrite(13, HIGH); // vypni LED
      delay(1000); // pockej 1s
      Serial.print("cekam "); 
      Serial.print(smycka1max);
      Serial.println("s nez se otevrou vrata a projede auto ...");
    
    for (smycka1 = 0;  smycka1 < smycka1max; smycka1 ++){ // pomocna smycka - cekani na otevreni vrat a prujezd aut
        delay(1000);
        Serial.print("Stav: ");
        Serial.print(smycka1); // pomocna smycka - cekani na otevreni vrat a prujezd aut
        Serial.print("s/");
        Serial.print(smycka1max); // pomocna smycka - cekani na otevreni vrat a prujezd aut
        Serial.println("s "); 
        
    }
        
  while (digitalRead(14) == LOW){ // je neco ve vratech
        Serial.println("neco je ve vratech!!!");
        digitalWrite (12, HIGH); // vypni rele
        digitalWrite(13, HIGH); // vypni LED
        delay(1000); // pockej 1s
        
    }
        digitalWrite(12, LOW); // sepni rele vrata (zavri) 
        digitalWrite(13, LOW); // sepni LED
        Serial.println("zaviram vrata ...");
        delay(1000); // pockej 1s
        digitalWrite (12, HIGH); // vypni rele
        digitalWrite (13, HIGH); // vypni LED
        delay(1000); // pockej 1s
       
  }
    
    if (digitalRead(14) == LOW){ // je neco ve vratech
       Serial.println("neco je ve vratech!!!");
       digitalWrite(12, LOW); // sepni rele vrata (otevri)
       digitalWrite(13, LOW); // rozsvit LED
       Serial.println("oteviram vrata ...");
       delay(1000); // pockej 1s
       digitalWrite (12, HIGH); // vypni rele
       digitalWrite (13, HIGH); // vypni LED
       delay(1000); // pockej 1s
       Serial.print("cekam "); 
       Serial.print(smycka1max);
       Serial.println("s nez se otevrou vrata a projede auto ...");
        
      for (smycka1 = 0;  smycka1 < smycka1max; smycka1 ++){ // pomocna smycka - cekani na otevreni vrat a prujezd aut
          delay(1000);
          Serial.print("Stav: ");
          Serial.print(smycka1); // pomocna smycka - cekani na otevreni vrat a prujezd aut
          Serial.print("s/");
          Serial.print(smycka1max); // pomocna smycka - cekani na otevreni vrat a prujezd aut
          Serial.println("s "); 
          //delay(20000); // pockej 20s (nez se otevrou vrata a projede auto)
      }
      
          digitalWrite(12, LOW); // sepni rele vrata (zavri) 
          digitalWrite(13, LOW); // sepni LED
          Serial.println("zaviram vrata ...");
          delay(1000); // pockej 1s
          digitalWrite (12, HIGH); // vypni rele
          digitalWrite (13, HIGH); // vypni LED
          delay(1000); // pockej 1s
        
    }  
            
}
Díky moc za reakce.

petan
Příspěvky: 358
Registrován: 23 črc 2017, 10:19
Kontaktovat uživatele:

Re: Automatizace ovládání vrat

Příspěvek od petan » 15 dub 2018, 10:52

Měl by sis vytvořit nějakou proměnnou status, ve které by byl stav vrat - zavírají se/jsou v klidu/otevírají se. Do této proměnné přiřazovat stav při změně. Pak budeš moct v návaznosti na aktuálním stavu brány provádět různé funkce.

Myslím to jako na kódu níž (nástřel). Akorát by bylo dobré z jednotlivých částí kódu vytáhnout funkce, aby v loopu nebylo "milion" řádků.

Kód: Vybrat vše

byte status; //0 - nic, 1 - zavírání, 2 otevírání

void loop(){

testWifiny();

switch (status) {
  case 0:
    // vrata nejsou v pohybu
    if (signal k otevreni){
     status = 1; //zastavit dveře
     }
    break;
  case 1:
    // vrata se otevárají
     if (koncak1){
     status = 0; //zastavit dveře
     }
    break;
  case 2:
    // vrata se zavírají
    if (koncak2){
     status = 0; //zastavit dveře
     }
     
     if (fotobunka){
     status = 1; //otevřít dveře
     }
    break;
}
}

void TestWifiny(){
 if(byl přijat signal k otevreni){
  status = 1;
 }
}

johnyhol
Příspěvky: 33
Registrován: 07 pro 2017, 21:17

Re: Automatizace ovládání vrat

Příspěvek od johnyhol » 15 dub 2018, 22:20

Ahoj, díky za reakci jenom v tom docela plavu. Nemohl bys prosím ukázat příklad podle mého kódu? Nechápu kde se berou v jednotlivých "casech" statusy, resp. jak s nimi pracovat.

Díky!

petan
Příspěvky: 358
Registrován: 23 črc 2017, 10:19
Kontaktovat uživatele:

Re: Automatizace ovládání vrat

Příspěvek od petan » 16 dub 2018, 06:42

Koukni se, jak funguje Switch Case. Jenom měníš proměnnou a podle toho se mění část, která se bude provádět. Je to takový lepší "IF".
Rozhodně nic neřeš pomocí časů (čekání na otevření apod). Sice to možná teď funguje, ale když třeba dveře zatuhnou, tak se časy zvýší. Doporučuju použít koncáky, nebo počítat třeba pulzy z motoru atd... prostě něco, co se dá jednoduše změřit. Navíc, když použiješ delay(), tak se program v tomto místě zastaví a na nic v té době nereaguje! (ovladač, koncáky, nic).

Program si prostě rozdělíš na 3 (vrata se otevírají, zavírají, stojí) části pomocí Switch a v těchto částech řešíš věci, které mohou nastat. A podle toho změníš proměnnou, která přepne stav.

johnyhol
Příspěvky: 33
Registrován: 07 pro 2017, 21:17

Re: Automatizace ovládání vrat

Příspěvek od johnyhol » 16 dub 2018, 22:32

Právě že jsem tu funkci studoval a moc jsem z toho moudrej nebyl, tak jsem se tomu zatím vyhýbal. Hlavně ty příklady jsou většinou trochu pro jiný použití.
Přesto díky, zkusím si udělat jednoduchý příklad na zkoušku a uvidíme jestli to rozchodím.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 2 hosti