Счетчик на энкодерах

ВериСлоу
Offline
Зарегистрирован: 02.10.2014

Всем привет.
Пытаюсь заставить ардуину считать количество импульсов, выдавать на экран ежесекундно, а затем обнулять счетчик и повторять с самого начала. 
Но в место этого программа ничего не выводит ((
Помогите поожалуйста, что не так, в программировании не  силен, а  для вас, думаю, это секундное дело :)

long previousMillis = 0; // время, первого изменнения когда произошел вывод на экран
long interval = 1000; // В это вреемяя он должен выводить на экран

const int SensorPin = 3;
int signal = 0;
int Counter = 0;
int lastSignal = 0;

void setup() {
Serial.begin(9600);
pinMode(SensorPin, INPUT);
}

void loop()
{
unsigned long currentMillis = millis(); // текущее время в миллисекундах

if ((currentMillis - previousMillis) < interval){
// сохраняем последний момент времени
previousMillis = currentMillis;
 
//  тут считаю количество импульсов
signal = digitalRead(SensorPin);
if (signal != lastSignal)
{
if (signal == HIGH)
{
Counter++;
Serial.println(Counter);

}
lastSignal = signal;
}

//а тут пытаюсь вывести нна экран
} else {Counter=0;}
}

 

Nosferatu
Offline
Зарегистрирован: 04.11.2012

Значения в мониторе выводятся. Проблема судя по всему у вас не в коде.

 И двадцатую строчку надо в ELSE перенести, иначе обнуление никогда не произойдёт.

Надо ещё вход (pin3) подтянуть к земле(GND),  резистором с большим сопротивлением, а то он паразитные токи считает.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ВериСлоу, А что вы свою тему  http://arduino.ru/forum/obshchii/enkoder-iz-staroi-myshki забросили, ничего не получилось стало быть?

ВериСлоу
Offline
Зарегистрирован: 02.10.2014

dimax пишет:

ВериСлоу, А что вы свою тему  http://arduino.ru/forum/obshchii/enkoder-iz-staroi-myshki забросили, ничего не получилось стало быть?

Увы. именно так. В итоге раздобыл на время готовый  энкодер для ардуины, и дабы съэкономить время, пользуюсь им.
Но к той теме я еще вернусь... Сразу же как только появится время

X-Dron
Offline
Зарегистрирован: 24.01.2015

Простейший вариант без защиты от дребезга контактов

#include <Timer_P.h>
#define SensorPin 3
 
int Counter = 0;
boolean Signal, Signal_Old = 0;
Timer_P DisplayPeriod;
 
void setup() {
  Serial.begin(9600);
  pinMode(SensorPin, INPUT);
}
 
void loop(){
  Signal = digitalRead(SensorPin);
  if (Signal && !Signal_Old) Counter++;
  Signal_Old = Signal;
  if (DisplayPeriod.Timer(!DisplayPeriod.Q0(),false,2,1000)){
    Serial.println(Counter);
    Counter=0;
  }
}

понадобится эта библиотека.
https://yadi.sk/d/hGQy8xu1fZNks

ВериСлоу
Offline
Зарегистрирован: 02.10.2014

Спасибо огромное! Работает как часы :)