посчитать импульсы

saftik
Offline
Зарегистрирован: 08.04.2015

Доброго времени суток уважаемые форумчане.
есть устройство (самодельное с 1 кнопкой и 2 дипами) которое генерирует импульсы различной скважности
50 ms on     /   50   ms off
60 ms on     /   300 ms off
30 ms on     /   50   ms off
150 ms on   /   150 ms off
хочу научиться различать эти импусы.

например если пришел импульс  50/ 50 
засветить зеленый светодиод,
если  импульс 60/ 300 
засветить красный светодиод
если  импульс 150/ 150 синий и т.д. 

проблема в том что количество импульсов всегда одно и тоже, ((
разная только скважность.

а за основу взят код купюроприемника. 

он работает . 
но  на любой скважности выдает одно и тоже число. 
подскажите пожалуйсто куда копать. что нужно дописать в коде

 

const int moneyPin1=2;
int pulse1=0;
unsigned long timeAllPulse1=1000; // макс. время приема купюры
unsigned long timeCount1=0;
int nominals1[5]={10, 50, 100, 500, 1000};
int sum=0;

# define redPin 4
# define greenPin 5
# define bluePin 6
void setup()
{
  Serial.begin(9600);
  pinMode(moneyPin1,INPUT);
  attachInterrupt(0,count_pulse1,FALLING);
pinMode(redPin,  OUTPUT);
pinMode(greenPin,OUTPUT);
pinMode(bluePin, OUTPUT);
}

void loop() {

if(pulse1>0 && (millis()-timeCount1)>timeAllPulse1)  // прошло максимальное время приема купюры?
{
sum+=nominals1[pulse1];
Serial.println(nominals1[pulse1]);
pulse1=0;
}
}

void count_pulse1()     // обработка прерывания купюроприемника - получить кол-во импульсов
{

detachInterrupt(0);
pulse1++;
if(pulse1==1)
timeCount1=millis();
attachInterrupt(0,count_pulse1,FALLING);
}

 

saftik
Offline
Зарегистрирован: 08.04.2015

Araris пишет:

А если прерывание поставить как attachInterrupt(0,count_pulse1,CHANGE); , засекать время начала и окончания импульса, а затем вычислять его длину в мсек ?

Кстати, неплохо бы еще и переменные, задействованные в обработчике прерывания, сделать volatile. (http://arduino.ru/Reference/Volatile)

вот немного подкоректировал скетч, 
гляньте пожалуйсто.

 

const int moneyPin1=2;
int pulse1=0;
unsigned long timeAllPulse1=1000; // макс. время приема купюры
unsigned long timeCount1=0;
int nominals1[5]={10, 50, 100, 500, 1000};
int sum=0;

# define redPin 4
# define greenPin 5
# define bluePin 6

unsigned long start_Impuls = 0;
unsigned long stopI_mpuls =0;
unsigned long duration_Impuls=0;

void setup()
{
  Serial.begin(9600);
  pinMode(moneyPin1,INPUT);
  attachInterrupt(0,count_pulse1,CHANGE);
pinMode(redPin,  OUTPUT);
pinMode(greenPin,OUTPUT);
pinMode(bluePin, OUTPUT);
}

void loop() {

if(pulse1>0 && (millis()-timeCount1)>timeAllPulse1)          // прошло максимальное время приема купюры?
{
sum+=nominals1[pulse1];
Serial.println(nominals1[pulse1]);
pulse1=0;
}
}

void count_pulse1() {  // обработка прерывания купюроприемника - получить кол-во импульсов
detachInterrupt(0);
pulse1++;
if(pulse1==1)
timeCount1=millis();
start_Impuls = millis();                                     // запомнить начало импульса
attachInterrupt(0,count_pulse1,CHANGE);
stopI_mpuls = millis();                                      // запомнить конец импульса
duration_Impuls = start_Impuls - stopI_mpuls;                // расчитываю продолжительность импульса

longImpuls();                                                // ухожу в подпрограму включение диодов
}

void longImpuls() {
  if(duration_Impuls==50)  
     digitalWrite(redPin, HIGH);
  if(duration_Impuls==60) 
     digitalWrite(greenPin, HIGH);
  if(duration_Impuls==150) 
     digitalWrite(bluePin, HIGH);
 duration_Impuls =0;                                          // обнуляю длительность импульса
    }

 

inspiritus
Offline
Зарегистрирован: 17.12.2012

Пульсейн попробуйте

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

1. 42 строка зачем?

2. используй лучше micros

3. зачем светодиодами управлять в прерывании? это можно делать и в лупе

4. добавь флаг. в прерывании ее будешь использовать я того чтобы определять начало и конец импульса

5. перепиши фукнцию прерывания

 

saftik
Offline
Зарегистрирован: 08.04.2015

простите что пропал работой завалили времени совсем нет.

Пульсейн   - хорошая мысль )

jeka_tm

1)  не знаю зачем 42 строка, она  идет во всех исходниках купюрника 
2) согласен 
3) тоже верно
4) флаг добавить могу но пока не знаю как пристроить его на сработку импульса вернее как определять что импульса нет.  (в общем подумать тут надо )
5) ну да- согласен,  в ней весь секрет кроется )