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();
}
@turty_k, 👍1
2 ответа
Вы можете добавить переменную статического состояния в функцию и при каждом вызове функции выполнять следующую часть "анимации".
У меня есть пример для звука:
#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, чтобы ограничить количество миганий
Функции 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
}
Подробнее об этом можно прочитать в документах.
- Есть ли функция Adafruit для инвертирования цветов моего экрана для языка Arduino?
- Использование кольца NeoPixel без Arduino
- Использование аккумуляторов 18650 с повышающим преобразователем 3,7 В в 5 В.
- Как погасить светодиод за определенное время с помощью FastLED
- Красный светодиод не выключается на игровой площадке Adafruit Circuit Classic
- FastLED и Adafruit Gemma M0 - Начало работы
- Питание светодиодной ленты - Сколько ампер?
- Несколько условий оператора if