Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kontrola relea 4x4 tastaurom

[es] :: Elektronika :: Mikrokontroleri :: Kontrola relea 4x4 tastaurom

[ Pregleda: 1371 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

SASA M.
Pripyat

Član broj: 32850
Poruke: 3180
*.dynamic.sbb.rs.



+370 Profil

icon Kontrola relea 4x4 tastaurom23.08.2021. u 16:19 - pre 31 meseci
Postovani prijatelji,

Rekoh da se malo odmorim od onog mog lifta jer mi glava jos uvek ide gore-dole, a uredjaj nije trenutno ni ukljucen, resih da probam nesto drugo sto sam hteo jos pre i zbog cega sam hteo tu probu sa motorom sto pre da zavrsim...

Prepravio sam jedan skec sa ovog YT kanala https://www.youtube.com/watch?v=dkESWpdDBYk da bih imao vise od 8 relea kao sto je prikazano u videu, ok mi radi tako, testirao sam sa 16 relea (samo kroz serial monitor, 2 u realnosti).

Potrebna mi je pomoc, resenje za ova 2 pitanja...
Realno mi treba mozda 10-12 relea, to mi nije prob. da limitiram, ali ne znam kako da dodam da mi neki od tastera u matrici koje ne bili korisceni ugasi sve relee. Ako npr upalim 7-8 relea a ostali su ugaseni, sada mora svaki da se ponovo pritisne da bih sve iskljucio. Malo mi glupo da koristim reset dugme za ovo.



Drugo pitanje bi bilo da jednim tasterom ukljucim-iskljucim predefinisanu grupu relea. Logika ovde ne dozvoljava da ako je jedan taster pritisnut da se pritisne neki drugi, da nije tako, mozda bih mogao da fizicki napravim neku prepravku koja bi jednim externim tasterom pritisnula vise linija odjednom.

Za oba pitanja, nije mi bitno da bash mora biti neki taster u matrici, mogu i eksterni tasteri, probu radim na mega koji ima malo vishe pinova od uno ili nano, pa mi to nije prob.

Ako se ovo ne moze da se uradi sa ovim skecom, i ta informacija bi mi znacila, jer ne uspevam ni ovo prvo da uradim.

Evo moj prepravljeni kod koji ukljucuje i iskljucuje 16 relea sa 4x4 matricom.

Code:
#include <Keypad.h>

//keypad settings
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char keys[ROWS][COLS] = {
  {'1', '2', '3', ':'},
  {'4', '5', '6', ';'},
  {'7', '8', '9', '<'},
  {'@', '?', '>', '='}
};
byte rowPins[ROWS] = {2, 3, 4, 5}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {6, 7, 8, 9}; //connect to the column pinouts of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );


//relay settings
const int relayPin[] = {22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37}; // output pins where 16 relays will be connected
String relayNames[] = {"CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16"}; // Just put name for 16 relays
int pushed[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // status of each buttons
int relayStatus[] = {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH}; // initial status of relay


void setup() {
  Serial.begin(9600);
  for (int i = 0; i < 16; i++)
  {
    pinMode(relayPin[i], OUTPUT); // set relay pins as output
    digitalWrite(relayPin[i], HIGH);// initial relay status to be OFF
  }

  Serial.println("16 channel relay keypad");

}

void loop() {
  int val;
  int knum;
  char key = keypad.getKey();

  // just print the pressed key
  if (key) {
    knum = (int)key - 49; // convert char to integer (one less)
    if (knum >= 0 && knum < 16) {
      //Serial.println(knum);
      if (relayStatus[knum] == LOW) {

        pushed[knum] = 1 - pushed[knum];
        delay(50);
      }
      controlRelay(knum);// turn relay ON or OFF
    }
  } else {
    val = LOW;
  }

  if (knum >= 0 && knum < 16) {
    relayStatus[knum] = val;
  }
  delay(50);
}

//controlRelay
void controlRelay(int number)
{
  if (pushed[number] == 1)
  {
    digitalWrite(relayPin[number], HIGH);// Turn OFF relay
    Serial.print(relayNames[number]);
    Serial.println(" OFF");
  } else {
    digitalWrite(relayPin[number], LOW); // turn ON relay
    Serial.print(relayNames[number]);
    Serial.println(" ON");
  }

}


slika za ilustraciju:
Prikačeni fajlovi
 
Odgovor na temu

veselinovic
Jovan Veselinovic
Ist. Sarajevo

Moderator
Član broj: 7761
Poruke: 3860
31.223.133.99



+333 Profil

icon Re: Kontrola relea 4x4 tastaurom23.08.2021. u 20:49 - pre 31 meseci
Ako imas pravo da broj releja smanjis na 15 problem je trivijalan.
Ako ne, moraces
a) pisati kod da dopustis dva tastera istovremeno
b) dodati jos jedan taster na slobodan pin kontrolera kojim ces pogasiti sve releje.
 
Odgovor na temu

SASA M.
Pripyat

Član broj: 32850
Poruke: 3180
*.dynamic.sbb.rs.



+370 Profil

icon Re: Kontrola relea 4x4 tastaurom24.08.2021. u 00:30 - pre 31 meseci
Mogu da smanjim na 10 ili 12, ali mislim da ne znam ni pod a, ni pod b da ovo prepravim
 
Odgovor na temu

veselinovic
Jovan Veselinovic
Ist. Sarajevo

Moderator
Član broj: 7761
Poruke: 3860
31.223.133.103



+333 Profil

icon Re: Kontrola relea 4x4 tastaurom25.08.2021. u 16:39 - pre 31 meseci
Probaj ovako

Code:

#include <Keypad.h>

//keypad settings
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char keys[ROWS][COLS] = {
  {'1', '2', '3', ':'},
  {'4', '5', '6', ';'},
  {'7', '8', '9', '<'},
  {'@', '?', '>', '='}
};
byte rowPins[ROWS] = {2, 3, 4, 5}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {6, 7, 8, 9}; //connect to the column pinouts of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );


//relay settings
const int relayPin[] = {22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37}; // output pins where 16 relays will be connected
String relayNames[] = {"CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16"}; // Just put name for 16 relays
int pushed[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // status of each buttons
int relayStatus[] = {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH}; // initial status of relay


void setup() {
  Serial.begin(9600);
  for (int i = 0; i < 16; i++)
  {
    pinMode(relayPin[i], OUTPUT); // set relay pins as output
    digitalWrite(relayPin[i], HIGH);// initial relay status to be OFF
  }

  Serial.println("16 channel relay keypad");

}

void loop() {
  int val;
  int knum;
  char key = keypad.getKey();

  // just print the pressed key
  if (key) {
    knum = (int)key - 49; // convert char to integer (one less)
    if (knum >= 0 && knum < 15) //  ovdje se ispituju tasteri 0 do 14
    {
      //Serial.println(knum);
      if (relayStatus[knum] == LOW) {

        pushed[knum] = 1 - pushed[knum];
        delay(50);
      }
      controlRelay(knum);// turn relay ON or OFF
    }
  } else {
    val = LOW;
  }

  if (knum >= 0 && knum < 16) {
    relayStatus[knum] = val;
  }
 if (knum == 15)   // ako je pritisnut 15ti taster onda:
 {
  for (int i=22;i<37; i++)  // prebaci sve izlaze na kojim su releji u LOW
  {
 digitalWrite (i,low);
    
  }
 }
  
  delay(50);
}

//controlRelay
void controlRelay(int number)
{
  if (pushed[number] == 1)
  {
    digitalWrite(relayPin[number], HIGH);// Turn OFF relay
    Serial.print(relayNames[number]);
    Serial.println(" OFF");
  } else {
    digitalWrite(relayPin[number], LOW); // turn ON relay
    Serial.print(relayNames[number]);
    Serial.println(" ON");
  }

}



 
Odgovor na temu

SASA M.
Pripyat

Član broj: 32850
Poruke: 3180
*.dynamic.sbb.rs.



+370 Profil

icon Re: Kontrola relea 4x4 tastaurom25.08.2021. u 22:36 - pre 31 meseci
Pozdrav i hvala na pomoci, probao sam naravno, radi gasenje relea, ali pojavio se jedan problem koji jos nisam uspeo da resim.

Naime originalni kod je imao jedan problem koji se ogledao u tome da se nakon ukljucenja i prvog pritiska na bilo koji taster nije desavalo nista tek na drugi promeni stanje i ukljuci rele. U serial monitoru za prvi pritisak ispishe off, a na drugom ispise on i tada stvarno ukljuci rele. Zbog toga sam promenio log. stanja u delu za kontrolu relea ovako:

Code:

//controlRelay
void controlRelay(int number)
{
  if (pushed[number] == 1)
  {
    digitalWrite(relayPin[number], HIGH);// Turn OFF relay
    Serial.print(relayNames[number]);
    Serial.println(" OFF");
  } else {
    digitalWrite(relayPin[number],LOW); // turn ON relay
    Serial.print(relayNames[number]);
    Serial.println(" ON");
  }


Sada kada iskljucim sve releje preko ovog tastera namenjanog za to, ponovo svaki taster mora da se u pritisne za prvo ukljucenje dvaput.

Mozda je onaj gornji problem bilo moguce negde ranije obrnuti, ali sad ne znam jer kada sam napravio ovu promenu u kodu i kada je radilo kako bi bilo logicno nisam obracao paznju.

Dodao sam sliku promena koje sam napravio na kodu od Jovana. Smanjio sam broj relea na 12. Nadam se da sam to dobro izmenio i umesto low stavio sam HIGH: digitalWrite (i, HIGH);
Kada je LOW ne desava se promena tj gasenje relea.




[Ovu poruku je menjao SASA M. dana 26.08.2021. u 00:15 GMT+1]
Prikačeni fajlovi
 
Odgovor na temu

goran_68

Član broj: 89012
Poruke: 932
*.dynamic.isp.telekom.rs.



+81 Profil

icon Re: Kontrola relea 4x4 tastaurom26.08.2021. u 07:00 - pre 31 meseci

Poigraj se sa ovim.

int relayStatus[] = {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH}; // initial status of relay


gorankg
 
Odgovor na temu

SASA M.
Pripyat

Član broj: 32850
Poruke: 3180
*.dynamic.sbb.rs.



+370 Profil

icon Re: Kontrola relea 4x4 tastaurom26.08.2021. u 11:42 - pre 31 meseci
Pozdrav Gorane, mislim da to ne bih trebao da diram, jer mi to pocetno stanje odgovara. Kada je tu HIGH tada su releji nakon ukljucenja svi ugaseni. Ako nesto nisam dobro objasnio, mogu da napisem opet drugacije.
 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroleri :: Kontrola relea 4x4 tastaurom

[ Pregleda: 1371 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.