Close

Dvě časově ovládaná relé ovládaná dvěma vzájemně se vybavujícími tlačítky

Úvodní stránka Fórum Hardware Arduino Dvě časově ovládaná relé ovládaná dvěma vzájemně se vybavujícími tlačítky

  • Toto téma obsahuje celkem 10 odpovědí. Do diskuze (4 diskutující) se naposledy zapojil uživatel BlindPBlindP a poslední změna proběhla před 4 roky.
Aktuálně je na stránce zobrazeno 11 příspěvků - 1. až 11. (celkem z 11)
  • Autor
    Příspěvky
  • #8243
    Profilový obrázekmilano
    Účastník

    Ahoj, s Arduinem se teprve seznamuji a asi jsem si vzal hned velké sousto. Potřebuji ovládat dvě relé, dvěma tlačítky a to tak, že když stisknu tlačítko 1 sepne relé 1 na dobu 30s a nebo do doby než se stiskne tlačítko 1 nebo 2. A to stejné s tlačítkem 2 a relátkem 2. Zkrátka nikdy nesmí být sepnutá obě relé současně. Relé spínají log. 0. Může mi prosím někdo pomoci? Děkuji moc

    #8254
    Profilový obrázekmilano
    Účastník

    Tak jsem to zatím provizorně vyřešil bez možnosti zastavení a jdu studovat jak to udělat bez DELAY, aby to testovalo tlačítka a v budoucnu hlídalo další dvě koncová čidla, která mám zatím v silové části .

    //ovladani brany casovym spinanim bez moznosti vypnuti behem cyklu
    //koncove polohy jsou resene v silove casti
    //cislo tlacitka pro otevreni
    int tlacitko1 = 13;
    //cislo tlacitka pro zavreni
    int tlacitko2 = 12;
    //cislo pinu rele otevreni
    int rele1 = 11;
    //cislo pinu rele zavreni
    int rele2 = 10;
    //promenne uchovavjici stav tlacitek
    int tlacitko1Stav = 0;
    int tlacitko2Stav = 0;

    void setup() {

    pinMode(tlacitko1, INPUT);
    pinMode(tlacitko2, INPUT);
    pinMode(rele1, OUTPUT);
    pinMode(rele2, OUTPUT);
    //vypnuti obou rele
    digitalWrite(rele1, HIGH);
    digitalWrite(rele2, HIGH);

    }

    void loop() {

    //nacteni stavu tlacitek
    tlacitko1Stav = digitalRead(tlacitko1);
    tlacitko2Stav = digitalRead(tlacitko2);
    //kontrola tlacitek
    if (tlacitko1Stav == HIGH){
    digitalWrite(rele1, LOW);//zapne rele1
    delay(30000);
    }

    //kdyz neni tlacitko sepnute rele je vypnute
    digitalWrite(rele1, HIGH);
    if (tlacitko2Stav == HIGH){
    digitalWrite(rele2, LOW);//zapne rele1
    delay(30000);
    }
    //kdyz neni tlacitko sepnute rele je vypnute
    digitalWrite(rele2, HIGH);
    }

    #8256
    BlindPBlindP
    Účastník

    Tady je hezký příklad.

    #8258
    Profilový obrázekmilano
    Účastník

    Díky, na to už jsem koukal, ale budu se tím muset asi prokousat.

    #8259
    Profilový obrázeklubosm
    Účastník

    Je možné použiť milis. iba si treba odložiť čas zapnutia a rozdielom aktuálneho času a času zapnutia porovnávať, či ubehol portebný čas. Ako premennú pre odloženie času je vhodné použiť unsigned long a ošetriť ak milis pretečie a začne počítať od 0, napr. vynulovať aj toto.

    #8260
    Profilový obrázekposjirka
    Účastník

    něco podobného jsme už řešili na jiném foru …
    http://duinozone.cz/index.php/topic,177.0.html

    #8261
    Profilový obrázekmilano
    Účastník

    Děkuji moc. Myslím, že to dám dohromady.Postupně si tím musím projít. Programoval jsem kdysi ještě ve strojáku a pak 25 let nic, protože jsem po škole začal dělat autoelektriku a elektroniku a programovat jsem nepotřeboval. K Arduinu jsem se dostal díky dceři, která s ním pracuje ve škole a docela mě to chytlo :)

    #8263
    Profilový obrázekposjirka
    Účastník

    zkus jako zaklad toto:

    // program pro ovladani 2 rele pomoci 2 tlacitek
    // v01 by JP 9/2016
    // program ovlada 2 rele s tím, ze:
    // - stiskem tlacitka 1 se na nastavenou dobu sepne rele 1
    // - stiskem tlacitka 2 se na nastavenou dobu sepne rele 2
    // - kdyz behem sepnuti rele 1 stisknu tlacitko 2 tak se rele 1 vypne a sepne se rele 2
    // - kdyz behem sepnuti rele 2 stisknu tlacitko 1 tak se rele 2 vypne a sepne se rele 1
    
    int RELE_1 = 10; // pin pro  rele 1
    int RELE_2 = 11; // pin pro rele 2
    int TLACITKO_1 = 4; // pin pro tlacitko 1
    int TLACITKO_2 = 3; // pin pro tlacitko 2
    int ZAPNI_RELE_1 = 0; // 0 - vypnuto
    int ZAPNI_RELE_2 = 0; // 0 - vypnuto
    unsigned long CAS_VYPNUTI_RELE_1 = 0; // kdy ma rele 1 vypnout (nastavuje se v době sepnuti tlacitka)
    unsigned long CAS_VYPNUTI_RELE_2 = 0; // kdy ma rele 2 vypnout (nastavuje se v době sepnuti tlacitka)
    unsigned long DELKA_SEPNUTI_RELE = 3000; // jak dlouho maji byt rele sepnute (v milisekundach )
    
    void setup()
    {
    	pinMode(RELE_1, OUTPUT); // nastaveni pinu jako vystup
    	pinMode(RELE_2, OUTPUT); // nastaveni pinu jako vystup
    	pinMode(TLACITKO_1, INPUT_PULLUP);  // nastaveni pinu jako vstup s interním pullup odporem
    	pinMode(TLACITKO_2, INPUT_PULLUP);  // nastaveni pinu jako vstup s interním pullup odporem
    }
    
    void loop()
    {
    	// ovladani tlacitka 1
    	if (digitalRead(TLACITKO_1) == 0 ){	// když je stisknuto tlačtíko 1 
    		CAS_VYPNUTI_RELE_1 = millis() + DELKA_SEPNUTI_RELE;
    		ZAPNI_RELE_1 = 1; // povoleni k sepnuti rele 1
    		ZAPNI_RELE_2 = 0; // preventivne zakaz zapnuti rele 2
    	}
    	if (ZAPNI_RELE_1 == 1) {	// rele 1 ma byt sepnute
    		if (millis() > CAS_VYPNUTI_RELE_1) {	// uz pretekl cas zapnuti rele 1
    			ZAPNI_RELE_1 = 0;		// zrus pozadavek na zapnuti rele 1
    			digitalWrite(RELE_1, LOW); // vypni rele 1
    		} 
    		else {
    			digitalWrite(RELE_1, HIGH); // zapni rele 1
    		}
    		
    	} 
    	else {
    		digitalWrite(RELE_1, LOW); // vypni rele 1
    	}
    	
    	// ovladani tlacitka 2
    	if (digitalRead(TLACITKO_2) == 0 ){	// když je stisknuto tlačtíko 2 
    		CAS_VYPNUTI_RELE_2 = millis() + DELKA_SEPNUTI_RELE;
    		ZAPNI_RELE_2 = 1; // povoleni k sepnuti rele 2
    		ZAPNI_RELE_1 = 0; // preventivne zakaz zapnuti rele 1
    	}
    	if (ZAPNI_RELE_2 == 1) {	// rele 2 ma byt sepnute
    		if (millis() > CAS_VYPNUTI_RELE_2) {	// uz pretekl cas zapnuti rele 2
    			ZAPNI_RELE_2 = 0;		// zrus pozadavek na zapnuti rele 2
    			digitalWrite(RELE_2, LOW); // vypni rele 2
    		} 
    		else {
    			digitalWrite(RELE_2, HIGH); // zapni rele 2
    		}
    		
    	} 
    	else {
    		digitalWrite(RELE_2, LOW); // vypni rele 1
    	} 
    } 
    #8264
    Profilový obrázekmilano
    Účastník

    Děkuji moc. Když na to takhle koukám, tak mi to je jasné, ale sám bych to asi zatím nenapsal. Jenom musím přehodit obráceně spínání relé. Mám tam ty čínský dvojrelé a ty jsou ovládané obráceně. To už je ale prkotina. Ještě jenou moc děkuji :)

    #8265
    Profilový obrázekposjirka
    Účastník

    není zač ….

    #8266
    BlindPBlindP
    Účastník

    Taky přihodím :)

    # define RELE1_PIN 5
    # define RELE2_PIN 6
    # define TLAC1_PIN 2
    # define TLAC2_PIN 3
    
    unsigned long pre_mill = 0;
    const long interval = 30000;
    
    void setup() {
    	Serial.begin(9600);
    	pinMode(TLAC1_PIN, INPUT_PULLUP);
    	pinMode(TLAC2_PIN, INPUT_PULLUP);
    	pinMode(RELE1_PIN, OUTPUT);
    	pinMode(RELE2_PIN, OUTPUT);
    	digitalWrite(RELE1_PIN, HIGH);
    	digitalWrite(RELE2_PIN, HIGH);
    }
    
    void loop() {
    	if(digitalRead(TLAC1_PIN) == LOW) {
    		pre_mill = millis();
    		digitalWrite(RELE2_PIN, HIGH);
    		digitalWrite(RELE1_PIN, LOW);
    		//Serial.println("Vypinam rele c.2, zapinam rele c. 1");
    	}
    	if(digitalRead(TLAC2_PIN) == LOW) {
    		pre_mill = millis();
    		digitalWrite(RELE1_PIN, HIGH);
    		digitalWrite(RELE2_PIN, LOW);
    		//Serial.println("Vypinam rele c.1, zapinam rele c. 2");
    	}
    	if(millis() - pre_mill >= interval) {
    		digitalWrite(RELE1_PIN, HIGH);
    		digitalWrite(RELE2_PIN, HIGH);
    		//Serial.println("Cas vyprsel vypinam obe dve rele!!!");
        
    	}
    }
    
Aktuálně je na stránce zobrazeno 11 příspěvků - 1. až 11. (celkem z 11)
  • Pro reakci na toto téma se musíte přihlásit.