Доброго здравия всем! Подскажите пожалуйста Могут ли на ардуино работать два объекта библиотеки SoftwareSerial ? Возникла проблема. Создал объект keySerial и RX_Serial Задача такая на одном сидит блютус модуль и принимает команды с приложения а второй шлет данные на другую ардуинку когда включены вместе RX_Serial работает а вот keySerial не реагирует почему? в отдельности все работает как надо Код (C++): #include <EEPROM.h> #include <SoftwareSerial.h> SoftwareSerial keySerial(9, 10); // Создаём объект softSerial указывая выводы RX, TX SoftwareSerial RX_Serial(14, 15); // Создаём объект softSerial указывая выводы RX, TX #include <Wire.h> // Библиотека iarduino_RTC будет использовать методы и функции библиотеки Wire. // #include <iarduino_RTC.h> // Подключаем библиотеку iarduino_RTC для работы с модулями реального времени. iarduino_RTC time(RTC_DS3231); // Объявляем объект time для работы с RTC модулем на базе чипа DS3231, используется аппаратная шина I2C #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); //SDA - А4 ,SCL - А5 int data_tx_int[5] ; int tx_count; int DataOut[] = {0, 0, 0, 0, 0}; // размер окна; byte key() { if (keySerial.available()) { int valserial = keySerial.read(); if (valserial == 'W') { return 3; // вверх } else if ( valserial == 'S') { return 4; //низ } else if ( valserial == 'A') { return 2; // лево } else if ( valserial == 'D') { return 5; // право } else if ( valserial == 'B') { return 1; // центр } } else return 0; } bool alarm_FLAG1 = true; // разрешение работы bool alarm_FLAG2 = false; uint8_t ON_alarm[] = {0, 0}; uint8_t OFF_alarm[] = {0, 0}; uint8_t HOUR = 12; uint8_t MIN = 45; uint8_t Day = 17; uint8_t Month = 02; uint8_t Year = 20; uint8_t Weekday = 1; #define beeper_pin 6 // пищалка byte flagbeep = 0; long previousMillis = 0; void beeper(int duration) { if (flagbeep == 1) { tone(beeper_pin, 1850, duration); } } void setup() { // time.settime(0,15,21,17,02,20,1); // установить время: сек, мин, часа, день, месяц, год, день недели - суббота // EEPROM.write(4, 1); EEPROM.write(0, 10); EEPROM.write(1, 22); EEPROM.write(2, 22); EEPROM.write(3, 15); EEPROM_int_write(6, 400); // Serial.begin(9600); pinMode(beeper_pin, OUTPUT); keySerial.begin(38400); RX_Serial.begin(1200); lcd.init(); // Инициализация дисплея lcd.clear(); lcd.backlight(); delay(300); // Ждем готовности модуля отвечать на запросы // Инициируем передачу данных в монитор последовательного порта на скорости 9600 бод. time.begin(); } void loop() { byte KEY = key(); if ( KEY == 0) { flagbeep = 0; } if (( KEY == 1) || ( KEY == 2) || (KEY == 4) || (KEY == 3) || (KEY == 5)) { flagbeep = 1 ; beeper(30); } //***************************************************************** if (millis() - previousMillis > 1000) { previousMillis = millis(); lcd.setCursor(0, 0); lcd.print(time.gettime("H-i-s")); lcd.setCursor(10, 0); //************************** lcd.setCursor(0, 1); lcd.print(time.gettime("d-m-Y")); lcd.setCursor(11, 1); lcd.print("tOn:"); lcd.setCursor(15, 1); if (tx_count < 12) { Write_Serial(); } else { tx_count++; } if (tx_count > 500) { tx_count = 0; } delay(1); } } void Write_Serial () { data_tx_int[0] = DataOut[0] ; data_tx_int[1] = DataOut[1]; data_tx_int[2] = DataOut[2]; data_tx_int[3] = DataOut[3]; data_tx_int[4] = DataOut[4]; if (tx_count == 0) { RX_Serial.print("."); } RX_Serial.write((byte *)data_tx_int, sizeof(data_tx_int)); tx_count++; }
могут, но такое использование не для новичков. Нужно при каждом обращении к одному СофтСериалу выключать второй и наоборот. В вашем случае я не вполне понимаю, зачем вам два СофтСериала? Во-первых, что у вас за Ардуино? - Уно, Мега? Пусть Уно. Допустим вам надо подключить одновременно блютуз и другую ардуинку. - включите одно устройство, например блютуз - на аппаратный Сериал на пины 0 и 1, а вторую ардуину - на СофтСериал на выбранных пинах. И все будет работать. Если же Мега - вам вообще не нужны СофтСерииалы, на Меге несколько аппаратных - Serial1 Serial2 и тд