Программируем Arduino. Основы работы со скетчами
Шрифт:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
Когда возникнет потребность использовать данный конкретный последовательный порт (связанный с контактами 10 и 11), достаточно создать именованный объект для его обслуживания — в данном случае mySerial — и затем выполнить в него запись, как показано далее:
mySerial.begin(9600);
mySerial.println("Hello World");
Не заботясь о конкретной реализации, определим, как должен выглядеть код, использующий библиотеку.
После импортирования
#include <TEA5767Radio.h>
TEA5767Radio radio = TEA5767Radio;
// или TEA5767Radio radio = TEA5767Radio(0x60);
Поскольку библиотека обслуживает УКВ-радиоприемник, она должна уметь настраивать частоту, то есть пользователь должен иметь возможность написать такой код:
radio.setFrequency(93.0);
Числовой параметр здесь представляет частоту в мегагерцах. Автор скетча хотел бы задавать частоту именно в таком виде, а не в малопонятном формате int, который передается аппаратному модулю. Библиотека должна скрывать технические детали и самостоятельно выполнять необходимые преобразования.
Это все, что касается проектирования данной библиотеки. Теперь приступим к созданию кода.
Заголовочный файл
Обычно программный код библиотеки хранится в двух файлах. Один из них называется заголовочным и имеет расширение .h. Этот файл будет указываться в скетчах в инструкции #include. Заголовочный файл не содержит выполняемого программного кода, он лишь определяет имена классов и методов в библиотеке. Далее приводится заголовочный файл примера библиотеки:
#include <Wire.h>
#ifndef TEA5767Radio_h
#define TEA5767Radio_h
class TEA5767Radio
{
private:
int _address;
public:
TEA5767Radio;
TEA5767Radio(int address);
void setFrequency(float frequency);
};
#endif
Команда #ifndef предотвращает многократное импортирование библиотеки и представляет стандартный прием для заголовочных файлов.
Далее следует определение класса, который имеет приватный (private) раздел с единственной переменной _address. Эта переменная хранит адрес I2C устройства.
Общедоступный раздел (public) включает две функции для создания объекта-радиоприемника, одна позволяет указать адрес устройства, а другая не позволяет и использует адрес по умолчанию. В общедоступном разделе имеется также функция setFrequncy.
Файл реализации
Код, фактически реализующий функции, находится в файле TEA5767Radio.cpp:
#include <Arduino.h>
#include <TEA5767Radio.h>
TEA5767Radio::TEA5767Radio(int address)
{
_address = address;
}
TEA5767Radio::TEA5767Radio
{
_address = 0x60;
}
void TEA5767Radio::setFrequency(float frequency)
{
unsigned int frequencyB = 4 * (frequency *
1000000 + 225000) / 32768;
byte frequencyH = frequencyB >> 8;
byte frequencyL = frequencyB & 0XFF;
Wire.beginTransmission(_address);
Wire.write(frequencyH);
Wire.write(frequencyL);
Wire.write(0xB0);
Wire.write(0x10);
Wire.write(0x00);
Wire.endTransmission;
delay(100);
}
Создают
Wire.beginTransmission(_address);
Файл с ключевыми словами
Папка с библиотекой может также содержать файл с именем keywords.txt. Этот файл не является обязательным, библиотека будет работать и без него. Но этот файл позволяет среде разработки Arduino IDE выделять цветом любые ключевые слова библиотеки. В нашей библиотеке только два таких слова: ее имя TEA5767Radio и имя метода setFrequency. Файл с ключевыми словами может сдержать комментарии в строках, начинающихся с символа #. Далее приводится содержимое этого файла:
#######################################
# Карта подсветки синтаксиса для TEA5767Radio
#######################################
#######################################
# Типы данных (KEYWORD1)
#######################################
TEA5767Radio KEYWORD1
#######################################
# Методы и функции (KEYWORD2)
#######################################
setFrequency KEYWORD2
Ключевые слова должны определяться как KEYWORD1 или KEYWORD2, даже при том что версия 1.4 среды разработки Arduino IDE выделяет ключевые слова обоих типов оранжевым цветом.
Папка с примерами
Если внутри папки библиотеки создать папку с именем examples, все скетчи в этой папке автоматически будут регистрироваться средой разработки Arduino IDE во время запуска, и вы сможете получить доступ к ним через меню Examples (Примеры) в подменю с именем библиотеки. Примеры скетчей могут быть самыми обычными скетчами, только хранящимися в папке библиотеки. Далее приводится пример использования этой библиотеки:
#include <Wire.h>