Ви не увійшли.
Сторінки 1
Всем привет, задумал я один проект: модернизировать свой древний усилитель. На нем куча регулировок, которые хочется сохранить да и панель мне нравится. По этому решил переделать это все на цыфру и в место вечно хрипящих переменников поставить энкодеры.
Как ядро буду использовать ардуино нано. А 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 энкодера.
Теперь суть вопроса: этот код надо преобразовать в библиотеку которую я смогу потом сам корректировать. Кто может с этим помочь?
Неактивний
Сторінки 1