Пытаюсь сделать тахометр с Arduino, но глючит счетчик лопаток мотора и выводит много 7с в консоль - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь построить тахометр в Arduino с датчиком линейного повторителя в качестве датчика, 8x32 MAX7219 в качестве дисплея и поворотным энкодером, чтобы выбрать количество лопастей в двигателе, но когда я тестирую поворотныйчасть кодера, он выводит в Serial Monitor просто кучу 7 с, как я могу это исправить?

Мой код следующий:

#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>

// Define the number of devices we have in the chain and the hardware interface
// NOTE: These pin numbers will probably not work with your hardware and may
// need to be adapted
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define CLK_PIN   52
#define DATA_PIN  51
#define CS_PIN    53

#define outputA 6
#define outputB 5
#define button 7

#define IRsensor 2

unsigned long prevMillis;
unsigned long duration;
unsigned long refresh;

int rpm;

boolean currentState;
boolean prevState;

#

int counter = 0;
int aState;
int aLastState;

int aspas = 0;

// Hardware SPI connection
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
// Arbitrary output pins
// MD_Parola P = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);

void setup(void)
{
  Serial.begin(9600);
  P.begin();
  P.displayText("Bienvenido", PA_RIGHT, 75, 0, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
  P.displayAnimate();
  P.begin(4);
  P.setZone(0, 0, 1);
  P.setZone(1, 2, 3);

  pinMode(outputA, INPUT);
  pinMode(outputB, INPUT);
  pinMode(button, INPUT_PULLUP);

  pinMode(IRsensor, INPUT);

  prevMillis = 0;
  prevState = LOW;

  aLastState = digitalRead(outputA);
}

void loop(void)
{
  P.displayAnimate();

  int B = digitalRead(button);

  aState = digitalRead(outputA);
  if (counter < 0) {
    counter = 0;
  } else if (counter > 100) {
    counter = 100;
  }
  if (aState != aLastState){
    if (digitalRead(outputB) != aState) {
      counter++;
      Serial.println(counter);
    }else {
      counter--;
      Serial.println(counter);
    }
    P.displayReset();
    P.displayClear();
    P.displayZoneText(1, "Aspas:", PA_RIGHT, 75, 0, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
    P.displayZoneText(0, counter, PA_RIGHT, 0, 0, PA_PRINT, PA_NO_EFFECT);
  }
  if (B == 0) {
    aspas = counter;
    Serial.println(aspas);
  }

  while (aspas > 0) {
    P.displayAnimate();
    currentState = digitalRead(IRsensor);
    if (prevState != currentState){
      if (currentState == HIGH) {
        duration = ( micros() - prevMillis );
        rpm = ( 60000000 / duration );
        prevMillis = micros();
      }
    }
    prevState = currentState;

    if ( ( millis() - refresh >= 100 ) ) {
      P.displayReset();
      P.displayZoneText(1, "RPM:", PA_LEFT, 0, 0, PA_PRINT, PA_NO_EFFECT);
      P.displayZoneText(1, rpm, PA_RIGHT, 0, 0, PA_PRINT, PA_NO_EFFECT);
    }
  }

}

Это то, что выводит мойпоследовательный монитор

И это схема моего контура

PS: Извините, если я допустил некоторые грамматические ошибки, английский не мой родной язык.

Спасибо за вашу помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...