Режимы свечения RGB ленты на Arduino+ mosfet

imnofear555
Offline
Зарегистрирован: 10.12.2019

Привет!
Я Новичок  и прошу Вашей помощи. 
нужно накидать пару эффектов свечения для rgb ленты (пульсация, плавное изменение яркости, и еще парочку). Почитал про циклы for и while в общих чертах понятно, НО мне нужно что бы цикл выполнялся постоянно, а во всех примерах эти два цикла находятся внутри loop. Мне такой Вариант не подходит( 
Плата nodemcu + модули mosfet. Думаю для знающих людей данный код не составит сложности, Надеюсь на Вашу Помощь)))
 

 BLYNK_WRITE(V10) {
  switch (param.asInt()) {
    case 1: { // Пункт 1 
         analogWrite (pinR, LOW);
         analogWrite (pinG, LOW);
         analogWrite (pinR, random(100, 1023));
         analogWrite (pinG, random(100, 1023));
         Serial.println("Выбран кейс 1");
         break;
        }
    case 2: { // Пункт 2
          analogWrite (pinR, LOW);
          analogWrite (pinG, LOW);
           for (int asd = 0; asd < 1023; asd += 102) {
            Blynk.virtualWrite(V4, asd);
            analogWrite(pinR, asd);
            Serial.println(asd);
            Serial.println("Выбран кейс 2");
            delay(10);
           };
          break;
          }
    case 3: { // Пункт 3
          analogWrite (pinR, LOW);
          analogWrite (pinG, LOW);
          Serial.println("Выбран кейс 3");
          break;
          }
      }
  }
В каждом Кейсе хотелось бы какой то эффект свечения, и при выборе другого кейса эффект менялся. Нужно что бы при выборе кейса эффект бесконечно повторялся (плавно разгорается после плавно Гаснет, так бесконечно).
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

imnofear555 пишет:
во всех примерах эти два цикла находятся внутри loop

А где Вам надо, чтобы они находились?

imnofear555 пишет:
Мне такой Вариант не подходит(

Чем именно не подходит? Что не устраивает?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

imnofear555 пишет:

НО мне нужно что бы цикл выполнялся постоянно, а во всех примерах эти два цикла находятся внутри loop*. Мне такой Вариант не подходит

* - (примечание: значит выполняются постоянно)

Ничего не понял. Противоречие самого себя в одной строке.

ВН
Offline
Зарегистрирован: 25.02.2016

ну не читал ТС про Loop

http://arduino.ru/Reference/Loop

Loop - петля, виток

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Ну, мало-ли. ТС не нравится loop() по религиозным или лингвистическим соображениям. Я могу предложить main() и сменить среду программирования.

imnofear555
Offline
Зарегистрирован: 10.12.2019
#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
#include <SPI.h>
#include <BlynkSimpleEsp8266.h>

#define pinR D1
#define pinG D2
#define BLYNK_PRINT Serial

int rezh;  
int brig; //Значение Яркости, получаю с приложения 
char auth[] = "хххххххххххххххххх"; //NodeMcu Token 2

BlynkTimer timer;
BLYNK_CONNECTED(){
  Blynk.syncAll();
}

void configModeCallback (WiFiManager *myWiFiManager) {
  Serial.println("Entered config mode");
  Serial.println(WiFi.softAPIP());
  //if you used auto generated SSID, print it
  Serial.println(myWiFiManager->getConfigPortalSSID());
}
void setup() {
    Serial.begin(115200);
    WiFiManager wifiManager;
    //wifiManager.resetSettings();
    wifiManager.setAPCallback(configModeCallback);
    wifiManager.autoConnect("Nigth_Ray");
    Serial.println("Подключен к Сети");
    Blynk.config(auth, IPAddress(хх,1х3,9х0,х), 8080);  
    pinMode (pinR, OUTPUT);
    pinMode (pinG, OUTPUT);
}
////////////////////////////////////////////////   

 BLYNK_WRITE(V10) {
  switch (param.asInt()) {
    case 1: { // Режим свечения Первый- Рандомный Цвет.
         analogWrite (pinR, LOW);
         analogWrite (pinG, LOW);
         analogWrite (pinR, random(100, brig));
         analogWrite (pinG, random(100, brig));
         Serial.println("Выбран кейс 1");
         break;
        }
    case 2: { // Режим свечения Второй- Плавное Включение Выключение.
          analogWrite (pinR, LOW);
          analogWrite (pinG, LOW);
           for (int rezh = 0; rezh < brig; rezh += 102.3) {
            Blynk.virtualWrite(V4, rezh);
            analogWrite(pinR, rezh);
            Serial.println(rezh);
            Serial.println("Выбран кейс 2");
            delay(10);
           };
          break;
          }
    case 3: { // Режим свечения Третий- 
          analogWrite (pinR, LOW);
          analogWrite (pinG, LOW);
          Serial.println("Выбран кейс 3");
          break;
          }
      }
  }
  BLYNK_WRITE(V9){ // Получаю Значение с Виджета в Приложении, и Записываю в "brig"
  brig = param.asInt();
  Blynk.virtualWrite(V11, brig);
  }
//////////////////////////////////////////////// 

void loop() {
 Blynk.run();
}

Обрати внимание что внутри цикла loop кроме Blynk.run ничего нету.
Я пытаюсь сделать что бы например  цикл пульсации светодиодной Ленты непрерывно выполнялся в case 1: или case 2: или  case 3:.
То есть каждый эффект свечения был внутри КЕЙСА

imnofear555
Offline
Зарегистрирован: 10.12.2019

Мне не устраивает Вариант когда Код который ниже, будет Заключен в  LOOP

 BLYNK_WRITE(V10) {
  switch (param.asInt()) {
    case 1: { // Режим свечения Первый- Рандомный Цвет.
         analogWrite (pinR, LOW);
         analogWrite (pinG, LOW);
         analogWrite (pinR, random(100, brig));
         analogWrite (pinG, random(100, brig));
         Serial.println("Выбран кейс 1");
         break;
        }
    case 2: { // Режим свечения Второй- Плавное Включение Выключение.
          analogWrite (pinR, LOW);
          analogWrite (pinG, LOW);
           for (int rezh = 0; rezh < brig; rezh += 102.3) {
            Blynk.virtualWrite(V4, rezh);
            analogWrite(pinR, rezh);
            Serial.println(rezh);
            Serial.println("Выбран кейс 2");
            delay(10);
           };
          break;
          }
    case 3: { // Режим свечения Третий- 
          analogWrite (pinR, LOW);
          analogWrite (pinG, LOW);
          Serial.println("Выбран кейс 3");
          break;
          }
      }
  }

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Давайте пока отойдем от блинка. Вы можете написать код эффектов чтобы он выполнялся в loop, а выбор осуществлялся пока статически (при компиляции) . Примерно так:

#define pinR D1
#define pinG D2

byte effect = 1;  //выбранный эффект
int brig =  255;

void setup() {

  pinMode (pinR, OUTPUT);
  pinMode (pinG, OUTPUT);
}


void loop() {
  switch (effect) {
    case 1: { // Режим свечения Первый- Рандомный Цвет.
        analogWrite (pinR, random(100, brig));
        analogWrite (pinG, random(100, brig));
        break;
      }
    case 2: { // Режим свечения Второй- Плавное Включение Выключение.
         //делаем здесь один шаг эффекта 2
        break;
      }
    case 3: { // Режим свечения Третий-
            //делаем здесь один шаг эффекта 3
        break;
      }
  }
}

Компилируете, добиваетесь чтобы эффект 1 работал как вам надо. Потом ставите byte effect = 2 и добиваетесь чтобы работал эффект 2

Когда все 3 эффекта будут работать сделайте чтобы значение для  effect получалось через Blynk. А код эффектов так и оставте в лупе

imnofear555
Offline
Зарегистрирован: 10.12.2019

Понял, СПАСИБО. попробую

imnofear555
Offline
Зарегистрирован: 10.12.2019

Дружище Спасибо!!! 
Все Получилось.

BLYNK_WRITE(V11) {
  switch (param.asInt()) {
    case 1: {
          effect = 1;
          break;
         }
    case 2: { // Режим свечения Первый- Рандомный Цвет.
         effect = 2;
         break;
        }
    case 3: { // Режим свечения Второй- Плавное Включение Выключение.
          effect = 3;
          break;
          }
    case 4: { // Режим свечения Третий- 
          effect = 4;
          break;
          }
      }
  }
  BLYNK_WRITE(V9){ // Получаю Значение с Виджета в Приложении, и Записываю в "brig"
  brig = param.asInt();
  Blynk.virtualWrite(V10, brig);
  }
//////////////////////////////////////////////// 

void loop() {
  Serial.println (effect);
 Blynk.run();
 switch (effect) {
    case 1: {
      
      break;
      }
    case 2: { // Режим свечения Первый- Рандомный Цвет.
        analogWrite (pinR, random(100, brig));
        analogWrite (pinG, random(100, brig));
        break;
      }
    case 3: { // Режим свечения Второй- Плавное Включение Выключение.
         //делаем здесь один шаг эффекта 2
        break;
      }
    case 4: { // Режим свечения Третий-
            //делаем здесь один шаг эффекта 3
        break;
      }
  }
}

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Вместо 

switch (param.asInt()) {
    case 1: {
          effect = 1;
          break;
         }
    case 2: { // Режим свечения Первый- Рандомный Цвет.
         effect = 2;
         break;
        }
    case 3: { // Режим свечения Второй- Плавное Включение Выключение.
          effect = 3;
          break;
          }
    case 4: { // Режим свечения Третий- 
          effect = 4;
          break;
          }
      }

Можно просто 

effect = param.asInt()

imnofear555
Offline
Зарегистрирован: 10.12.2019

ДА все Огонь!) 
Может еще подскажешь как можно сделать задержку не используя deley ()б чет я не понял как использовать millis()

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

imnofear555 пишет:

ДА все Огонь!) 
Может еще подскажешь как можно сделать задержку не используя deley ()б чет я не понял как использовать millis()

От конкретного варианта зависит и от цели замены.