C++ arduino算不算++;有一个限制,如何解决它?
我需要为一件工作物品制作一个仪表计数器,所以我决定只为它制作Arduino。我找到了一个旧的编码器,找到/编写了一个简单的代码,并对其进行了黑客攻击,遇到了一个意想不到的问题 由于某些原因,我的计数器无法计数超过8米或31991个编码器脉冲。一旦达到此8m限制,该数字将变为负数,并开始向后计数,如-7.9>-7.8(即继续向上向0计数)。C++ arduino算不算++;有一个限制,如何解决它?,c++,count,arduino,counter,limit,C++,Count,Arduino,Counter,Limit,我需要为一件工作物品制作一个仪表计数器,所以我决定只为它制作Arduino。我找到了一个旧的编码器,找到/编写了一个简单的代码,并对其进行了黑客攻击,遇到了一个意想不到的问题 由于某些原因,我的计数器无法计数超过8米或31991个编码器脉冲。一旦达到此8m限制,该数字将变为负数,并开始向后计数,如-7.9>-7.8(即继续向上向0计数)。 然后它达到零,再次计数到8 这对我来说很奇怪,我有限的编码知识无法解决它 有人知道如何解决这个问题,或者我能做些什么让它工作吗 #include <Li
然后它达到零,再次计数到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);
}
}
#包括
#在6中定义输入
#在7中定义inputB_
液晶显示器(12,11,5,4,3,2);
int-inputA_V=0;
int inputB_V=0;
int-inputA=0;
int inputB=0;
int计数器=0;
//斯梅尼·弗雷德诺斯特图卡酒店
int console_频率_毫秒=200;///埃德娜·塞昆达
int aLastState=0;
int bLastState=0;
浮子流量计=0.0;
无符号长lasttime=0;
int move_正=0;
int move_负=0;
int最大输入数字v=300//城堡的最大值和最小值
int最小输入数字v=0;
int逻辑阈值=150//brojkive se random staveni
无效设置(){
pinMode(输入,输入);
pinMode(inputB_输入,输入);
Serial.begin(9600);
lcd.begin(16,2);
//将消息打印到LCD
lcd.打印(“Metraza[m]”;
aLastState=输入;
bLastState=inputB;
lasttime=0;
}
空循环(){
inputA=数字读取(inputA_in);
如果(输入!=aLastState){
如果(数字读取(输入)!=输入){
计数器++;
aLastState=输入;
}否则{
计数器--;
aLastState=输入;
}
}
if(millis()-console\u frequency\u millises>lasttime)//每150ms检测一次
{
仪表=0.50014*计数器/2000;
序列号。打印(“位置:”);
串行打印项数(米);
lasttime=millis();
lcd.setCursor(0,1);
//将消息打印到LCD的第二行
lcd.打印(米);
}
}
您的计数器是一个简单的int
int counter = 0;
在您的系统上,它们似乎只有16位宽(最大值为32767),这并不奇怪。使用 获取更广泛的变量 您可能还希望从更改计算
meters = 0.50014 * counter / 2000;
到
以避免丢失精度和范围。即使使用int,也可以将范围从31991个编码器脉冲扩展到32757个编码器脉冲;和更宽范围的模拟
您还可以尝试将
计数器
更改为无符号整数
或无符号长整数
。我没有分析你的全部代码,但我认为你没有任何依赖于负数表示的东西。所以你可能会把射程再扩大一倍。但不保证,有待测试。阅读精美手册欢迎来到miloshIra。请拿这个。谢谢你们,你们总是让我看起来很蠢:)我检查了long int背后的理论,它将为我做这项工作,因为我只需要测量到2000米左右,再次感谢。我的荣幸。顺便问一下,你知道吗?你好,米洛希拉。我看到你一直在,并没有回应我的建议,澄清什么失踪你认为这个答案是有益的。如果这不是你想要的,那么你真的需要解释为什么,因为(冒着虚荣的风险),你似乎不会得到另一个不同的答案。如果你在等什么,请告诉我。
meters = 0.50014 * counter / 2000;
meters = 0.50014 * counter / 2000.0;