Softwareserial

Тема в разделе "Arduino & Shields", создана пользователем sanik, 18 ноя 2020.

  1. sanik

    sanik Гик

    Доброго здравия всем! Подскажите пожалуйста Могут ли на ардуино работать два объекта библиотеки 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++;
    }
     
     
  2. b707

    b707 Гуру

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

    В вашем случае я не вполне понимаю, зачем вам два СофтСериала? Во-первых, что у вас за Ардуино? - Уно, Мега?
    Пусть Уно. Допустим вам надо подключить одновременно блютуз и другую ардуинку. - включите одно устройство, например блютуз - на аппаратный Сериал на пины 0 и 1, а вторую ардуину - на СофтСериал на выбранных пинах. И все будет работать.
    Если же Мега - вам вообще не нужны СофтСерииалы, на Меге несколько аппаратных - Serial1 Serial2 и тд
     
    Последнее редактирование: 18 ноя 2020
  3. sanik

    sanik Гик

    Спасибо! сделал немного по другому Почитав понял в моем случае вариантов нет