Olá estou com uma divida, gostaria de saber se é possível associar 4 saidas digitais em uma úníca variável.  tipo eu gostaria de acionar a variável SUB aos pinos (4,9,8 e 10) do arduino e quando a variável ficar  HIGT todas as saidas ficam HIGT...   como programo no Setup para q eles fiquem associados apenas quando a variável for Higt?

Abraços agradeço a atenção!

Exibições: 1696

Responder esta

Respostas a este tópico

Para associar dessa forma, terá que efetuar um loop (for), quando a variável estiver em nível alto, o loop seta os pinos (um por vez) para HIGH.

Bem eles seriam acionados em ordem? e tenho outro problema uma outra variável vai usar alguns destes pinos q só podem ser HIGT quando a variável for!

Pode me dar um exemplo?

Grato pela atenção!

Exemplo simples:

if (SUB == HIGH){

   for (int i=0; i<4; i++){

      digitalWrite(4, HIGH);

      digitalWrite(8, HIGH);

      digitalWrite(9, HIGH);

      digitalWrite(10, HIGH);

   }

}

else{

   for (int i=0; i<4; i++){

      digitalWrite(4, LOW);

      digitalWrite(8, LOW);

      digitalWrite(9, LOW);

      digitalWrite(10, LOW);

   }

}

Por ai.
Abraços!

colocando os pinos numa variável ficaria assim:

int pinosSUB[4] = {4,8,9,10};

if (SUB == HIGH){
   for (int i=0; i<4; i++){
      digitalWrite(pinosSUB[i], HIGH);
   }
}
else{
   for (int i=0; i<4; i++){
      digitalWrite(pinosSUB[i], LOW);
   }
}

A lógica fica menor e "mais bonita". :)

Abraços!

Coloco em setup né! 

vou editar ele completo e coloco aqui!

Obrigado pela atenção!

Olá,

A dica do Fellipe é boa e muito elegante, e deve funcionar para 99% das necessidades, mas existem situações em que se torna necessário mudar o estado dos pinos ao mesmo tempo e com maior velocidade, coisa que não acontece quando se usa a lógica acima, mesmo se considerarmos a velocidade de um microcontrolador. 

Para esses casos, eu sugiro a seguinte lógica:

 

  if (sub == 1) {    
    PORTD = PORTD | B00010000; // seta o pino digital 4 em HIGH
    PORTB = PORTB | B00000111; // seta os pinos digitais 8,9,10 pins 7,5,3 em HIGH 
  }
  else {
    PORTD = PORTD & B11101111; // seta o pino digital 4 em LOW
    PORTB = PORTB & B11111000; // seta os pinos digitais 8,9,10 pins 7,5,3 em LOW
  }

 

Usar a função PORTx tem algumas vantagens sobre o digitalWrite:

1 - A velocidade de execução, pois o port comanda os pinos em uma fração do tempo usado pelo digitalWrite;

2 - Comandar os oitos pinos de um determinado PORT de uma única vez.

Isso é muito bom quando for necessário comandar motores de passo, gerar trens de pulso etc...

Como os pinos que o Hélio quer comandar estão distribuidos em dois ports, não conseguimos comandar o quatro pinos exatamente ao mesmo tempo (no mesmo ciclo de máquina), primeiro os pinos de um port e depois os pinos do outro port, para que isso seja possível todos os pinos tem que estar no mesmo port.

Pra quem tiver interesse em aprender mais, consulte o site do arduino, lá tem todas as dicas...

http://www.arduino.cc/en/Reference/PortManipulation

Abraço. 

Esta dando este erro aqui...

modbus_proteus.cpp: In function 'void setup()':
modbus_proteus:131: error: 'SUB' was not declared in this scope
modbus_proteus:162: error: 'DES' was not declared in this scope
modbus_proteus:196: error: a function-definition is not allowed here before '{' token
modbus_proteus:819: error: expected `}' at end of input

Obrigado!

De acordo com o relatório de erros, diz algo que dentro do 'void setup()' não está declarada a variável SUB e a variável DES. Todas as variaveis devem ser declaradas, assim como coloquei na lógica acima: "int pinosSUB[4] = {4,8,9,10};" exemplo.

Indica também que em alguma linha não é permitodo ou está faltando as chaves "{ }".

E a lógica que fiz acima, não deve ser dentro do setup, e sim dentro do loop, para estar sempre "rodando" e verificando os estados das variáveis.

Pessoal este código não funcionou! vou tentar ser mais objetivo...   tenho duas variáveis sendo SUB e outra DES. quando aciono SUB ele liga quatro saidas (10, 8, 11, 13) em HIGT e quando aciono DES ( 10, 7, 11, 12) ele coloca estes pinos em HIGT....  neste código do poste me parece q os quatro pinos são iguais a SUB tanto em HIGT como em LOW, e neste caso não é possível usa los na variável DES...  elas só podem ser = quando for HIGT.

Agradeço a todos pela atenção!

Hélio,

Exatamente conforme sua narrativa acima, vou adaptar o código do Felipe Couto:

int pinosSUB[4] = {10,8,11,13}; //pinos do SUB

int pinosDES[4] = {10,7,11,12};//pinos do DES

void highSUB(){

   for (int i=0; i<4; i++){
      digitalWrite(pinosSUB[i], HIGH);
   }

}

void lowSUB(){

    for (int i=0; i<4; i++){
      digitalWrite(pinosSUB[i], LOW);
   }

}

 

void highDES(){

   for (int i=0; i<4; i++){
      digitalWrite(pinosDES[i], HIGH);
   }

}

void lowDES(){

    for (int i=0; i<4; i++){
      digitalWrite(pinosDES[i], LOW);
   }

}

 

void setup(){

//aqui o seu setup() normal, vou setar os pinos para saida...

   for (int i=0; i<4; i++){
      pinMode(pinosSUB[i], OUTPUT);

      pinMode(pinosDES[i],OUTPUT);
    }

}

 

void loop(){

   highSUB(); //para ligar os pinos SUB, etc.

   

}

 

Embora os pinos estejam repetidos em SUB, acho que não dará problema.

Alguém revise o código, por favor.

Espero que seja isso.

 

Abraços.

 

 

Vou aplicar ele aqui!

agradeço a atenção Edson!

Colega esta dando este erro!

modbus_proteus.cpp: In function 'void loop()':
modbus_proteus:195: error: 'sub' was not declared in this scope
modbus_proteus:209: error: 'des' was not declared in this scope

o código é assim:

 int pinosSUB[4] = {10,8,11,13}; //pinos do SUB

int pinosDES[4] = {10,7,11,12};//pinos do DES

void highSUB(){

   for (int i=0; i<4; i++){
      digitalWrite(pinosSUB[i], HIGH);
   }

}

void lowSUB(){

    for (int i=0; i<4; i++){
      digitalWrite(pinosSUB[i], LOW);
   }

}

 

void highDES(){

   for (int i=0; i<4; i++){
      digitalWrite(pinosDES[i], HIGH);
   }

}

void lowDES(){

    for (int i=0; i<4; i++){
      digitalWrite(pinosDES[i], LOW);
   }

}

int update_mb_slave(unsigned char slave, int *regs,
unsigned int regs_size);


/* Modbus RTU common parameters, the Master MUST use the same parameters */
enum {
        MB_SLAVE = 1,    /* modbus slave id */
};
/* slave registers example */
enum {        
        MB_REG0,
        MB_REG1,
        MB_REGS
       

         /* total number of registers on slave */
};

int regs[MB_REGS];    /* this is the slave's modbus data map */
 





void setup()



{
      

  /* Modbus setup example, the master must use the same COM parameters */
        /* 115200 bps, 8N1, two-device network */
        configure_mb_slave(19200, 'n', 0);
    
    for (int i=0; i<4; i++){
      pinMode(pinosSUB[i], OUTPUT);

      pinMode(pinosDES[i],OUTPUT);
    }

}

void loop()
{
        /* This is all for the Modbus slave */
    update_mb_slave(MB_SLAVE, regs, MB_REGS);
 
  //regs[MB_REG0]=analogRead(0);
  //regs[MB_REG1]=analogRead(1);
  //regs[MB_REG2]=analogRead(2);
  //regs[MB_REG3]=analogRead(3);
  //regs[MB_REG4]=analogRead(4);
  //regs[MB_REG5]=analogRead(5);
 
 
 
 
 
  switch ( regs[MB_REG0]) {
    case 1:
      
      digitalWrite(sub,HIGH);
      break;
    case 0:
       digitalWrite(sub,LOW);
      break;
    default:
     digitalWrite(sub,LOW);
  }
 
 
 
 switch ( regs[MB_REG1]) {
    case 1:
      
      digitalWrite(des,HIGH);
      break;
    case 0:
       digitalWrite(des,LOW);
      break;
    default:
     digitalWrite(des,LOW);
  }
 
 

 
 
 
 
    /* your code goes here */
}

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço