My-library.info
Все категории

Программируем Arduino. Основы работы со скетчами - Монк Саймон

На электронном книжном портале my-library.info можно читать бесплатно книги онлайн без регистрации, в том числе Программируем Arduino. Основы работы со скетчами - Монк Саймон. Жанр: Программирование год 2004. В онлайн доступе вы получите полную версию книги с кратким содержанием для ознакомления, сможете читать аннотацию к книге (предисловие), увидеть рецензии тех, кто произведение уже прочитал и их экспертное мнение о прочитанном.
Кроме того, в библиотеке онлайн my-library.info вы найдете много новинок, которые заслуживают вашего внимания.

Название:
Программируем Arduino. Основы работы со скетчами
Дата добавления:
18 сентябрь 2020
Количество просмотров:
394
Читать онлайн
Программируем Arduino. Основы работы со скетчами - Монк Саймон

Программируем Arduino. Основы работы со скетчами - Монк Саймон краткое содержание

Программируем Arduino. Основы работы со скетчами - Монк Саймон - описание и краткое содержание, автор Монк Саймон, читайте бесплатно онлайн на сайте электронной библиотеки My-Library.Info

Впервые на русском языке выходит легендарный бестселлер Саймона Монка, который много лет занимает первые строчки в рейтингах Amazon. Хотите создать умный дом или запрограммировать робота? Нет ничего проще. Саймон Монк не только поможет разобраться с проволочками, контактами и датчиками, но и покажет как заставить все это хитросплетение проводов и плат делать то, что вам нужно. Arduino — это не так сложно как кажется с первого взгляда. Вы сразу будете покорены открывающимися возможностями.

 

Программируем Arduino. Основы работы со скетчами читать онлайн бесплатно

Программируем Arduino. Основы работы со скетчами - читать книгу онлайн бесплатно, автор Монк Саймон

Ниже приводится пример объявления статического массива, как это обычно делается в скетчах:

// sketch_06_04_static

int array[100];

void setup()

{

  array[0] = 1;

  array[50] = 2;

  Serial.begin(9600);

  Serial.println(array[50]);

}

void loop()

{

}

Объем памяти, занимаемой массивом, известен уже на этапе компиляции скетча, поэтому компилятор может зарезервировать для массива необходимый объем памяти. Второй пример, приведенный ниже, также создает массив того же размера, но выделяет память для него во время выполнения из пула доступной памяти. Обратите внимание на то, что версии Arduino IDE ниже 1.0.4 не поддерживают malloc.

// sketch_06_03_dynamic

int *array;

void setup()

{

  array = (int *)malloc(sizeof(int) * 100);

  array[0] = 1;

  array[50] = 2;

  Serial.begin(9600);

  Serial.println(array[50]);

}

void loop()

{

}

В начале скетча определяется переменная int *array. Символ * сообщает, что это указатель на целочисленное значение (или в данном случае массив целых чисел), а не простое значение. Объем памяти, занимаемой массивом, неизвестен, пока не будет выполнена следующая строка в функции setup:

  array = (int *)malloc(sizeof(int) * 100);

Команда malloc (memory allocate — выделить память) выделяет память в области ОЗУ, которую называют кучей (heap). В качестве аргумента ей передается объем памяти в байтах, который следует выделить. Так как массив хранит 100 значений типа int, требуется выполнить некоторые расчеты, чтобы определить размер массива в байтах. В действительности можно было бы просто передать функции malloc число 200 в аргументе, потому что известно, что каждое значение типа int занимает 2 байта памяти, но использование функции sizeof гарантирует получение правильного числа в любом случае.

После выделения памяти массивом можно пользоваться точно так же, как если бы память для него была выделена статически. Динамическое распределение памяти позволяет отложить принятие решения о размере массива до фактического запуска скетча, и это единственное преимущество данного подхода.

Однако, используя прием динамического распределения памяти, легко оказаться в ситуации, когда память выделяется, но не освобождается, из-за чего скетч может быстро исчерпать имеющуюся память. Исчерпание памяти может вызвать зависание Arduino. Но если вся память выделяется статически, такого не происходит.

Обратите внимание на то, что даже мне, разработавшему не одну сотню проектов на Arduino, сложно найти вескую причину, оправдывающую прием динамического выделения памяти в Arduino.

Строки

Строки (текста) намного реже используются в скетчах для Arduino, чем в обычных программах. В обычных программах строки чаще всего применяются для взаимодействий с пользователями или базами данных, где текст является естественным средством передачи информации.

Многие программы для Arduino вообще не нуждаются в текстовом представлении данных или используют его только в командах Serial.println для нужд отладки.

В Arduino поддерживаются два основных метода использования строк: старый метод — массивы элементов типа char и новый метод с применением библиотеки String Object.

Массивы элементов типа char

Когда в скетче определяется строковая константа, такая как

char message[] = "Hello World";

создается статический массив элементов типа char, содержащий 12 символов. Именно 12, а не 11, по числу букв в строке «Hello World», потому что в конец добавляется заключительный нулевой символ (), отмечающий конец строки. Такое соглашение для строк символов, принятое в языке C, позволяет использовать массивы символов большего размера, чем предполагалось вначале (рис. 6.4). Каждая буква, цифра или другой символ имеет код, который называют значением ASCII.

Программируем Arduino. Основы работы со скетчами - _47.jpg

Рис. 6.4. Массив элементов типа char в стиле языка C с завершающим нулевым символом

Обратите внимание на то, что часто используется немного иной синтаксис записи строковых констант:

char *message = "Hello World";

Этот синтаксис действует подобным образом, но определяет message как указатель на символ (первый символ в массиве).

Форматированный вывод строк несколькими командами print

Часто строки необходимы, только чтобы вывести сообщение на жидкокристаллический дисплей или в качестве параметра Serial.println. Многие могут подумать, что в основном требуется только возможность объединения строк и преобразования чисел в строки. Например, рассмотрим конкретную проблему — как на жидкокристаллическом дисплее отобразить сообщение «Temp: 32 C». Вы могли бы предположить, что для этого нужно объединить число 32 со строкой "Temp: " и затем добавить в конец строку " C". И действительно, программисты с опытом использования языка Java могли бы попытаться написать на C следующий код:

String text = "Temp: " + tempC + " C";

Увы, в C этот прием не работает. В данном случае сообщение можно вывести несколькими инструкциями print, как показано далее:

lcd.print("Temp: "); lcd.print(tempC); lcd.print(" C");

Этот подход устраняет необходимость закулисного копирования данных в процессе конкатенации (объединения) строк, как происходит в других современных языках.

Аналогичный подход с применением нескольких инструкций вывода можно использовать при работе с монитором последовательного порта и инструкциями Serial.print. В подобных случаях последней в строке обычно используется команда println, добавляющая в конец символ перевода строки.

Форматирование строк с помощью sprintf

Стандартная библиотека строковых функций для языка C (не путайте с библиотекой Arduino String Object, которая обсуждается в следующем разделе) включает очень удобную функцию sprintf, выполняющую форматирование массивов символов. Она вставляет значения переменных в строку шаблона, как показано в следующем примере:

char line1[17];

int tempC = 30;

sprint(line1, "Temp: %d C", tempC);

Массив символов line1 — это строковый буфер, содержащий форматированный текст. Как указано в примере, он имеет емкость 17 символов, включая дополнительный нулевой символ в конце. Имя line1 я выбрал потому, что собираюсь показать, как сформировать содержимое верхней строки для жидкокристаллического дисплея с двумя строками по 16 символов в каждой.

В первом параметре команде sprintf передается массив символов, в который должен быть записан результат. Следующий аргумент — строка формата, содержащая смесь простого текста, такого как Temp:, и команд форматирования, например %d. В данном случае %d означает «десятичное целое со знаком». Остальные параметры будут подставлены в строку формата в порядке их следования на место команд форматирования.

Чтобы во вторую строку на жидкокристаллическом дисплее вывести время, его можно сформировать из отдельных значений часов, минут и секунд, как показано далее:

char line2[17];

int h = 12;

int m = 30;

int s = 5;

sprintf(line2, "Time: %2d:%02d:%02d", h, m, s);

Если попробовать вывести строку line2 в монитор последовательного порта или на экран жидкокристаллического дисплея, вы увидите текст

Time: 12:30:05

Команда sprintf не только подставила числа в нужные места, но и добавила ведущий ноль перед цифрой 5. В примере между символами : находятся команды форматирования трех компонентов времени. Часам соответствует команда %2d, которая выводит двузначное десятичное число. Команды форматирования для минут и секунд немного отличаются (%02d). Эти команды также выводят двузначные десятичные числа, но добавляют ведущий ноль, если это необходимо.


Монк Саймон читать все книги автора по порядку

Монк Саймон - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки My-Library.Info.


Программируем Arduino. Основы работы со скетчами отзывы

Отзывы читателей о книге Программируем Arduino. Основы работы со скетчами, автор: Монк Саймон. Читайте комментарии и мнения людей о произведении.

Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*
Все материалы на сайте размещаются его пользователями.
Администратор сайта не несёт ответственности за действия пользователей сайта..
Вы можете направить вашу жалобу на почту librarybook.ru@gmail.com или заполнить форму обратной связи.