Помогите объединить 2 скетча в 1

Тема что хочу тут: www.drive2.ru/l/470507414878159563/
Люди, помогите объединить 2 скетча.
Есть RFID приемник, и есть BT модуль. Управляют они релюхами.
По отдельности — работают.
Заливаю в один — не работает 2-я часть с BT.
#include
#include // библиотека «RFID».
#define SS_PIN 10
#define RST_PIN 9
int val; // BT
int n=1; // цикл откр/закр с RFID
int LOCK = 4; // 4 вывод закрывает
int UNLOCK = 5; // 5 вывод открывает
int SER = 6; // 6 вывод сервис *
int IMMO = 7; // 7 вывод на обход IMMO
MFRC522 mfrc522(SS_PIN, RST_PIN);
unsigned long uidDec, uidDecTemp; // для храниения номера метки в десятичном формате
pinMode(LOCK, OUTPUT);
digitalWrite(LOCK, HIGH); // Задаем изначально «+» так как реле управляется «-«, по умолчанию — отключено
pinMode(UNLOCK, OUTPUT);
digitalWrite(UNLOCK, HIGH);
pinMode(SER, OUTPUT);
digitalWrite(SER, HIGH);
pinMode(IMMO, OUTPUT);
digitalWrite(IMMO, HIGH);
Serial.begin(9600);
Serial.println(«Waiting for card…»);
SPI.begin(); // инициализация SPI / Init SPI bus.
mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card.
>
void loop()
// Работа с RFID //////////////////////////////////////////////
// Поиск новой метки
if ( ! mfrc522.PICC_IsNewCardPresent()) return;
>
// Выбор метки
if ( ! mfrc522.PICC_ReadCardSerial()) return;
>
uidDec = 0;
// Выдача серийного номера метки.
for (byte i = 0; i < mfrc522.uid.size; i++)
uidDecTemp = mfrc522.uid.uidByte[i];
uidDec = uidDec * 256 + uidDecTemp;
>
Serial.println(«Card UID: «);
Serial.println(uidDec); // Выводим UID метки в консоль.
++n; // 1 нажатие — открыть, 2 нажатие — закрыть
if (n>2) n=1;
>
if (uidDec == 2687440508 || uidDec == 705036399 || uidDec == 1259499323 || uidDec == 988152175) // Сравниваем Uid метки.
// 2687440508 — карта
// 1259499323 — синий браслет
// 705036399 — оранжевый
// 988152175 — синий большой
switch(n)
case 1:
digitalWrite(UNLOCK, LOW); //открыть
delay(200);
digitalWrite(UNLOCK, HIGH);
digitalWrite(IMMO, LOW); // отключение IMMO (подаем «-» на вывод)
delay(2000);
break;
case 2:
digitalWrite(LOCK, LOW); //закрыть
delay(200);
digitalWrite(LOCK, HIGH);
digitalWrite(IMMO, HIGH); // включение IMMO (отключаем «-» на выводе)
delay(2000);
break;
>
else // если ключ-карта не прописана, сирена сигналит
digitalWrite(SER, LOW);
delay(200);
digitalWrite(SER, HIGH);
delay(200);
digitalWrite(SER, LOW);
delay(200);
digitalWrite(SER, HIGH);
delay(2000);
>
>
и для BT:
int val;
int LOCK = 4; // 4 вывод закрывает
int UNLOCK = 5; // 5 вывод открывает
int SER = 6; // 6 вывод сервис *
int IMMO = 7; // 7 вывод на обход IMMO
void setup()
Serial.begin(9600);
pinMode(LOCK, OUTPUT);
digitalWrite(LOCK, HIGH); // Задаем изначально «+» так как реле управляется «-«, по умолчанию — отключено
pinMode(UNLOCK, OUTPUT);
digitalWrite(UNLOCK, HIGH);
pinMode(SER, OUTPUT);
digitalWrite(SER, HIGH);
pinMode(IMMO, OUTPUT);
digitalWrite(IMMO, HIGH);
>
void loop()
if (Serial.available())
val = Serial.read();
// При символе «1» закрываем машину
if (val == ‘1’)
digitalWrite(LOCK, LOW); //закрыть
delay(200);
digitalWrite(LOCK, HIGH);
digitalWrite(IMMO, HIGH); // включение IMMO (отключаем «-» на выводе)
delay(1000);
>
// При символе «2» открываем машину
if ( val == ‘2’)
digitalWrite(UNLOCK, LOW); //открыть
delay(200);
digitalWrite(UNLOCK, HIGH);
digitalWrite(IMMO, LOW); // отключение IMMO (подаем «-» на вывод)
delay(1000);
>
// При символе «3» запускаем мотор
if ( val == ‘3’)
digitalWrite(LOCK, LOW);
delay(1000);
digitalWrite(LOCK, HIGH);
delay(200);
digitalWrite(SER, LOW);
delay(300);
digitalWrite(SER, HIGH);
delay(1000);
>
// При символе «4» глушим мотор
if ( val == ‘4’)
digitalWrite(UNLOCK, LOW);
delay(1000);
digitalWrite(UNLOCK, HIGH);
delay(200);
digitalWrite(SER, LOW);
delay(300);
digitalWrite(SER, HIGH);
delay(1000);
>
>
>
Как правильно объединить два скетча в ARDUINO?
Есть два скетча и их нужно объединить.
Первый скетч получает данные с гироскопа и акселерометра.
Второй для передачи данных по UDP порту.
Задача состоит в том, что бы считывать данные с гироскопа и посылать их через порт UDP, принимая через ноду UDP в программе VVVV.
Скетчи работаю по отдельности данные с гироскопа получаю, также принимаю и отправляю «Packet» по UDP в VVVV.
Скетч для Гироскопа
#include "Wire.h" // This library allows you to communicate with I2C devices. const int MPU_ADDR = 0x68; // I2C address of the MPU-6050. If AD0 pin is set to HIGH, the I2C address will be 0x69. int16_t accelerometer_x, accelerometer_y, accelerometer_z; // variables for accelerometer raw data int16_t gyro_x, gyro_y, gyro_z; // variables for gyro raw data int16_t temperature; // variables for temperature data char tmp_str[7]; // temporary variable used in convert function char* convert_int16_to_str(int16_t i) < // converts int16 to string. Moreover, resulting strings will have the same length in the debug monitor. sprintf(tmp_str, "%6d", i); return tmp_str; >void setup() < Serial.begin(115200); Wire.begin(); Wire.beginTransmission(MPU_ADDR); // Begins a transmission to the I2C slave (GY-521 board) Wire.write(0x6B); // PWR_MGMT_1 register Wire.write(0); // set to zero (wakes up the MPU-6050) Wire.endTransmission(true); >void loop() < Wire.beginTransmission(MPU_ADDR); Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H) [MPU-6000 and MPU-6050 Register Map and Descriptions Revision 4.2, p.40] Wire.endTransmission(false); // the parameter indicates that the Arduino will send a restart. As a result, the connection is kept active. Wire.requestFrom(MPU_ADDR, 7*2, true); // request a total of 7*2=14 registers // "Wire.read()Скетч для UDP #include #include // Set WiFi credentials #define WIFI_SSID "OKISHEVA" #define WIFI_PASS "I0 // Connected to WiFi Serial.println(); Serial.print("Connected! IP address: "); Serial.println(WiFi.localIP()); // Begin listening to UDP port UDP.begin(UDP_PORT); Serial.print("Listening on UDP port "); Serial.println(UDP_PORT); > void loop() < // If packet received. int packetSize = UDP.parsePacket(); if (packetSize) < Serial.print("Received packet! Size: "); Serial.println(packetSize); int len = UDP.read(packet, 255); if (len >0) < packet[len] = '\0'; >Serial.print("Packet received: "); Serial.println(packet); Serial.println(UDP.remoteIP()); // Send return packet // UDP.beginPacket(UDP.remoteIP(), UDP.remotePort()); UDP.beginPacket("172.20.10.2", 5555); UDP.write(reply); UDP.endPacket(); > >
- Вопрос задан более трёх лет назад
- 786 просмотров
Объединить несколько скетчей?


Чтобы соединить несколько проектов в один, нужно разобраться со всеми возможными конфликтами:
- Проекты построены на одной и той же плате/платформе?
- Да – отлично!
- Нет – нужно убедиться, что “общая” плата сможет работать с железками, которые есть в объединяемых проектах, а также сама обладает нужной периферией.
- Нет – отлично!
- Да, I2C – все железки подключаются на I2C общей платы. Убедитесь, что адреса устройств не совпадают (случается крайне редко)!
- Да, SPI – у шины SPI все пины “общие”, кроме CS (Chip Select), этот пин может быть любым цифровым. Подробнее можно почитать вот тут.
- Да, UART – беда, к UART может быть подключено только одно устройство. Можно повесить одну железку на аппаратный UART, а вторую на SoftwareSerial. Либо заморачиваться с мультиплексорами.
- Нет – отлично!
- Да – разобраться, какую функцию выполняет пин в каждом из проектов и подобрать замену, как в железе, так и в программе:
- Если это обычный цифровой вход-выход, можно заменить на любой другой
- Если это измерение аналогового сигнала – заменить на другой аналоговый пин
- Если это генерация ШИМ, подключить соответственно на другой ШИМ пин и подкорректировать программу
- Если это прерывание – быть внимательным
- Нет – ОТЛИЧНО!
- Да – ситуация требует хорошего опыта работы с Ардуино…
- Используется один и тот же таймер – нельзя одновременно использовать ШИМ на ногах первого таймера и управление сервоприводами при помощи библиотеки Servo.h
- Используется генерация звука при помощи tone() – нельзя использовать ШИМ на ногах второго таймера
- Используются прерывания по таймеру и генерация ШИМ на соответствующем таймере – сложная ситуация
- И т.д., ситуаций может быть бесконечно много…
Можно внести все правки в схемы и программы объединяемых проектов, чтобы они не конфликтовали. Далее приступаем к сборке общей программы:
- Подключаем все библиотеки. Некоторые библиотеки могут конфликтовать, например Servo и Timer1, как обсуждалось выше.
- Сравниваем имена глобальных переменных и дефайны в объединяемых программах: они не должны совпадать. Совпадающие меняем при помощи замены по коду (Правка/Найти) на другие. Далее копипастим все глобальные переменные и дефайны в общую программу
- Объединяем содержимое блока setup()
- Копипастим в общую программу все “пользовательские” функции
- Остаётся у нас только loop() , и это самая сложная задача
Раньше у нас было два (или больше) отдельно работающих проекта. Теперь наша задача как программиста – продумать и запрограммировать работу этих нескольких проектов в одном, и тут ситуаций уже бесконечное множество:
- Основной код (который в loop()) из разных проектов должен выполняться по очереди по таймеру
- Набор действий из разных проектов должен переключаться кнопкой или ещё как-то
- К одному проекту добавляется датчик из другого проекта – данные нужно обработать и запрограммировать их дальнейшее движение (вывод на дисплей, отправку и т.д.)
- Все “проекты” должны работать одновременно на одной Ардуине
- И так далее
В большинстве случаев нельзя просто так взять и объединить содержимое loop() из разных программ, я надеюсь все это понимают. Даже мигалку и пищалку таким образом объединить не получится, если изначально код был написан с задержками или замкнутыми циклами.
Полезные страницы
- Набор GyverKIT – большой стартовый набор Arduino моей разработки, продаётся в России
- Каталог ссылок на дешёвые Ардуины, датчики, модули и прочие железки с AliExpress у проверенных продавцов
- Подборка библиотек для Arduino, самых интересных и полезных, официальных и не очень
- Полная документация по языку Ардуино, все встроенные функции и макросы, все доступные типы данных
- Сборник полезных алгоритмов для написания скетчей: структура кода, таймеры, фильтры, парсинг данных
- Видео уроки по программированию Arduino с канала “Заметки Ардуинщика” – одни из самых подробных в рунете
- Поддержать автора за работу над уроками
- Обратная связь – сообщить об ошибке в уроке или предложить дополнение по тексту ([email protected])
Как объединить два скетча в один
Как то не удобно обзовись по имени, а то Хотабыч. Извени конечно за наглость , но что с этим делать? Где и как это можно объявить.
Вложения

95.5 KB Просмотры: 3
Изменено: 1 Май 2020Старик Похабыч
14 Авг 2019 4,063 1,261 Москва
не помню есть ли именованные цвета в микролед, но должно работать так:
leds[y]=CRGB(0,0,0);Алексей22
25 Фев 2020 41 0 64
не помню есть ли именованные цвета в микролед, но должно работать так:
светодиоды [y] = CRGB (0,0,0);Nаверное надоел уже, представления не имею что в этой области обьявить
Вложения

136.4 KB Просмотры: 5
Изменено: 1 Май 2020Старик Похабыч
14 Авг 2019 4,063 1,261 Москва
вместо
CRGB tmp[x];
надо
LEDdata tmp[x];
это написано в инструкции переводаАлексей22
25 Фев 2020 41 0 64
вместо
CRGB tmp [x];
надо
LEDdata tmp [x];
это написано в инструкции перевода
Че то у меня получился замкнутый круг, перекинулась ошибка на пред строку?Вложения

113.6 KB Просмотры: 2
Изменено: 1 Май 2020Старик Похабыч
14 Авг 2019 4,063 1,261 Москва
тут не могу понять. вот мой рабочий кусок кода#ifdef REPLACE_FASTLED LEDdata d_color = CRGB(0, 0, 0); #else CRGB d_color = CRGB(0, 0, 0); #endifверхняя часть для микроледа , а нижняя для фастледа. я как раз запоминаю черный цвет в переменной и потом его использую где надо.
проверь написание CRGB, что бы все буковки были латинские чтольАлексей22
25 Фев 2020 41 0 64
тут не могу понять. вот мой рабочий кусок кода#ifdef REPLACE_FASTLED LEDdata d_color = CRGB (0, 0, 0); #else CRGB d_color = CRGB (0, 0, 0); #endifверхняя часть для микроледа , а нижняя для фастледа. я как раз запоминаю черный цвет в переменной и потом его использую где надо.
проверь написание CRGB, что бы все буковки были латинские чтольХататабыч, будь добр, проверь. Может я чего на косячил?
Спойлер: КОД
#include
#include
#include#define NUM_LEDS 289 //
#define DATA_PIN 6 //
#define REPLACE_FASTLED // пункт 0
#define COLOR_DEBTH 3 // пункт 1
#define CHIPSET WS2811 //
#define CMD_NEW_DATA 1
#define BAUD_RATE 115200 //
символ без знака x = 17; // матрица х размер
символ без знака y = 17; // размер матрицы y
#define COLOR_ORDER GRB
#define BRIGHTNESS 50int count_files = 15; //
Файл fxdata;
LEDdata leds[NUM_LEDS]; //CRGB leds[NUM_LEDS]; 4) Заменить CRGB на LEDdata при создании буфера
microLED strip(leds, NUM_LEDS, DATA_PIN); // 5) Создать объект ленты microLED
int val;
настройка void ()
//FastLED.addLeds (светодиоды, NUM_LEDS) .setCorrection (TypicalLEDStrip);
//FastLED.setBrightness(BRIGHTNESS);Serial.begin (BAUD_RATE); // при использовании Glediator через usb
Serial.begin (115200);для (int y = 0; y светодиоды [y] = CRGB (0,0,0); // установить все светодиоды на черный во время установки
>
// FastLED.show();pinMode (10, ВЫХОД); // CS / SS
digitalWrite (10, HIGH); //if (! SD.begin (4))
возвращение;
>// тестовый файл открыт
fxdata = SD.open («1.out»); // только для чтения
if (fxdata)
fxdata.close ();
>
>int serialGlediator ()
while (! Serial.available ()) <>
return Serial.read ();
>fxdata = SD.open (String (val) + «. out»); //
if (fxdata)
>while (fxdata.available ())
fxdata.readBytes ((char *) светодиоды, NUM_LEDS * 3);
ledSort (4); // 1-4 возможно, установите позицию вашего первого светодиода. Измените число: 1 = TL (вверху слева), 2 = TR (вверху справа), 3 = BL (внизу слева), 4 = BR (внизу справа)
FastLED.show();
задержка (50); // установить скорость анимации. 20 — около 500 кбод
>// закрываем файл, чтобы предотвратить зависание ввода-вывода или подобное
fxdata.close ();
>
>
int ledSort (int modus)/ 1 = TL, 2 = TR, 3 = BL, 4 = BR, эта функция переставит массив светодиодов ;-)
LEDdata tmp [x]; // CRGB tmp [x];
if (modus == 3 || modus == 4)для (int i = 0; i <(y / 2); i ++) <
для (int j = 0; j tmp [j] = leds [i * x + j];
leds [i * x] = leds [(y — i — 1) * x];
светодиоды [(y — i — 1) * x] = tmp [j];
>
>
>// if (modus == 1 || modus == 3) // for (int i = 1; i
0; j—) // tmp [(x — j)] = leds [i * x + j — 1];
// >
// for (int j = 0; j// >
// >
//
// >if (modus == 2 | modus == 4) для (int i = 0; i
0; j—) tmp [(x — j)] = светодиоды [i * x + j — 1];
>
для (int j = 0; j>
>Изменено: 1 Май 2020
Старик Похабыч
14 Авг 2019 4,063 1,261 Москва
Отредактируй сообщение. сделай код как положено: на панели есть символ : три точки и стрелка вниз, справа от смайлика. Там выбирай код, и в код вставь скетч.
Алексей22
25 Фев 2020 41 0 64
#include #include #include #define NUM_LEDS 289 // #define DATA_PIN 6 // #define REPLACE_FASTLED // пункт 0 #define COLOR_DEBTH 3 // пункт 1 #define CHIPSET WS2811 // #define CMD_NEW_DATA 1 #define BAUD_RATE 115200// unsigned char x = 17; // matrix x size unsigned char y = 17; // matrix y size #define COLOR_ORDER GRB #define BRIGHTNESS 50 int count_files = 15; // File fxdata; LEDdata leds[NUM_LEDS]; //CRGB leds[NUM_LEDS]; 4) Заменить CRGB на LEDdata при создании буфера microLED strip(leds, NUM_LEDS, DATA_PIN); // 5) Создать объект ленты microLED int val; void setup() < //FastLED.addLeds(leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); //FastLED.setBrightness(BRIGHTNESS); Serial.begin(BAUD_RATE); // when using Glediator via usb Serial.begin(115200); for(int y = 0 ; y < NUM_LEDS ; y++) < leds[y] = CRGB(0,0,0); // set all leds to black during setup >// FastLED.show(); pinMode(10, OUTPUT); // CS/SS digitalWrite(10, HIGH); // if (!SD.begin(4)) < return; >// test file open fxdata = SD.open("1.out"); // read only if (fxdata) < fxdata.close(); >> int serialGlediator () < while (!Serial.available()) <>return Serial.read(); > void loop() < for(val = 1; val while (fxdata.available()) < fxdata.readBytes((char*)leds, NUM_LEDS*3); ledSort(4); //1-4 possible, set your first LED's position. Change the number: 1=TL(top left),2=TR(top right),3=BL(bottom left),4=BR(bottom right) FastLED.show(); задержка (50); // установить скорость анимации. 20 - около 500 кбод >// закрываем файл, чтобы предотвратить зависание ввода-вывода или подобное fxdata.close (); > > int ledSort (int modus)/ 1 = TL, 2 = TR, 3 = BL, 4 = BR, эта функция переставит массив светодиодов ;-) LEDdata tmp [x]; // CRGB tmp [x]; if (modus == 3 || modus == 4) < для (int i = 0; i <(y / 2); i ++) < для (int j = 0; j> > // if (modus == 1 || modus == 3) < // for (int i = 1; i 0; j--) < // tmp [(x - j)] = leds [i * x + j - 1]; // >// for (int j = 0; j // > // // > if (modus == 2 | modus == 4) < для (int i = 0; i 0; j--) < tmp [(x - j)] = светодиоды [i * x + j - 1]; >для (int j = 0; j > > возврат 1; >[/КОД] Старик Похабыч
14 Авг 2019 4,063 1,261 Москва
Скетч нужен рабочий или тот, что пытался исправить, но не с переводом операторов на русский язык. Если памяти не хватает, то сложно назвать твоим косяком. Ну возьми мегу напримере, там памяти поболее будет
Алексей22
25 Фев 2020 41 0 64
#include #include #include #define NUM_LEDS 100 // LED number #define DATA_PIN 6 // your data arduino pin #define CHIPSET WS2811 // your LED chip type #define CMD_NEW_DATA 1 #define BAUD_RATE 500000 //if using Glediator via serial unsigned char x = 10; // matrix x size unsigned char y = 10; // matrix y size #define COLOR_ORDER GRB #define BRIGHTNESS 150 int count_files = 15; // Количество файлов File fxdata; CRGB leds[NUM_LEDS]; int val; void setup() < FastLED.addLeds(leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); FastLED.setBrightness(BRIGHTNESS); Serial.begin(BAUD_RATE); // when using Glediator via usb Serial.begin(115200); for(int y = 0 ; y < NUM_LEDS ; y++) < leds[y] = CRGB::Black; // set all leds to black during setup >FastLED.show(); pinMode(10, OUTPUT); // CS/SS pin as output for SD library to work. digitalWrite(10, HIGH); // workaround for sdcard failed error. if (!SD.begin(4)) < Serial.println("sdcard initialization failed!"); return; >Serial.println("sdcard initialization done."); // test file open fxdata = SD.open("1.out"); // read only if (fxdata) < Serial.println("file open ok"); fxdata.close(); >> int serialGlediator () < while (!Serial.available()) <>return Serial.read(); > void loop() < for(val = 1; val while (fxdata.available()) < fxdata.readBytes((char*)leds, NUM_LEDS*3); ledSort(4); //1-4 possible, set your first LED's position. Change the number: 1=TL(top left),2=TR(top right),3=BL(bottom left),4=BR(bottom right) FastLED.show(); delay(50); // set the speed of the animation. 20 is appx ~ 500k bauds >// close the file in order to prevent hanging IO or similar throughout time fxdata.close(); > > int ledSort (int modus) < //1=TL,2=TR,3=BL,4=BR, this function will rearrange the led array ;-) CRGB tmp[x]; if(modus == 3 || modus == 4) < for(int i = 0; i < (y / 2);i++) < for(int j = 0; j < x;j++) < tmp[j] = leds[i * x + j]; leds[i * x] = leds[(y - i - 1) * x]; leds[(y - i - 1) * x] = tmp[j]; >> > // if(modus == 1 || modus == 3) < // for(int i = 1; i < y; i = i + 2) < // for(int j = x; j >0;j--) < // tmp[(x - j)] = leds[i * x + j - 1]; // >// for(int j = 0; j < x;j++) < // leds[i * x + j] = tmp[j]; // >// > // // > if(modus == 2 | modus == 4) < for(int i = 0; i < y; i = i + 2) < for(int j = x; j >0;j--) < tmp[(x - j)] = leds[i * x + j - 1]; >for(int j = 0; j < x;j++) < leds[i * x + j] = tmp[j]; >> > return 1; >Этот код работает на 120 диодах. Так что вариантов нет что то сделать с НАНО?
Скетч нужен рабочий или тот, что пытался исправить, но не с переводом операторов на русский язык. Если памяти не хватает, то сложно назвать твоим косяком. Ну возьми мегу напримере, там памяти поболее будет