Arduino Uno продолжает цикл setup() каждый раз, когда я нажимаю определенную кнопку на пульте дистанционного управления.
Я пытаюсь расшифровать пульт от телевизора Panasonic, используя приведенный ниже скетч IR_RECEIVE.
Когда я нажимаю кнопки пульта, он работает нормально, и я получаю значения, за исключением случаев, когда я нажимаю кнопку питания — выполняется функция setup().
Это код:
/* Raw IR decoder sketch!
This sketch/program uses the Arduno and a PNA4602 to
decode IR received. This can be used to make a IR receiver
(by looking for a particular code)
or transmitter (by pulsing an IR LED at ~38KHz for the
durations detected
Code is public domain, check out www.ladyada.net and adafruit.com
for more tutorials!
*/
#define IRpin_PIN PIND
#define IRpin 2
#define MAXPULSE 65000
#define RESOLUTION 20
uint16_t pulses[100][2]; // пара — высокий и низкий импульс
uint8_t currentpulse = 0; // индекс импульсов, которые мы сохраняем
void setup(void) {
Serial.begin(9600);
Serial.println("Ready to decode IR!");
}
void loop(void) {
uint16_t highpulse, lowpulse; // время временного хранения
highpulse = lowpulse = 0; // начинаем без длины импульса
while (IRpin_PIN & (1 << IRpin)) {
highpulse++;
delayMicroseconds(RESOLUTION);
if ((highpulse >= MAXPULSE) && (currentpulse != 0)) {
printpulses();
currentpulse = 0;
return;
}
}
pulses[currentpulse][0] = highpulse;
while (!(IRpin_PIN & _BV(IRpin))) {
lowpulse++;
delayMicroseconds(RESOLUTION);
if ((lowpulse >= MAXPULSE) && (currentpulse != 0)) {
printpulses();
currentpulse = 0;
return;
}
}
pulses[currentpulse][1] = lowpulse;
currentpulse++;
}
void printpulses(void) {
Serial.println("\n\r\n\rReceived: \n\rOFF \tON");
for (uint8_t i = 0; i < currentpulse; i++) {
Serial.print("delayMicroseconds(");
Serial.print(pulses[i][0] * RESOLUTION, DEC);
Serial.println(");");
Serial.print("pulseIR(");
Serial.print(pulses[i][1] * RESOLUTION, DEC);
Serial.println(");");
}
}
Вот результат:
Готовы к декодированию IR!
Получено:
ВЫКЛ.ВКЛ.
задержкамикросекунды(34724);
пульсIR(3600);
задержкамикросекунды(1800);
......
задержкамикросекунды(1340);
импульсIR(460);
задержкамикросекунды(1360);
импульсIR(460);
Готов декодировать IR!
Готовы декодировать IR!
Последние две строки появились, когда я нажал кнопку питания (дважды). Строки выше появляются, когда я нажимаю любую другую кнопку.
Я поигрался с Arduino и пультом дистанционного управления, возможно, я что-то сделал, чтобы это вызвать. Первый раз попробовал - получилось нормально.
Я попробовал сбросить настройки и загрузить заново.
Извините, если сообщение слишком длинное или недостаточно информативное — я новичок в этом и не совсем уверен, какую информацию предоставлять.
@Atalia.d, 👍0
Обсуждение1 ответ
Насколько высоко может подняться currentpulse
, прежде чем он обнулится? Используется индекс массива, и если он становится больше (количество элементов массива-1), ваш код будет писать за пределами массива.
Может ли массив быть настолько перезаписан, что он врастет в область стека? Это определенно может вызвать сброс или поведение, подобное сбросу.
- Arduino IRremote перестает работать
- Использование ИК-пульта с Arduino
- ИК приемник принимает только 0
- Эмулятор Nikon IR remote trigger (ML-L3) не работает
- Звуковые библиотеки UNremote и PCM мешают
- ИК-пульт дистанционного управления на UNO
- Ошибка загрузки Arduino IDE
- Как использовать ЖК-экран и ИК пульт дистанционного управления для трансляции обратного отсчета
чип сбрасывается из-за какой-то ошибки, @Juraj
попробуйте больший массив
uint16_tpulses[150][2];
, @Juraj