Я пытаюсь построить тахометр в 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: Извините, если я допустил некоторые грамматические ошибки, английский не мой родной язык.
Спасибо за вашу помощь.