diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..1e60353 --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,16 @@ +{ + "configurations": [ + { + "name": "Mac", + "includePath": [ + "/Users/gsd/Library/Arduino15/packages/**" + ], + "defines": [], + "compilerPath": "/usr/bin/clang", + "cStandard": "c17", + "cppStandard": "c++17", + "intelliSenseMode": "macos-clang-arm64" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index af13e3a..825d1c2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,16 @@ { "files.associations": { - "cstdint": "cpp" + "cstdint": "cpp", + "__bit_reference": "cpp", + "__hash_table": "cpp", + "__split_buffer": "cpp", + "array": "cpp", + "initializer_list": "cpp", + "string": "cpp", + "string_view": "cpp", + "unordered_map": "cpp", + "vector": "cpp", + "ostream": "cpp", + "map": "cpp" } } \ No newline at end of file diff --git a/pipboyIO/enc.cpp b/pipboyIO/enc.cpp new file mode 100644 index 0000000..6e31dbe --- /dev/null +++ b/pipboyIO/enc.cpp @@ -0,0 +1,146 @@ +#include +#include +#include +#include +#include "enc.h" + +const int PinA[ENCODER_COUNT]={14,12,26,33}; // контат AB +const int PinC[ENCODER_COUNT]={27,13,25,32}; // контат BC + +uint8_t pinA[ENCODER_COUNT] = {0,0,0,0}; // состояние контата AB +uint8_t pinC[ENCODER_COUNT] = {0,0,0,0}; // состояние контата BC + +uint8_t blockA[ENCODER_COUNT] = {false,false,false,false}; // блокировка прерывания на контакте AB +uint8_t blockC[ENCODER_COUNT] = {false,false,false,false}; // блокировка прерывания на контакте BC + +uint8_t encoderResult[ENCODER_COUNT] = {0,0,0,0}; // Результирующая переменная +int16_t encoderCount[ENCODER_COUNT] = {0,0,0,0}; // Счетчик щелчков энкодера +int16_t oldencoderCount[ENCODER_COUNT] = {0,0,0,0}; // Счетчик старое значение + +int16_t getEncoderCount(int enc) { + return encoderCount[enc]; +} + +int16_t getOldencoderCount(int enc) { + return oldencoderCount[enc]; +} + +void setOldencoderCount(int enc, int16_t val) { + oldencoderCount[enc] = val; +} + +void encoderFilter (int enc) { + encoderResult[enc] = encoderResult[enc] & B00001111; + if (encoderResult[enc] == B1011) encoderCount[enc] ++; // по часовой стрелке + if (encoderResult[enc] == B0111) encoderCount[enc] --; // против часосовой стрелки + } + +void pinACHANGE (int enc) { // Изменилось состояние контакта АB + if (blockA[enc] == true) return; + pinA[enc] = !digitalRead(PinA[enc]); + pinC[enc] = !digitalRead(PinC[enc]); + encoderResult[enc] <<= 1; + bitWrite(encoderResult[enc], 0, pinA[enc]); + encoderResult[enc] <<= 1; + bitWrite(encoderResult[enc], 0, pinC[enc]); + encoderFilter(enc); + if (!pinA[enc] && !pinC[enc]) blockA[enc] = false; else blockA[enc] = true; + blockC[enc] = false; +} + +void pinCCHANGE (int enc) { // Изменилось состояние контакта BC + if (blockC[enc] == true) return; + pinA[enc] = !digitalRead(PinA[enc]); + pinC[enc] = !digitalRead(PinC[enc]); + encoderResult[enc] <<= 1; + bitWrite(encoderResult[enc], 0, pinA[enc]); + encoderResult[enc] <<= 1; + bitWrite(encoderResult[enc], 0, pinC[enc]); + encoderFilter(enc); + if (!pinA[enc] && !pinC[enc]) blockC[enc] = false; else blockC[enc] = true; + blockA[enc] = false; +} + +#ifdef ENC1 +void enc_1_A() { + pinACHANGE(ENC1); +} + +void enc_1_C() { + pinCCHANGE(ENC1); +} +#endif + +#ifdef ENC2 +void enc_2_A() { + pinACHANGE(ENC2); +} + +void enc_2_C() { + pinCCHANGE(ENC2); +} +#endif + +#ifdef ENC3 +void enc_3_A() { + pinACHANGE(ENC3); +} + +void enc_3_C() { + pinCCHANGE(ENC3); +} +#endif + +#ifdef ENC4 +void enc_4_A() { + pinACHANGE(ENC4); +} + +void enc_4_C() { + pinCCHANGE(ENC4); +} +#endif + +void setupEncoder() { + //привязываем прерывания + //первый енкодер + #ifdef ENC1 + pinMode (PinA[ENC1], INPUT_PULLUP); // Как вход и внутренняя подтяжка + pinMode (PinC[ENC1], INPUT_PULLUP); // Как вход и внутренняя подтяжка + attachInterrupt(digitalPinToInterrupt(PinA[ENC1]), enc_1_A, CHANGE); + attachInterrupt(digitalPinToInterrupt(PinC[ENC1]), enc_1_C, CHANGE); + #endif + + //второй энкодер + #ifdef ENC2 + pinMode (PinA[ENC2], INPUT_PULLUP); // Как вход и внутренняя подтяжка + pinMode (PinC[ENC2], INPUT_PULLUP); // Как вход и внутренняя подтяжка + attachInterrupt(digitalPinToInterrupt(PinA[ENC2]), enc_2_A, CHANGE); + attachInterrupt(digitalPinToInterrupt(PinC[ENC2]), enc_2_C, CHANGE); + #endif + + //третий энкодер + #ifdef ENC3 + pinMode (PinA[ENC3], INPUT_PULLUP); // Как вход и внутренняя подтяжка + pinMode (PinC[ENC3], INPUT_PULLUP); // Как вход и внутренняя подтяжка + attachInterrupt(digitalPinToInterrupt(PinA[ENC3]), enc_3_A, CHANGE); + attachInterrupt(digitalPinToInterrupt(PinC[ENC3]), enc_3_C, CHANGE); + #endif + + //четвертый энкодер + #ifdef ENC4 + pinMode (PinA[ENC4], INPUT_PULLUP); // Как вход и внутренняя подтяжка + pinMode (PinC[ENC4], INPUT_PULLUP); // Как вход и внутренняя подтяжка + attachInterrupt(digitalPinToInterrupt(PinA[ENC4]), enc_4_A, CHANGE); + attachInterrupt(digitalPinToInterrupt(PinC[ENC4]), enc_4_C, CHANGE); + #endif +} + +/*void loop() { + + if (oldencoderCount != encoderCount) { + Serial.println (encoderCount); + oldencoderCount = encoderCount; + } + +}*/ diff --git a/pipboyIO/enc.h b/pipboyIO/enc.h new file mode 100644 index 0000000..f3b935c --- /dev/null +++ b/pipboyIO/enc.h @@ -0,0 +1,11 @@ +#define ENCODER_COUNT 4 + +#define ENC1 (0) +#define ENC2 (1) +#define ENC3 (2) +#define ENC4 (3) + +void setupEncoder(); +int16_t getEncoderCount(int enc); +int16_t getOldencoderCount(int enc); +void setOldencoderCount(int enc, int16_t val); \ No newline at end of file diff --git a/pipboyIO/encoder1.cpp b/pipboyIO/encoder1.cpp deleted file mode 100644 index 76b6efa..0000000 --- a/pipboyIO/encoder1.cpp +++ /dev/null @@ -1,82 +0,0 @@ -#include -#include -#include -#include -#include "encoder1.h" - -#define PinA 27 // контат AB -#define PinC 14 // контат BC -//#define PinS 5 // кнопка - -#define encoder1 - -uint8_t pinA = 0; // состояние контата AB -uint8_t pinC = 0; // состояние контата BC - -uint8_t blockA = false; // блокировка прерывания на контакте AB -uint8_t blockC = false; // блокировка прерывания на контакте BC - -uint8_t encoderResult = 0; // Результирующая переменная -int16_t encoderCount = 0; // Счетчик щелчков энкодера -int16_t oldencoderCount = 0; // Счетчик старое значение - -int16_t getEncoderCount() { - return encoderCount; -} - -int16_t getOldencoderCount() { - return oldencoderCount; -} - -void setOldencoderCount(int16_t val) { - oldencoderCount = val; -} - - -void encoderFilter () { - encoderResult = encoderResult & B00001111; - if (encoderResult == B1011) encoderCount ++; // по часовой стрелке - if (encoderResult == B0111) encoderCount --; // против часосовой стрелки - } - -void pinACHANGE () { // Изменилось состояние контакта АB - if (blockA == true) return; - pinA = !digitalRead(PinA); - pinC = !digitalRead(PinC); - encoderResult <<= 1; - bitWrite(encoderResult, 0, pinA); - encoderResult <<= 1; - bitWrite(encoderResult, 0, pinC); - encoderFilter(); - if (!pinA && !pinC) blockA = false; else blockA = true; - blockC = false; -} - -void pinCCHANGE () { // Изменилось состояние контакта BC - if (blockC == true) return; - pinA = !digitalRead(PinA); - pinC = !digitalRead(PinC); - encoderResult <<= 1; - bitWrite(encoderResult, 0, pinA); - encoderResult <<= 1; - bitWrite(encoderResult, 0, pinC); - encoderFilter(); - if (!pinA && !pinC) blockC = false; else blockC = true; - blockA = false; -} - -void setupEncoder1() { - pinMode (PinA, INPUT_PULLUP); // Как вход и внутренняя подтяжка - pinMode (PinC, INPUT_PULLUP); // Как вход и внутренняя подтяжка - attachInterrupt(digitalPinToInterrupt(PinA), pinACHANGE, CHANGE); - attachInterrupt(digitalPinToInterrupt(PinC), pinCCHANGE, CHANGE); -} - -/*void loop() { - - if (oldencoderCount != encoderCount) { - Serial.println (encoderCount); - oldencoderCount = encoderCount; - } - -}*/ diff --git a/pipboyIO/encoder1.h b/pipboyIO/encoder1.h deleted file mode 100644 index a5bf747..0000000 --- a/pipboyIO/encoder1.h +++ /dev/null @@ -1,4 +0,0 @@ -void setupEncoder1(); -int16_t getEncoderCount(); -int16_t getOldencoderCount(); -void setOldencoderCount(int16_t val); \ No newline at end of file diff --git a/pipboyIO/pipboyIO.ino b/pipboyIO/pipboyIO.ino index fa48405..f80517a 100644 --- a/pipboyIO/pipboyIO.ino +++ b/pipboyIO/pipboyIO.ino @@ -1,46 +1,89 @@ -#include "encoder1.h" +#include "enc.h" +#include +#include +#include -const int input[] = {36, 39, 34 ,35 ,32 ,33 ,25 ,26}; -long inputValue[] = {0, 0, 0, 0, 0, 0, 0, 0}; +const int input[] = {}; +long inputCurrentValue[] = {0, 0, 0, 0, 0, 0, 0, 0}; +long inputPreviewValue[] = {0, 0, 0, 0, 0, 0, 0, 0}; const int numPins = sizeof(input) / sizeof(input[0]); +const int buttonInput[2] = {36,39}; +int buttonLastState[2] = {HIGH, HIGH}; +int buttonCurrentState[2]; + #define RXD2 (16) #define TXD2 (17) +//#define DEBUGIO + void setup() { - Serial.begin(115200); - //#ifdef encoder1 - setupEncoder1(); - //#endif + #ifdef DEBUGIO + Serial.begin(115200); + #else + Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2); + #endif + + setupEncoder(); + + pinMode(buttonInput[0], INPUT); - Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2); analogReadResolution(12); analogSetAttenuation(ADC_11db); - } -void values2uart() { - for (int i = 0; i < numPins; i++) { - Serial2.print(input[i]); - Serial2.print("-"); - Serial2.print(inputValue[i]); - Serial2.print("\n"); +void loop() { + for (int i = 0; i < 2; i++) { + buttonCurrentState[i] = digitalRead(buttonInput[i]); + if (buttonLastState[i] == LOW && buttonCurrentState[i]){ + #ifdef DEBUGIO + Serial.print(1001+i); + Serial.print("*"); + Serial.print(buttonCurrentState[i]); + Serial.print("\n"); + #else + Serial2.print(1001+i); + Serial2.print("*"); + Serial2.print(buttonCurrentState[i]); + Serial2.print("\n"); + #endif + } + buttonLastState[i] = buttonCurrentState[i]; } -} -void loop() { + for (int i = 0; i < numPins; i++) { - inputValue[i] = map(analogRead(input[i]), 0, 4096, 0, 25); + inputCurrentValue[i] = map(analogRead(input[i]), 0, 4096, 0, 16); + if (inputCurrentValue[i] != inputPreviewValue[i]) { + inputPreviewValue[i] = inputCurrentValue[i]; + #ifdef DEBUGIO + Serial.print(input[i]); + Serial.print("*"); + Serial.print(inputCurrentValue[i]); + Serial.print("\n"); + #else + Serial2.print(input[i]); + Serial2.print("*"); + Serial2.print(inputCurrentValue[i]); + Serial2.print("\n"); + #endif + } } - //#ifdef encoder1 - // Serial.print(0); - if (getOldencoderCount() != getEncoderCount()) { - Serial.println (getEncoderCount()); - setOldencoderCount(getEncoderCount()); + for (int enc = 0; enc < ENCODER_COUNT; enc++) { + if (getOldencoderCount(enc) != getEncoderCount(enc)) { + #ifdef DEBUGIO + Serial.print(101+enc); + Serial.print("*"); + Serial.println (getEncoderCount(enc)); + #else + Serial2.print(101+enc); + Serial2.print("*"); + Serial2.println (getEncoderCount(enc)); + #endif + setOldencoderCount(enc, getEncoderCount(enc)); + } } - //#endif - - values2uart(); + delay(50); }