Эксперемент 19. Задание2.

Тема в разделе "Флудилка", создана пользователем Oleg_duino, 3 июл 2015.

  1. Oleg_duino

    Oleg_duino Нерд

    Помогите пожалуйста, с заданием:Переделайте программу так, чтобы устройство распознавало текстовые команды, например, «on» и «off», и соответственно включало и выключало светодиод.
    C начала начну, пожалуй с команд "High" и "Low", а «on» и «off», потом условием поставлю! У меня где-то ошибка, а не пойму где...Код...


    #define LED_PIN 9

    String message;

    void setup()
    {
    pinMode(LED_PIN, OUTPUT);
    Serial.begin(9600);
    }
    void loop()
    {
    while (Serial.available()) {
    char incomingChar = Serial.read();
    if ('a' <= incomingChar && incomingChar <='z') {
    message += incomingChar;
    } else if (incomingChar == '\n')
    digitalWrite(LED_PIN, message.toLowerCase());
    message = "";
    }
    }
    }

    Компилятор выдаёт ошибку: error: invalid use of void expression(Ошибка: неправильное использование пустот выражения)!Что это значит???
    Может я не правильно использую метод "message.toLowerCase()"?
     
  2. ИгорьК

    ИгорьК Гуру

    Метод Вы используете не правильно, уже по той причине, что пытаетесь перевести сообщение не в верхний регистр, а в нижний.
    Но даже это не поможет, потому что выражение digitalWrite(pin, value) принимает либо HIGH и LOW в момент написания программы для замены их компилятором, либо 0 либо 1(да и вообще любые числа) как значения переменных для работы с ними во время программы.
     
  3. DrProg

    DrProg Вечный нерд

    Есть же хороший пример получения данных из COM порта и использования их как угодно. Можно разобраться и переписать под любую задачу.
     
  4. Oleg_duino

    Oleg_duino Нерд

    Ну, да! Я как раз с ним и разбираюсь!И как раз у меня вопрос, почему компилятор выделяет мне строчку

    digitalWrite(LED_PIN, message.toUpperCase());

    и выдаёт ошибку: invalid use of void expression(Ошибка: неправильное использование пустот выражения)! Что это значит? О каких пустотах он говорит???

    С верхним регистром тоже самое!
    Это я понимаю! Я спрашиваю об ошибке " invalid use of void expression"!
     
  5. Unixon

    Unixon Оракул Модератор

    В классе String метод toUpperCase определен как "void toUpperCase(void);", т.е. метод преобразует саму строку и не возвращает никакого результата. Следовательно, использовать его нужно так:
    Код (Text):

    message.toUpperCase();
     
    Но что эта строчка делает у вас в параметрах digitalWrite(), как она там вообще оказалась?
     
  6. Oleg_duino

    Oleg_duino Нерд

    Да, действительно! Ошибка, в неправильном использовании. Всё теперь, я розобрался! В принципе ничего сложного, но нужно было почитать дополнительную информацию по классу String, и по его функциям. В самом эксперементе № 19, плохо описана эта тема, я несильно понял. Пришлось навёрстывать тут...

    http://arduino.ua/ru/prog/

    И ещё долго промучился, с тем что забыл считать символ "\n"(enter, символ новой строки). И таки думал почему условие if (message == "ON") не выполняеться, оказалось if (message == "ON\n") - всё решило!

    Спасибо, всем кто ответил!
     
  7. Unixon

    Unixon Оракул Модератор

    Только это неправильный способ. Нужно поменять условие в цикле чтения строки, чтобы символ перевода строки не оказывался внутри нее.
     
  8. Oleg_duino

    Oleg_duino Нерд

    Ага, спасибо! Разобрался!