Освой 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].
Дальше идёт сложный код, который я не изучал толком. Главное, что работает.