Как изменить яркость светодиода в соответствии с цифрами?

Тема в разделе "Arduino & Shields", создана пользователем martin1987, 28 июл 2021.

Метки:
  1. b707

    b707 Гуру

    вы же вроде английский знаете? "write" никак не может быть использована для чтения...
     
  2. martin1987

    martin1987 Нерд

    Я имею в виду, что каждый раз, когда я нажимаю кнопку "+" или "-", будет возвращаться массив. Например, когда я нажимаю "+", число показывает 1, и то, что я вижу через последовательный порт, - A5 5A 06 83 00 01 01 00 01. Снова нажмите "+", число покажет 2, и то, что я вижу через последовательный порт, будет A5 5A 06 83 00 01 01 00 02.
    Затем я увидел этот пример на сайте Arduino:

    Код (C++):
    int ledPin = 9;      // LED connected to digital pin 9
    int analogPin = 3;   // potentiometer connected to analog pin 3
    int val = 0;         // variable to store the read value

    void setup() {
      pinMode(ledPin, OUTPUT);  // sets the pin as output
    }

    void loop() {
      val = analogRead(analogPin);  // read the input pin
      analogWrite(ledPin, val / 4); // analogRead values go from 0 to 1023, analogWrite values from 0 to 255
    }
    Здесь значение val, мне нужно прочитать последний бит моего массива.
    Это так?
     
  3. fogary

    fogary Гик

    Вы точно биты с байтами не перепутали?
     
  4. b707

    b707 Гуру

    вас правильно поправили выше - не бит. а байт
    В остальном ваш ход мысли верный.

    Совет - не надо вопросов про каждую запятую. старайтесь больше думать сами
     
  5. Sergku

    Sergku Нерд

    в таком случае, после получения строки, нужно ее сравнивать по условию и выдавать нужный пвм, примерно так
    Код (C++):
    inputString ; //строка с полученным значением кнопки
    pwmPin; // пин диода
    switch(inputString ){
      case "A5 5A 06 83 00 01 01 00 01":
        analogWrite(pwmPin, 10);
      break;
     
    case "A5 5A 06 83 00 01 01 00 02":
        analogWrite(pwmPin, 20);
      break;
    // и тд. и т.п
    }
     
    либо, парсить ее на последний символ, но это уже отдельная история.
     
    Последнее редактирование: 3 авг 2021
  6. b707

    b707 Гуру

    Sergku

    редкостная бредятина....

    Всего-то надо извлечь из строки последний символ и использовать его.
    И никакой "парсинг - это отдельная история" тут не нужен.
     
  7. Sergku

    Sergku Нерд

    об этом и идет речь - о последнем символе. просто потом у автора начнут меняться и 3 справа символы и т.п..
     
  8. b707

    b707 Гуру

    прежде чем спорить. попробуйте свой код откомпилировать
     
  9. Sergku

    Sergku Нерд

    да, через if надо.
     
  10. b707

    b707 Гуру

    не надо.
    Сравнивать целиком строки - это очень медленно и неэффективно.
    Кроме того., для такого сравнения нужно знать заранее все символы строки ВСЕХ ВОЗМОЖНЫХ СТРОК, а по условию задачи ТС интересн только последний байт.
    Придет вместо "A5 5A 06 83 00 01 01 00 02" строка "FF FF 06 83 00 01 01 00 02" - и ваш метод не сработает.

    В общем в итоге - минусы вашего метода - он длиннее. медленнее, жрет кучу памяти и работает через раз. А плюсов нет.
     
  11. akl

    akl Гуру

    смотря откуда и в каком виде приходят строки. не всегда можно точно понять где именно у строки последний или первый байт.
     
  12. b707

    b707 Гуру

    это отдельная проблема и метод Sergku ее никак не отменяет... если вы об этом
     
  13. Sergku

    Sergku Нерд

    не сработает, я в курсе. без деталей что там приходит - можно долго гадать.
     
  14. b707

    b707 Гуру

    да нет, даже с известными уже деталями ясно. что подход неверный :)

    Кроме того. строчки ТС вообще выглядят как текстовое представление HEX- может тут вообще String не нужен и проще работать с бинарными данными
     
  15. Sergku

    Sergku Нерд

    беда:) я предложил 2 варианта ифами или парсить (под парсить я имел ввиду извлечение нужного символа/ов, приведение его к байту/инту и т.п.)
     
  16. b707

    b707 Гуру

    нафига сначала собирать строку, потом ее парсить, и приводить символ к байту. если из Сериала СРАЗУ приходят БАЙТЫ?

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

    Sergku Нерд

    Где вы видите спор? Я предполагаю, что могут прийти и такие строки

    A55A06830001010002 и такая F55A06830001010002 и такая A55A068А0001010002

    и они могут нести разный смысл. Если гарантированно меняется только последний байт то да, я полностью согласен, что достаточно анализировать последний символ. Просто я делал одному парню: по кан шине приходили разнообразные подобные коды, так там проще было ифами перебрать, чем что то дергать склеивать и т.д.
     
  18. parovoZZ

    parovoZZ Гуру

    приходят, как сказала сова, БАЙТЫ. Это уже вы их ЗАЧЕМ-ТО интерепретируете как строки. Что мешает работать с байтами как с байтами? Зачем заставлять МК переводить понятные для него БАЙТЫ в другую сущность, затем из этой сущности опять переводить в байты, понятные для МК?
     
  19. Sergku

    Sergku Нерд

    да неважно в чем они приходят (char byte string) - под это все выделяется память, важно то какой они смысл несут (как их различить между собой), грубо говоря, в каком символе. Если только в последнем, то с этим все понятно (можно одним байтом памяти обойтись). А если в 3 в 5 или 7 байтах тогда что?
     
    Последнее редактирование: 3 авг 2021
  20. b707

    b707 Гуру

    вообще-то вы их преобразуете в HEXcode - то есть еще и теряете в памяти в два раза. кроме кучи лишних преобразований...