Chip, "методом научного тыка" удалил лишнее из скетча и оставил только: ИК-приемник, Резисторные кнопки и Энкодер с нажатием. Вроде получилось.
#include <IRremote.h>
byte bytes[4]={0,3}; // 0-3 байт - энкодер, рулевые кнопки, ИК приемник
int JOYSTIK_PIN = 5 ; // вход для рулевых кнопок
int RECV_PIN = 11; // вход ИК приемника
int encoder0PinA = 2 ; // вывод А энкодера
int encoder0PinB = 3 ; // вывод В энкодера
int encoder0PinC = 4 ; // вход кнопки энкодера
unsigned long res_dt, ir_dt, old_ir, time;
byte temp;
IRrecv irrecv(RECV_PIN);
decode_results results;
//******************************************
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); // настроить скорость com порт
irrecv.enableIRIn(); // включить приемник
}
//****************Кнопка Энкодера****************************
void loop()
{
if(digitalRead(encoder0PinC)==LOW)
{
bytes[0] = 0;
bytes[1] = 8;
bytes[2] = 0;
bytes[3] = 0;
Serial.write(bytes,4);
while(digitalRead(encoder0PinC)==LOW){delay(50);}
bytes[0] = 0;
bytes[1] = 7;
bytes[2] = 0;
bytes[3] = 0;
}
IR_resiver();
joystik();
}
//****************ИК приемник********************************
void IR_resiver()
{
if ((millis()-time)>1000 )
{
time = millis();
results.value=0;
}
if (irrecv.decode(&results))
{
if (results.value > 0 && results.value < 0xFFFFFFFF)
{
ir_dt = results.value;
bytes[0] = ir_dt & 0xFF; // преобразовать в 4-байта
bytes[1] = (ir_dt & 0xFF00) >> 8;
bytes[2] = (ir_dt & 0xFF0000) >> 16;
bytes[3] = (ir_dt & 0xFF000000) >> 24;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
if (old_ir == ir_dt){delay(100);} // пауза между короткими нажатиями
else {delay(50);} // пауза после первого нажатия и удержания (перед повторами)
old_ir = ir_dt;
}
if (results.value == 0xFFFFFFFF )
{
delay(5); //пауза между повторами
Serial.write( bytes,4);
}
irrecv.resume();
}
}
//****************Резистивные кнопки**************************
void joystik()
{
res_dt = analogRead(JOYSTIK_PIN); // прочитать данные АЦП
if( res_dt < 1023 && results.value == 0)
{
delay(50); // пауза для проверки дребезга
if(res_dt == analogRead(JOYSTIK_PIN)) // если нет дребезга
{
bytes[0] = res_dt & 255; // преобразовать в 2-байта
bytes[1] = (res_dt & 768) >> 8;
bytes[2] = 0;
bytes[3] = 0;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
delay(250); // пауза между нажатиями
}
}
}
//*******************Поворот Энкодера (обработка прерывания)****
void doEncoderA()
{
cli();
if(digitalRead(encoder0PinB)==HIGH){bytes[1]=25;}else{bytes[1]=5;}
bytes[0] = 0;
bytes[2] = 0;
bytes[3] = 0;
Serial.write( bytes,4);
sei();
}
//*******************Поворот Энкодера (обработка прерывания)****
void doEncoderB()
{
cli();
if(digitalRead(encoder0PinA)==HIGH){bytes[1]=5;}else{bytes[1]=25;}
bytes[0] = 0;
bytes[2] = 0;
bytes[3] = 0;
Serial.write( bytes,4);
sei();
}




Ответить с цитированием