Форум программистов, компьютерный форум, киберфорум
Arduino
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 4

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

13.09.2018, 17:04. Показов 5988. Ответов 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)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.09.2018, 17:04
Ответы с готовыми решениями:

Arduino - выполнение кода в loop по условию, с задержкой
Всем привет. Прошу помощи в реализации алгоритма, глаза замылил уже, не понимаю как сделать. К ардуино подключен модуль с двумя реле. ...

Open Loop и Closed Loop системы, какие утверждения верны?
1) В системах Open Loop можно обойтись без измерения фактического значения. 2) В случае большой ошибки между фактическим и установленным...

Найти среднее арифметическое отрицательных чисел, введенных с клавиатуры, используя do-loop while/do-loop until
Нужна помощь. Найти среднее арифметическое отрицательных чисел, введенных с клавиатуры, используя ИМЕННО операторы do-loop while, do-loop...

9
techpriest
 Аватар для Mirmik
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
14.09.2018, 15:42
Уточняйте участок кода, в котором происходит ошибка. Особенность QA на форумах в том, что подробно разбираться с тем, как работает ваша программа все равно никто не будет.

Чтобы получить конкретный ответ, нужно задать максимально конкретный вопрос. В идеале предоставить минимальный пример, в котором ошибка сохраняется, но где выкинуты все незначимые куски кода.
0
518 / 410 / 188
Регистрация: 08.04.2013
Сообщений: 1,749
16.09.2018, 03:57
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
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 4
17.09.2018, 09:41  [ТС]
эти переменные обрабатывают код повторения сигнала при удержании кнопки (ну и отсекают нулевой код до кучи), и бо он один для всех кнопок - 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
518 / 410 / 188
Регистрация: 08.04.2013
Сообщений: 1,749
17.09.2018, 14:32
Давайте посмотрим на 6 строку вашего кода. И вопрос какой ардуино вы используете? С мр3 плеерами пока не работал. Возникает еще вопрос RX TX в UNO только 0 и 1, на меге тем более не 4 и 12 намек надеюсь понятен, стоит наверное разобраться с каждым по отдельности сначала с пультом а потом с мр3 плеером по отдельности

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

Добавлено через 2 минуты
ИМХО, следует разобраться с тем, какой правильный порядок получения данных. Как-то сомнительно, что функция decode отвечает за приём.
0
518 / 410 / 188
Регистрация: 08.04.2013
Сообщений: 1,749
17.09.2018, 14:38
Mini MP3 плеер
0
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 4
18.09.2018, 09:14  [ТС]
Цитата Сообщение от 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
techpriest
 Аватар для Mirmik
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
18.09.2018, 10:35
Лучший ответ Сообщение было отмечено 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
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 4
18.09.2018, 14:05  [ТС]
вот спасибо, ваша подсказка очень помогла. не знаю чем, но выяснить причину такого поведения - уже хорошо
впрочем что с этим можно сделать я тоже слабо представляю попробую как нибудь сделать без SoftwareSerial
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.09.2018, 14:05
Помогаю со студенческими работами здесь

Как создать 4 варианта программы c For/Next,Do While / Loop, Do Loop /Until , If Then Goto
Создать 4 варианта программы c,m For/Next,Do While / Loop, Do Loop /Until , If Then Goto A=(c!+\sum_{i=3}^{m}{x}_{i}+c) здесь x1,xh,c,m...

Нужно написать программу с циклом Do While.Loop или Do.Loop Until
Составить алгоритм и написать программу нахождения для введенных 15 чисел сумму, если число положительное и произведение, если число...

Создание двумерного массива циклами Do While… Loop, While… Wend, Until… Loop, Each… Next
Доброго времени суток, требуется создать процедуры заполнения массива рода 1, 2, 2, 2, 2 3, 1, 2, 2, 2 3, 3, 1, 2, ...

Warining For-loop variable 'i' may be undefined after loop
Что не так с кодом? При компиляции программы появляется предупреждение:&quot; Unit1.pas(46):For-loop variable 'i' may be undefined after...

Warining For-loop variable 'i' may be undefined after loop
Как исправить код, что бы программа работала корректно. var Form1: TForm1; implementation {$R *.dfm} procedure...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru