Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ arduino算不算++;有一个限制,如何解决它?_C++_Count_Arduino_Counter_Limit - Fatal编程技术网

C++ arduino算不算++;有一个限制,如何解决它?

C++ arduino算不算++;有一个限制,如何解决它?,c++,count,arduino,counter,limit,C++,Count,Arduino,Counter,Limit,我需要为一件工作物品制作一个仪表计数器,所以我决定只为它制作Arduino。我找到了一个旧的编码器,找到/编写了一个简单的代码,并对其进行了黑客攻击,遇到了一个意想不到的问题 由于某些原因,我的计数器无法计数超过8米或31991个编码器脉冲。一旦达到此8m限制,该数字将变为负数,并开始向后计数,如-7.9>-7.8(即继续向上向0计数)。 然后它达到零,再次计数到8 这对我来说很奇怪,我有限的编码知识无法解决它 有人知道如何解决这个问题,或者我能做些什么让它工作吗 #include <Li

我需要为一件工作物品制作一个仪表计数器,所以我决定只为它制作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);
  }

}
#包括
#在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;