849 / 164 / 44
Регистрация: 06.11.2015
Сообщений: 1,623
Записей в блоге: 2
1

Буффер для хранения сигналов

12.11.2021, 12:09. Показов 490. Ответов 5
Метки нет (Все метки)

Доброго времени, есть четыре блока светодиодов которые управляются с пульта. Они мигают с разной частотой, которую пользователь тоже может задавать с пульта.
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
void loop() {
  
  if (irrecv.decode(&results)){
        Serial.println(results.value, HEX);        
        irrecv.resume();
        
        switch (results.value) {
          case 0xFF18E7: //up btn pressed
              Serial.println(curDelayValue);
              if (curDelayValue <= upperDelayLimit) {
                curDelayValue = curDelayValue + delayShifting;
              }
              break;
          case 0xFF4AB5:  //down btn pressed
            Serial.println(curDelayValue);
            if (curDelayValue > lowerDelayLimit) {
              curDelayValue = curDelayValue - delayShifting;
            }
            break;
          case 0xFF9867: //zero btn
            lightAll();
            Serial.println("Zero option recieved");
            break;
          case 0xFFA25D: // first btn
            lightFirst();
            Serial.println("First option recieved");
            break;
          case 0xFF629D: //second
            lightSecond();
            Serial.println("Second option recieved");
            break;
          case 0xFFE21D: //third
            lightThird();
            Serial.println("Third option recieved");
            break;
          case 0xFF22DD: //fourth
            lightFourth();
            Serial.println("Fourth option recieved");
            break;
        }    
  }
}
 
void activateAll() {
 
  digitalWrite(redLedPin1, HIGH);
  digitalWrite(blueLedPin, HIGH);
  digitalWrite(redLedPin2, HIGH);
  digitalWrite(greenLedPin, HIGH);
  
}
 
 
void deactivateAll() {
 
  digitalWrite(redLedPin1, LOW);
  digitalWrite(blueLedPin, LOW);
  digitalWrite(redLedPin2, LOW);
  digitalWrite(greenLedPin, LOW);
  
}
 
void lightAll() {
 
  activateAll ();
  delay(curDelayValue);
  deactivateAll();
  
}
 
void lightFirst() {
 
  deactivateAll();
  delay(curDelayValue);
  digitalWrite(redLedPin1, HIGH);
  delay(curDelayValue);
 
}
 
 
void lightSecond() {
 
  deactivateAll();
  delay(curDelayValue);
  digitalWrite(blueLedPin, HIGH);
  delay(curDelayValue);
 
}
 
 
void lightThird() {
 
  deactivateAll();
  delay(curDelayValue);
  digitalWrite(redLedPin2, HIGH);
  delay(curDelayValue);
  
}
 
void lightFourth() {
 
  deactivateAll();
  delay(curDelayValue);
  digitalWrite(greenLedPin, HIGH);
  delay(curDelayValue);
  
}
С учетом текущей логики, сигналы не могут приниматься корректно, т.к. МК попросту висит в ожидании. То есть, если пользователь выбрал величину задержки для затухания в 2500 мс, то следовательно в этот момент никто сигналы с пульта воспринимать не будет.

Как по мне, варианта 3:
1. Подкинуть второй МК для управления и приёмки сигналов и соединить его с первым например по I2C. Как по мне расточительно.
2. Организовать собственный delay, который бы в цикле, например с итерацией в 100 мс делал инкремент до заданного значения, но при этом был подписан на события приемки сигналов с пульта.
3. Сделать аппаратно какой то буффер, например при получении сигнала на ресивер, он бы сохранял данное значение и после того как МК вышел из делея, он бы отрабатывал это значение.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.11.2021, 12:09
Ответы с готовыми решениями:

Построить временные диаграммы выходных сигналов триггеров для заданных входных сигналов
1 задание. Построить временную диаграмму выходных сигналов T-триггера при заданных входных...

Построить временные диаграммы выходных сигналов триггеров для заданных входных сигналов
1 задание. Построить временную диаграмму выходных сигналов T-триггера при заданных входных...

Построить временные диаграммы выходных сигналов триггеров для заданных входных сигналов
1 задание. Построить временную диаграмму выходных сигналов T-триггера при заданных входных...

Реализуйте класс для хранения ФИО и номера телефона человека, класс для хранения даты рождения человека, а также класс для хранения ФИО и почтового ад
Реализуйте класс для хранения ФИО и номера телефона человека, класс для хранения даты рождения...

Прошу разъяснение логики работы сигналов созданных для элемента и сигналов созданных для сцены
Проблема в следующем - есть кастомная QGraphicsScene(MainScene) и кастомный QGraphicsItem(Form)....

5
362 / 292 / 148
Регистрация: 08.04.2013
Сообщений: 1,268
12.11.2021, 14:17 2
https://alexgyver.ru/lessons/time/
0
849 / 164 / 44
Регистрация: 06.11.2015
Сообщений: 1,623
Записей в блоге: 2
15.11.2021, 15:24  [ТС] 3
Цитата Сообщение от marat_miaki Посмотреть сообщение
https://alexgyver.ru/lessons/time/
познавательно
Нашел еще библиотеку Eventually, для более event-driven подхода.
0
349 / 333 / 72
Регистрация: 18.03.2015
Сообщений: 1,185
15.11.2021, 17:00 4
Цитата Сообщение от Luca Brasi Посмотреть сообщение
Организовать собственный delay, который бы в цикле...
может стоит заменить delay() на millis().
0
849 / 164 / 44
Регистрация: 06.11.2015
Сообщений: 1,623
Записей в блоге: 2
15.11.2021, 17:19  [ТС] 5
Сергей 190, может, там вообще в материалах у Аликса Гувера есть описанные интересные вещи. И yield и собственая либа по таймерам, но как-то это уже всё приелось. Ну а про читаемость кода я молчу, если там таких таймеров штук 4-5, то разрастается целая простыня.
Как по мне, более элегантное решение использование Eventually библиотеки.
Нашел даже на ютубе сравнение подхода реализаций через millis и eventually либу, где всё наглядно в пользу второго.

Чуть позже попробую и отпишусь о результатах.
0
849 / 164 / 44
Регистрация: 06.11.2015
Сообщений: 1,623
Записей в блоге: 2
24.11.2021, 17:14  [ТС] 6
Много я всего попробовал, но определенно Eventually библиотека - лучшее что есть.
Вот пример реализации аналогичного кода, с испольованием Eventually библиотеки
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
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
#include <IRremote.h>
#include <Eventually.h>
 
const int redLedPin1 = 3;
const int blueLedPin = 4;
const int redLedPin2 = 5;
const int greenLedPin = 6;
 
const int zeroBtnCode   = 0xFF9867;
const int firstBtnCode  = 0xFFA25D;
const int secondBtnCode = 0xFF629D;
const int thirdBtnCode  = 0xFFE21D;
const int fourthBtnCode = 0xFF22DD;
 
long lastActivatedLed;
bool isAllLedActive;
 
const int RECV_PIN = 7;
EvtManager mgr;
IRrecv irrecv(RECV_PIN);
decode_results results;
 
int lowerDelayLimit = 100;
int upperDelayLimit = 5000;
int delayShifting = 500;
 
//* * * * * MODES * * * * *
//0   : ALL       - FF9867
//1   : FIRST     - FFA25D
//2   : SECOND    - FF629D
//3   : THIRD     - FFE21D
//4   : FOURTH    - FF22DD
//
//10  : LEFT      - FF10EF
//11  : RIGHT     - FF5AA5
//15  : UP        - FF18E7
//16  : DOWN      - FF4AB5
//
//20  : AUTOLIGHT
 
int curDelayValue;
 
long curBtnValue;
long lastCurBtnValue;
 
void setup() {
  Serial.begin(9600);
  
  pinMode(redLedPin1, OUTPUT);
  pinMode(blueLedPin, OUTPUT);
  pinMode(redLedPin2, OUTPUT);
  pinMode(greenLedPin, OUTPUT);
 
  curBtnValue = 0xFF9867;
  curDelayValue = 2000;
 
  lastActivatedLed = 0xFF9867;
  isAllLedActive = false;
 
  irrecv.enableIRIn();
  makePreset();
}
 
 
void activateAll() {
 
  digitalWrite(redLedPin1, HIGH);
  digitalWrite(blueLedPin, HIGH);
  digitalWrite(redLedPin2, HIGH);
  digitalWrite(greenLedPin, HIGH);
  
}
 
 
void deactivateAll() {
 
  digitalWrite(redLedPin1, LOW);
  digitalWrite(blueLedPin, LOW);
  digitalWrite(redLedPin2, LOW);
  digitalWrite(greenLedPin, LOW);
  
}
 
void lightAll() {
 
  makePreset();
  lastActivatedLed = 0xFF9867;
  mgr.addListener(new EvtTimeListener(curDelayValue, true, (EvtAction)toggleAllLeds));
  
}
 
 
void toggleAllLeds() {
  
  isAllLedActive = !isAllLedActive;
  if (isAllLedActive) {
    activateAll();
    Serial.println("### LIGHT ###");
      
  } else {
    deactivateAll();
    Serial.println("### DIM ###");
  }
  
}
 
 
void lightFirst() {
  makePreset();
  lastActivatedLed = 0xFFA25D;
  deactivateAll();
  digitalWrite(redLedPin1, HIGH);
  Serial.println("First LED is lighting");
 
}
 
 
void lightSecond() {
  
  makePreset();
  lastActivatedLed = 0xFF629D;
  deactivateAll();
  digitalWrite(blueLedPin, HIGH);
  Serial.println("Second LED is lighting");
 
}
 
 
void lightThird() {
 
  makePreset();
  lastActivatedLed = 0xFFE21D;
  deactivateAll();
  digitalWrite(redLedPin2, HIGH);
  Serial.println("Third LED is lighting");
  
}
 
void lightFourth() {
 
  makePreset();
  lastActivatedLed = 0xFF22DD;
  deactivateAll();
  digitalWrite(greenLedPin, HIGH);
  Serial.println("Fourth LED is lighting");
  
}
 
 
void shiftToRight() {
 
  Serial.println("=======>>>>>>>>");
  switch (lastActivatedLed) {
      case 0xFF9867: //zero
        curBtnValue = 0xFFA25D;
        break;
      case 0xFFA25D: //first
        curBtnValue = 0xFF629D;
        break;
      case 0xFF629D: //second
        curBtnValue = 0xFFE21D;
        break;
      case 0xFFE21D: //third
        curBtnValue = 0xFF22DD;
        break;
      case 0xFF22DD: //fourth
        curBtnValue = 0xFF9867;
        break;
  }    
}
 
void shiftToLeft() {
  Serial.println("<<<<<<=========");
  switch (lastActivatedLed) {
      case 0xFF9867: //zero
        curBtnValue = 0xFF22DD;
        break;
      case 0xFFA25D: //first
        curBtnValue = 0xFF9867;
        break;
      case 0xFF629D: //second
        curBtnValue = 0xFFA25D;
        break;
      case 0xFFE21D: //third
        curBtnValue = 0xFF629D;
        break;
      case 0xFF22DD: //fourth
        curBtnValue = 0xFFE21D;
        break;
  }  
}
 
 
USE_EVENTUALLY_LOOP(mgr)
 
void makePreset() {
  
  mgr.resetContext();
  mgr.addListener(new EvtPinListener(RECV_PIN, (EvtAction)activateProperLed));
  mgr.addListener(new EvtTimeListener(500, true, (EvtAction)mainAction));
  
}
 
 
void activateProperLed() {
 
  if (irrecv.decode(&results)){        
        irrecv.resume();
        if (results.value != 0xFFFFFFFF) {
          curBtnValue = results.value;
//          Serial.print("Raw received value: ");
//          Serial.println(curBtnValue, HEX);
        }
  }
}
 
 
void mainAction() {
 
  if (curBtnValue != lastCurBtnValue 
      ||
      curBtnValue == 0xFF18E7 // use case if btn up pressed
      ||
      curBtnValue == 0xFF4AB5 // use case if btn down pressed
      )    {
 
//  Serial.print("Cur BtnValue:   ");
//  Serial.println(curBtnValue, HEX);
//
//  Serial.print("Last BtnValue:   ");
//  Serial.println(lastCurBtnValue, HEX);
  
      lastCurBtnValue = curBtnValue;
      switch (curBtnValue) {
        case 0xFF18E7: //up btn pressed
          Serial.println("Current delay value is: " + curDelayValue);
          curBtnValue = 0xFF9867; //zero btn
          if (curDelayValue <= upperDelayLimit) {
            curDelayValue = curDelayValue + delayShifting;
          }
          break;
        case 0xFF4AB5:  //down btn pressed
          Serial.println("Current delay value is: " + curDelayValue);
          curBtnValue = 0xFF9867; //zero btn
          if (curDelayValue > lowerDelayLimit) {
            curDelayValue = curDelayValue - delayShifting;
          }
          break;
        case 0xFF10EF:
          shiftToLeft();
          break;
        case 0xFF5AA5:
          shiftToRight();
          break;
        case 0xFF9867: //zero btn
          Serial.println("Zero option recieved");
          lightAll();
          break;
        case 0xFFA25D: // first btn
          Serial.println("First option recieved");
          lightFirst();
          break;
        case 0xFF629D: //second
          Serial.println("Second option recieved");
          lightSecond();
          break;
        case 0xFFE21D: //third
          Serial.println("Third option recieved");
          lightThird();
          break;
        case 0xFF22DD: //fourth
          Serial.println("Fourth option recieved");
          lightFourth();
          break;
      }    
  }
 
}
Здесь нет главного цикла, зато есть Eventually manager, куда мы добавляем наших подписчиков. В моем случае это делает в makePreset(). Т.е. всё время слушается пин с ИК ресивером. Ну и с интервалом в 500 мс выполняется основной цикл вызывая mainAction.
Результатом я вполне доволен, ибо это в разы больше отображает Event-Driven архитектуру, которая мне больше привычна.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.11.2021, 17:14

[Sockets] Можно не создавать буффер для входящих пакетов?
Мне надо просто подождать, пока сервер &quot;что-то&quot; ответит, не важно что. А так как он обычно отвечает...

Создать запись для хранения. Для хранения данных использовать стек. Для группировки данных использовать очередь
Решил выложить свои лабораторные работы 1-10 за первый курс, первого семестра...

Способы стабилизации сигналов энкодеров, триггеров, захват ШИМ сигналов
Доброго времени суток, поделитесь своим опытом как вы боритесь с ложными срабатываниями Timer Input...

Цифровая обработка сигналов. Ортогональность сигналов
Только начала заниматься цифровой обработкой и возник вопрос. У нас есть 2 сигнала s1 = @(t)...

Литература для создания элементарного языка управляющих сигналов и интерпретатора для него
Доброго времени суток! Подскажите, с чего начать при создании? Нужно придумать элементарный язык...


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

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

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