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!
Tags:
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 */
}
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por