Olá pessoal. 
Estou desenvolvendo um projeto onde ligo um rele por um determinado tempo de acordo com o valor de uma moeda inserida. Esta funcionado perfeitamente quando inserida uma só moeda, porém quando outra moeda é inserida antes do tempo acabar o dispositivo "engole" a moeda sem nenhum efeito. A leitura da moeda se dá via SoftwareSerial com a função "nome.read()" atribuida a uma variável (como no exemplo TwoPortReceive, a biblioteca SoftwareSerial). Estou tentando usar uma interrupção para incrementar uma variável tempo sepre que uma moeda nova for inserida, só que está "perdendo" parte do conteúdo quando recebo a leitura da serial dentro da interrupção. Quando uma moeda é inserida o dispositivo liga/desliga uma porta digital (5v) e depois envia o valor lido via serial.
Segue o código:

#include <SoftwareSerial.h>
SoftwareSerial moedeiro(10, 11);   //TX=10, RX=11
int moeda=0;
int tempo = 0;
void setup(){
   Serial.begin(9600);
   attachInterrupt(0,maisDinheiro,CHANGE); //0 é a interrupção do pino 2.
}
void loop(){
   while (tempo>0){
      Serial.println(tempo);
      tempo--;
      delay(1000);

// aqui devo inserir a linha para ligar o rele

   }

// aqui para desliga-lo
}
void maisDinheiro(){
     while (moedeiro.available()){           //verifica se há entrada
               moeda=int(moedeiro.read());  //grava a leitura como inteiro em moeda
     }
   if (moeda!=0) {
                Serial.print(moeda);
        }
   if (moeda==25){
      tempo+=600; // 10 minutos = 600 segundos
   }
   if (moeda==50){
      tempo+=1200;
   }
   if (moeda==100){
      tempo+=2400;
   }
}


Exibições: 1891

Responder esta

Respostas a este tópico

Oi RPB, boa tarde,

qual Arduino você está utilizando?

Se for o UNO, ele só aceita interrup externo nos pinos 2 e 3,

 attachInterrupt(0,   para o pino 2 e

 attachInterrupt(1,  pra o pino 3.

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

Tabela de pinos de interrupt por tipo de board

Board int.0 int.1 int.2 int.3 int.4 int.5
Uno, Ethernet 2 3        
Mega2560 2 3 21 20 19 18
Leonardo 3 2 0 1 7  
Due (see below)

The Arduino Due board has powerful interrupt capabilities that allows you to attach an interrupt function on all available pins. You can directly specify the pin number in attachInterrupt().

Portanto, sua rotina de interrup não terá ação, pois seu dispositivo está conectado nos pinos 10 e 11.

Rui

Ta ligado assim!

Parece muito redundante, mas isso ai foi uma tentativa de usar na placa 1 (ligada ao moedeiro) para gerar um sinal para "provocar" a interrupção na placa 2 e só depois transmitir o valor na serial. 

Código da placa 1(ligada ao moedeiro).

#include <SoftwareSerial.h>
SoftwareSerial moedeiro(10,11); //TX=10, RX=11
SoftwareSerial paraPrincipal(6,7);
int sinalizador = 13;
int estado = LOW;
void setup() {
moedeiro.begin(9600);
paraPrincipal.begin(9600);
pinMode(sinalizador,OUTPUT);
digitalWrite(sinalizador, estado);
}
void loop() {
int x=0;
moedeiro.listen(); //escuta porta
while (moedeiro.available()) //verifica se há entrada
{
x+=int(moedeiro.read()); //acumula a leitura como inteiro em x
}
switch (x)
{
case 496: //R$ 0,25
sinal();
paraPrincipal.print("1111"),paraPrincipal.print(25);break;
case 624: //R$ 0,50
sinal();
paraPrincipal.print("1111");paraPrincipal.print(50);break;
case 616: //R$ 1,00
sinal();
paraPrincipal.print("1111");paraPrincipal.print(100);break;
}
delay(100);
}
void sinal(){
estado==LOW?estado=HIGH:estado=LOW; //condição?verdadeiro:falso
delayMicroseconds(100);
digitalWrite(sinalizador, estado);
}

Oi RPB, bom dia,

segue um código, em que usei o conceito de threads para fazer a leitura das moedas e a contagem do tempo.

Ele usará somente um Arduino.

Faça um teste e depois de um feebback para nós.

http://pastebin.com/ujuTUSHL

Rui

Muitíssimo obrigado Rui Viana!!

A princípio o problema permaneceu, porém estudando um pouquinho mais consegui resolver. A Sua solução foi fundamental pra eu pensar diferente sobre o problema. 

Resumindo: O uso da simulação de threads foi o determinante para o funcionamento, porém o uso de um laço de repetição impedia sair de uma função (thread) para outra.

Segue o código da solução final e como ficou montado o protótipo. 

Oi RPB, bom dia,

fico satisfeito que você tenha resolvido o problema do seu projeto.

Se você considerar que está tudo resolvido,

Escreva a palavra "RESOLVIDO" antes do título, 

assim estará ajudando outros, que possam procurar uma solução.

Atenciosamente,

Rui

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço