App inventor блютус управление

Тема в разделе "Arduino & Shields", создана пользователем sanik, 26 май 2021.

  1. sanik

    sanik Гик

    Помогите пожалуйста с управлением Сделал приложение и написал код все вроде работает но иногда после регулировки ползунками кнопки срабатывают с трудом Может я не правильно метку ползунка отправляю. Так как загрузил скетч SoftwareSerialExample кнопки отрабатывают четко а с ползунков приходит что то непонятное Хотя значения типа EpromSpeed[0] меняются как положено. Блоки Inventor на скриншоте
    Код (C++):
    #include <SoftwareSerial.h>
    SoftwareSerial softSerial(2, 3);

    byte key() {
      if (softSerial.available()) {
        int valserial = softSerial.read();
        if (valserial == 'W') { //Up
          return 1;
        }
        else if ( valserial == 'S') { //Down
          return 2;
        }
        else if ( valserial == 'A') { //Left
          return 3;
        }
        else if ( valserial == 'D') { //Right
          return 4;
        }
        else if ( valserial == 'B') { // Set
          return 5;
        }
        else if ( valserial == 'T') { // DolRight
          return 6;
        }
        else if ( valserial == 'R') { //DolLeft
          return 7;
        }
        else if ( valserial == 'L') {  //PanRight
          return 8;
        }
        else if ( valserial == 'Y') { //PanLeft
          return 9;
        }
        else if ( valserial == 'G') { //TiltUp
          return 10;
        }
        else if ( valserial == 'J') { //TiltDown
          return 11;
        }
        else if ( valserial == 'K') { //Calibration
          return 12;
        }
        else if ( valserial == 'Z') {
          EpromSpeed[0] = softSerial.read();
          return 20;
        }
        else if ( valserial == 'P') {
          EpromAcceleration[0] = softSerial.read();
          return 21;
        }
        else if ( valserial == 'U') {
          EpromSpeed[1] = softSerial.read();
          return 22;
        }
        else if ( valserial == 'V') {
          EpromAcceleration[1] = softSerial.read();
          return 23;
        }
        else if ( valserial == 'I') {
          EpromSpeed[2] = softSerial.read();
          return 24;
        }
        else if ( valserial == 'Q') {
          EpromAcceleration[2] = softSerial.read();
          return 25;
        }
       // delay(1);
      } else  return 0;
    }
    void setup() {
      Serial.begin(9600);

      softSeria.begin(38400);
    }

    void loop() {
      Serial.print("SPEED");
      Serial.println(EpromSpeed[1]);
      Serial.print("KEY");
      Serial.println(KEY);
    }
    https://disk.yandex.ru/i/ln52xj_FfLUl4Q

    [​IMG]
     
  2. sanik

    sanik Гик

    Что я делаю не так? Помогите с протоколом приема! Проверяю SoftwareSerialExample приходит как положено метка разделитель значение и конц строки 6$108; А в скетче меняется только первое значение и то криво.
    Код (C++):
    #include <SoftwareSerial.h>
    SoftwareSerial softSerial(2, 3);

    int EpromAcceleration[] = {0, 0, 0};
    int EpromSpeed[] = {0, 0, 0};

    char divider = '$';
    char ending = ';';
    const char *headers[]  = {
      "slide1",   // 0
      "slide2",   // 1
      "slide3",   // 2
      "slide4",   // 3
      "slide5",    // 4
      "slide6",    // 5
    };
    enum names {
      SLAIDER1,   // 0
      SLAIDER2,   // 1
      SLAIDER3,   // 2
      SLAIDER4,   // 3
      SLAIDER5,    // 4
      SLAIDER6,    // 5
    };
    names thisName;
    byte headers_am = sizeof(headers) / 2;
    uint32_t prsTimer;
    String prsValue = "";
    String prsHeader = "";
    enum stages {WAIT, HEADER, GOT_HEADER, VALUE, SUCCESS};
    stages parseStage = WAIT;
    boolean recievedFlag;

    void parsingSeparate() {
      if (softSerial.available() > 0) {
        if (parseStage == WAIT) {
          parseStage = HEADER;
          prsHeader = "";
          prsValue = "";
        }
        if (parseStage == GOT_HEADER)
          parseStage = VALUE;
        char incoming = (char)softSerial.read();
        if (incoming == divider) {
          parseStage = GOT_HEADER;
        }
        else if (incoming == ending) {
          parseStage = SUCCESS;
        }
        if (parseStage == HEADER)
          prsHeader += incoming;
        else if (parseStage == VALUE)
          prsValue += incoming;
        prsTimer = millis();
      }
      if (parseStage == SUCCESS) {
        for (byte i = 0; i < headers_am; i++) {
          if (prsHeader == headers[i]) {
            thisName = i;
          }
        } recievedFlag = true; parseStage = WAIT;
      } if ((millis() - prsTimer > 50) && (parseStage != WAIT)) {    // таймаут
        parseStage = WAIT;
      }
    }
    byte key() {
      if (softSerial.available()) {
        int valserial = softSerial.read();
        if (valserial == 'W') { //Up
          return 1;
        }
        else if ( valserial == 'S') { //Down
          return 2;
        }
        else if ( valserial == 'A') { //Left
          return 3;
        }
        else if ( valserial == 'D') { //Right
          return 4;
        }
        else if ( valserial == 'B') { // Set
          return 5;
        }
        else if ( valserial == 'T') { // DolRight
          return 6;
        }
        else if ( valserial == 'R') { //DolLeft
          return 7;
        }
        else if ( valserial == 'L') {  //PanRight
          return 8;
        }
        else if ( valserial == 'Y') { //PanLeft
          return 9;
        }
        else if ( valserial == 'G') { //TiltUp
          return 10;
        }
        else if ( valserial == 'J') { //TiltDown
          return 11;
        }
        else if ( valserial == 'K') { //Calibration
          return 12;
        } else {
          parsingSeparate();
        }
      } else  return 0;
    }
    void setup() {
      softSerial.begin(38400);
      Serial.begin(9600);
    }
    void loop() {
      byte KEY = key();
      if (KEY != 0) {
        Serial.print("KEY= ");
        Serial.println(KEY);
      }
     
      if (recievedFlag) {
        recievedFlag = false;
        switch (thisName) {
          case SLAIDER1:
            EpromSpeed[0] = prsValue.toInt();
            Serial.print("slide1 ");
            Serial.println(EpromSpeed[0]);
            break;
          case SLAIDER2:
            EpromAcceleration[0] = prsValue.toInt();
            Serial.print("slide2 ");
            Serial.println(EpromAcceleration[0]);
            break;
          case SLAIDER3:
            EpromSpeed[1] = prsValue.toInt();
            Serial.print("slide3 ");
            Serial.println(EpromSpeed[1]);
            break;
          case SLAIDER4:
            EpromAcceleration[1] = prsValue.toInt();
            Serial.print("slide4 ");
            Serial.println(EpromAcceleration[0]);
            break;
          case SLAIDER5:
            EpromSpeed[2] = prsValue.toInt();
            Serial.print("slide5 ");
            Serial.println(EpromSpeed[2]);
            break;
          case SLAIDER6:
            EpromAcceleration[2] = prsValue.toInt();
            Serial.print("slide6 ");
            Serial.println(EpromAcceleration[2]);
            break;
        }
      }
    }
     
     
  3. Feofan

    Feofan Нерд

    1. <thisName = i;> thisName это enum, i это byte. Так можно? Об этом компилятор должен предупреждать.
    2. Красота c return в <byte key()> может вернуть ничего. Скорее всего и тут компилятор ругается.
    3. Не факт, что после исправления 1 и 2 все заработает.
     
  4. sanik

    sanik Гик

    Спасибо! Что интересно компилятор не ругается и даже работает только вот криво.
     
  5. Feofan

    Feofan Нерд

    Может надо включить "Сообщения компилятора"?
     
  6. sanik

    sanik Гик

    Все спасибо! За подсказку запустил. Немного коды изменил.