Странно, после обновления данных ленты идёт обычно пауза на многие миллисекунды. В это время можно считывать кнопки с пульта. Именно так я и пробовал - но нет, нажатия кнопок не фиксируются. В "ик библиотеке" явно не хватает функции :-) какой то. Вот тут была похожая тема с победой в конце (их много попадается), но для фастлед.
Пробовал под неопиксель - не работает. Тогда сделал грубо, добавил между УНО и ИК приёмником "шибанутую про мини 168". Такой вариант работает, то есть вместо блютуз модуля подключаем по ТХ, RX ещё один МК и в него простенький скетч.
Фишка в том, что на УНО скетч под блютуз менять совсем не надо - можно выбирать хочешь блютуз модуль, хочешь ИК модуль на про мини, хочешь сразу оба подключаешь. Правда надо 2 развязывающих диода и резистор тогда. Но тогда гирлянда управляется с телефона, ПК, самодельного пульта, ИК пульта от чего нибудь и перепрошивается по воздуху.
У меня несколько лет был самопальный ящик на 328м МК с фастледом и ИК. Все заработало сразу, но реактивность сохраняется только до определённого FPS. Потом уже пропуски кнопок идут и пр.
resume() нужно сразу делать, не громоздить в свичах println. Выставил по кнопке номер эффекта в переменную, зарезюмировал и пошёл фонарики в неблокирующем стиле крутить.
Это страничка библиотеки. Нашёл на ней вопрос конкретный и ответ конкретный. Нифига не работает (решил ещё раз проверить). Может конечно я не понял ответ.
IR не работает правильно, когда я использую Neopixels (также известный как WS2811 / WS2812 / WS2812B) или другие библиотеки, блокирующие прерывания на более длительное время (> 50 мкс).
2
Независимо от того, используете ли вы Adafruit Neopixel lib или FastLED, прерывания отключаются на многих младших процессорах, таких как базовый Arduinos, на время более 50 мкс. В свою очередь, это останавливает выполнение обработчика прерывания IR, когда это необходимо.
3
Вы можете попытаться подождать, пока ИК-приемник будет бездействовать, прежде чем отправлять данные Neopixel с помощью if(IrReceiver.isIdle()) { strip.show();}. Это предотвращает, по крайней мере, прерывание работающей ИК-передачи и, в зависимости от частоты обновления Neopixel, может работать достаточно хорошо.
Точнее можно включить только один раз выбранный эффект пультом, дальше пульт "не работает " до перезагрузки платы. На одном эффекте вообще идёт свистопляска - шары мигают кракозяброй, в мониторе порта якобы идёт нажатие кнопок сплошной лентой :-) Чёт автор явно не договаривает.
Среди описаний бесчисленных победных модернизаций изделия от Гайвера проскочила строка, что авторы библиотеки "ирремото" взяли и испортили её, исключив корректную работу с умными светодиодами. Благо у автора осталась старая версия.
Про мини 168 так и не заработала корректно (два эффекта не хочет воспроизводить), видимо ресурс ограничен (95 процентов использует скетч для неё и 62 по ОЗУ). Поэтому 328.
Нет, внутри шара аккумулятор б/у на 800 мА. Схема потребляет (по микроамперметру, в разрыв плюса) - шар не светит 14 мА, ярко вспыхивает (в одном эффекте) 55 мА. Теоретически, на ёлке "должон мигаться" сутки без подзарядки :-)
Один интересный вопрос возник у меня. Сделал для шарика голосовое управление через смартфон. В мит апп инверторе штатно нет возможности управлять ИК сенсором. На другом форуме подсказали статью одного немецкого автора - он сделал расширение под сенсор (набор пазлов) для инвертора. Но приложение, написанное с его пазлами, не очень стабильно с кодами кнопок триколоровского ИК пульта. Мне пришлось воспользоваться пультом от детской игрушки. Всё заработало, но возник вопрос чисто на знание. Чуть упростил его скетч для получения кодов кнопок и их "тайминг-сигнатур".
В длинных строчках записаны 0 и 1 (как я понял из визуального анализа), их 10 штук с каждой кнопки (10 бит данных). В коротких строчках код кнопки. Есть ли связь между этими данными?, и какая? Просто на других пультах длинные строчки не менялись, а коды кнопок (для каждой) могли быть разные (связь неустойчивая видимо - данные терялись :-). Только вот какие и почему?
01
//
02
int
uploadpin=2;
// вывод платы для осуществления аппаратной перезагрузки, соединён с RES
03
04
String inputString;
// строки данных
05
int
n=komanda;
//переменная хранения команды-числа
06
07
08
/////////////////////////////////////////////////////////////////////////////////////////////////
09
//ФУНКЦИИ ПРИЁМА И ОБРАБОТКИ КОМАНД-ДАННЫХ
10
int
CheckSerial()
11
{
12
//////////////////////////////////////////////////////////////////////////////
13
while
(
Serial
.available())
//считываем строку данных пока они поступают
14
{
15
char
inChar = (
char
)
Serial
.read();
16
if
(inChar ==
'\n'
||inChar ==
' '
)
//если окончание строки или запрос на загрузку
17
{
18
MakeCmd();
//обрабатываем её данной функцией
19
break
;
20
}
21
else
inputString += inChar;
// иначе удлиняем строку на один символ
22
}
23
return
n;
// возвращаем значение переменной как значение всей функции
24
}
25
/////////////////////////////////////////////////////////////////////////////////
26
void
MakeCmd()
27
{
28
int
y = inputString.length();
// присваиваем переменной у число символов в строке
29
if
(y < 1 || y > 4){inputString =
""
;
return
;}
//если их меньше 1 или больше 4, выходим из функции
30
String cmd = inputString;
// передаём строку другой переменной
31
inputString =
""
;
//"обнуляем переменную"
32
//////
33
34
//
35
36
if
(cmd ==
"0"
) {
//если получили ноль и выбрана данная плата
37
Serial
.write(0x14);
// ответить avrdude.exe
38
Serial
.write(0x10);
// для синхронизации
39
delay(10);
40
pinMode(uploadpin,OUTPUT);
//ЭТО ВЫЗОВЕТ аппаратный РЕСЕТ
41
}
42
if
(cmd !=
"0"
){ n=cmd.toInt();}
// преобразуем строку в номер команды-число
43
44
//////
45
}
46
47
///////////////////////////////////////////////////////////////////////////////////////////////////////
Забыл, вот второй файл - скетч из 2 частей.
Интересное явление, явно неземного происхождения мне приходиться наблюдать.
Так намедни ж полнолуние было, а в такое время и не то случается.
Интересное явление, явно неземного происхождения мне приходиться наблюдать.
Так намедни ж полнолуние было, а в такое время и не то случается.
Особенно при том, что шары все залиты)
Явление осталось необъяснимым. Заменил на УНО, всё работает как надо, значит в платке дело.
001
/////////////////////////// тест цветов и эффектов для гирлянды ШАРИКОВ НА WS2812b с дистанционной заливкой скетчей на UNO
002
#include "Adafruit_NeoPixel.h"
003
#define LED_COUNT 5 //число пикселей в шаре
004
#define N 3 // число шаров в гирлянде
005
#define LED_COUNT_N N*LED_COUNT // число пикселей в ленте
006
#define LED_PIN 6
007
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT_N, LED_PIN, NEO_GRB + NEO_KHZ800);
// Создаем переменную strip для управления нашей лентой.
008
String gir=
""
;
// переменная задающая участие шара в текущем эффекте
009
int
t=3000;
// переменная задающая паузу между эффектами
010
011
long
Y=0;
//пременная хранения моментов времени
012
int
komanda=1;
// переменная хранения
013
014
void
setup
()
015
{
016
Serial
.begin(115200);
// скорость 115200 для Arduino UNO
017
// может быть разная для разных моделей плат
018
strip.begin();
019
for
(
int
i = 0; i < LED_COUNT_N; i++) {
020
pixel_(i,0,0);
// выключение пикселя
021
}
022
strip.show();
023
/////////////////////////////////////////////////
024
025
}
026
027
void
loop
()
028
{
029
//сценарий переключения шаров по командам
030
komanda=CheckSerial();
031
// если приходит команда 0 плата презагружается и переходит в режим команды 1
032
if
(komanda==1){
for
(
int
i = 0; i < LED_COUNT_N; i++) { pixel_(i,0,0);}strip.show();}
//выключить гирлянду
033
if
(komanda==2){gir=
"AAA"
;FUN_1(
"мятный"
,
"красный"
,
"оранжевый"
,25);}
//
034
if
(komanda==3){gir=
"AAA"
;FUN_1(
"малиновый"
,
"синий_2"
,
"синий_1"
,25);}
//
035
if
(komanda==4){gir=
"AAA"
;FUN_1(
"белый_1"
,
"синий_2"
,
"красный"
,25);}
//
036
if
(komanda==5){gir=
"AAA"
;FUN_1(
"розовый"
,
"зелёный_1"
,
"сиреневый"
,25);}
//
037
if
(komanda==6){gir=
"AAA"
;fun_2(
"мятный"
,40,50);fun_2(
"жёлтый"
,40,50);fun_2(
"оранжевый"
,40,50);fun_2(
"сиреневый"
,40,50);}
//
038
if
(komanda==7){gir=
"AAA"
;fun_2(
"сиреневый"
,40,50);fun_2(
"белый_1"
,40,50); fun_2(
"синий_2"
,40,50);fun_2(
"красный"
,40,50);}
//
039
if
(komanda==8){gir=
"AAA"
;FUN_3(
"синий_2"
,50,150);FUN_3(
"сиреневый"
,50,150);FUN_3(
"жёлтый"
,50,150);delay(t);}
040
if
(komanda==9){
041
gir=
"AAA"
;FUN_1(
"мятный"
,
"красный"
,
"оранжевый"
,25);
//
042
gir=
"A*A"
;FUN_1(
"малиновый"
,
"синий_2"
,
"синий_1"
,25);
//
043
gir=
"*A*"
;FUN_1(
"белый_1"
,
"голубой"
,
"чёрный"
,25);
//
044
gir=
"A*A"
;FUN_1(
"белый_2"
,
"зелёный_1"
,
"жёлтый"
,25);
//
045
delay(t);
046
gir=
"AAA"
;fun_2(
"мятный"
,40,50);
//
047
fun_2(
"жёлтый"
,40,50);
//
048
fun_2(
"оранжевый"
,40,50);
//
049
fun_2(
"сиреневый"
,40,50);
//
050
delay(t);
051
gir=
"A**"
;FUN_3(
"синий_2"
,50,150);
//
052
gir=
"*A*"
;FUN_3(
"сиреневый"
,50,150);
//
053
gir=
"**A"
;FUN_3(
"жёлтый"
,50,150);
//
054
delay(t);
055
gir=
"AAA"
;FUN_3(
"зелёный_1"
,50,150);
//
056
delay(t);
057
//
058
gir=
"AAA"
;FUN_1(
"белый_1"
,
"красный"
,
"синий_2"
,25);
//
059
gir=
"A*A"
;FUN_1(
"сиреневый"
,
"синий_2"
,
"синий_2"
,25);
//
060
gir=
"*A*"
;FUN_1(
"белый_1"
,
"белый_2"
,
"чёрный"
,25);
//
061
gir=
"A*A"
;FUN_1(
"розовый"
,
"зелёный_1"
,
"сиреневый"
,25);
//
062
delay(t);
063
gir=
"AAA"
;fun_2(
"сиреневый"
,40,50);
//
064
fun_2(
"белый_1"
,40,50);
//
065
fun_2(
"синий_2"
,40,50);
//
066
fun_2(
"красный"
,40,50);
//
067
delay(t);
068
gir=
"A**"
;FUN_3(
"бежевый"
,50,150);
//
069
gir=
"*A*"
;FUN_3(
"сиреневый"
,50,150);
//
070
gir=
"**A"
;FUN_3(
"красный"
,50,150);
//
071
delay(t);
072
gir=
"AAA"
;FUN_3(
"голубой"
,50,150);
//
073
delay(t);
074
}
075
}
076
//////////////////////////////////////////////////
077
// цвет пикселя по номеру (1 уровень)
078
void
pixel_(
int
num,
byte
cvet ,
byte
M){
079
if
(num<LED_COUNT&&cvet<63&&M<86){
080
int
b=cvet/16;
int
g=(cvet%16)/4;
int
r=cvet-4*g-16*b;
// цвета от 0 до 63
081
for
(
int
i = 0; i < N; i++) {
082
if
( gir.substring(i, i+1)==
"A"
){
083
strip.setPixelColor(num+i*LED_COUNT, r*M, g*M, b*M);
084
}
085
}
086
}
087
}
088
//////////////////////////////////////////////////
089
//цвет пикселя по названию (2 уровень)
090
void
pixel_(
int
num, String CVET ,
byte
M){
091
byte
cvet;
092
//набор цветов
093
if
(CVET==
"жёлтый"
||CVET==
"желтый"
){cvet=11;pixel_( num,cvet,M);}
094
if
(CVET==
"зелёный_1"
||CVET==
"зеленый_1"
){cvet=8;pixel_( num,cvet,M);}
095
if
(CVET==
"зелёный_3"
||CVET==
"зеленый_3"
){cvet=9;pixel_( num,cvet,M);}
096
if
(CVET==
"малиновый"
){cvet=19;pixel_( num,cvet,M);}
097
if
(CVET==
"голубой"
){cvet=52;pixel_( num,cvet,M);}
098
if
(CVET==
"розовый"
){cvet=23;pixel_( num,cvet,M);}
099
if
(CVET==
"бирюзовый"
){cvet=24;pixel_( num,cvet,M);}
100
if
(CVET==
"мятный"
){cvet=29;pixel_( num,cvet,M);}
101
if
(CVET==
"синий_1"
){cvet=37;pixel_( num,cvet,M);}
102
if
(CVET==
"белый_1"
){cvet=47;pixel_( num,cvet,M);}
103
if
(CVET==
"синий_2"
){cvet=48;pixel_( num,cvet,M);}
104
if
(CVET==
"сиреневый"
){cvet=49;pixel_( num,cvet,M);}
105
if
(CVET==
"красный"
){cvet=3;pixel_( num,cvet,M);}
106
if
(CVET==
"зелёный_2"
||CVET==
"зеленый_2"
){cvet=4;pixel_( num,cvet,M);}
107
if
(CVET==
"белый_2"
){cvet=41;pixel_( num,cvet,M);}
108
if
(CVET==
"оранжевый"
){cvet=7;pixel_( num,cvet,M);}
109
if
(CVET==
"бежевый"
){cvet=27;pixel_( num,cvet,M);}
110
if
(CVET==
"чёрный"
||CVET==
"черный"
){cvet=0;pixel_( num,cvet,M);}
111
}
112
/////////////////////////////////////////////////
113
// бегущие 2 пикселя разных цветов по фоновому цвету (3 уровень)
114
void
fun_1( String CVET_f ,String CVET_1,String CVET_2,
byte
M,
int
T){
115
for
(
int
i = 0; i < LED_COUNT; i++) {
116
for
(
int
j = 0; j < LED_COUNT; j++) {
117
pixel_(j, CVET_f ,M);
// фоновые пиксели
118
}
119
pixel_(i, CVET_2 ,M);
// бегущий пиксель 2
120
if
(i != LED_COUNT - 1) {
121
pixel_(i+1, CVET_1 ,M);
// бегущий пиксель 1
122
}
else
{
123
pixel_(0, CVET_1 ,M);
124
}
125
strip.show(); delay_(T);
126
}
127
}
128
//////////////////////////////////////////////////
129
// вариации разных комбинаций цветов 2 бегущих пикселей (4 уровень)- 1 эффект
130
void
FUN_1(String CVET_f ,String CVET_1,String CVET_2,
byte
M){
131
int
K=1;
//
132
byte
k=1;
//
133
byte
st_=0;
//
134
while
(st_<=4){
135
if
(st_==0){fun_1(CVET_f,CVET_1,CVET_2,M,35*k);}
//
136
k=k+K;
if
(k==8){K=-1;}
if
(k==0){K=1;st_++;}
137
}st_=0;
138
}
139
/////////////////////////////////////////////////
140
// фоновая смена цвета свечения всего шара (3 уровень)
141
void
fun_2( String CVET_f,
byte
M,
int
T){
142
for
(
int
j = 0; j < LED_COUNT; j++) {
143
pixel_(j,
"чёрный"
,M/2);
// фоновые пиксели последовательно выключаются
144
strip.show(); delay_(T);
145
}
146
147
for
(
int
j = 0; j < LED_COUNT; j++) {
148
pixel_(j, CVET_f ,M/2);
// фоновые пиксели последовательно включаются и горят
149
strip.show(); delay_(T);
150
}
151
delay_(40*T);
152
for
(
int
j = 0; j < LED_COUNT; j++) {
153
pixel_(j, CVET_f ,M);
// фоновые пиксели вспышка краткая
154
}
155
strip.show(); delay_(6*T);
156
for
(
int
j = 0; j < LED_COUNT; j++) {
157
pixel_(j, CVET_f ,M/2);
// фоновые пиксели горят слабее некоторое время
158
}
159
strip.show(); delay_(40*T);
160
}
161
//////////////////////////////////////////////////
162
// смена фоновых цветов(4 уровень)- 2 эффект
163
void
FUN_2(
byte
M,
int
T){
164
fun_2(
"красный"
,M,T);
//
165
fun_2(
"мятный"
,M,T);
//
166
fun_2(
"бежевый"
,M,T);
//
167
fun_2(
"бирюзовый"
,M,T);
//
168
fun_2(
"жёлтый"
,M,T);
//
169
fun_2(
"оранжевый"
,M,T);
//
170
fun_2(
"белый_1"
,M,T);
//
171
}
172
//////////////////////////////////////////////////
173
// фоновая смена цвета свечения всего шара (3 уровень)
174
void
fun_3( String CVET_f,
byte
M,
int
T){
175
for
(
int
j = 0; j < LED_COUNT; j++) {
176
pixel_(j,
"чёрный"
,M/2);
// фоновые пиксели последовательно выключаются
177
}
178
byte
d;
//
179
for
(
int
j = 0; j < LED_COUNT; j++) {
180
d=random(1,10);
//
181
if
(d==1){pixel_(j, CVET_f ,M);}
// фоновые пиксели псевдослучайно включаются
182
if
(d==2){pixel_(j, CVET_f ,M);}
183
if
(d==3){pixel_(j, CVET_f ,M);}
184
if
(d==4){pixel_(j, CVET_f ,M/5);}
185
if
(d==5){pixel_(j, CVET_f ,M/5);}
186
if
(d==6){pixel_(j, CVET_f ,M/5);}
187
if
(d==7){pixel_(j,CVET_f ,M/2);}
188
if
(d==8){pixel_(j,CVET_f ,M/2);}
189
if
(d==9){pixel_(j, CVET_f ,M/2);}
190
}
191
strip.show(); delay_(T/d);
192
}
193
//////////////////////////////////////////////////
194
// смена фоновых цветов(4 уровень)- 3 эффект
195
void
FUN_3(String CVET_f,
byte
M,
int
T){
196
for
(
int
i = 0; i < 100; i++) {fun_3( CVET_f,M,T);}
//
197
for
(
int
i = 0; i < 200; i++) {fun_3(CVET_f,M/8,T/2);}
//
198
}
199
//////////////////////////////////////////////////
200
/////////////////////////////////////////////////////////////////////////////////
201
// функция временной задержки с проверкой поступающих данных
202
void
delay_(
int
T1)
203
{
204
Y=millis();
205
while
(millis()-Y<T1){komanda=CheckSerial();}
//по поступившей команде выполняем действие
206
207
}
208
209
210
211
212
213
Параллельно выяснилось, что управлять шарами с ик пульта тоже фантастично, видимо библиотеки не совместимы меж собой ("неопиксель" и "иримото" ).
На небольших скоростях совместимы. А так да - битстрим блокирует прерывания.
Можно запытать фастлед в SPI mode.
Странно, после обновления данных ленты идёт обычно пауза на многие миллисекунды. В это время можно считывать кнопки с пульта. Именно так я и пробовал - но нет, нажатия кнопок не фиксируются. В "ик библиотеке" явно не хватает функции :-) какой то. Вот тут была похожая тема с победой в конце (их много попадается), но для фастлед.
http://arduino.ru/forum/programmirovanie/upravlenie-pikselnoi-svetodiodn...
Пробовал под неопиксель - не работает. Тогда сделал грубо, добавил между УНО и ИК приёмником "шибанутую про мини 168". Такой вариант работает, то есть вместо блютуз модуля подключаем по ТХ, RX ещё один МК и в него простенький скетч.
01
/////////////////////////// тест с дистанционным управлением через ИК пульт на про мини 168
02
#include "IRremote.h"
03
int
RECV_PIN = 2;
//Пин подключения выходного сигнала с ИК-приёмника
04
//Создаём экземпляр класса IRrecv, в качестве параметра передаём пин подключения сигнала ИК-приёмника
05
IRrecv irrecv(RECV_PIN);
06
decode_results results;
//Переменная для сохранения полученного кода нажатой кнопки
07
void
setup
()
08
{
09
Serial
.begin(115200);
10
irrecv.enableIRIn();
//Включение ИК-приёмника в работу
11
///////////////////////////////////
12
}
13
void
loop
()
14
{
15
if
(irrecv.decode(&results))
//Если произошло событие/кнопка была нажата
16
{
17
switch
( results.value )
18
{
19
case
0x830CF:
//кнопка 0
20
Serial
.print(
"0\n"
);
21
break
;
22
case
0x8C03F:
//кнопка 1
23
Serial
.print(
"1\n"
);
24
break
;
25
case
0x820DF:
//кнопка 2
26
Serial
.print(
"2\n"
);
27
break
;
28
case
0x8A05F:
//кнопка 3
29
Serial
.print(
"3\n"
);
30
break
;
31
case
0x8609F:
//кнопка 4
32
Serial
.print(
"4\n"
);
33
break
;
34
case
0x8E01F:
//кнопка 5
35
Serial
.print(
"5\n"
);
36
break
;
37
case
0x810EF:
//кнопка 6
38
Serial
.print(
"6\n"
);
39
break
;
40
case
0x8906F:
//кнопка 7
41
Serial
.print(
"7\n"
);
42
break
;
43
case
0x850AF:
//кнопка 8
44
Serial
.print(
"8\n"
);
45
break
;
46
case
0x8D02F:
//кнопка 9
47
Serial
.print(
"9\n"
);
48
break
;
49
case
0x8C837:
//кнопка OK
50
Serial
.print(
"10\n"
);
51
break
;
52
}
53
irrecv.resume();
//Считываем следующую значение/кнопку
54
}
55
}
Фишка в том, что на УНО скетч под блютуз менять совсем не надо - можно выбирать хочешь блютуз модуль, хочешь ИК модуль на про мини, хочешь сразу оба подключаешь. Правда надо 2 развязывающих диода и резистор тогда. Но тогда гирлянда управляется с телефона, ПК, самодельного пульта, ИК пульта от чего нибудь и перепрошивается по воздуху.
У меня несколько лет был самопальный ящик на 328м МК с фастледом и ИК. Все заработало сразу, но реактивность сохраняется только до определённого FPS. Потом уже пропуски кнопок идут и пр.
resume() нужно сразу делать, не громоздить в свичах println. Выставил по кнопке номер эффекта в переменную, зарезюмировал и пошёл фонарики в неблокирующем стиле крутить.
https://github.com/Arduino-IRremote/Arduino-IRremote
Это страничка библиотеки. Нашёл на ней вопрос конкретный и ответ конкретный. Нифига не работает (решил ещё раз проверить). Может конечно я не понял ответ.
1
IR не работает правильно, когда я использую Neopixels (также известный как WS2811 / WS2812 / WS2812B) или другие библиотеки, блокирующие прерывания на более длительное время (> 50 мкс).
2
Независимо от того, используете ли вы Adafruit Neopixel lib или FastLED, прерывания отключаются на многих младших процессорах, таких как базовый Arduinos, на время более 50 мкс. В свою очередь, это останавливает выполнение обработчика прерывания IR, когда это необходимо.
3
Вы можете попытаться подождать, пока ИК-приемник будет бездействовать, прежде чем отправлять данные Neopixel с помощью
if
(IrReceiver.isIdle()) { strip.show();}. Это предотвращает, по крайней мере, прерывание работающей ИК-передачи и, в зависимости от частоты обновления Neopixel, может работать достаточно хорошо.
Точнее можно включить только один раз выбранный эффект пультом, дальше пульт "не работает " до перезагрузки платы. На одном эффекте вообще идёт свистопляска - шары мигают кракозяброй, в мониторе порта якобы идёт нажатие кнопок сплошной лентой :-) Чёт автор явно не договаривает.
001
/////////////////////////// тест цветов и эффектов для гирлянды ШАРИКОВ НА WS2812b с дистанционным управлением через ИК пульт
002
#include "Adafruit_NeoPixel.h"
003
#define LED_COUNT 5 //число пикселей в шаре
004
#define N 3 // число шаров в гирлянде
005
#define LED_COUNT_N N*LED_COUNT // число пикселей в ленте
006
#define LED_PIN 6
007
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT_N, LED_PIN, NEO_GRB + NEO_KHZ800);
// Создаем переменную strip для управления нашей лентой.
008
//////////////////
009
//#include "boarddefs.h" //Добавочная библиотека
010
#include "IRremote.h"
011
//#include "IRremoteInt.h" //Добавочная библиотека
012
int
RECV_PIN = 2;
//Пин подключения выходного сигнала с ИК-приёмника
013
//Создаём экземпляр класса IRrecv, в качестве параметра передаём пин подключения сигнала ИК-приёмника
014
IRrecv irrecv(RECV_PIN);
015
decode_results results;
//Переменная для сохранения полученного кода нажатой кнопки
016
//////////////////
017
String gir=
""
;
// переменная задающая участие шара в текущем эффекте
018
int
t=3000;
// переменная задающая паузу между эффектами
019
020
long
Y=0;
//пременная хранения моментов времени
021
int
komanda=0;
// переменная хранения
022
023
void
setup
()
024
{
025
Serial
.begin(9600);
026
irrecv.enableIRIn();
//Включение ИК-приёмника в работу
027
strip.begin();
028
gir=
"AAA"
;
029
for
(
int
i = 0; i < LED_COUNT_N; i++) {
030
pixel_(i,0,0);
// выключение пикселя
031
}
032
strip.show();
033
/////////////////////////////////////////////////
034
035
}
036
037
void
loop
()
038
{
039
//сценарий переключения шаров по командам
040
if
(komanda==0){gir=
"AAA"
;
for
(
int
i = 0; i < LED_COUNT_N; i++) { pixel_(i,0,0);}strip.show();}
//выключить гирлянду
041
if
(komanda==1){gir=
"AAA"
;FUN_1(
"мятный"
,
"красный"
,
"оранжевый"
,25);}
//
042
if
(komanda==2){gir=
"AAA"
;FUN_1(
"малиновый"
,
"синий_2"
,
"синий_1"
,25);}
//
043
if
(komanda==3){gir=
"AAA"
;FUN_1(
"белый_1"
,
"синий_2"
,
"красный"
,25);}
//
044
if
(komanda==4){gir=
"AAA"
;FUN_1(
"розовый"
,
"зелёный_1"
,
"сиреневый"
,25);}
//
045
if
(komanda==5){gir=
"AAA"
;fun_2(
"мятный"
,40,50);fun_2(
"жёлтый"
,40,50);fun_2(
"оранжевый"
,40,50);fun_2(
"сиреневый"
,40,50);}
//
046
if
(komanda==6){gir=
"AAA"
;fun_2(
"сиреневый"
,40,50);fun_2(
"белый_1"
,40,50); fun_2(
"синий_2"
,40,50);fun_2(
"красный"
,40,50);}
//
047
if
(komanda==7){gir=
"AAA"
;FUN_3(
"синий_2"
,50,150);FUN_3(
"сиреневый"
,50,150);FUN_3(
"жёлтый"
,50,150);delay(t);}
048
delay_(50);
049
}
050
051
//////////////////////////////////////////////////
052
// цвет пикселя по номеру (1 уровень)
053
void
pixel_(
int
num,
byte
cvet ,
byte
M){
054
if
(num<LED_COUNT&&cvet<63&&M<86){
055
int
b=cvet/16;
int
g=(cvet%16)/4;
int
r=cvet-4*g-16*b;
// цвета от 0 до 63
056
for
(
int
i = 0; i < N; i++) {
057
if
( gir.substring(i, i+1)==
"A"
){
058
strip.setPixelColor(num+i*LED_COUNT, r*M, g*M, b*M);
059
}
060
}
061
}
062
}
063
//////////////////////////////////////////////////
064
//цвет пикселя по названию (2 уровень)
065
void
pixel_(
int
num, String CVET ,
byte
M){
066
byte
cvet;
067
//набор цветов
068
if
(CVET==
"жёлтый"
||CVET==
"желтый"
){cvet=11;pixel_( num,cvet,M);}
069
if
(CVET==
"зелёный_1"
||CVET==
"зеленый_1"
){cvet=8;pixel_( num,cvet,M);}
070
if
(CVET==
"зелёный_3"
||CVET==
"зеленый_3"
){cvet=9;pixel_( num,cvet,M);}
071
if
(CVET==
"малиновый"
){cvet=19;pixel_( num,cvet,M);}
072
if
(CVET==
"голубой"
){cvet=52;pixel_( num,cvet,M);}
073
if
(CVET==
"розовый"
){cvet=23;pixel_( num,cvet,M);}
074
if
(CVET==
"бирюзовый"
){cvet=24;pixel_( num,cvet,M);}
075
if
(CVET==
"мятный"
){cvet=29;pixel_( num,cvet,M);}
076
if
(CVET==
"синий_1"
){cvet=37;pixel_( num,cvet,M);}
077
if
(CVET==
"белый_1"
){cvet=47;pixel_( num,cvet,M);}
078
if
(CVET==
"синий_2"
){cvet=48;pixel_( num,cvet,M);}
079
if
(CVET==
"сиреневый"
){cvet=49;pixel_( num,cvet,M);}
080
if
(CVET==
"красный"
){cvet=3;pixel_( num,cvet,M);}
081
if
(CVET==
"зелёный_2"
||CVET==
"зеленый_2"
){cvet=4;pixel_( num,cvet,M);}
082
if
(CVET==
"белый_2"
){cvet=41;pixel_( num,cvet,M);}
083
if
(CVET==
"оранжевый"
){cvet=7;pixel_( num,cvet,M);}
084
if
(CVET==
"бежевый"
){cvet=27;pixel_( num,cvet,M);}
085
if
(CVET==
"чёрный"
||CVET==
"черный"
){cvet=0;pixel_( num,cvet,M);}
086
}
087
/////////////////////////////////////////////////
088
// бегущие 2 пикселя разных цветов по фоновому цвету (3 уровень)
089
void
fun_1( String CVET_f ,String CVET_1,String CVET_2,
byte
M,
int
T){
090
for
(
int
i = 0; i < LED_COUNT; i++) {
091
for
(
int
j = 0; j < LED_COUNT; j++) {
092
pixel_(j, CVET_f ,M);
// фоновые пиксели
093
}
094
pixel_(i, CVET_2 ,M);
// бегущий пиксель 2
095
if
(i != LED_COUNT - 1) {
096
pixel_(i+1, CVET_1 ,M);
// бегущий пиксель 1
097
}
else
{
098
pixel_(0, CVET_1 ,M);
099
}
100
if
( irrecv.isIdle()) { strip.show();}delay_(T);
101
}
102
}
103
//////////////////////////////////////////////////
104
// вариации разных комбинаций цветов 2 бегущих пикселей (4 уровень)- 1 эффект
105
void
FUN_1(String CVET_f ,String CVET_1,String CVET_2,
byte
M){
106
int
K=1;
//
107
byte
k=1;
//
108
byte
st_=0;
//
109
while
(st_<=4){
110
if
(st_==0){fun_1(CVET_f,CVET_1,CVET_2,M,35*k);}
//
111
k=k+K;
if
(k==8){K=-1;}
if
(k==0){K=1;st_++;}
112
}st_=0;
113
}
114
/////////////////////////////////////////////////
115
// фоновая смена цвета свечения всего шара (3 уровень)
116
void
fun_2( String CVET_f,
byte
M,
int
T){
117
for
(
int
j = 0; j < LED_COUNT; j++) {
118
pixel_(j,
"чёрный"
,M/2);
// фоновые пиксели последовательно выключаются
119
if
( irrecv.isIdle()) { strip.show();} delay_(T);
120
}
121
122
for
(
int
j = 0; j < LED_COUNT; j++) {
123
pixel_(j, CVET_f ,M/2);
// фоновые пиксели последовательно включаются и горят
124
if
( irrecv.isIdle()) { strip.show();} delay_(T);
125
}
126
delay_(40*T);
127
for
(
int
j = 0; j < LED_COUNT; j++) {
128
pixel_(j, CVET_f ,M);
// фоновые пиксели вспышка краткая
129
}
130
if
( irrecv.isIdle()) { strip.show();} delay_(6*T);
131
for
(
int
j = 0; j < LED_COUNT; j++) {
132
pixel_(j, CVET_f ,M/2);
// фоновые пиксели горят слабее некоторое время
133
}
134
if
( irrecv.isIdle()) { strip.show();} delay_(40*T);
135
}
136
//////////////////////////////////////////////////
137
// смена фоновых цветов(4 уровень)- 2 эффект
138
void
FUN_2(
byte
M,
int
T){
139
fun_2(
"красный"
,M,T);
//
140
fun_2(
"мятный"
,M,T);
//
141
fun_2(
"бежевый"
,M,T);
//
142
fun_2(
"бирюзовый"
,M,T);
//
143
fun_2(
"жёлтый"
,M,T);
//
144
fun_2(
"оранжевый"
,M,T);
//
145
fun_2(
"белый_1"
,M,T);
//
146
}
147
//////////////////////////////////////////////////
148
// фоновая смена цвета свечения всего шара (3 уровень)
149
void
fun_3( String CVET_f,
byte
M,
int
T){
150
for
(
int
j = 0; j < LED_COUNT; j++) {
151
pixel_(j,
"чёрный"
,M/2);
// фоновые пиксели последовательно выключаются
152
}
153
byte
d;
//
154
for
(
int
j = 0; j < LED_COUNT; j++) {
155
d=random(1,10);
//
156
if
(d==1){pixel_(j, CVET_f ,M);}
// фоновые пиксели псевдослучайно включаются
157
if
(d==2){pixel_(j, CVET_f ,M);}
158
if
(d==3){pixel_(j, CVET_f ,M);}
159
if
(d==4){pixel_(j, CVET_f ,M/5);}
160
if
(d==5){pixel_(j, CVET_f ,M/5);}
161
if
(d==6){pixel_(j, CVET_f ,M/5);}
162
if
(d==7){pixel_(j,CVET_f ,M/2);}
163
if
(d==8){pixel_(j,CVET_f ,M/2);}
164
if
(d==9){pixel_(j, CVET_f ,M/2);}
165
}
166
if
( irrecv.isIdle()) { strip.show();} delay_(T/d);
167
}
168
//////////////////////////////////////////////////
169
// смена фоновых цветов(4 уровень)- 3 эффект
170
void
FUN_3(String CVET_f,
byte
M,
int
T){
171
for
(
int
i = 0; i < 100; i++) {fun_3( CVET_f,M,T);}
//
172
for
(
int
i = 0; i < 200; i++) {fun_3(CVET_f,M/8,T/2);}
//
173
}
174
//////////////////////////////////////////////////
175
/////////////////////////////////////////////////////////////////////////////////
176
// функция временной задержки с проверкой поступающих данных
177
void
delay_(
int
T1)
178
{
179
Y=millis();
180
while
(millis()-Y<T1){
181
if
(irrecv.decode(&results))
//Если произошло событие/кнопка была нажата
182
{
183
switch
( results.value )
184
{
185
case
0x830CF:
//кнопка 0
186
komanda=0;
187
break
;
188
case
0x8C03F:
//кнопка 1
189
komanda=1;
190
break
;
191
case
0x820DF:
//кнопка 2
192
komanda=2;
193
break
;
194
case
0x8A05F:
//кнопка 3
195
komanda=3;
196
break
;
197
case
0x8609F:
//кнопка 4
198
komanda=4;
199
break
;
200
case
0x8E01F:
//кнопка 5
201
komanda=5;
202
break
;
203
case
0x810EF:
//кнопка 6
204
komanda=6;
205
break
;
206
case
0x8906F:
//кнопка 7
207
komanda=7;
208
break
;
209
case
0x850AF:
//кнопка 8
210
komanda=8;
211
break
;
212
case
0x8D02F:
//кнопка 9
213
komanda=9;
214
break
;
215
case
0x8C837:
//кнопка OK
216
komanda=10;
217
break
;
218
}
219
Serial
.println(results.value, HEX);
220
irrecv.resume();
//Считываем следующую значение/кнопку
221
}
222
}
223
}
Опять println() до resume().
Где-то у меня набор ресивера-пульт валялся, найду попробую.
Целый день глумления над платами и итог.
001
/////////////////////////// тест цветов и эффектов для гирлянды ШАРИКОВ НА WS2812b с дистанционным управлением через ИК пульт
002
#include "Adafruit_NeoPixel.h"
003
#define LED_COUNT 5 //число пикселей в шаре
004
#define N 3 // число шаров в гирлянде
005
#define LED_COUNT_N N*LED_COUNT // число пикселей в ленте
006
#define LED_PIN 6
007
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT_N, LED_PIN, NEO_GRB + NEO_KHZ800);
// Создаем переменную strip для управления нашей лентой.
008
//////////////////
009
//#include "boarddefs.h" //Добавочная библиотека
010
#include "IRremote.h"
011
//#include "IRremoteInt.h" //Добавочная библиотека
012
int
RECV_PIN = 14;
//Пин подключения выходного сигнала с ИК-приёмника
013
int
uploadpin =2;
//вывод для аппаратного ресета
014
//Создаём экземпляр класса IRrecv, в качестве параметра передаём пин подключения сигнала ИК-приёмника
015
IRrecv irrecv(RECV_PIN);
016
decode_results results;
//Переменная для сохранения полученного кода нажатой кнопки
017
//////////////////
018
String gir=
""
;
// переменная задающая участие шара в текущем эффекте
019
int
t=3000;
// переменная задающая паузу между эффектами
020
021
long
Y=0;
//пременная хранения моментов времени
022
int
komanda=0;
// переменная хранения
023
024
void
setup
()
025
{
026
//Serial.begin(9600);
027
irrecv.enableIRIn();
//Включение ИК-приёмника в работу
028
strip.begin();
029
gir=
"AAA"
;
030
for
(
int
i = 0; i < LED_COUNT_N; i++) {
031
pixel_(i,0,0);
// выключение пикселя
032
}
033
strip.show();
034
/////////////////////////////////////////////////
035
036
}
037
038
void
loop
()
039
{
040
//сценарий переключения шаров по командам
041
if
(komanda==1){gir=
"AAA"
;
for
(
int
i = 0; i < LED_COUNT_N; i++) { pixel_(i,27,25);}strip.show();}
//включить гирлянду бежевым цветом
042
if
(komanda==2){gir=
"AAA"
;FUN_1(
"мятный"
,
"красный"
,
"оранжевый"
,25);FUN_1(
"малиновый"
,
"синий_2"
,
"синий_1"
,25);FUN_1(
"белый_1"
,
"синий_2"
,
"красный"
,25);}
//
043
if
(komanda==3){gir=
"AAA"
;fun_2(
"мятный"
,40,50);fun_2(
"жёлтый"
,40,50);fun_2(
"оранжевый"
,40,50);fun_2(
"сиреневый"
,40,50);fun_2(
"белый_1"
,40,50); fun_2(
"синий_2"
,40,50);fun_2(
"красный"
,40,50);}
//
044
if
(komanda==4){gir=
"AAA"
;FUN_3(
"синий_2"
,50,150);delay_(t);FUN_3(
"сиреневый"
,50,150);delay_(t);FUN_3(
"жёлтый"
,50,150);delay_(t);}
045
if
(komanda==5){gir=
"AAA"
;FUN_1(
"мятный"
,
"красный"
,
"оранжевый"
,25);FUN_1(
"малиновый"
,
"синий_2"
,
"синий_1"
,25);FUN_1(
"белый_1"
,
"синий_2"
,
"красный"
,25);
046
fun_2(
"мятный"
,40,50);fun_2(
"жёлтый"
,40,50);fun_2(
"оранжевый"
,40,50);fun_2(
"сиреневый"
,40,50);fun_2(
"белый_1"
,40,50); fun_2(
"синий_2"
,40,50);fun_2(
"красный"
,40,50);
047
FUN_3(
"синий_2"
,50,150);delay_(t);FUN_3(
"сиреневый"
,50,150);delay_(t);FUN_3(
"жёлтый"
,50,150);delay_(t);}
048
delay_(50);
049
}
050
051
//////////////////////////////////////////////////
052
// цвет пикселя по номеру (1 уровень)
053
void
pixel_(
int
num,
byte
cvet ,
byte
M){
054
if
(num<LED_COUNT&&cvet<63&&M<86){
055
int
b=cvet/16;
int
g=(cvet%16)/4;
int
r=cvet-4*g-16*b;
// цвета от 0 до 63
056
for
(
int
i = 0; i < N; i++) {
057
if
( gir.substring(i, i+1)==
"A"
){
058
strip.setPixelColor(num+i*LED_COUNT, r*M, g*M, b*M);
059
}
060
}
061
}
062
}
063
//////////////////////////////////////////////////
064
//цвет пикселя по названию (2 уровень)
065
void
pixel_(
int
num, String CVET ,
byte
M){
066
byte
cvet;
067
//набор цветов
068
if
(CVET==
"жёлтый"
||CVET==
"желтый"
){cvet=11;pixel_( num,cvet,M);}
069
if
(CVET==
"зелёный_1"
||CVET==
"зеленый_1"
){cvet=8;pixel_( num,cvet,M);}
070
if
(CVET==
"зелёный_3"
||CVET==
"зеленый_3"
){cvet=9;pixel_( num,cvet,M);}
071
if
(CVET==
"малиновый"
){cvet=19;pixel_( num,cvet,M);}
072
if
(CVET==
"голубой"
){cvet=52;pixel_( num,cvet,M);}
073
if
(CVET==
"розовый"
){cvet=23;pixel_( num,cvet,M);}
074
if
(CVET==
"бирюзовый"
){cvet=24;pixel_( num,cvet,M);}
075
if
(CVET==
"мятный"
){cvet=29;pixel_( num,cvet,M);}
076
if
(CVET==
"синий_1"
){cvet=37;pixel_( num,cvet,M);}
077
if
(CVET==
"белый_1"
){cvet=47;pixel_( num,cvet,M);}
078
if
(CVET==
"синий_2"
){cvet=48;pixel_( num,cvet,M);}
079
if
(CVET==
"сиреневый"
){cvet=49;pixel_( num,cvet,M);}
080
if
(CVET==
"красный"
){cvet=3;pixel_( num,cvet,M);}
081
if
(CVET==
"зелёный_2"
||CVET==
"зеленый_2"
){cvet=4;pixel_( num,cvet,M);}
082
if
(CVET==
"белый_2"
){cvet=41;pixel_( num,cvet,M);}
083
if
(CVET==
"оранжевый"
){cvet=7;pixel_( num,cvet,M);}
084
if
(CVET==
"бежевый"
){cvet=27;pixel_( num,cvet,M);}
085
if
(CVET==
"чёрный"
||CVET==
"черный"
){cvet=0;pixel_( num,cvet,M);}
086
}
087
/////////////////////////////////////////////////
088
// бегущие 2 пикселя разных цветов по фоновому цвету (3 уровень)
089
void
fun_1( String CVET_f ,String CVET_1,String CVET_2,
byte
M,
int
T){
090
for
(
int
i = 0; i < LED_COUNT; i++) {
091
for
(
int
j = 0; j < LED_COUNT; j++) {
092
pixel_(j, CVET_f ,M);
// фоновые пиксели
093
}
094
pixel_(i, CVET_2 ,M);
// бегущий пиксель 2
095
if
(i != LED_COUNT - 1) {
096
pixel_(i+1, CVET_1 ,M);
// бегущий пиксель 1
097
}
else
{
098
pixel_(0, CVET_1 ,M);
099
}
100
if
( irrecv.isIdle()) { strip.show();}delay_(T);
101
}
102
}
103
//////////////////////////////////////////////////
104
// вариации разных комбинаций цветов 2 бегущих пикселей (4 уровень)- 1 эффект
105
void
FUN_1(String CVET_f ,String CVET_1,String CVET_2,
byte
M){
106
int
K=1;
//
107
byte
k=1;
//
108
byte
st_=0;
//
109
while
(st_<=4){
110
if
(st_==0){fun_1(CVET_f,CVET_1,CVET_2,M,35*k);}
//
111
k=k+K;
if
(k==8){K=-1;}
if
(k==0){K=1;st_++;}
112
}st_=0;
113
}
114
/////////////////////////////////////////////////
115
// фоновая смена цвета свечения всего шара (3 уровень)
116
void
fun_2( String CVET_f,
byte
M,
int
T){
117
for
(
int
j = 0; j < LED_COUNT; j++) {
118
pixel_(j,
"чёрный"
,M/2);
// фоновые пиксели последовательно выключаются
119
if
( irrecv.isIdle()) { strip.show();} delay_(T);
120
}
121
122
for
(
int
j = 0; j < LED_COUNT; j++) {
123
pixel_(j, CVET_f ,M/2);
// фоновые пиксели последовательно включаются и горят
124
if
( irrecv.isIdle()) { strip.show();} delay_(T);
125
}
126
delay_(40*T);
127
for
(
int
j = 0; j < LED_COUNT; j++) {
128
pixel_(j, CVET_f ,M);
// фоновые пиксели вспышка краткая
129
}
130
if
( irrecv.isIdle()) { strip.show();} delay_(6*T);
131
for
(
int
j = 0; j < LED_COUNT; j++) {
132
pixel_(j, CVET_f ,M/2);
// фоновые пиксели горят слабее некоторое время
133
}
134
if
( irrecv.isIdle()) { strip.show();} delay_(40*T);
135
}
136
//////////////////////////////////////////////////
137
// смена фоновых цветов(4 уровень)- 2 эффект
138
void
FUN_2(
byte
M,
int
T){
139
fun_2(
"красный"
,M,T);
//
140
fun_2(
"мятный"
,M,T);
//
141
fun_2(
"бежевый"
,M,T);
//
142
fun_2(
"бирюзовый"
,M,T);
//
143
fun_2(
"жёлтый"
,M,T);
//
144
fun_2(
"оранжевый"
,M,T);
//
145
fun_2(
"белый_1"
,M,T);
//
146
}
147
//////////////////////////////////////////////////
148
// фоновая смена цвета свечения всего шара (3 уровень)
149
void
fun_3( String CVET_f,
byte
M,
int
T){
150
for
(
int
j = 0; j < LED_COUNT; j++) {
151
pixel_(j,
"чёрный"
,M/2);
// фоновые пиксели последовательно выключаются
152
}
153
byte
d;
//
154
for
(
int
j = 0; j < LED_COUNT; j++) {
155
d=random(1,10);
//
156
if
(d==1){pixel_(j, CVET_f ,M);}
// фоновые пиксели псевдослучайно включаются
157
if
(d==2){pixel_(j, CVET_f ,M);}
158
if
(d==3){pixel_(j, CVET_f ,M);}
159
if
(d==4){pixel_(j, CVET_f ,M/5);}
160
if
(d==5){pixel_(j, CVET_f ,M/5);}
161
if
(d==6){pixel_(j, CVET_f ,M/5);}
162
if
(d==7){pixel_(j,CVET_f ,M/2);}
163
if
(d==8){pixel_(j,CVET_f ,M/2);}
164
if
(d==9){pixel_(j, CVET_f ,M/2);}
165
}
166
if
( irrecv.isIdle()) { strip.show();} delay_(T/d);
167
}
168
//////////////////////////////////////////////////
169
// смена фоновых цветов(4 уровень)- 3 эффект
170
void
FUN_3(String CVET_f,
byte
M,
int
T){
171
for
(
int
i = 0; i < 100; i++) {fun_3( CVET_f,M,T);}
//
172
for
(
int
i = 0; i < 200; i++) {fun_3(CVET_f,M/8,T/2);}
//
173
}
174
//////////////////////////////////////////////////
175
/////////////////////////////////////////////////////////////////////////////////
176
// функция временной задержки с проверкой поступающих данных
177
void
delay_(
int
T1)
178
{
179
Y=millis();
180
while
(millis()-Y<T1){
181
if
(irrecv.decode(&results))
//Если произошло событие/кнопка была нажата
182
{
183
switch
( results.value )
184
{
185
case
0x830CF:
//кнопка 0
186
komanda=0;
187
break
;
188
case
0x8C03F:
//кнопка 1
189
komanda=1;
190
break
;
191
case
0x820DF:
//кнопка 2
192
komanda=2;
193
break
;
194
case
0x8A05F:
//кнопка 3
195
komanda=3;
196
break
;
197
case
0x8609F:
//кнопка 4
198
komanda=4;
199
break
;
200
case
0x8E01F:
//кнопка 5
201
komanda=5;
202
break
;
203
case
0x810EF:
//кнопка 6
204
komanda=6;
205
break
;
206
case
0x8906F:
//кнопка 7
207
komanda=7;
208
break
;
209
case
0x850AF:
//кнопка 8
210
komanda=8;
211
break
;
212
case
0x8D02F:
//кнопка 9
213
komanda=9;
214
break
;
215
case
0x8C837:
//кнопка OK
216
komanda=10;pinMode(uploadpin,OUTPUT);
//ЭТО ВЫЗОВЕТ аппаратный РЕСЕТ
217
break
;
218
}
219
irrecv.resume();
//Считываем следующую значение/кнопку
220
// Serial.println(results.value, HEX);
221
}
222
}
223
}
Секрет открылся при прочтении темы:
https://mysku.ru/blog/aliexpress/68990.html
Среди описаний бесчисленных победных модернизаций изделия от Гайвера проскочила строка, что авторы библиотеки "ирремото" взяли и испортили её, исключив корректную работу с умными светодиодами. Благо у автора осталась старая версия.
Про мини 168 так и не заработала корректно (два эффекта не хочет воспроизводить), видимо ресурс ограничен (95 процентов использует скетч для неё и 62 по ОЗУ). Поэтому 328.
Чёт авторы библиотеки мудрят.
Изменил концепт - каждый шар сам по себе,без гирлянды, управляется с пульта. Можно так группу сделать, с адресным управлением по ИК каналу.
А питание все равно по проводам? Имхо таже гирлянда
А питание все равно по проводам?
Нет, внутри шара аккумулятор б/у на 800 мА. Схема потребляет (по микроамперметру, в разрыв плюса) - шар не светит 14 мА, ярко вспыхивает (в одном эффекте) 55 мА. Теоретически, на ёлке "должон мигаться" сутки без подзарядки :-)
Добавил в схему динамик, мотор. Теперь шар мигает, крутится, исполняет мелодии. Можно оказывается управлять с телефона им.
Один интересный вопрос возник у меня. Сделал для шарика голосовое управление через смартфон. В мит апп инверторе штатно нет возможности управлять ИК сенсором. На другом форуме подсказали статью одного немецкого автора - он сделал расширение под сенсор (набор пазлов) для инвертора. Но приложение, написанное с его пазлами, не очень стабильно с кодами кнопок триколоровского ИК пульта. Мне пришлось воспользоваться пультом от детской игрушки. Всё заработало, но возник вопрос чисто на знание. Чуть упростил его скетч для получения кодов кнопок и их "тайминг-сигнатур".
01
#include <IRremote.h>
02
int
RECV_PIN = 11;
// Pin, an den der Empf�nger angeschlossen ist
03
IRrecv irrecv(RECV_PIN);
// Instanz der Receiver-Klasse
04
decode_results results;
// Zur Aufnahme des ermittelsten Codes
05
06
void
setup
() {
07
Serial
.begin(9600);
08
irrecv.enableIRIn();
// Startet den Receiver
09
10
}
11
12
// Gibt die Code-Sequenz auf der seriellen Schnittstelle aus
13
void
printCode(decode_results *results) {
14
int
codeLen = results->rawlen - 1;
// The length of the code
15
for
(
int
i = 1; i <= codeLen; i++) {
16
unsigned
int
rawCode;
17
if
(i % 2) {
18
// Mark
19
rawCode = results->rawbuf[i] * USECPERTICK - MARK_EXCESS;
20
21
}
22
else
{
23
// Space
24
rawCode = results->rawbuf[i] * USECPERTICK + MARK_EXCESS;
25
26
}
27
if
(i > 1)
28
Serial
.print(
","
);
29
Serial
.print(rawCode, DEC);
30
}
31
Serial
.println(
""
);
32
}
33
34
35
void
loop
() {
36
if
(irrecv.decode(&results)) {
37
printCode(&results);
// вывод кода кнопки в "сигнатуре"
38
Serial
.println(results.value, HEX);
//код кнопки в привычном нам виде
39
irrecv.resume();
// resume receiver
40
41
}
42
}
У меня для пульта получилось так:
01
3250,650,1000,750,1000,750,1000,1350,500,1350,500,1400,500,750,1000,750,1000,750,1000,1350,450
02
9F4FDCF9
03
3250,1300,450,800,1000,750,1000,750,1000,1350,450,1400,500,750,1000,800,900,850,900,1400,500
04
9E614B1D
05
3250,700,950,1350,500,750,1000,1400,450,1350,500,1400,450,800,1000,1350,500,750,1000,1350,450
06
9E1C511
07
3250,1300,450,800,1000,750,1000,750,1000,1400,400,1400,500,750,1000,800,950,800,950,1350,500
08
9E614B1D
09
3250,1300,500,750,1000,1400,400,850,950,1400,450,1400,450,800,950,1400,450,800,950,1400,450
10
9472DE25
11
3250,1300,450,800,1000,750,1000,750,1000,1350,450,1400,500,750,950,850,900,850,900,1400,500
12
9E614B1D
13
3250,650,1050,1350,500,1350,550,700,1050,1350,500,1350,550,750,950,1400,500,750,1000,1350,500
14
6567AC1
15
3250,1350,400,850,950,800,950,800,950,1400,450,1400,450,800,950,850,900,850,900,1400,500
16
9E614B1D
В длинных строчках записаны 0 и 1 (как я понял из визуального анализа), их 10 штук с каждой кнопки (10 бит данных). В коротких строчках код кнопки. Есть ли связь между этими данными?, и какая? Просто на других пультах длинные строчки не менялись, а коды кнопок (для каждой) могли быть разные (связь неустойчивая видимо - данные терялись :-). Только вот какие и почему?
Конечно есть связь. См. например: https://techdocs.altium.com/display/FPGA/NEC+Infrared+Transmission+Protocol