Ir ao conteúdo
  • Cadastre-se

Arduino eu queria saber como consigo trabalhar com mais de dois sensores de fluxo


Posts recomendados

eu peguei um código que trabalha com um sensor, porém quando eu copio e colo de forma a trabalhar com dois sensor, o arduino só lê o valor de um deles, alguem poderia me ajuda

código:

volatile int pulsos; 
volatile int pulsos2;
#define sensordefluxo 2
#define sensordefluxo2 3
 
void fluxo () 
{
 pulsos++; 
}
void fluxo2()
{
  pulsos2++;
}
void setup()
{
 pinMode(sensordefluxo, INPUT);
 pinMode(sensordefluxo2, INPUT);
  Serial.begin(9600);
  attachInterrupt(0, fluxo, RISING);
 delay(5);
 attachInterrupt(0, fluxo2, RISING);
}
 
void loop () 
{
 Serial.print("Pulsos: ");
 Serial.println(pulsos);
 Serial.print("pulsos2: ");
 Serial.println(pulsos2);
 delay(500);
 
}

Link para o comentário
Compartilhar em outros sites

O interrupt externo são dois o 0  e 1, você está usando o mesmo interrupt para os dois casos.

attachInterrupt(0, fluxo, RISING);
attachInterrupt(1, fluxo2, RISING);

Assim deve ter o acréscimo ao fluxo2...

Mas você tem que fazer algumas contas para ver se não tem conflito nas leituras finais também...

 

adicionado 0 minutos depois

pinos 2 e 3 do arduino fazem interrupt externo ... só lembrando...

Link para o comentário
Compartilhar em outros sites

O arduino UNO (ou atmega328p) só tem esses dois externos, fora o do botão de resete... Então se você quer mais interrupts você vai ter que mudar um Arduíno "maior" tipo mega que tem mais interrupts externos* ou passar para outro micro controlador como da empresa ST... Ou talvez você possa usar dois chips atmega ou dois arduinos... mas melhor pegar o mega mesmo. <isso para se você exclusivamente for usar externos

--> Uno, Nano, Mini, other 328-based pinos 2 e 3 ;

--> Mega, Mega2560, MegaADK 2, 3, 18, 19, 20, 21 ;

-->Micro, Leonardo, other 32u4-based0, 1, 2, 3, 7;

-->Zeroall digital pins, except 4

-->MKR1000 Rev.10, 1, 4, 5, 6, 7, 8, 9, A1, A2

-->Dueall digital pins

-->101all digital pins (Only pins 2, 5, 7, 8, 10, 11, 12, 13 work with CHANGE

https://www.arduino.cc/en/Reference/AttachInterrupt

 

Externo é qualquer sinal que vem de fora e é lido pelas portas do arduino... o attachInterrupt tem várias formas uma delas que você colocou ai em cima RISING...dependendo da forma que você escolher o interrupt vai ser ativado, seja você esperando um sinal HIGH, LOW, HIGH para LOW ou LOW para HIGH.... mudança de estado...

 

Já o interno são feitos partir de um contador de tempo interno do arduino(timers). Esses já são mais complicados por você ter que ter uma boa leitura do datasheet do arduino... mas você consegue achar tutoriais sobre interrupt timers no arduino no google ^^

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Penso que com um truque simples tu podes ter quantas interrupts quiseres com um único pino programado realmente pra "interromper" o fluxo do programa. Algo como diodos formando uma porta AND com o da interrupção deve direcionar à função que desejas. Algo como a essência abaixo (em c) . De fato há implementos e complementos otimizáveis

void interrupt_do_pino_s()
{
if (!pino_a) pulso0++; //ou funcao0()
if (!pino_b) pulso1++; //ou funcao1()
if (!pino_c) pulso2++; //ou funcao2()
if (!pino_d) pulso3++; //ou funcao3()
if (!pino_x) o_pulso_ainda_pulsa();
}

Se pedir pra desenhar, ferrou pois o que achei na net rapidamente foi isso...

gate-diodo.gif

abcd: os pinos do mc. A entrada de cada interrupt virtual (inventei isso agora) estaria entre cada bolinha da esquerda e gnd e a real no pino s

Se achares que é só fazer ctrl-c ctrl-v e  que tem que ser 10V, precisas de outro tipo de ajuda que não tenho certeza se posso te dar... sorry

 

 

Link para o comentário
Compartilhar em outros sites

@Isadora Ferraz

hum... acho que entendi...

Daria para colocar um pino no interrupt e colocar o mesma fio do sinal também indo para outra porta(porta digital normal do Arduíno sem ser a 2 e 3)... e associar no programa qual está sendo ativada... assim dá para incrementar a cada ativação do interrupt ^^

 

Dá para tentar fazer ^^

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

É isso aí amigo @Bommu Perneta . Perceba a importância da porta E com diodos pra não curto.

 

Algo a ser considerado nesta implementação teórica (que criei agora) é que as interrupts são eventos fortuitos tendo vida própria as quais podem p.ex. ocorrer + de uma ao mesmo tempo, dentro da rotina, etc. Algo como o mc sendo bem rápido se comparado ao tempo da interrupt,  ler o byte da porta pra posterior análise (e alguns etc que só a prática vai dizer) pode ajudar a contornar tal circunstância.

unsigned char p=0;
void interrupt_do_pino_s()
{
p|=PORTD;//zere p depois do uso
...

De novo... conceitos

Link para o comentário
Compartilhar em outros sites

De vez em quando aparece um povo aqui de tcc... repetindo pode pedir ajuda sim, mas o trabalho principalmente é seu ^^ Por vezes eles não publicam o trabalho todo só em partes ... mas enfim além da Isa (cof cof) tem também outros aqui da comunidade que podem lhe ajudar ^^ 

Link para o comentário
Compartilhar em outros sites

o funcionamento seria: ao apertar o botão, a válvula(rele1) e a bomba(bomba) ligam, e quando der 450 pulsos, desliga ambos e zera a quantidade de pulso.

porém quando aperta o botão novamente, não acontece nada.

obs:só funciona na primeira vez

obs: a bomba e a válvula são ligadas por relés

 

 

 

volatile int pulsos;
int botao1 = 8;
int rele1 = 4;
int bomba = 7;
int estadobotao1 = 0;
#define sensordefluxo 2  

void fluxo ()
{
 pulsos++;
}

void setup()
{
 pinMode(botao1, INPUT);
 pinMode(bomba, OUTPUT);
 pinMode(rele1,OUTPUT);
 pinMode(sensordefluxo, INPUT);
 Serial.begin(9600);
 attachInterrupt(0, fluxo, RISING);
 interrupts();
}
 
void loop ()
{
estadobotao1=digitalRead(botao1);

while(estadobotao1 == 1){
while(pulsos<450){      
Serial.print("Pulsos: ");
Serial.println(pulsos);
if(estadobotao1==1 && pulsos<449){
digitalWrite(rele1, HIGH);
digitalWrite(bomba, HIGH);
}
 
else{
 digitalWrite(rele1, LOW);
 digitalWrite(bomba, LOW);
}
if(pulsos==450){
pulsos=0;  
estadobotao1=0;
  }
  }
  }
}

@Isadora Ferraz @Bommu Perneta

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Não conheço tal sensor.. são apenas pulsos pra contar? Talvez nem precise de interrupt: basta um contador dum timer p.ex.

 

Bem... o que vislumbro da superfície...

51 minutos atrás, Francisco Godinho disse:

if(pulsos==450){

Na interrupt pode estar passando pelos 450 e aquela condição nunca será satisfeita. Tente algo como

if (pulsos>=450)

Também o hw pode estar ajudando a atrapalhar. As vezes podem ocorrer ruídos e o sistema pensa que é pulso. Hás de analisar isso. Se achar que deve, publique o esquema...

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!