Форум программистов, компьютерный форум, киберфорум
Наши страницы
Arduino
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Kyouma
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 4
#1

"Виснет" выполнение loop

13.09.2018, 17:04. Просмотров 1570. Ответов 9

Скетч должен по сигналу с ИК-пульта плавно зажигать два светодиода, включать воспроизведение аудиозаписи на мини mp3 плеере(при начале воспроизведения включается реле усилителя, по окончании - выключается), в определенный момент воспроизведения включать реле дым машины на короткий промежуток времени, по окончании воспризведения и выключении реле дым машины - плавно тушить светодиоды.

На ИК пульте кроме кнопок №1 и №2 включения определенной аудиозаписи, используются кнопки регулировки громкости, кнопка эквалайзера, и кнопка для сброса плеера (reset).

Проблема заключается в том, что после того как я решил сделать управления с ИК пульта через прерывания - после приема какого-то количества сигналов с пульта основной цикл loop перестает выполняться (вставлял маркеры для проверки), хотя сигналы с пульта ардуина принимает (определил по блинку). Плюс к этому - сигналы с пульта искажаются, смотрел по последовательному порту - идет какой-то мусор, не пойму откуда он. Прошу помощи, ибо я новичок, возможно что-то где-то сделал не так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#include <IRremote.h>
#define Bitrate 4500
#define Speed 1
 
IRrecv irrecv(3); // вход ИК-приемника
unsigned long ir_dt, ir_kod;
decode_results results;
SoftwareSerial mySoftwareSerial(4, 11); //RX, TX связь с mp3 плеером
DFRobotDFPlayerMini myDFPlayer;
const byte led1 = 9;
const byte led2 = 10;
const byte rele1 = 5; //реле дым машины
const byte rele4 = 8; //включение-выключение усилителя
const int interva1 = 3600; //задержка включения, интервал между включениями дыма
const int interva2 = 500; //время удержания во включенном состоянии дым-машины
unsigned long previousMillis = 0;
unsigned long previousMillis1 = 0;
bool releSrab = false;
bool finishPlay = false;
bool zaderjka = false;
bool mp3_flag = true;
uint8_t eq;
 
 
void setup()
{
mySoftwareSerial.begin(9600);
Serial.begin(115200);
irrecv.enableIRIn(); // включить ИК-приемник
Serial.println();
Serial.println(F("DFRobot DFPlayer Mini Demo"));
Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
 
while (!myDFPlayer.begin(mySoftwareSerial)) { //Use softwareSerial to communicate with mp3.
Serial.println(F("Unable to begin:"));
Serial.println(F("1.Please recheck the connection!"));
Serial.println(F("2.Please insert the SD card!"));
myDFPlayer.reset();
mySoftwareSerial.begin(9600);
}
Serial.println(F("DFPlayer Mini online."));
 
myDFPlayer.volume(30); //Set volume value. From 0 to 30
myDFPlayer.EQ(DFPLAYER_EQ_BASS);
digitalWrite (rele1, HIGH);
digitalWrite (rele4, HIGH);
pinMode (3, INPUT); // ИК приемник
pinMode (9, OUTPUT); //светодиод
pinMode (10, OUTPUT); //светодиод
pinMode (5, OUTPUT); //реле дым машины
pinMode (8, OUTPUT); //реле усилителя
pinMode (13, OUTPUT); //сигнализация приема сигнала с пульта ДУ
}
 
void loop() {
Serial.println(ir_kod, HEX);
if (ir_kod > 0) { //прием данных с пульта ДУ
switch (ir_kod) {
case 0xFF30CF: //кнопка "1" нажата
if (mp3_flag == true) {
led_ON();
digitalWrite (rele4, LOW); //включение усилителя
myDFPlayer.play(1);
delay (100);
mp3_flag = false;
zaderjka = true;
}
break;
 
case 0xFF18E7: //кнопка "2" нажата
if (mp3_flag == true) {
led_ON();
digitalWrite (rele4, LOW); //включение усилителя
myDFPlayer.play(2);
delay (100);
mp3_flag = false;
zaderjka = true;
}
break;
 
case 0xFFE01F: //кнопка звук- нажата
myDFPlayer.volumeDown();
delay (100);
break;
 
case 0xFFA857: //кнопка звук+ нажата
myDFPlayer.volumeUp();
delay (100);
break;
 
case 0xFF906F: //кнопка "EQ" нажата
myDFPlayer.readEQ();
delay (100);
eq = myDFPlayer.read()+1; //переключение эквалайзера на следующий режим
myDFPlayer.EQ(eq);
delay (100);
break;
 
case 0xFFC23D: //кнопка play/pause нажата
myDFPlayer.reset(); //перезагрузка плеера
delay (100);
myDFPlayer.volume(30);
delay (100);
break;
 
default:
break;
}
ir_kod = 0;
irrecv.resume();
}
 
unsigned long currentMillis = millis();
if (myDFPlayer.readState() == 0x201 && currentMillis - previousMillis >= interva1) { //плеер играет, задержка включения реле дыма (чтобы под конец песни)
if (zaderjka == true) {
previousMillis = currentMillis;
zaderjka = false;
}
else {
digitalWrite (rele1, LOW);
releSrab = true;
previousMillis = currentMillis;
}
}
 
if (releSrab == true && currentMillis - previousMillis >= interva2) {
digitalWrite (rele1, HIGH);
previousMillis = currentMillis;
releSrab = false;
}
 
if(myDFPlayer.readState() == 0x0200 && mp3_flag == false) { //плеер закончил воспроизведение трека.
digitalWrite (rele4, HIGH);
mp3_flag = true;
finishPlay = true;
myDFPlayer.stop();
}
 
if (finishPlay == true && releSrab == false) { //плеер закончил воспроизведение трека и реле дым машины выключено. сделал подобную конструкцию ибо плеер в последовательный порт как-то перестал передавать что он окончил воспроизведение трека, вместо этого пишет о том что он в режиме "стоп" как при начальной загрузке
led_OFF();
}
 
}
 
void led_ON() {
for(uint16_t i = 0; i<Bitrate; i+=Speed) {
uint16_t del = pow(i,2) / Bitrate;
PORTB |= (1 << PB1)|(1 << PB2); //включение 9й и 10й ноги
delayMicroseconds(del);
PORTB &= (~((1 << PB1)|(1 << PB2))); //выключение 9й и 10й ноги
delayMicroseconds(Bitrate - del);
}
PORTB |= (1 << PB1)|(1 << PB2);
}
 
void led_OFF() {
for(uint16_t i = Bitrate; i>Speed; i-=Speed) {
uint16_t del = pow(i,2) / Bitrate;
PORTB |= (1 << PB1)|(1 << PB2); //включение 9й и 10й ноги
delayMicroseconds(del);
PORTB &= (~((1 << PB1)|(1 << PB2))); //выключение 9й и 10й ноги
 
delayMicroseconds(Bitrate - del);
}
PORTB &= (~((1 << PB1)|(1 << PB2)));
}
 
void get_ir_kod() { // получить код, переданный с ИК-пульта
cli();
if (irrecv.decode(&results)) {
irrecv.blink13(1);
if (results.value > 0 && results.value != REPEAT) {
ir_dt = results.value;
ir_kod = ir_dt;
}
else if (results.value == REPEAT){
ir_kod = ir_dt;
}
 
}
sei();
}
Добавлено через 5 часов 15 минут
Немного исправил код, убрал отдельное прерывание на прием IR
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#include <IRremote.h>
#define Bitrate 4500
#define Speed 1
 
IRrecv irrecv(3); // вход ИК-приемника
unsigned long ir_dt, ir_kod;
decode_results results;
SoftwareSerial mySoftwareSerial(4, 11); //RX, TX связь с mp3 плеером
DFRobotDFPlayerMini myDFPlayer;
const byte led1 = 9;
const byte led2 = 10;
const byte rele1 = 5; //реле дым машины
const byte rele4 = 8; //включение-выключение усилителя
const int interva1 = 3600; //задержка включения, интервал между включениями дыма
const int interva2 = 500; //время удержания во включенном состоянии дым-машины
unsigned long previousMillis = 0;
unsigned long previousMillis1 = 0;
bool releSrab = false;
bool finishPlay = false;
bool zaderjka = false;
bool mp3_flag = true;
uint8_t eq;
 
 
void setup()
{
mySoftwareSerial.begin(9600);
Serial.begin(115200);
irrecv.enableIRIn(); // включить ИК-приемник
Serial.println();
Serial.println(F("DFRobot DFPlayer Mini Demo"));
Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
 
while (!myDFPlayer.begin(mySoftwareSerial)) { //Use softwareSerial to communicate with mp3.
Serial.println(F("Unable to begin:"));
Serial.println(F("1.Please recheck the connection!"));
Serial.println(F("2.Please insert the SD card!"));
myDFPlayer.reset();
mySoftwareSerial.begin(9600);
}
Serial.println(F("DFPlayer Mini online."));
 
myDFPlayer.volume(30); //Set volume value. From 0 to 30
myDFPlayer.EQ(DFPLAYER_EQ_BASS);
digitalWrite (rele1, HIGH);
digitalWrite (rele4, HIGH);
pinMode (3, INPUT); // ИК приемник
pinMode (9, OUTPUT); //светодиод
pinMode (10, OUTPUT); //светодиод
pinMode (5, OUTPUT); //реле дым машины
pinMode (8, OUTPUT); //реле усилителя
pinMode (13, OUTPUT); //сигнализация приема сигнала с пульта ДУ
attachInterrupt(1,get_ir_kod,FALLING); // назначим прерывание
}
 
void loop() {
//Serial.println(ir_kod, HEX);
if (irrecv.decode(&results)){                           //прием данных с пульта ДУ
irrecv.blink13(1);
  if (results.value > 0 && results.value != REPEAT)  {
      ir_dt = results.value;
      ir_kod = ir_dt;
      }
    else if (results.value == REPEAT){
      ir_kod = ir_dt;
    }
Serial.println(ir_kod, HEX);
 
switch (ir_kod) {
case 0xFF30CF: //кнопка "1" нажата
if (mp3_flag == true) {
led_ON();
digitalWrite (rele4, LOW); //включение усилителя
myDFPlayer.play(1);
delay (100);
mp3_flag = false;
zaderjka = true;
}
break;
 
case 0xFF18E7: //кнопка "2" нажата
if (mp3_flag == true) {
led_ON();
digitalWrite (rele4, LOW); //включение усилителя
myDFPlayer.play(2);
delay (100);
mp3_flag = false;
zaderjka = true;
}
break;
 
case 0xFFE01F: //кнопка звук- нажата
myDFPlayer.volumeDown();
delay (100);
break;
 
case 0xFFA857: //кнопка звук+ нажата
myDFPlayer.volumeUp();
delay (100);
break;
 
case 0xFF906F: //кнопка "EQ" нажата
myDFPlayer.readEQ();
delay (100);
eq = myDFPlayer.read()+1; //переключение эквалайзера на следующий режим
myDFPlayer.EQ(eq);
delay (100);
break;
 
case 0xFFC23D: //кнопка play/pause нажата
myDFPlayer.reset(); //перезагрузка плеера
delay (100);
myDFPlayer.volume(30);
delay (100);
break;
 
default:
break;
}
ir_kod = 0;
irrecv.resume();
}
 
unsigned long currentMillis = millis();
if (myDFPlayer.readState() == 0x201 && currentMillis - previousMillis >= interva1) { //плеер играет, задержка включения реле дыма (чтобы под конец песни)
if (zaderjka == true) {
previousMillis = currentMillis;
zaderjka = false;
}
else {
digitalWrite (rele1, LOW);
releSrab = true;
previousMillis = currentMillis;
}
}
 
if (releSrab == true && currentMillis - previousMillis >= interva2) {
digitalWrite (rele1, HIGH);
previousMillis = currentMillis;
releSrab = false;
}
 
if(myDFPlayer.readState() == 0x0200 && mp3_flag == false) { //плеер закончил воспроизведение трека.
digitalWrite (rele4, HIGH);
mp3_flag = true;
finishPlay = true;
myDFPlayer.stop();
}
 
if (finishPlay == true && releSrab == false) { //плеер закончил воспроизведение трека и реле дым машины выключено. сделал подобную конструкцию ибо плеер в последовательный порт как-то перестал передавать что он окончил воспроизведение трека, вместо этого пишет о том что он в режиме "стоп" как при начальной загрузке
led_OFF();
}
}
 
void led_ON() {
for(uint16_t i = 0; i<Bitrate; i+=Speed) {
uint16_t del = pow(i,2) / Bitrate;
PORTB |= (1 << PB1)|(1 << PB2); //включение 9й и 10й ноги
delayMicroseconds(del);
PORTB &= (~((1 << PB1)|(1 << PB2))); //выключение 9й и 10й ноги
delayMicroseconds(Bitrate - del);
}
PORTB |= (1 << PB1)|(1 << PB2);
}
 
void led_OFF() {
for(uint16_t i = Bitrate; i>Speed; i-=Speed) {
uint16_t del = pow(i,2) / Bitrate;
PORTB |= (1 << PB1)|(1 << PB2); //включение 9й и 10й ноги
delayMicroseconds(del);
PORTB &= (~((1 << PB1)|(1 << PB2))); //выключение 9й и 10й ноги
delayMicroseconds(Bitrate - del);
}
PORTB &= (~((1 << PB1)|(1 << PB2)));
}
loop больше не виснет, но в COM на нажатие кнопки льются какие-то рандомные цифры. Не могу понять в чем дело, буду благодарен за подсказку

Добавлено через 8 минут
если кто будет тестировать код - нужно будет из второй версии с 56 строки переместить код в первую версию. хотел убрать attachInterrupt, а убрал не там. и время на редактирование вышло
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.09.2018, 17:04
Ответы с готовыми решениями:

Arduino WebClient ошибка "Notice: Undefined index"
Доброго времени суток, уважаемые форумчане Помогите реализовать веб клиент на базе ардуино и...

Ошибка при попытка "вгружения" кода на плату.
Помогите! Ошибка при попытка &quot;вгружения&quot; кода на плату (Arduino Uno) Возникает ошибка:avrdude:...

Ошибка "avrdude: stk500_getsync(): not in sync: resp=0x00" (Arduino Nano)
Выдает ошибку при заливании проекта, COM порт верно стоит. Проверял на двух машинах, одна и таже...

Digispark Attiny85 выдал ошибку "сбой запроса дескриптора устройства"
Я купил Digispark Attiny85, но когда вставил в комп, он не определился, а выдал такую ошибку &quot;сбой...

Ошибка в Arduino Uno/avrdude: ser_open(): can't set com-state for "\\.\COM4"
Всем привет! Сегодня пришел долгожданный заказ - Arduino Uno. Но появилась проблема, при попытке...

9
Mirmik
techpriest
620 / 201 / 56
Регистрация: 27.02.2014
Сообщений: 1,071
14.09.2018, 15:42 #2
Уточняйте участок кода, в котором происходит ошибка. Особенность QA на форумах в том, что подробно разбираться с тем, как работает ваша программа все равно никто не будет.

Чтобы получить конкретный ответ, нужно задать максимально конкретный вопрос. В идеале предоставить минимальный пример, в котором ошибка сохраняется, но где выкинуты все незначимые куски кода.
0
marat_miaki
149 / 138 / 87
Регистрация: 08.04.2013
Сообщений: 557
16.09.2018, 03:57 #3
decode_results results; // описание переменной

Ошибка у вас со строк 63 по 68 стоит вообще их убрать, вы по своему пытаетесь переделать принятый результат.
if (irrecv.decode(&results)) //Если произошло событие/кнопка была нажата
комментарии говорит сама за себя, нужный вам результат уже в переменной results.value , вы дальше начинаете шаманить
используя 2 лишние переменные ir_dt, ir_kod, зачем

C++
1
2
3
4
//Serial.println(ir_kod, HEX);
Serial.println(results.value, HEX);    //Выводим в монитор порта код нажатой кнопки в шестнадцатиричном виде
 
switch (results.value) {
0
Kyouma
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 4
17.09.2018, 09:41  [ТС] #4
эти переменные обрабатывают код повторения сигнала при удержании кнопки (ну и отсекают нулевой код до кучи), и бо он один для всех кнопок - 0xFFFFFFFF

Добавлено через 1 час 17 минут
вот минимальный участок кода с ошибкой
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "SoftwareSerial.h"
#include <IRremote.h>
 
IRrecv irrecv(2);                             // вход ИК-приемника
decode_results results; 
SoftwareSerial mySoftwareSerial(4, 12);
 
void setup()
{
  mySoftwareSerial.begin(9600);
  Serial.begin(115200);
  irrecv.enableIRIn();
}
 
void loop() 
{
mySoftwareSerial.println("Hey!");                     //имитируем общение с плеером
if (irrecv.decode(&results))                           //прием данных с пульта ДУ
   {
Serial.println(results.value, HEX);
irrecv.resume();
   }
}
0
marat_miaki
149 / 138 / 87
Регистрация: 08.04.2013
Сообщений: 557
17.09.2018, 14:32 #5
Давайте посмотрим на 6 строку вашего кода. И вопрос какой ардуино вы используете? С мр3 плеерами пока не работал. Возникает еще вопрос RX TX в UNO только 0 и 1, на меге тем более не 4 и 12 намек надеюсь понятен, стоит наверное разобраться с каждым по отдельности сначала с пультом а потом с мр3 плеером по отдельности

Добавлено через 13 минут
Видел код для мрз плеера где использован 10 и 11 пин ( шим) на уно и скорости на портах 9600 а не разный как у вас
0
Mirmik
techpriest
620 / 201 / 56
Регистрация: 27.02.2014
Сообщений: 1,071
17.09.2018, 14:36 #6
Если это ардуино uno, прерывания на четвертой ноге вроде бы поддерживаются. Так что SoftwareSerial должен работать. .. Если это Uno или аналог.

Добавлено через 2 минуты
ИМХО, следует разобраться с тем, какой правильный порядок получения данных. Как-то сомнительно, что функция decode отвечает за приём.
0
marat_miaki
149 / 138 / 87
Регистрация: 08.04.2013
Сообщений: 557
17.09.2018, 14:38 #7
Mini MP3 плеер
0
Kyouma
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 4
18.09.2018, 09:14  [ТС] #8
Цитата Сообщение от marat_miaki Посмотреть сообщение
И вопрос какой ардуино вы используете?
Я использую Arduino Uno
Цитата Сообщение от marat_miaki Посмотреть сообщение
RX TX в UNO только 0 и 1
аппаратный serial. я использую библиотеку SoftwareSerial
Цитата Сообщение от marat_miaki Посмотреть сообщение
по отдельности сначала с пультом а потом с мр3 плеером
по отдельности все замечательно работает
Цитата Сообщение от marat_miaki Посмотреть сообщение
Видел код для мрз плеера где использован 10 и 11 пин ( шим) на уно и скорости на портах 9600 а не разный как у вас
по вашей ссылке постом ниже есть код
C++
1
2
3
4
5
6
7
8
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);
 
void setup()
{
  mySoftwareSerial.begin(9600);
  Serial.begin(115200);
мне кажется скорости все же разные. впрочем это не важно. для приема сигнала с пульта я использую вторую ногу, а на ней ведь нет шима. дело в том что он тут не при чем. впрочем это тоже не важно
Цитата Сообщение от Mirmik Посмотреть сообщение
прерывания на четвертой ноге вроде бы поддерживаются
прерывания по таймеру на Uno поддерживаются на всех ногах кроме 13, но это не точно
Цитата Сообщение от Mirmik Посмотреть сообщение
Так что SoftwareSerial должен работать
работает, собака, но мешает работать пульту. библиотеки SoftwareSerial.h и IRremote.h мешают друг другу, видимо. вторая работает на втором таймере, может и первая на нем же? к сожалению информации не нашел
Цитата Сообщение от Mirmik Посмотреть сообщение
Как-то сомнительно, что функция decode отвечает за приём.
в библиотеке IRremote.h в файле irRecv.cpp есть такой код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
int  IRrecv::decode (decode_results *results)
{
    results->rawbuf   = irparams.rawbuf;
    results->rawlen   = irparams.rawlen;
 
    results->overflow = irparams.overflow;
 
    if (irparams.rcvstate != STATE_STOP)  return false ;
 
#if DECODE_NEC
    DBG_PRINTLN("Attempting NEC decode");
    if (decodeNEC(results))  return true ;
#endif
 
#if DECODE_SONY
    DBG_PRINTLN("Attempting Sony decode");
    if (decodeSony(results))  return true ;
#endif
 
#if DECODE_SANYO
    DBG_PRINTLN("Attempting Sanyo decode");
    if (decodeSanyo(results))  return true ;
#endif
 
#if DECODE_MITSUBISHI
    DBG_PRINTLN("Attempting Mitsubishi decode");
    if (decodeMitsubishi(results))  return true ;
#endif
 
#if DECODE_RC5
    DBG_PRINTLN("Attempting RC5 decode");
    if (decodeRC5(results))  return true ;
#endif
 
#if DECODE_RC6
    DBG_PRINTLN("Attempting RC6 decode");
    if (decodeRC6(results))  return true ;
#endif
 
#if DECODE_PANASONIC
    DBG_PRINTLN("Attempting Panasonic decode");
    if (decodePanasonic(results))  return true ;
#endif
 
#if DECODE_LG
    DBG_PRINTLN("Attempting LG decode");
    if (decodeLG(results))  return true ;
#endif
 
#if DECODE_JVC
    DBG_PRINTLN("Attempting JVC decode");
    if (decodeJVC(results))  return true ;
#endif
 
#if DECODE_SAMSUNG
    DBG_PRINTLN("Attempting SAMSUNG decode");
    if (decodeSAMSUNG(results))  return true ;
#endif
 
#if DECODE_WHYNTER
    DBG_PRINTLN("Attempting Whynter decode");
    if (decodeWhynter(results))  return true ;
#endif
 
#if DECODE_AIWA_RC_T501
    DBG_PRINTLN("Attempting Aiwa RC-T501 decode");
    if (decodeAiwaRCT501(results))  return true ;
#endif
 
#if DECODE_DENON
    DBG_PRINTLN("Attempting Denon decode");
    if (decodeDenon(results))  return true ;
#endif
 
#if DECODE_LEGO_PF
    DBG_PRINTLN("Attempting Lego Power Functions");
    if (decodeLegoPowerFunctions(results))  return true ;
#endif
 
    // decodeHash returns a hash on any input.
    // Thus, it needs to be last in the list.
    // If you add any decodes, add them before this.
    if (decodeHash(results))  return true ;
 
    // Throw away and start over
    resume();
    return false;
}
long  IRrecv::decodeHash (decode_results *results)
{
    long  hash = FNV_BASIS_32;
 
    // Require at least 6 samples to prevent triggering on noise
    if (results->rawlen < 6)  return false ;
 
    for (int i = 1;  (i + 2) < results->rawlen;  i++) {
        int value =  compare(results->rawbuf[i], results->rawbuf[i+2]);
        // Add value into the hash
        hash = (hash * FNV_PRIME_32) ^ value;
    }
 
    results->value       = hash;
    results->bits        = 32;
    results->decode_type = UNKNOWN;
 
    return true;
}
я не очень разбираюсь, но если отбросить условную компиляцию то, кажется что decode таки отвечает за прием, хоть и опосредованно, через Hash
0
Mirmik
techpriest
620 / 201 / 56
Регистрация: 27.02.2014
Сообщений: 1,071
18.09.2018, 10:35 #9
Лучший ответ Сообщение было отмечено bormant как решение

Решение

По идее sofwareserial вообще не использует таймер.
Использует програмные задержки. Тобишь вообще синхронно работает на передачу. Таймер не использует.

Добавлено через 22 минуты
Он, собака, во время передачи отключает прерывания.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
size_t SoftwareSerial::write(uint8_t b)
{
  if (_tx_delay == 0) {
    setWriteError();
    return 0;
  }
 
  uint8_t oldSREG = SREG;
  cli();  // turn off interrupts for a clean txmit       // <---- Вот он камень преткновения
 
  .
  .
  .
Отсюда и проблема, потому как во время передачи по SoftwareSerial не может коректно работать приём IR.
Собственно, как это решать мне не очень понятно.
1
Kyouma
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 4
18.09.2018, 14:05  [ТС] #10
вот спасибо, ваша подсказка очень помогла. не знаю чем, но выяснить причину такого поведения - уже хорошо
впрочем что с этим можно сделать я тоже слабо представляю попробую как нибудь сделать без SoftwareSerial
0
18.09.2018, 14:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.09.2018, 14:05

Автоматизация GrowBox на базе "кит" Ардуино
Доброго времени суток. Хочу автоматизировать не большой бокс под рассаду для помидоров, на базе...

Подключить датчик движения "Фотон-1" к буратине
Ув. форумчане, помогите разобраться. Достались мне пара совковых датчиков движения (Фотон-1) и...

Не прошивается Arduino UNO R3 ("programmer is not responding")
Люди, помогите пожалуйста!!! Три дня не могу прошить Arduino UNO R3. Попробовал все какие есть на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru