Browse Source

io next

main
gsd 7 months ago
parent
commit
2950862d5e
  1. 16
      .vscode/c_cpp_properties.json
  2. 13
      .vscode/settings.json
  3. 146
      pipboyIO/enc.cpp
  4. 11
      pipboyIO/enc.h
  5. 82
      pipboyIO/encoder1.cpp
  6. 4
      pipboyIO/encoder1.h
  7. 95
      pipboyIO/pipboyIO.ino

16
.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
}

13
.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"
}
}

146
pipboyIO/enc.cpp

@ -0,0 +1,146 @@
#include <cstdint>
#include <binary.h>
#include <esp32-hal-gpio.h>
#include <Arduino.h>
#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;
}
}*/

11
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);

82
pipboyIO/encoder1.cpp

@ -1,82 +0,0 @@
#include <cstdint>
#include <binary.h>
#include <esp32-hal-gpio.h>
#include <Arduino.h>
#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;
}
}*/

4
pipboyIO/encoder1.h

@ -1,4 +0,0 @@
void setupEncoder1();
int16_t getEncoderCount();
int16_t getOldencoderCount();
void setOldencoderCount(int16_t val);

95
pipboyIO/pipboyIO.ino

@ -1,46 +1,89 @@
#include "encoder1.h"
#include "enc.h"
#include <arduino.h>
#include <esp32-hal-adc.h>
#include <HardwareSerial.h>
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);
}

Loading…
Cancel
Save