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 BlindP a poslední změna proběhla před 8 roky a 3 měsíci.
-
AutorPříspěvky
-
3.9.2016 v 14:27 #8243milanoÚč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
4.9.2016 v 14:01 #8254milanoÚčastníkTak 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);
}4.9.2016 v 16:02 #82564.9.2016 v 17:43 #8258milanoÚčastníkDíky, na to už jsem koukal, ale budu se tím muset asi prokousat.
4.9.2016 v 20:45 #8259lubosmÚčastníkJe 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.
4.9.2016 v 23:06 #8260posjirkaÚčastníkněco podobného jsme už řešili na jiném foru …
http://duinozone.cz/index.php/topic,177.0.html4.9.2016 v 23:24 #8261milanoÚčastníkDě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 🙂
5.9.2016 v 10:48 #8263posjirkaÚčastníkzkus 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 } }
5.9.2016 v 12:12 #8264milanoÚčastníkDě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 🙂
5.9.2016 v 15:24 #8265posjirkaÚčastníknení zač ….
5.9.2016 v 16:07 #8266BlindPÚčastníkTaky 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!!!"); } }
-
AutorPříspěvky
- Pro reakci na toto téma se musíte přihlásit.