Содержание

Эксперимент 19. Светильник, управляемый по USB

← Тестер батареек | Оглавление | Перетягивание каната →

В этом эксперименте мы отправляем устройству команды, как ему светить.

Список деталей для эксперимента

Принципиальная схема

Схема на макетке

Скетч

p190_serial_brightness.ino
#define LED_PIN 9
// для работы с текстом существуют объекты-строки (англ. string)
String message;
 
void setup()
{
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(9600);
}
 
void loop()
{
  // передаваемые с компьютера данные поставляются байт за
  // байтом, в виде отдельных символов (англ. character). Нам
  // нужно последовательно их обрабатывать пока (англ. while)
  // в порту доступны (англ. available) новые данные
  while (Serial.available()) {  
    // считываем (англ. read) пришедший символ в переменную
    char incomingChar = Serial.read();
    // не стоит путать целые числа и символы. Они соотносятся
    // друг с другом по таблице, называемой кодировкой. Например
    // '0' — это 48, '9' — 57, 'A' — 65, 'B' — 66 и т.п. Символы
    // в программе записываются в одинарных кавычках
    if (incomingChar >= '0' && incomingChar <= '9') {
      // если пришёл символ-цифра, добавляем его к сообщению
      message += incomingChar;
    } else if (incomingChar == '\n') {
      // если пришёл символ новой строки, т.е. enter, переводим
      // накопленное сообщение в целое число (англ. to integer).
      // Так последовательность символов '1', '2', '3' станет
      // числом 123. Результат выводим на светодиод
      analogWrite(LED_PIN, message.toInt());
      // обнуляем накопленное сообщение, чтобы начать всё заново
      message = "";
    }
  }
  // посылайте сообщения-числа с компьютера через Serial Monitor
}

Пояснения к коду

Вопросы для проверки себя

  1. Какие объекты позволяют легко манипулировать текстовыми данными?
  2. Что возвращают методы Serial.available() и Serial.read()?
  3. Чем отличаются конструкции for и while?
  4. Каким образом можно организовать более сложное ветвление, чем if … else?
  5. Как можно объединить текстовые строки?
  6. Как можно привести текстовую строку, содержащую цифры, к числовому типу?

Задания для самостоятельного решения

  1. Проверьте, попадает ли переданное число в диапазон значений, которые нужно передавать в analogWrite(). Передайте на компьютер сообщение об ошибке, если нет.
  2. Переделайте программу так, чтобы устройство распознавало текстовые команды, например, «on» и «off», и соответственно включало и выключало светодиод.

Вам может пригодиться один из методов String: toLowerCase(yourString) или toUpperCase(yourString), которые возвращают переданную строку yourString, приведенную к нижнему или верхнему регистру соответственно.


← Тестер батареек | Оглавление | Перетягивание каната →