Blynk app, DotStar bluetooth код управления справка

Это моя настройка:

  • Arduino Mega;
  • Модуль bluetooth HM-10 (куплен на ebay, поэтому не уверен, что подлинный, но работает);
  • Adafruit Dotstar addressable LED strip;
  • Приложение iOS Blynk;

Аппаратно все подключено и работает нормально.

Моя конечная цель-реализовать эту светодиодную полосу на моем автомобиле в свете фар.

На данный момент, однако, я хочу, чтобы все работало с приложением Blynk с 3 кнопками включения/выключения, связанными с 3 виртуальными контактами и не учитывающими приоритет кода для огней.

У меня есть 3 световых "шоу" для полосы, которые имеют свои собственные пустотные функции.

Это:

  • Дневные ходовые огни: DRL();
  • Сигнальный указатель поворота: STI();
  • Полицейский дисплей: POL();

Это мой первый серьезный проект, так что считайте, что я начинающий программист. Каждая кнопка переключателя должна быть связана с каждым световым шоу и включать и выключать полосу.

Что я хочу более конкретно: когда я нажимаю переключатель DRL, DRL должен оставаться включенным. Выключается только при повторном нажатии переключателя. Это прекрасно работает.

ИППП, которую я хочу зациклить. но когда я нажимаю на переключатель, он проходит через эту функцию только один раз. Вот чего я не понимаю, так как Blynk.run() находится в функции void loop, а состояние виртуального контакта не изменилось.

То же самое и с полицейскими огнями, они проходят через последовательность только один раз, но я хочу, чтобы она была зациклена.

Итак, мой вопрос таков: Как я могу зациклить функции STI и POL в своем коде?

Я пробовал использовать функцию while, но не могу выйти из нее, прочитав виртуальный pin внутри этой функции.

Вот весь код:

Я знаю, что код может быть грязным, любой вклад приветствуется.

#define BLYNK_PRINT Serial
#include <SPI.h>
#include <BlynkSimpleSerialBLE.h>

#include <Adafruit_DotStar.h>
#define NUMPIXELS 72

#include <SoftwareSerial.h>

Adafruit_DotStar strip = Adafruit_DotStar(NUMPIXELS, DOTSTAR_BRG);

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "***";

uint32_t amber = 0x020600;
uint32_t white = 0x020202;
uint32_t red = 0x000200;
uint32_t blue = 0x000002;
//SoftwareSerial SerialBLE(10, 11); // RX, TX


BLYNK_WRITE(V1)
{
  int pinValue1 = param.asInt(); // assigning incoming value from pin V1     to a variable

  if (pinValue1 == 1) {
    Serial.print("Daytime running lights: ON ");
    Serial.println(pinValue1); //showing the actual virtual pin status 0/1
    DRL();
  }
  else {
    Serial.print("Daytime running lights: OFF ");
    Serial.println(pinValue1); //showing the actual virtual pin status 0/1
    OFF();
    Serial.print("off ok"); // this just helps me check where the code has   progressed
  }
}

BLYNK_WRITE(V2)
{
  int pinValue2 = param.asInt(); // assigning incoming value from pin V2 to    a variable

  if (pinValue2 == 1) {
    Serial.print("Dynamic turn indicator: ON ");
    Serial.println(pinValue2);  //showing the actual virtual pin status 0/1
    STI();
  }
  else {
    Serial.print("Dynamic turn indicator: OFF ");
    Serial.println(pinValue2);  //showing the actual virtual pin status 0/1
    OFF();
    Serial.print("off ok"); // this just helps me check where the code has  progressed
  }
}

BLYNK_WRITE(V3)
{
  int pinValue3 = param.asInt(); // assigning incoming value from pin V3 to a variable

  if (pinValue3 == 1) {
    Serial.print("Police Lights: ON ");
    Serial.println(pinValue3);
    POL();
  }
  else {
    Serial.print("Police Lights: OFF ");
    Serial.println(pinValue3);
    OFF();
    Serial.print("off ok"); // this just helps me check where the code has progressed
  }
}

void setup()
{
  Serial.begin(9600);
  Serial1.begin(9600);
  Blynk.begin(Serial1, auth);
  Serial.println("Waiting for connections...");

  strip.begin();  //initializes the strip
  strip.show();  //turn off LEDs within NUMPIXELS
}

void OFF() {
  for (int i; i <= 72; i++) { //turn off strip
    strip.setPixelColor(i, 0);
    strip.show();
  }
}

void DRL() {
  for (int i = 0; i <= 72; i++) {
    strip.setPixelColor(i, white);
    strip.show();
    delay(4);
  }
}

void STI() {
  //turn on dinamic indicator
  for (int i = 0; i <= 72; i++) {
    strip.setPixelColor(i, amber);
    strip.show();
    delay(2);
  }

  //turn off dinamic indicator
  for (int i; i <= 72; i++) {
    strip.setPixelColor(i, 0);
  }
  delay (200);  //on condition delay
  strip.show();
  delay (500);  //off condition delay
}

void POL() {

  for (int i = 0; i <= 36; i++) {
    strip.setPixelColor(i, red);
    strip.show();
  }
  delay(30);

  for (int i = 0; i <= 36; i++) {
    strip.setPixelColor(i, 0);
    strip.show();
  }
  delay(30);

  for (int i = 0; i <= 36; i++) {
    strip.setPixelColor(i, red);
    strip.show();
  }
  delay(30);

  for (int i = 0; i <= 36; i++) {
    strip.setPixelColor(i, 0);
    strip.show();
  }
  delay(30);

  for (int i = 0; i <= 36; i++) {
    strip.setPixelColor(i, red);
    strip.show();
  }
  delay(30);

  for (int i = 0; i <= 36; i++) {
    strip.setPixelColor(i, 0);
    strip.show();
  }
  delay(30);

  for (int i = 0; i <= 36; i++) {
    strip.setPixelColor(i, red);
    strip.show();
  }
  delay(30);

  for (int i = 0; i <= 36; i++) {
    strip.setPixelColor(i, 0);
    strip.show();
  }
  delay(100);

  for (int i = 37; i <= 72; i++) {
    strip.setPixelColor(i, blue);
    strip.show();
  }
  delay(30);

  for (int i = 37; i <= 72; i++) {
    strip.setPixelColor(i, 0);
    strip.show();
  }
  delay(30);

  for (int i = 37; i <= 72; i++) {
    strip.setPixelColor(i, blue);
    strip.show();
  }
  delay(30);

  for (int i = 37; i <= 72; i++) {
    strip.setPixelColor(i, 0);
    strip.show();
  }
  delay(30);

  for (int i = 37; i <= 72; i++) {
    strip.setPixelColor(i, blue);
    strip.show();
  }
  delay(30);

  for (int i = 37; i <= 72; i++) {
    strip.setPixelColor(i, 0);
    strip.show();
  }
  delay(30);

  for (int i = 37; i <= 72; i++) {
    strip.setPixelColor(i, blue);
    strip.show();
  }
  delay(30);

  for (int i = 37; i <= 72; i++) {
    strip.setPixelColor(i, 0);
    strip.show();
  }
  delay(100);
}

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

, 👍1


2 ответа


0

Вы можете добавить переменную статического состояния в функцию и при каждом вызове функции выполнять следующую часть "анимации".

У меня есть пример для звука:

#include "Arduino.h"

const byte TONE_PIN = 4;
const int ALARM_BEEP_1 = 4186;
const int ALARM_BEEP_2 = 4699;

const int ALARM_TONE_LENGTH = 200;
const int ALARM_TONE_PAUSE = 800;
const int ALARM_TONE_REPEAT = 6;

boolean alarm = false;

void setup()
{
  alarm = true;
}

void loop()
{
  if (alarm) {
    alarmSound();
  }
}

void alarmSound() {
  static unsigned long next = millis();
  static byte count = 0;
  if (millis() > next) {
    next += ALARM_TONE_LENGTH;
    count++;
    if (count == ALARM_TONE_REPEAT) {
      next += ALARM_TONE_PAUSE;
      count = 0;
    }
    tone(TONE_PIN, (count % 2) ? ALARM_BEEP_1 : ALARM_BEEP_2, ALARM_TONE_LENGTH);
  }
}

следующая переменная и код вокруг нее находятся вместозадержки. вместо перехода на звуковой сигнал у вас будет цикл " для " над светодиодами, и вы будете использовать условие для количества нечетных/случайных вызовов % 2 для включения и выключения светодиодов. добавьте параметр условие для count, чтобы ограничить количество миганий

,

1

Функции BLYNK_WRITE работают так, что они вызываются каждый раз, когда устройство получает обновление значения виртуального пина из приложения. Теперь, если вы хотите запустить что-то по таймеру или в цикле, есть функция под названием BlynkTimer. Вы пишете свою собственную функцию, которую хотите зациклить, и используете эту функцию, чтобы определить, как часто она должна повторяться. Вы можете управлять выполнением, установив логический флаг в функции BLYNK_WRITE и проверив его в цикле, или запустив enable() и disable()методы таймера. Итак, вы можете сделать что-то вроде этого (без библиотек, просто пример):

BlynkTimer timer; // создаем таймер

void myTimer() 
{
    // переключить светодиод
    static bool state;
    digitalWrite(13, state);
    state = !state;
}

void setup()
{
  Blynk.begin(details); // старт мигания
  timer.setInterval(1000L, myTimer); // повторяем таймер раз в секунду
  pinMode(13, OUTPUT); // вывод светодиода как выход
}

void loop()
{
  Blynk.run(); // Запускает все вещи Blynk
  timer.run(); // запускает BlynkTimer
}

Подробнее об этом можно прочитать в документах.

,