Нужна помощь с написанием скетча (управление по bluetooth)

Статус
В этой теме нельзя размещать новые ответы.

Stas_Bro

✩✩✩✩✩✩✩
27 Апр 2020
25
0
Оформи код соответствующим тэгом
Написал я вот такой код на днях, планировал сделать так, что бы при 1 выключалась подсветка, а при 0 отключалась, но понял что не всё так легко)
Поидеи что бы отключить подсветку нужно определенные 3 числа или сделать яркость на 0, на данный момент если отправить 1 или 0, то меняется цвет подсветки
#define NUM_LEDS 6
int val;
#include "FastLED.h"
#define PIN 2
CRGB leds[NUM_LEDS];
byte counter;
void setup() {
FastLED.addLeds<WS2812, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
FastLED.setBrightness(100);
pinMode(2, OUTPUT);
Serial.begin(9600);
}
void loop()
{
if (Serial.available()) // проверка поданных команд

{
val = Serial.read();
if (val == '1')
{
digitalWrite(2, HIGH); // при 1 включается светодиод
}

if (val == '0')
{
digitalWrite(2, LOW); // при 0 выключается светодиод
}
for (int i = 0; i < NUM_LEDS; i++ ) { // от 0 до первой трети
leds = CHSV(counter + i * 3, 255, 255); // HSV. Увеличивать HUE (цвет)
// умножение i уменьшает шаг радуги
}
counter++; // counter меняется от 0 до 255 (тип данных byte)
FastLED.show();
delay(5); // скорость движения радуги
{

}

}

}
 

bort707

★★★★★★✩
21 Сен 2020
2,864
850
Вы код не перепутали, когда отправляли? В этом коде никакой цвет не меняется, вы тут управляете не лентой, а светодиодом на пине 2

Поправка - увидел, что у вас на пине2 лента... Ну в общем это неправильно, так лентой не управляют. Замените digitalWrite() на изменение яркости - должно сработать
 
Изменено:
  • Лойс +1
Реакции: Stas_Bro

Lumenjer

★★★✩✩✩✩
10 Дек 2020
220
112
@Stas_Bro, не надо менять уровни на пине, где находится светодиодная лента, оно имело бы место быть только в том случае, если бы вы переключали транзистор, который управлял бы питанием ленты.
Работу FastLed по хорошему нужно вынести из условия if (Serial.available())
А в if (val == '1') и if (val == '0') не переключать уровень пина, а переключать флаг, по которому уже будет ясно, что делать с лентой
 
  • Лойс +1
Реакции: Stas_Bro

Stas_Bro

✩✩✩✩✩✩✩
27 Апр 2020
25
0
@Lumenjer, нужно поразбиратся с flag, как и с чем их едят, а за транзистор хорошая идея, спасибо
 

Lumenjer

★★★✩✩✩✩
10 Дек 2020
220
112
@Stas_Bro, Если есть желание разобраться, то нужно тащить матчасть. Основы надо знать, иначе тяжко.
Начинать можно отсюда
 
  • Лойс +1
Реакции: Stas_Bro

Normalek

★✩✩✩✩✩✩
6 Авг 2021
140
39
C++:
#include "FastLED.h"
/*
если хотите управлять питанием лентой транзистором  раскоментируйте #define PIN_NPN и укажите пин на каторый он подключен
если хотите плавную заливку заливку светодиодов раскоментируйте #define LED_START
*/
//#define PIN_NPN 3
//#define LED_START true

#define PIN 2
#define NUM_LEDS 6

CRGB leds[NUM_LEDS];
byte counter;
byte led_brig = 100; //яркость светодиодов при старте
byte led_mode; //режим работы
int led_timer; //для таймера
byte led_sped=5; //скорость эффекта

void setup() {
    Serial.begin(9600);
    #if defined PIN_NPN
        pinMode(PIN_NPN, OUTPUT);
        digitalWrite(PIN_NPN, true);
    #endif
    FastLED.addLeds<WS2812, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
    #if defined LED_START
        for(byte i; i <= led_brig; i++) {
            FastLED.setBrightness(i); //увеличиваем яркость на 1 до значения переменой led_brig
            effect_rainbow(); //запускаем эффект радуги
            delay(50); //задержка
        }
    #else
        FastLED.setBrightness(led_brig); //устанавливаем яркость
    #endif
    led_mode = 1; //установливаем режим 1 радуга
}
void loop() {
    if(Serial.available() > 2) { //если в буфере порта больше 2 байт начинаем парсить
        switch(Serial.read()) {
            case 77: //если первый байт равен символу M
            case 109: { //или m то меняем мод. То есть если отправить M0 светодиоды погаснут M1 включится эффект радугу M2 рандомный эффект M3 сплошной цвет и тд если допишишь
                byte i = Serial.parseInt(); //читаем значения после команды m
                if(i < 4) { //если значения меньше доступных режимов
                    led_mode = i; //присваиваем его как мод
                    if(led_mode == 0) { //если пришла команда отключить отключаем
                        #if defined PIN_NPN
                            digitalWrite(PIN_NPN, false); //просто дергаем транзистором
                        #else
                            FastLED.clear();//очищает ленту, буквально обнуляет все цвета в массиве, задаёт “чёрный” цвет.
                            FastLED.setBrightness(0); // уберем яркость
                            FastLED.show();//обновляем
                        #endif
                    }
                    else { //включпем
                        #if defined PIN_NPN
                            digitalWrite(PIN_NPN, true); //просто дергаем транзистором
                        #else
                            FastLED.setBrightness(led_brig); // ставим яркость
                        #endif
                        counter = random(0, 255); //задаем рандомный цвет
                        effect_fadeall();
                    }
                }
                break; //выодим
            }
            case 67: //если первый байт равен символу C
            case 99: { //или c то меняем цвет от 0 до 255 пригодится для сплошной заливки
                counter = Serial.parseInt(); //читаем значения после команды c
                effect_fadeall();
                break; //выодим
            }
            case 83: //если первый байт равен символу S
            case 115: { //или s то меняем скорость эффекта от 0 до 255
                led_sped = Serial.parseInt(); //читаем значения после команды s
                break; //выходим
            }
            case 66: //если первый байт равен символу B
            case 98: { //или b то меняем яркость от 0 до 255
                led_brig = Serial.parseInt(); //читаем значения после команды b
                if(led_mode) {
                    FastLED.setBrightness(led_brig);
                    FastLED.show();
                }
                break; //выходим
            }
      
      
        }
        Serial.flush(); //чистем буфер
    }
    int m = int(millis());
    if(m-led_timer > led_sped) {
        led_timer = m;
        switch(led_mode) {
            case 1: effect_rainbow();  break;
            case 2: effect_random();  break;
            //третий не надо как достаточно его раз залить будешь добавлять тут с четвертого начнешь и в веру проверку надо будет изменить if(i < 4)
        }
    }
}

void  effect_random() {
    leds[random(0, NUM_LEDS)] .setHue(random(0, 255)); //рандомный светодиод и цвет
    FastLED.show();
}

void  effect_rainbow() {
    for(int i = 0; i < NUM_LEDS; i++ )  leds[i] = CHSV(counter + i * 3, 255, 255);
    counter++;
    FastLED.show();
}

void effect_fadeall()  {
  for (int i = 0; i < NUM_LEDS; i++) leds[i] .setHue(counter);
  FastLED.show();
}
тут наглядно
 
Изменено:
  • Лойс +1
Реакции: Stas_Bro и Lumenjer

Stas_Bro

✩✩✩✩✩✩✩
27 Апр 2020
25
0
@Normalek, Огромное спасибо!!, А как сделать так чтобы сохранялся последний режим?
 

Stas_Bro

✩✩✩✩✩✩✩
27 Апр 2020
25
0
Чем можно заменить delay?
я заменил на millis но не получается что-то
fill_solid(leds,NUM_LEDS, CRGB::Red);
FastLED.show();
if (millis() - timing > 1000000){ // Вместо 10000 подставьте нужное вам значение паузы
timing = micros();
fill_solid(leds,NUM_LEDS, CRGB::Blue);
FastLED.show();
хочу что бы цвета менялись и что бы я мог управлять скоростью с помощью переменной
сейчас цвет просто стоит на месте

@Stas_Bro, уже увидел ошибку "millis" не заменил на micros, но всеравно оно работает "не ровно"
 

Stas_Bro

✩✩✩✩✩✩✩
27 Апр 2020
25
0
Оформи код соответствующим тэгом
@bort707, 100 микросекунд, вообще надо что бы от переменной настраивалось
fill_solid(leds,NUM_LEDS, CRGB::Red);
FastLED.show();
delay (led_speed);
fill_solid(leds,NUM_LEDS, CRGB::Blue);
также только не через delay потому что я хочу скорость настраивать в реальном времени, а не пока loop закончит
 

Normalek

★✩✩✩✩✩✩
6 Авг 2021
140
39
@bort707, micros не знаю, но millis желательно для парсинга ибо delay тормозит весь восполняемый код ниже, можно конечно это обойти но надо ли, тем более за бесплатно так заморачиваться.
@Stas_Bro, if (millis() - timing > 1000000) так надо место 1000000 свою перемену сувать, а micros не надо тут на самом деле ибо на большой скорости тоже эффект может размываться
 
Изменено:
  • Лойс +1
Реакции: Stas_Bro

bort707

★★★★★★✩
21 Сен 2020
2,864
850

@Stas_Bro, 100 микросекунд, уверены? 10тыс раз в секунду менять цвет?это слишком быстро, fastled не будет успевать цвет менять.
Может все же МИЛЛИсекунд, а не микро?
 

kDn

★★★★★✩✩
18 Ноя 2019
1,109
437
Дошел до компьютера. Как-то так, не проверял, ибо лень. Суть - мигалка двумя цветами, без задержек и смс.
C++:
static CRGB color = CRGB::Blue;
stalic unsigned long timing;

if (millis() - timing > 1000){ // Вместо 1000 подставьте нужное вам значение паузы
  timing = millis();
  color = (color != CRGB::Red ? CRGB::Red : CRGB::Blue);
  fill_solid(leds,NUM_LEDS, color);
  FastLED.show();
}
 
  • Лойс +1
Реакции: Lumenjer и Stas_Bro

Stas_Bro

✩✩✩✩✩✩✩
27 Апр 2020
25
0
Оформи код соответствующим тэгом

@Stas_Bro, 100 микросекунд, уверены? 10тыс раз в секунду менять цвет?это слишком быстро, fastled не будет успевать цвет менять.
Может все же МИЛЛИсекунд, а не микро?
ой мили*

@kDn, можешь расписать пожалуйста, что и для чего оно написано?
учусь)
FastLED.show понятно это для вывода а всё остальное:unsure:
попробывал пишет
'CRGB' does not name a type; did you mean 'OCR0B'

С мигалкой это конечно хорошо, но есть такой кусок кода и тут тоже delay с переменной
void effect_AB() {
for(int i = 0; i < NUM_LEDS; i++) {
leds.setHue(counter);
FastLED.show();
delay(led_speed);
leds = CRGB::Black;
}
for(int i = NUM_LEDS - 1; i >=0; i--) {
leds.setHue(counter);
FastLED.show();
delay(led_speed);
leds = CRGB::Black;
FastLED.show();
}}
Как же сделать так что бы светодиод менял цвет в любое время, а не пока добежит туда и сюда
 
Изменено:

kDn

★★★★★✩✩
18 Ноя 2019
1,109
437
@Stas_Bro, и где вы такой говнокод раскапываете??? В примерах фастледа чтоли? В примеры нужно смотреть выборочно, т.к. их писали не включая мозг.

ожешь расписать пожалуйста, что и для чего оно написано?
учусь)
Неа, не могу. Потрудитесь найти ответы самостоятельно, иначе ничему не научитесь.
 

Normalek

★✩✩✩✩✩✩
6 Авг 2021
140
39
@Stas_Bro,
C++:
void effect_AB() {
    static int id; // сохраняем текший светодиод
    static bool nap; //нападения
    nap?leds[id--] = CRGB::Black:leds[id++].setHue(counter); //проверяем если nap == true заливаем светодиод черным если нет меняем на другой цвет
    if( id== 0 || id == NUM_LEDS) nap = !nap; //если дошли до последнего или первого меняем направления
    FastLED.show();
}
каждый вызов будет по одному светодиоду подряд
а вот совсем немного изменив код уже выглядит по другому
C++:
void effect_AB() {
    static int id;
    static bool nap;
    nap?leds[id--] = CRGB::Black:leds[id++]= CHSV((counter ++)*3 , 255, 255);
    if(0 == id||id== NUM_LEDS) nap = !nap;
    FastLED.show();
}
 
Изменено:
  • Лойс +1
Реакции: Stas_Bro

Stas_Bro

✩✩✩✩✩✩✩
27 Апр 2020
25
0
@Normalek, крутяк, спасибо! ты можешь поскидывать ссылки где ты научился такие коды писать?
 

Normalek

★✩✩✩✩✩✩
6 Авг 2021
140
39
@Stas_Bro, честно сказать не могу, ибо мне лень, да и ссылки будут это основа с++ програмирования, чтоб понимать как работать с классами структурами функциями и тд. например вот ссылка, да и оф. сайт ардуино чтоб понимать что делает та или иная функция. И самое главное логика, чтоб понимать что делаешь и что выйдет. Ну для начала наверное все
 
  • Лойс +1
Реакции: Lolectronik и Stas_Bro
Статус
В этой теме нельзя размещать новые ответы.