Есть ли у arduino count ++ лимит и как его исправить? - PullRequest
0 голосов
/ 26 июня 2018

Мне нужно было сделать счетчик метров для работы, поэтому я решил просто Arduino для этого.Я нашел старый кодировщик, нашел / написал простой код, взломал его все вместе и столкнулся с неожиданной проблемой.

По какой-то причине мой счетчик не будет считать последние 8 метров или 31991 импульсов кодировщика.Как только он достигает этого предела в 8 м, число становится отрицательным и начинает считать в обратном направлении, как -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);
  }

}

1 Ответ

0 голосов
/ 26 июня 2018

Ваш счетчик прост: int,

int counter = 0;

Кажется, что в вашей системе они имеют ширину всего 16 бит (с максимальным значением 32767), что неудивительно.
Использование

long int counter = 0;

для получения более широких переменных.

Вы также можете изменить расчет с

meters = 0.50014 * counter / 2000;

на

meters = 0.50014 * counter / 2000.0;

, чтобы избежать потери точностии ассортимент.Даже с int, который расширит ваш диапазон от 31991 импульсов датчика до 32757 импульсов датчика;и аналог для более широкого диапазона.

Вы также можете попробовать изменить counter на unsigned int или unsigned long int.Я не анализировал весь ваш код, но думаю, что у вас нет ничего, что основывалось бы на представлении отрицательных чисел.Так что вы, вероятно, могли бы снова удвоить диапазон.Но никаких гарантий при условии тестирования.

...