#1 2018-12-09 14:03:36

Rosental
Учасник
Зареєстрований: 2018-03-28
Повідомлень: 5

Помогите с библиотекой

Всем привет, задумал я один проект: модернизировать свой древний усилитель. На нем куча регулировок, которые хочется сохранить да и панель мне нравится. По этому решил переделать это все на цыфру и в место вечно хрипящих переменников поставить энкодеры.
Как ядро буду использовать ардуино нано. А 4 энкодера хочу подключить по шине I2C.

#include <Wire.h>

byte But1;
byte But2;
boolean x;
boolean n;
byte c;
byte c0;
byte c1;
byte c_old;
byte c_old0;
byte c_old1;
int Count0;
int Count1;

void setup() {
  Wire.begin(27);
  Wire.requestFrom(0x27, 1);              // чтение из адаптера
  if (Wire.available())                        //
    c_old = Wire.read();                     //
  c_old0 = c_old << 4;
  c_old1 = c_old >> 5;
  Serial.begin(9600);                         // отладка по уарт
  Serial.println("START OK");              //
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode (2, INPUT_PULLUP);
  attachInterrupt(0, Read, CHANGE);
}
void loop() {
  if (x == 1) {                                   //условие прерывания
    Wire.requestFrom(0x27, 1);             // чтение из адаптера в переменную
    if (Wire.available())                        //
      c = Wire.read();                          //
    //
    c0 = c;                                         // разбиваем для считывания 2х енкодеров
    c1 = c;                                         //
    c0 = c0 << 4;                               //сдвиг переменной для получения кода первого энкодера
    c1 = c1 >> 4;                               //сдвиг переменной для получения кода второго энкодера
    //Serial.println(c1);


    if (bitRead(c0, 6) == 0) {                //считывание кнопки первого энкодера
      But1++;
      if (But1 >= 4) {
        But1 = 0;
      }
      Serial.print("But1=");                    //ОТЛАДКА
      Serial.println(But1);                      //
    }


    if (bitRead(c1, 3) == 0) {                 //считывание кнопки второго энкодера
      But2++;
      if (But2 >= 4) {
        But2 = 0;
      }
      //Serial.println(c1, BIN);
      Serial.print("But2=");                    //ОТЛАДКА
      Serial.println(But2);                      //
    }

    if (c1 == 11 & c_old1 == 9) {          // счет значения щелчков энкодера
      Count1++;
    }

    if (c1 == 13 & c_old1 == 15) {
      Count1++;
    }

    if (c1 == 15 & c_old1 == 13) {
      Count1--;
    }

    if (c1 == 9 & c_old1 == 11) {
      Count1--;
    }

    if (c0 == 64 & c_old0 == 96) {         // счет значения щелчков энкодера
      Count0++;
    }

    if (c0 == 112 & c_old0 == 80) {
      Count0++;
    }

    if (c0 == 80 & c_old0 == 112) {
      Count0--;
    }

    if (c0 == 96 & c_old0 == 64) {
      Count0--;
    }
    if (n == 1) {
      Serial.print("Count1=");//ОТЛАДКА
      Serial.println(Count1);//
      Serial.print("Count0=");//ОТЛАДКА
      Serial.println(Count0);//
    }
    //Serial.println(c1);
    //Serial.println(c0);
    n = !n;
    c_old0 = c0;
    c_old1 = c1;
  }
  digitalWrite(5, x);

}

void Read() {                                     // обработчик прерывания для счета энкодеров
  x = !x;

}

Для тестов использовал плату расширения от ЛСД экрана, чистой платы на PCF8574 к сожалению не нашел.
Суть в следующем, при изменении в порту расширителя, он генерирует прерывание по которому ардуино считывает маску порта, разбивает на два и вычисляет какой из энкодеров и что сделал: или поворот, или нажатие кнопки. Остаются еще несколько пинов, которые хочу задействовать для каскадирования прерывания. В иоге можно будет на 3 провода навесить до 254 энкодера.

Теперь суть вопроса: этот код надо преобразовать в библиотеку которую я смогу потом сам корректировать. Кто может с этим помочь?

Неактивний

#2 2018-12-14 12:07:28

Mazzi
Учасник
Зареєстрований: 2018-12-14
Повідомлень: 6

Re: Помогите с библиотекой

Могу помочь за деньги.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму