Ошибки программирования Arduino
Программирование Arduino отличается от программирования других встраиваемых систем легкостью и простотой понимания синтаксиса. Тем не менее, среди пользователей Arduino (особенно новичков) наблюдается распространенных ошибок программирования Arduino, о которых поговорим в данном материале.
Равенство и присвоение
При программировании на языке C или C++ очень распространенная ошибка заключается в том, что программист зачастую путает оператор присваивания и оператор сравнения. В то время как для информирования может быть установлен уровень предупреждений, уровень по умолчанию, используемый средой Arduino, будет игнорировать этот простой if-оператор с неправильным равенством без выдачи предупреждения.
if (foo = bar) {
В данном случае вместо использования '==', код использует '='. Вместо сравнения foo с bar компилятор присваивает значение bar переменной foo и возвращает это значение. В яыке C ноль (0) ложно, и все остальное истинно. Поэтому, если bar не содержит значение 0, то if-statement всегда будет возвращать true.
Математические операции с Float и Integer
Такие ошибки обычно легко заметить. При выполнении математики с плавающей запятой (float) не допускайте, чтобы непреднамеренный перевод в целые числа (integer) вызывал проблемы.
int bar = 4;
float foo = 10 / bar;
Serial.println(foo);
Что бы вы ожидаете на выходе Serial.println()? Будет 2. Несмотря на то, что десять поделенное на четыре дает 2.5, компилятор только смотрит на целые числа и реализует целочисленную математику. Затем он пытается сохранить результат в переменную типа float, но дробной части для нее никогда не существовало. Существует несколько способов избежать этой проблемы. Во-первых, вы можете перевести целые числа в float, поэтому компилятор будет знать, что их надо обрабатывать как float вместо целых чисел.
int bar = 4;
float foo = (float)10 / (float)bar;
Serial.println(foo);
Или, если одно значение справа – это float, компилятор также обновит другие значения в float. Добавление десятичной части к константе 10 – это простой способ превратить «10» в float.
int bar = 4;
float foo = 10.0 / bar; // verify if this is right
Serial.println(foo);
Путаница с аналоговыми и цифровыми линиями
На плате Arduino нет необходимости вызывать функцию pinMode для аналоговых линий при использовании их в качестве аналоговых входов. На самом деле, это может оказаться запутанным, поскольку аналоговые контакты могут функционировать как цифровой вывод. Было бы неплохо взглянуть на setup() и определить, какие контакты являются аналоговыми или цифровыми. Поэтому добавим, пожалуй, бессмысленный analogRead к setup().
void setup() {
Serial.begin(9600);
pinMode(13, OUTPUT);
pinMode(2, INPUT_PULLUP);
analogRead(A1);
}
Еще одно важное замечание заключается в том, что мы используем значение «A1», а не десятичное число. Заголовочный файл Arduino.h определяет A1 как постоянное целое число. На платах на основе 328p, таких как Uno, A1 присваивается значение 15. Так как A1 является постоянным целым числом, вы можете рассматривать A1 так же, как число 15. Настоятельно рекомендуется определять ваши аналоговые контакты по их десятичному значению. Придерживайтесь констант по двум причинам. Во-первых, сразу видно, что Ax относится к аналоговым выводам. Во-вторых, если вы перейдете на плату с большим количеством линий ввода/вывода, вы не столкнетесь с тем, что ваш аналоговый ввод станет цифровым.
«Плавающие» линии
Если вы новичок в микроконтроллерах, вы можете предположить, что линия находится в низком логическом уровне (или ноль), если к ней ничего не подключено. Однако, когда на линии нет ничего, она называется плавающей или висящей в воздухе. Эта ошибка очень распространена. Использование подтягивающего (к нулю или к питанию) резистора определит статус линии. Но иногда использование внешнего резистора не всегда удобно, поэтому можно воспользоваться внутренним подтягивающим резистором. Вызывая функцию pinMode() с аргументом «INPUT_PULLUP», вы активируете резистор на отдельном выводе.
© digitrode.ru