Счетчик на энкодерах
- Войдите на сайт для отправки комментариев
Чт, 02/04/2015 - 01:22
Всем привет.
Пытаюсь заставить ардуину считать количество импульсов, выдавать на экран ежесекундно, а затем обнулять счетчик и повторять с самого начала.
Но в место этого программа ничего не выводит ((
Помогите поожалуйста, что не так, в программировании не силен, а для вас, думаю, это секундное дело :)
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;}
}
Значения в мониторе выводятся. Проблема судя по всему у вас не в коде.
И двадцатую строчку надо в ELSE перенести, иначе обнуление никогда не произойдёт.
Надо ещё вход (pin3) подтянуть к земле(GND), резистором с большим сопротивлением, а то он паразитные токи считает.
ВериСлоу, А что вы свою тему http://arduino.ru/forum/obshchii/enkoder-iz-staroi-myshki забросили, ничего не получилось стало быть?
ВериСлоу, А что вы свою тему http://arduino.ru/forum/obshchii/enkoder-iz-staroi-myshki забросили, ничего не получилось стало быть?
Увы. именно так. В итоге раздобыл на время готовый энкодер для ардуины, и дабы съэкономить время, пользуюсь им.
Но к той теме я еще вернусь... Сразу же как только появится время
Простейший вариант без защиты от дребезга контактов
#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
Спасибо огромное! Работает как часы :)