РЕШЕНО Преобразование string в byte

Тема в разделе "Arduino & Shields", создана пользователем Valera_gug, 8 авг 2016.

Статус темы:
Закрыта.
  1. Valera_gug

    Valera_gug Нерд

    Доброго дня столкнулся с проблемой - посылаю на сдвиговой регистр байт через shiftOut B10101000,
    но смысл в том, чтобы собрать этот байт в зависимости от внешних переменных, например вот таким куском кода
    Код (C++):
    if (s1==0){
        String c="B0";
        String k="1";
        c="00"+k+"0000";
        }
    Как мне преобразовать String в byte
     
  2. DIYMan

    DIYMan Guest

    Байт собирается не в строку, а в byte.
     
  3. ostrov

    ostrov Гуру

    Зачем вообще сначала собирать в String? Этот тип последнее, что нужно использовать, когда другое или нельзя или очень трудно.
     
  4. Valera_gug

    Valera_gug Нерд

    Может тогда подскажете как мне подготовить байт для отправки на регистр 74hc595.
    смысл в том что я получаю данные, на основании которых должны зажигаться определенные светодиоды на ножках регистра.
     
  5. Zamuhrishka

    Zamuhrishka Нуб

    Возможно я ошибусь, но может как-то так:

    Код (C++):
    char i = 0xF0;
    Serial.print(i, HEX);
     
  6. ostrov

    ostrov Гуру

    Откуда данные приходят и в каком виде?
     
  7. CryNET

    CryNET Гик

    По сабжу:

    Код (C++):
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);

      String s = "B01100001"; // 'a' in ascii
      byte result = 0;

      int val = 0;
      for (int i = s.length() - 1; i > 0; i--)
      {
        if (s[i] == '1')
          result += (byte) (1 << val);
        val++;
      }

      Serial.println((char) result);
    }

    void loop() {
      // put your main code here, to run repeatedly:
    }
    Букву "B" в строке не дочитывает цикл, поэтому она должна быть в начале строки (!)
    Если без неё, типо шоб String s = "01100001", то i >= 0 поправьте.
     
  8. Valera_gug

    Valera_gug Нерд

    Решил проблему.
    Вот скетч.
    Может кому пригодится
    Код (C++):
    /*Скетч парсит строку и по данным зажигает светодиоды через сдвиговой регистр 74hc595*/
    const int latchPin = 2;
    const int clockPin = 3;
    const int dataPin = 4;
    String Str = "2;3;0;2;3;0;1;2;2;2;3;1";
    /*
      0-off
      1-open
      2-closed
      3-prepearing
      /////
      так как на RGB-светодиоде используем только два цвета - Green и Red, то нам нужно для каждой полученной переменной из строки использовать две ноги сдвигового регистра
    */

    char buffer[20];
    int s1, s2, s3, s4, s5, s6, s7, s8, s9, s10,s11,s12;
    void setup() {
      pinMode(latchPin, OUTPUT);
      pinMode(clockPin, OUTPUT);
      pinMode(dataPin, OUTPUT);
      Serial.begin(9600);
      Serial.println("Starting");
      //Тушим светодиоды
      digitalWrite(latchPin, LOW);
    }
    void loop() {
      /*Разбираем строку на данные*/
      Str.toCharArray(buffer, 20);
      s1 = atoi(strtok(buffer, ";"));
      s2 = atoi(strtok(NULL, ";"));
      s3 = atoi(strtok(NULL, ";"));
      s4 = atoi(strtok(NULL, ";"));
      s5 = atoi(strtok(NULL, ";"));
      s6 = atoi(strtok(NULL, ";"));
      s7 = atoi(strtok(NULL, ";"));
      s8 = atoi(strtok(NULL, ";"));
      s9 = atoi(strtok(NULL, ";"));
      s10 = atoi(strtok(NULL, ";"));
      s11 = atoi(strtok(NULL, ";"));
      s12 = atoi(strtok(NULL, ";"));
      /*объявлем переменные для записи битов в байты для передачи в сдвиговой регистр 74hc959 #1*/
      int SR1_1, SR1_2, SR1_3, SR1_4, SR1_5, SR1_6, SR1_7, SR1_8, SR2_1, SR2_2, SR2_3, SR2_4, SR2_5, SR2_6, SR2_7, SR2_8, SR3_1, SR3_2, SR3_3,SR3_4, SR3_5, SR3_6, SR3_7, SR3_8;
      if (s1 == 0) {
        SR1_1 = 0;
        SR1_2 = 0;
      }
      if (s1 == 1) {
        SR1_1 = 0;
        SR1_2 = 1;
      }
      if (s1 == 2) {
        SR1_1 = 1;
        SR1_2 = 0;
      }
      if (s1 == 3) {
        SR1_1 = 1;
        SR1_2 = 1;
      }
      //
      if (s2 == 0) {
        SR1_3 = 0;
        SR1_4 = 0;
      }
      if (s2 == 1) {
        SR1_3 = 0;
        SR1_4 = 1;
      }
      if (s2 == 2) {
        SR1_3 = 1;
        SR1_4 = 0;
      }
      if (s2 == 3) {
        SR1_3 = 1;
        SR1_4 = 1;
      }
      //
      if (s3 == 0) {
        SR1_5 = 0;
        SR1_6 = 0;
      }
      if (s3 == 1) {
        SR1_5 = 0;
        SR1_6 = 1;
      }
      if (s3 == 2) {
        SR1_5 = 1;
        SR1_6 = 0;
      }
      if (s3 == 3) {
        SR1_5 = 1;
        SR1_6 = 1;
      }
      //
      if (s4 == 0) {
        SR1_7 = 0;
        SR1_8 = 0;
      }
      if (s4 == 1) {
        SR1_7 = 0;
        SR1_8 = 1;
      }
      if (s4 == 2) {
        SR1_7 = 1;
        SR1_8 = 0;
      }
      if (s4 == 3) {
        SR1_7 = 1;
        SR1_8 = 1;
      }
      /*объявлем переменные для записи битов в байты для передачи в сдвиговой регистр 74hc959 #2*/
        if (s5 == 0) {
        SR2_1 = 0;
        SR2_2 = 0;
      }
      if (s5 == 1) {
        SR2_1 = 0;
        SR2_2 = 1;
      }
      if (s5 == 2) {
        SR2_1 = 1;
        SR2_2 = 0;
      }
      if (s5 == 3) {
        SR2_1 = 1;
        SR2_2 = 1;
      }
      //
      if (s6 == 0) {
        SR2_3 = 0;
        SR2_4 = 0;
      }
      if (s6 == 1) {
        SR2_3 = 0;
        SR2_4 = 1;
      }
      if (s6 == 2) {
        SR2_3 = 1;
        SR2_4 = 0;
      }
      if (s6 == 3) {
        SR2_3 = 1;
        SR2_4 = 1;
      }
      //
      if (s7 == 0) {
        SR2_5 = 0;
        SR2_6 = 0;
      }
      if (s7 == 1) {
        SR2_5 = 0;
        SR2_6 = 1;
      }
      if (s7 == 2) {
        SR2_5 = 1;
        SR2_6 = 0;
      }
      if (s7 == 3) {
        SR2_5 = 1;
        SR2_6 = 1;
      }
      //
      if (s8 == 0) {
        SR2_7 = 0;
        SR2_8 = 0;
      }
      if (s8 == 1) {
        SR2_7 = 0;
        SR2_8 = 1;
      }
      if (s8 == 2) {
        SR2_7 = 1;
        SR2_8 = 0;
      }
      if (s8 == 3) {
        SR2_7 = 1;
        SR2_8 = 1;
      }
      /*объявлем переменные для записи битов в байты для передачи в сдвиговой регистр 74hc959 #3*/
        if (s9 == 0) {
        SR3_1 = 0;
        SR3_2 = 0;
      }
      if (s9 == 1) {
        SR3_1 = 0;
        SR3_2 = 1;
      }
      if (s9 == 2) {
        SR3_1 = 1;
        SR3_2 = 0;
      }
      if (s9 == 3) {
        SR3_1 = 1;
        SR3_2 = 1;
      }
      //
      if (s10 == 0) {
        SR3_3 = 0;
        SR3_4 = 0;
      }
      if (s10 == 1) {
        SR3_3 = 0;
        SR3_4 = 1;
      }
      if (s10 == 2) {
        SR3_3 = 1;
        SR3_4 = 0;
      }
      if (s10 == 3) {
        SR3_3 = 1;
        SR3_4 = 1;
      }
      //
      if (s11 == 0) {
        SR3_5 = 0;
        SR3_6 = 0;
      }
      if (s11 == 1) {
        SR3_5 = 0;
        SR3_6 = 1;
      }
      if (s11 == 2) {
        SR3_5 = 1;
        SR3_6 = 0;
      }
      if (s11 == 3) {
        SR3_5 = 1;
        SR3_6 = 1;
      }
      //
      if (s12 == 0) {
        SR3_7 = 0;
        SR3_8 = 0;
      }
      if (s12 == 1) {
        SR3_7 = 0;
        SR3_8 = 1;
      }
      if (s12 == 2) {
        SR3_7 = 1;
        SR3_8 = 0;
      }
      if (s12 == 3) {
        SR3_7 = 1;
        SR3_8 = 1;
      }
      //пишем биты в байт
      byte SR1=SR1_1|(SR1_2<<1)|(SR1_3<<2)|(SR1_4<<3)|(SR1_5<<4)|(SR1_6<<5)|(SR1_7<<6)|(SR1_8<<7);
      byte SR2=SR2_1|(SR2_2<<1)|(SR2_3<<2)|(SR2_4<<3)|(SR2_5<<4)|(SR2_6<<5)|(SR2_7<<6)|(SR2_8<<7);
      byte SR3=SR3_1|(SR3_2<<1)|(SR3_3<<2)|(SR3_4<<3)|(SR3_5<<4)|(SR3_6<<5)|(SR3_7<<6)|(SR3_8<<7);
      digitalWrite(latchPin, LOW);// открываем защелку для ввода информации
      shiftOut(dataPin, clockPin, MSBFIRST, SR3 );// побитово закружаем байт информации
      shiftOut(dataPin, clockPin, MSBFIRST , SR2 );// побитово закружаем байт информации
      shiftOut(dataPin, clockPin, MSBFIRST, SR1 );// побитово закружаем байт информации
      digitalWrite(latchPin, HIGH);// закрываем защелку
    delay(50000);
    }
     
  9. ostrov

    ostrov Гуру

    Адский адЪ.
     
    b707 и CryNET нравится это.
  10. CryNET

    CryNET Гик

    Это очень больно...
     
  11. Valera_gug

    Valera_gug Нерд

    Я только осваиваю ардуино.
    Если кто подскажет как оптимизировать код - буду признателен.
     
  12. DIYMan

    DIYMan Guest

    За настойчивость - респект, но не обижайтесь, плз - ТАКОЕ точно никому не пригодится. Это пишется раз в 10 короче и понятнее.
     
  13. Valera_gug

    Valera_gug Нерд

    Так я и не обижаюсь. Если подскажете как сократить код - буду очень благодарен
     
  14. DIYMan

    DIYMan Guest

    Массивы, циклы.
     
  15. CryNET

    CryNET Гик

    Пример:

    Код (C++):
    /*Пример вывода счетчика от 0 до 255 на сдвиговый регистр с последовательным вводом 74HC595.*/

    //**************************************************************//
    //  Name    : shiftOutCode, Hello World                         //
    //  Author  : Carlyn Maw,Tom Igoe                               //
    //  Date    : 25 Oct, 2006                                      //
    //  Version : 1.0                                               //
    //  Notes   : Code for using a 74HC595 Shift Register           //
    //          : to count from 0 to 255                            //
    //****************************************************************
    //Порт подключенный к ST_CP 74HC595
    int latchPin = 8;
    //Порт подключенный к SH_CP  74HC595
    int clockPin = 12;
    //Порт подключенный к DS 74HC595
    int dataPin = 11;
    void setup() {
      //устанавливаем режим порта выхода
      pinMode(latchPin, OUTPUT);
      pinMode(clockPin, OUTPUT);
      pinMode(dataPin, OUTPUT);
    }
    void loop() {
      for (int j = 0; j < 256; j++) {
        //устанавливаем LOW на latchPin пока не окончена передача байта
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, LSBFIRST, j);
        //устанавливаем HIGH на latchPin, чтобы проинформировать регистр, что передача окончена.
        digitalWrite(latchPin, HIGH);
        delay(1000);
      }
    }
     
    Источник - первая ссылка в гугле: http://arduino.ru/Reference/ShiftOut
    Из примеров выковыриваете то, что вам нужно и собираете кусками свой код. Самый простой способ в освоении...
     
  16. CryNET

    CryNET Гик

  17. serega_dgl

    serega_dgl Нуб

  18. DetSimen

    DetSimen Guest

    Ахтунг, некропостер detected...
     
    Igor68 нравится это.
  19. DetSimen

    DetSimen Гуру

    Это просто алгоритм феерического дебила.
    Оператор value |= (1<<5); установит 5й бит value без вышеперечисленных танцев с бубном
     
    issaom нравится это.
Статус темы:
Закрыта.