Здравствуйте!
Помогите, пожалуйста!
решил сделать кнопки+энкодер, попытался соединить 2 кода в один... вот что получилось:
Код:
#define encoder0PinA 2
#define encoder0PinB 3
#define encoder0PinC 4
#define PIN 5 //номер аналогового порта
#define LIMIT 10 //предел погрешности при дребезге
byte bytes[4];
//byte bytes[2]={0,7};
unsigned long math_time,old_time,real_time, res_dt1, res_d;
void setup()
{
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);
}
void loop()
{
res_d = analogRead(PIN);
if( res_d < LIMIT) res_d = LIMIT;
delay(10);
res_dt1 = analogRead(PIN);
old_time = millis();
math_time = 0;
while(math_time < 200)
{
real_time = millis();
math_time = real_time - old_time;
res_dt1 = analogRead(PIN);
if(res_dt1 < res_d-LIMIT || res_dt1 > res_d+LIMIT)break;
}
if(digitalRead(encoder0PinC)==LOW)
{
res_d=res_d+2000;
// Serial.write( bytes,2);
while(digitalRead(encoder0PinC)==LOW){delay(50);}
// bytes[1]=7;
}
if( math_time > 70)
{
bytes[0] = res_d & 0xFF; // преобразовать в 4-байта
bytes[1] = (res_d & 0xFF00) >> 8;
bytes[2] = (res_d & 0xFF0000) >> 16;
bytes[3] = (res_d & 0xFF000000) >> 24;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
bytes[0] = 0;
bytes[1] = 0;
bytes[2] = 0;
bytes[3] = 0;
}
}
// обработка прерывания
void doEncoderA()
{
if(digitalRead(encoder0PinB)==HIGH){res_d=2048;
bytes[0] = res_d & 0xFF; // преобразовать в 4-байта
bytes[1] = (res_d & 0xFF00) >> 8;
bytes[2] = (res_d & 0xFF0000) >> 16;
bytes[3] = (res_d & 0xFF000000) >> 24;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
bytes[0] = 0;
bytes[1] = 0;
bytes[2] = 0;
bytes[3] = 0;}
// Serial.write( bytes,2);
// bytes[0]=0;}
}
// обработка прерывания
void doEncoderB()
{
if(digitalRead(encoder0PinA)==HIGH){res_d=2084;
bytes[0] = res_d & 0xFF; // преобразовать в 4-байта
bytes[1] = (res_d & 0xFF00) >> 8;
bytes[2] = (res_d & 0xFF0000) >> 16;
bytes[3] = (res_d & 0xFF000000) >> 24;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
bytes[0] = 0;
bytes[1] = 0;
bytes[2] = 0;
bytes[3] = 0;}
// Serial.write( bytes,2);
// bytes[0]=0;}
}
Если начинаю резко крутить энкодер - программа начинает читать неверные значения, а именно вместо 2048 - 1372830241 (число написал примерно, на самом деле их слишком много, выскакивают разные, иногда повторяются), кнопки при этом глюке тоже показывают неверные значения, тоже увеличенные до больших размеров, но все пропорционально... например вместо 20 показывает 248912, а вместо 250 показывает 5448912
и т.д... Через пару сек может все встать на свои места или через 10-20 сек... Где ошибка?
UPDATE:
Сейчас вместо 1000 четко показывал 256000, еще покрутил - показал 65536000
вместо 990 - 253440
вместо 1023 - 261888
ну то есть просто умножает на 256 программа или скетч... потом все нормально становится