Макрос для print()
При разработке программ для Arduino очень часто требуется использовать функцию вывода в сериальный порт Serial.print(). При отсутствии удобного отладчика функция print() остается единственным способом понять, где в программе ошибка, вывести значения переменных а также убедиться, что библиотечные функции отработали правильно и вернули корректные значения. Все бы хорошо, но когда программа отлажена и вроде бы даже правильно работает, оставлять весь этот мусор ну совсем не хочется. И вот вы потратили время на удаление всех строчек вывода. Но через какое-то время программа потребовала небольшой доработки и снова заработала некорректно. Приходится возвращать все вызовы print() и так далее.
Так вот, есть неплохое решение:
#include <Arduino.h>
...
#define DEBUG 0
#define debug_println(a) { if (DEBUG) Serial.println(a); };
#define debug_print(a) { if (DEBUG) Serial.print(a); };
...
void setup()
{
...
if (DEBUG) {
Serial.begin(9600);
}
...
}
...
void loop()
{
debug_println("Begin function loop()");
...
}
Смысл заключается в создании макросов и объявлении константы DEBUG. Если константа принимает ненулевое значение, то все функции debug_println() и debug_print() в коде будут заменены на привычные Serial.println() и Serial.print(), а также будет вызвана функция Serial.begin(), если же в константу DEBUG записать 0, то отладка будет выключена. Довольно удобный способ, не правда ли?
Использование #define
Директиву #define вообще полезно применять в коде. Вроде как на первый взгляд нет разницы:
...
const int pin = 2;
...
или
...
#DEFINE PIN 2;
...
Однако во втором случае мы не потратим память на переменную pin, а также код будет работать чуть быстрее, потому что препроцессором все вхождения PIN в коде будут заменены на значение (в нашел случае на 2).