Sari la conținut
ELFORUM - Forumul electronistilor

arduino mega 2560 +8 relay


hauerit

Postări Recomandate

salut ! am o mare nelamurire ..am folosit codul asta de pe net si nu prea functioneaza ..

ideea e simpla ,poti comanda cele 8 relee  din  serial monitor,,cu comenzile ,,-1,,+1,, on/off  prin arduino mega2560 

 1 fiind nr releului ..zis si facut doar ca de la releul 1 la 6 nu primeste comanda iar la -8 porneste releul 7 si la -7 releul 8 

orice alta comanda anuleaza celelalte comenzi ..multumesc mult daca ma poate ajuta cineva . 

#define RELAY1  52
#define RELAY2  50                    
#define RELAY3  48                        
#define RELAY4  46                       
#define RELAY5  44
#define RELAY6  42                     
#define RELAY7  40                        
#define RELAY8  38                        

void setup()
{    
  // Initialize the Arduino data pins for OUTPUT
  pinMode(RELAY1, OUTPUT);       
  pinMode(RELAY2, OUTPUT);
  pinMode(RELAY3, OUTPUT);
  pinMode(RELAY4, OUTPUT);
  pinMode(RELAY5, OUTPUT);       
  pinMode(RELAY6, OUTPUT);
  pinMode(RELAY7, OUTPUT);
  pinMode(RELAY8, OUTPUT);
  
//setting all pins to high so that all relays are off at start
  digitalWrite(RELAY1,HIGH);    
  digitalWrite(RELAY2,HIGH);    
  digitalWrite(RELAY3,HIGH);  
  digitalWrite(RELAY4,HIGH);      
  digitalWrite(RELAY5,HIGH);    
  digitalWrite(RELAY6,HIGH);    
  digitalWrite(RELAY7,HIGH);    
  digitalWrite(RELAY8,HIGH);  
  
  //wait for serial connect from COM Port
  while (!Serial);
  Serial.begin(19200);
}

void loop()
{
  String command;
  char charBuf[5];
  
  //waiting for data command
  if(Serial.available() > 0)
  {
    command = Serial.readStringUntil('\r');
    command.toCharArray(charBuf, 5);
  }
  else
    return;

  //-1 - off relay 01 
  //+1 - on relay 01
  
  if  (charBuf[0]=='+') //relay off
    SetStatus(true, charBuf[1]);
  else if (charBuf[0]=='-') //relay on
    SetStatus(false, charBuf[1]);  
  }

  void SetStatus(boolean on,char relayNumber)
  {
    int relayState =0;//off 
    if (on)
      relayState =1;//on 

    switch (relayNumber) {
    case '1':
      digitalWrite(RELAY1,relayState);        
      break;
    case '2':
      digitalWrite(RELAY2,relayState);        
      break;
    case '3':
      digitalWrite(RELAY3,relayState);        
      break;
    case '4':
      digitalWrite(RELAY4,relayState);        
      break;
    case '5':
      digitalWrite(RELAY5,relayState);        
      break;
    case '6':
      digitalWrite(RELAY6,relayState);        
      break;
    case '7':
      digitalWrite(RELAY7,relayState);        
      break;
    case '8':
      digitalWrite(RELAY8,relayState);        
      break;
    }
  }

Link spre comentariu
  • Răspunsuri 9
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Mie singura chestie neclara mi-e formatul lui charBuf[1].

1 oră în urmă, hauerit a spus:

  if  (charBuf[0]=='+') //relay off

    SetStatus(true, charBuf[1]);
  else if (charBuf[0]=='-') //relay on
    SetStatus(false, charBuf[1]);  
  }

In conditiile in care charBuf[0] e un caracter ('+' sau '-'), ma intreb daca nu cumva si charBuf[1] nu e tot un caracter (ASCII), drept pentru care as incerca cu 

 if  (charBuf[0]=='+') //relay off

    SetStatus(true, charBuf[1] - '0'); //scade codul ascii al lui 0
  else if (charBuf[0]=='-') //relay on
    SetStatus(false, charBuf[1] - '0'); //scade codul ascii al lui 0
  }

 

Editat de Liviu M
Link spre comentariu

Oricum, constat ca programatorilor de Arduino le place sa scrie linii de cod "fara numar, fara numar". Mai putin cand e cazul sa fie vorbareti (si sa puna acolade).

Mie mi-ar fi iesit ceva mai "grupat"

#define RELAY1  52
#define RELAY2  50                    
#define RELAY3  48                        
#define RELAY4  46                       
#define RELAY5  44
#define RELAY6  42                     
#define RELAY7  40                        
#define RELAY8  38                        

uint8_t relays[] = {RELAY1, RELAY2, RELAY3, RELAY4, RELAY5, RELAY6, RELAY7, RELAY8};

void SetStatus(boolean on, char relayNumber);

void setup()
{    
  // Initialize the Arduino data pins for OUTPUT
  //setting all pins to high so that all relays are off at start
  for(uint8_t i = 0; i < 8; i++) { 
    pinMode(relays[i], OUTPUT);                       
    digitalWrite(relays[i],HIGH);    
  }
  
  //wait for serial connect from COM Port
  while (!Serial);
  Serial.begin(19200);
}

void loop(){
  String command;
  char charBuf[5];
  
  //waiting for data command
  if(Serial.available() > 0) {
    command = Serial.readStringUntil('\r');
    command.toCharArray(charBuf, 5);
  } else {
    return;
  }

  //-1 - off relay 01 
  //+1 - on relay 01
  
  if  (charBuf[0]=='+') {       //relay off
    SetStatus(true, charBuf[1] - '0');
  } else if (charBuf[0]=='-') {  //relay on
    SetStatus(false, charBuf[1] - '0');  
  }
}
    
void SetStatus(boolean on, char relayNumber){
  int relayState = LOW;//off 
    
    if (on){
      relayState =HIGH;//on 
    }
    
    digitalWrite(relays[relayNumber],relayState);
}

 

Link spre comentariu
Chiar acum, Liviu M a spus:

Oricum, constat ca programatorilor de Arduino le place sa scrie linii de cod "fara numar, fara numar". Mai putin cand e cazul sa fie vorbareti (si sa puna acolade).

Mie mi-ar fi iesit ceva mai "grupat"


#define RELAY1  52
#define RELAY2  50                    
#define RELAY3  48                        
#define RELAY4  46                       
#define RELAY5  44
#define RELAY6  42                     
#define RELAY7  40                        
#define RELAY8  38                        

uint8_t relays[] = {RELAY1, RELAY2, RELAY3, RELAY4, RELAY5, RELAY6, RELAY7, RELAY8};

void SetStatus(boolean on, char relayNumber);

void setup()
{    
  // Initialize the Arduino data pins for OUTPUT
  //setting all pins to high so that all relays are off at start
  for(uint8_t i = 0; i < 8; i++) { 
    pinMode(relays[i], OUTPUT);                       
    digitalWrite(relays[i],HIGH);    
  }
  
  //wait for serial connect from COM Port
  while (!Serial);
  Serial.begin(19200);
}

void loop(){
  String command;
  char charBuf[5];
  
  //waiting for data command
  if(Serial.available() > 0) {
    command = Serial.readStringUntil('\r');
    command.toCharArray(charBuf, 5);
  } else {
    return;
  }

  //-1 - off relay 01 
  //+1 - on relay 01
  
  if  (charBuf[0]=='+') {       //relay off
    SetStatus(true, charBuf[1] - '0');
  } else if (charBuf[0]=='-') {  //relay on
    SetStatus(false, charBuf[1] - '0');  
  }
}
    
void SetStatus(boolean on, char relayNumber){
  int relayState = LOW;//off 
    
    if (on){
      relayState =HIGH;//on 
    }
    
    digitalWrite(relays[relayNumber],relayState);
}

 

salut !multumesc  mult.. chiar merge ..comenzile sunt de la 0 la 7 ..macar de atat m,am prins si eu ..sunt la inceputuri 

Link spre comentariu
Chiar acum, Liviu M a spus:

Mie singura chestie neclara mi-e formatul lui charBuf[1].

In conditiile in care charBuf[0] e un caracter ('+' sau '-'), ma intreb daca nu cumva si charBuf[1] nu e tot un caracter (ASCII), drept pentru care as incerca cu 


 if  (charBuf[0]=='+') //relay off

    SetStatus(true, charBuf[1] - '0'); //scade codul ascii al lui 0
  else if (charBuf[0]=='-') //relay on
    SetStatus(false, charBuf[1] - '0'); //scade codul ascii al lui 0
  }

 

multumesc frumos ..

Link spre comentariu

Cu placere.

 

Acum 9 ore, hauerit a spus:

comenzile sunt de la 0 la 7

 

Ai dreptate, ca sa mearga de la 1 la 8, la ultima linie trebuia sa scad 1 din index:

    digitalWrite(relays[relayNumber - 1],relayState);

 

A propos, eu as mai pune si o mica intarziere dupa modificarea releelor, sa le dau timp sa se miste:

void SetStatus(boolean on, char relayNumber){
  int relayState = LOW;//off 
    
    if (on){
      relayState =HIGH;//on 
    }
    
    digitalWrite(relays[relayNumber],relayState);
    delay(5 ms); //asteapta releul sa ajunga in noua pozitie.
}
Editat de Liviu M
Link spre comentariu

Ca tot vorbeam de scris putin, o varianta echivalenta si mai scurta ar iesi:

#define RELAY1  52
#define RELAY2  50                    
#define RELAY3  48                        
#define RELAY4  46                       
#define RELAY5  44
#define RELAY6  42                     
#define RELAY7  40                        
#define RELAY8  38                        

uint8_t relays[] = {RELAY1, RELAY2, RELAY3, RELAY4, RELAY5, RELAY6, RELAY7, RELAY8};

void SetStatus(boolean on, char relayNumber);

void setup()
{    
  // Initialize the Arduino data pins for OUTPUT
  //setting all pins to high so that all relays are off at start
  for(uint8_t i = 0; i < 8; i++) { 
    pinMode(relays[i], OUTPUT);                       
    digitalWrite(relays[i],HIGH);    
  }
  
  //wait for serial connect from COM Port
  while (!Serial);
  Serial.begin(19200);
}

void loop(){
  String command;
  
  //waiting for data command
  if(Serial.available() > 0) {
    command = Serial.readStringUntil('\r');
    
    boolean bNewState = false;
    if  (command[0]=='+') {       //relay off
      bNewState = true;
    } else if(command[0]!='-') { //bad data on serial port, return
      return;
    }
    
    uint8_t relIdx = command[1] - '0';
    digitalWrite(relays[relIdx - 1], bNewState);  
    delay(5);
  }
}
   

De compilat se compileaza, de testat n-am cum.

 

 

Editat de Liviu M
Link spre comentariu
  • 2 luni mai târziu...

nu toti utilizatorii de arduino scriu fara număr. e vorba de începători. oricum arduino in sine e pentru începători dar când depășești stadiul de incepator, garantat apar si codurile de intreruperi, optimizari etc. 

 

sa nu fim rai, la toți a fost un început. candva. acei "fara număr" sunt sigur ca nu au astfel de preocupari vreodata. 

(smile)

Editat de Gilbert Sparios
Link spre comentariu
  • 2 săptămâni mai târziu...

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări