【发布时间】:2018-12-04 17:21:51
【问题描述】:
我需要为工作物品制作一个计米器,所以我决定只使用 Arduino。我找到了一个旧的编码器,找到/编写了一个简单的代码并将它们全部破解并遇到了一个意想不到的问题。
由于某种原因,我的计数器不会超过 8 米或 31991 个编码器脉冲。一旦达到这个 8m 的限制,数字变为负数并开始倒数,如 -7.9 > -7.8(即继续向上计数至 0)。
然后它达到零并再次计数到 8...
这对我来说很奇怪,我有限的编码知识无法解决它。
有谁知道如何解决这个问题或我可以做些什么来使它工作?
#include <LiquidCrystal.h>
#define inputA_in 6
#define inputB_in 7
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int inputA_V = 0;
int inputB_V = 0;
int inputA = 0;
int inputB = 0;
int counter = 0;
// smeni vrednost tuka pred run
int console_frequency_milliseconds = 200; /// edna sekunda
int aLastState = 0;
int bLastState = 0;
float meters = 0.0;
unsigned long lasttime = 0;
int move_positive = 0;
int move_negative = 0;
int maximum_input_digital_v = 300; //treba da citash od konzola i da gi setirash max i min
int minimum_input_digital_v = 0;
int logical_threshold_v = 150; //brojkive se random staveni
void setup() {
pinMode (inputA_in, INPUT);
pinMode (inputB_in, INPUT);
Serial.begin (9600);
lcd.begin(16, 2);
// Print a message to the LCD
lcd.print("Metraza [m]");
aLastState = inputA;
bLastState = inputB;
lasttime = 0;
}
void loop () {
inputA = digitalRead(inputA_in);
if (inputA != aLastState) {
if (digitalRead(inputB_in) != inputA) {
counter ++;
aLastState = inputA;
} else {
counter --;
aLastState = inputA;
}
}
if (millis() - console_frequency_milliseconds > lasttime)//Detect once every 150ms
{
meters = 0.50014 * counter / 2000;
Serial.print("Position: ");
Serial.println(meters);
lasttime = millis();
lcd.setCursor(0, 1);
//Print a message to second line of LCD
lcd.print(meters);
}
}
【问题讨论】:
-
欢迎来到 StackOverflow miloshIra。请拨打tour。
标签: c++ count arduino counter limit