Как объединить два скетча в один
Перейти к содержимому

Как объединить два скетча в один

  • автор:

Помогите объединить 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])

      Как объединить два скетча в один

      Как то не удобно обзовись по имени, а то Хотабыч. Извени конечно за наглость , но что с этим делать? Где и как это можно объявить.

      Вложения

      Снимок2.JPG

      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аверное надоел уже, представления не имею что в этой области обьявить

      Вложения

      Снимок3.JPG

      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];
      это написано в инструкции перевода
      Че то у меня получился замкнутый круг, перекинулась ошибка на пред строку?

      Вложения

      Снимок4.JPG

      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 50

      int 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) 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) > > // 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 диодах. Так что вариантов нет что то сделать с НАНО?

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *