нужна помощь умельцев.
скетч написан ногой.
из него работает дисплей и кнопки. Нужно добавить сюда правильно энкодер. Как добавил результата естественно не получил
Помогите разобраться
PHP код:
#define LIMIT 10 //предел погрешности сопротивления
byte bytes[2];
int res_dt1, res_d;
int encoder0PinA = 2 ; //Вывод А энкодера
int encoder0PinB = 3 ; //Вывод В энкодера
int encoder0PinC = 4; //Вход кнопки энкодера
int LIGHT_SENS = 0 ; // Вход датчика освещености
int JOYSTIK_PIN = 5 ; // Вход для рулевых Кнопок
int CLK = 12;
int DI = 11;
int CE = 10;
int ADDR = 130;
byte ReadByte[8];
int i;
unsigned long math_time,old_time,real_time;
void setup()
{
pinMode(CLK, OUTPUT);
pinMode(DI, OUTPUT);
pinMode(CE, OUTPUT);
pinMode(encoder0PinA, INPUT);
digitalWrite(encoder0PinA, HIGH); // подключить подтягивающий резистор
pinMode(encoder0PinB, INPUT);
digitalWrite(encoder0PinB, HIGH); // подключить подтягивающий резистор
pinMode(encoder0PinC, INPUT);
digitalWrite(encoder0PinC, HIGH); // подключить подтягивающий резистор
attachInterrupt(0, doEncoderA, FALLING); // настроить прерывание interrupt 0 на pin 2
attachInterrupt(1, doEncoderB, FALLING); // настроить прерывание interrupt 0 на pin 3
Serial.begin(115200); // настроить скорость com порта
digitalWrite(CLK, LOW);
digitalWrite(DI, LOW);
digitalWrite(CE, LOW);
delay(1);
}
//===================================================
void loop()
{
hear();
ReadDisplay();
Encoder();
delay(10);
}
//==================================================
void Send_Adress()
{
Byte_Out(DI, CLK, ADDR);
delayMicroseconds(5);
digitalWrite(CE, HIGH);
}
//==================================================
void Byte_Out(uint8_t DI, uint8_t CLK, byte val)
{
int idx;
for (idx = 0; idx < 8; idx++)
{
delayMicroseconds(10);
if (((val << idx) & B10000000) == 128) digitalWrite(DI, HIGH); else digitalWrite(DI, LOW);
// digitalWrite(DI, val & (1 << idx)); /
digitalWrite(CLK, HIGH); // педний фронт синхроимульса
delayMicroseconds(15);
digitalWrite(CLK, LOW); // задний фронт синхроимульса
}
}
//==================================================
void hear()
{
res_d = analogRead(JOYSTIK_PIN); // прочитать данные АЦП
delay(50);
res_dt1 = analogRead(JOYSTIK_PIN); // прочитать данные АЦП
//old_time = millis();
/*math_time = 0;
while(math_time < 300 && (res_dt1 > res_d-LIMIT && res_dt1 < res_d+LIMIT ))
{
//real_time = millis(); //получить реальное время
math_time = real_time - old_time; //считаем длительность нажатия
res_dt1 = analogRead(JOYSTIK_PIN); // прочитать данные АЦП
}
*/
if (abs(res_dt1-res_d)<=20 and res_dt1<1000 ) //если нет дребезга и что-то есть
{
bytes[0] = res_dt1 & 255; // преобразовать в 2-байта
bytes[1] = (res_dt1 & 768) >> 8;
if ((bytes[1]>=-3) || (bytes[1]<=-7))
{
Serial.write( bytes,2); // отправить прочитаное значение компьютеру
delay(10);
Serial.flush();
}
}
/*
if( math_time > 50) //если нет дребезга то короткое нажатие
{
bytes[0] = res_d & 255; // преобразовать в 2-байта
bytes[1] = (res_d & 768) >> 8;
if (bytes[1]==1) // выделяем полезную информацию
{
Serial.write( bytes,2); // отправить прочитаное значение компьютеру
delay(10);
Serial.flush();
}
}*/
}
//===============================================
void ReadDisplay()
{
if (Serial.available() > 7)
{
for (i = 0; i < 8; i++)
{
(ReadByte[i]) = Serial.read() ; // принимаем данные с компа в массив
}
Serial.flush(); //очистить входной буфер USB
Send_Adress(); // отправляем адрес устройства
for (i = 0; i < 8; i++)
{
Byte_Out(DI, CLK, ReadByte[i]); //отправляем данные в шину в шину
}
digitalWrite(CE, LOW); // запретить прием данных подчиненым
}
delay(1);
}
//*******************Центральная кнопка***********************
void Encoder()
{
if(digitalRead(encoder0PinC)==LOW)
{
bytes[1]=8;
Serial.write( bytes,2);
while(digitalRead(encoder0PinC)==LOW){delay(50);}
bytes[1]=7;
}
}
//*******************обработка прерывания***********************
void doEncoderA()
{
cli();
if(digitalRead(encoder0PinB)==HIGH){bytes[0]=25;}else{bytes[0]=5;}
bytes[1] = 0;
Serial.write( bytes,2);
sei();
}
//*******************обработка прерывания***********************
void doEncoderB()
{
cli();
if(digitalRead(encoder0PinA)==HIGH){bytes[0]=5;}else{bytes[0]=25;}
bytes[1] = 0;
Serial.write( bytes,2);
sei();
}