Помогите высчитать обороты.

Dima85
Offline
Зарегистрирован: 07.01.2013

У меня есть колесико, когда оно проделывает оборот задивает кнопку и она зажимается где-то на секунду +- сотые секунды.

Я сделал вот такой код:

    SensorState = digitalRead(PinSensor);
 if (WinSensorState == HIGH){
     Oboroti=Oboroti+1;
     Serial.println(Oboroti);
 }

Но в нем проблема, т.к. кнопка зажимается где-то на секунду в переменной "Oboroti" успевает приплюсоваться около 20-25 цифр. Мне же необходимо засчитывать по 1 цифре в каждый оборот. Подскажите пожалуйста как это сделать?

Dima85
Offline
Зарегистрирован: 07.01.2013
   SensorState = digitalRead(PinSensor);
	if (SensorState == HIGH){
	    Oboroti=Oboroti+1;
	    Serial.println(Oboroti);
	}

Немного поправил код.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Использовать прерывание. Там можно указать выполнение при изменении с 0 на 1

attachInterrupt()

int Oboroti = 0;
int old_Oboroti = 0;

void setup()
{
  Serial.begin(9600);
  attachInterrupt(0, oborot_add, RISING);
}

void loop()
{
  if(Oboroti != old_Oboroti){
      Serial.println(Oboroti);
      old_Oboroti = Oboroti;
   }
}

void oborot_add()
{
  Oboroti++;
}

Только придется датчик подключить на пин прерывания - 2

Dima85
Offline
Зарегистрирован: 07.01.2013

Спасибо большое, но код все равно немного не так работает. Сейчас он выводит такие цифры:

1
2
15
21
24
33
35
45
50
56
67
76
83
85
102

И почему в вашем коде я нигде не вижу цифру, пин "2"?

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Потому что нужно читать по ссылке и возможно у вас "дребезг" контактов

Dima85
Offline
Зарегистрирован: 07.01.2013

Я не думаю что это из за дребезка контактов. Возможно для этой схемы нужно как-то иначе подключать кнопку, я ее подключил как указано на этой схеме: http://arduino.ru/tutorials/button это правильно?

vvadim
Offline
Зарегистрирован: 23.05.2012

NeironN вам написал - дребезг контактов. Об этом на форуме сто раз писалось. В указанной вами схеме всё правильно, только не учтён дребезг. Введите обработку кнопки от дребезга в ваш код и всё будет гуд.

Dima85
Offline
Зарегистрирован: 07.01.2013

Понял. Я сначало подумал под словом дребезг подрузамивался какой-то шум в соеденение. Я и не предполагал что такое может быть в самой кнопке.

Воспользовался вот таким кодом против дребезга:

void oborot_add(){
    static unsigned long millis_prev;
	  if(millis()-1000 > millis_prev) {Oboroti++; }  
	  millis_prev = millis(); 
}

Но не совсем им доволен. Где-то раз в 10 - 15 оборотов проскакивает 2 цифры. Или же если я millis()-1000 меняю на millis-1500 так же иногда не засчитывается оборот. Подсажите пожалуйста как это побороть?

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

если есть мелкий кондер 10-100 нФ (0,1-0,01мкф, придется подобрать) поставьте паралельно кнопке. должно пропасть