Освой Arduino играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Управляем светодиодами с клавиатуры

Для примера понадобятся три светодиода - красный, зелёный, синий.

Мы будем посылать команды с клавиатуры, задавая цвет и яркость светодиода. Поэтому выбирайте выводы с тильдой, в нашем примере 9, 10, 11.

Светодиоды размещаются стандартным образом (не забываем про резисторы). Скетч достаточно большой, взял готовый из интернета.


char buffer[18];
int red, green, blue;
int redPin = 11; // вывод 11 для красного светодиода
int greenPin = 10; // вывод 10 для зелёного светодиода
int bluePin = 9; // вывод 9 для синего светодиода

void setup()
{
  Serial.begin(9600);
  Serial.flush();
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
}

void loop()
{
  if (Serial.available() > 0) {
    int index = 0;
    delay(100); // let the buffer fill up
    int numChar = Serial.available();
    if (numChar > 15) {
      numChar = 15;
    }
    while (numChar--) {
      buffer[index++] = Serial.read();
    }
    splitString(buffer);
  }
}

void splitString(char* data) {
  Serial.print("Data entered: ");
  Serial.println(data);
  char* parameter;
  parameter = strtok (data, " ,");
  while (parameter != NULL) {
    setLED(parameter);
    parameter = strtok (NULL, " ,");
  }
  // Clear the text and serial buffers
  for (int x = 0; x < 16; x++) {
    buffer[x] = '\0';
  }
  Serial.flush();
}

void setLED(char* data) {
  if ((data[0] == 'r') || (data[0] == 'R')) {
    int answer = strtol(data + 1, NULL, 10);
    answer = constrain(answer, 0, 255);
    analogWrite(redPin, answer);
    Serial.print("Red is set to: ");
    Serial.println(answer);
  }
  if ((data[0] == 'g') || (data[0] == 'G')) {
    int answer = strtol(data + 1, NULL, 10);
    answer = constrain(answer, 0, 255);
    analogWrite(greenPin, answer);
    Serial.print("Green is set to: ");
    Serial.println(answer);
  }
  if ((data[0] == 'b') || (data[0] == 'B')) {
    int answer = strtol(data + 1, NULL, 10);
    answer = constrain(answer, 0, 255);
    analogWrite(bluePin, answer);
    Serial.print("Blue is set to: ");
    Serial.println(answer);
  }
}

Загрузите скетч, откройте Serial Monitor и введите команду R100. У вас должен загореться красный светодиод в половину своей яркости. Формат команды: первый символ (три варианта: R, G, B) в любом регистре отвечает за цвет , а затем идёт число от 0 до 255. Если вы введёте по ошибке большее число, то ошибки не будет, число будет урезано. Вводить команды можно по отдельности, а также вместе через пробел или запятую. Примеры команд.


r255 b100
r127 b127 g127
G255, B0
B127, R0, G255

В переменной buffer содержится массив из 18 символов. Это с лихвой достаточно для самой длинной команды с клавиатуры, чтобы управлять тремя светодиодами.

Далее создаём переменные для управления цветом и назначаем выводы платы под светодиоды. Используем выводы с тильдой, чтобы задавать различную интенсивность яркости.

В setup() запускаем монитор для считывания данных и устанавливаем режимы для выводов платы. Также сбрасываем буфер монитора от лишних символов на всякий случай (flush()).

Функция loop() начинается с проверки на наличие данных (available()). Если данные есть, то начинаем их обрабатывать.

Если мы пошлём команду R255, G255, B255, то значение numChar будет равно 17 - 16 символов и невидимый символ NULL, обозначающий конец строки. Если длина строки numChar будет больше, чем 15, то устанавливаем равным 15, чтобы не выйти за границу массива buffer[18].

Дальше идёт сложный код, который я не изучал толком. Главное, что работает.

Реклама