Arduino.Вспомогательные классы
https://t.me/HotCheatSheetWire
Позволяет взаимодействовать с различными устройствами по интерфейсу I2C / TWI.
Функции
begin() — инициализирует библиотеку Wire и подключает Ардуино к шине I2C в роли ведущего (master) или ведомого (slave) устройства. Как правило, эта функция вызывается только один раз.
Синтаксис:
Wire.begin()
Wire.begin(address)
Параметры:
address: 7-битный адрес ведомого устройства (не обязательный параметр); если адрес не указан, то Ардуино выступает в роли ведущего устройства (master).
Возвращаемые значения:
нет
requestFrom() — функция запрашивает данные у ведомого устройства (slave). Как правило, используется только ведущим устройством (Master).
Синтаксис:
Wire.requestFrom(address, quantity)
Wire.requestFrom(address, quantity, stop)
Параметры:
address: 7-битный адрес ведомого устройства, у которого запрашиваются данные
quantity: количество запрашиваемых байт
stop: boolean. При значении true будет отправлен запрос со стоповым битом, что позволит освободить шину. При значении false - соединение будет поддерживаться в активном состоянии.
Возвращаемые значения:
byte : количество байт, возвращенных ведомым устройством
beginTransmission() — начинает процедуру передачи данных по интерфейсу I2C ведомому устройству с указанным адресом.
Синтаксис:
Wire.beginTransmission(address)
Параметры:
address: 7-битный адрес принимающего устройства
Возвращаемые значения:
нет
endTransmission() — завершает процедуру передачи данных ведомому устройству, инициированную функцией beginTransmittion().
Синтаксис:
Wire.endTransmission()
Wire.endTransmission(stop)
Параметры:
stop: boolean. При значении true будет отправлен запрос со стоповым битом, что позволит освободить шину. При значении false - соединение будет поддерживаться в активном состоянии.
Возвращаемые значения:
byte, байт данных, характеризующий статус передачи:
0: передача успешна
1: объем данных слишком велик для буфера передачи
2: получен NACK при передаче адреса
3: получен NACK при передаче данных
4: другая ошибка
write() — на ведомом устройстве (Slave) данная функция отправляет данные в ответ на запрос ведущего устройства. На ведущем устройстве (Master) функция добавляет данные в очередь отправки для последующей передачи ведомому устройству (в этом случае функция write() должна вызываться между beginTransmission() и endTransmission()).
Синтаксис:
Wire.write(value)
Wire.write(string)
Wire.write(data, length)
Параметры:
value: значение, которое необходимо отправить в виде одиночного байта
string: строка, которую необходимо отправить в виде последовательности байт
data: массив данных, который необходимо отправить в виде нескольких байт
length: количество передаваемых байт
Возвращаемые значения:
byte
Функция write() возвращает количество записанных байт. Считывание этого значения не обязательно
Пример:
#include <Wire.h>
byte val = 0;
void setup()
{
Wire.begin(); // подключаемся к шине i2c
}
void loop()
{
Wire.beginTransmission(44); // начинаем процедуру передачи устройству с адресом #44 (0x2c)
// адрес устройства указан в даташите
Wire.write(val); // отправляем байт данных
Wire.endTransmission(); // завершаем процедуру передачи
val++; // увеличиваем значение
if(val == 64) // при достижении значения 64 (максимум)
{
val = 0; // начинаем счет заново
}
delay(500);
}
available() — возвращает количество байт, доступных для считывания функцией read(). На ведущем устройстве (Master) данная функция должна вызываться после функции requestFrom(), а на ведомом (Slave) - внутри обработчика onReceive().
Параметры:
нет
Возвращаемые значения:
Количество байт, доступных для считывания.
read() — данная функция считывает байт данных, полученный ведущим устройством от ведомого (либо наоборот) в результате выполнения функции requestFrom().
Синтаксис:
Wire.read()
Параметры:
нет
Возвращаемые значения:
Очередной полученный байт
Пример:
#include <Wire.h>
void setup()
{
Wire.begin(); // подключаемся к шине i2c (для ведущего устройства адрес не обязательный)
Serial.begin(9600); // инициализируем последовательный порт для вывода информации
}
void loop()
{
Wire.requestFrom(2, 6); // запрашиваем у ведомого устройства #2 6 байт
while(Wire.available()) // ведомое устройство может отправить не все запрашиваемые байты
{
char c = Wire.read(); // считываем байт данных в виде символа
Serial.print(c); // выводим символ
}
delay(500);
}
onReceive() — на ведомом устройстве позволяет назначить функцию, которая будет автоматически вызываться при поступлении данных от Мастера.
Синтаксис:
Wire.onReceive(handler)
Параметры:
handler: функция, которую необходимо вызвать при поступлении данных от ведущего устройства; эта функция не должна возвращать никаких значений и может принимать только один параметр (int), описывающий количество поступивших байт.
Возвращаемые значения:
нет
onRequest() — на ведомом устройстве позволяет назначить функцию, которая будет автоматически вызываться при получения запроса от Мастера.
Синтаксис:
Wire.onRequest(handler)
Параметры:
handler: вызываемая функция без параметров, не должна возвращать никаких значений.
Возвращаемые значения:
нет
Вспомогательные классы
Класс Serial
Используется для связи платы Ардуино с компьютером или другими устройствами.
Функции
if (Serial) — позволяет проверить готовность определенного последовательного порта.
Синтаксис:
if (Serial)
Параметры:
нет
Возвращаемые значения:
boolean: возвращает true, если указанный последовательный порт готов к работе.
Пример:
void setup() {
//Инициализируем последовательный интерфейс и ожидаем открытия порта:
Serial.begin(9600);
while (!Serial) {
; // ожидаем подключения последовательного порта. Нужно только для Leonardo
}
}
void loop() {
//продолжаем работу
}
available() — возвращает количество байт (символов) доступных для считывания из буфера последовательного порта. Под символами понимаются данные, которые уже приняты и хранятся в последовательном приемном буфере (который может хранить максимум 64 байта).
Синтаксис:
Serial.available()
Параметры:
нет
Возвращаемые значения:
количество байт, доступных для считывания
Пример:
int incomingByte = 0; // для данных, поступающих через последовательный порт
void setup() {
Serial.begin(9600); // открываем последовательный порт
//и задаем скорость обмена 9600 бод
}
void loop() {
// отправляем данные только после их получения:
if (Serial.available() > 0) {
// считываем входящий байт:
incomingByte = Serial.read();
// показываем, что именно мы получили:
Serial.print("I received: ");
Serial.println(incomingByte, DEC);
}
}
begin() — задает скорость передачи данных по последовательному интерфейсу в битах в секунду (бодах). Для взаимодействия с компьютером следует использовать одну из предустановленных скоростей обмена: 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 или 115200.
Синтаксис:
Serial.begin(speed)
Serial.begin(speed, config)
Параметры:
speed: скорость в битах в секунду (бодах) - long
config: задает количество бит данных, проверку четности и стоповые биты. Ниже приведен список возможных значений:
SERIAL_5N1, SERIAL_6N1, SERIAL_7N1, SERIAL_8N1 (по умолчанию)
SERIAL_5N2, SERIAL_6N2, SERIAL_7N2, SERIAL_8N2, SERIAL_5E1
SERIAL_6E1, SERIAL_7E1, SERIAL_8E1, SERIAL_5E2, SERIAL_6E2
SERIAL_7E2, SERIAL_8E2, SERIAL_5O1, SERIAL_6O1, SERIAL_7O1
SERIAL_8O1, SERIAL_5O2, SERIAL_6O2, SERIAL_7O2, SERIAL_8O2
Возвращаемые значения:
нет
Пример:
void setup() {
Serial.begin(9600); // открываем последовательный порт, задаем скорость передачи данных 9600 бод
}
void loop() {}
end() — функция разрывает последовательную связь, после чего выводы RX и TX снова могут использовать как выводы общего назначения.
Синтаксис:
Serial.end()
Параметры:
нет
Возвращаемые значения:
нет
find() — осуществляет чтение данных из последовательного буфера до тех пор, пока не будет найдена искомая строка заданной длины.
Синтаксис:
Serial.find(target)
Параметры:
target : искомая строка (char)
Возвращаемые значения:
boolean
findUntil() — считывает данные из последовательного буфера до тех пор, пока не будет найдена искомая строка определенной длины или символы конца строки.
Синтаксис:
Serial.findUntil(target, terminal)
Параметры:
target : искомая строка (char)
terminal : символы конца строки (char)
Возвращаемые значения:
boolean
flush() — функция ожидает завершения процесса отправки всех исходящих данных по последовательному интерфейсу.
Синтаксис:
Serial.flush()
Параметры:
нет
Возвращаемые значения:
нет
parseFloat() — анализирует последовательный буфер и возвращает первое попавшееся число с плавающей точкой. В процессе анализа буфера функцией игнорируются знак "минус", а также все не цифровые символы.
Синтаксис:
Serial.parseFloat()
Параметры:
нет
Возвращаемые значения:
float
parseInt() — осуществляет поиск очередного целого числа во входном потоке.
Синтаксис:
Serial.parseInt()
Параметры:
нет
Возвращаемые значения:
int : найденное целое число
peek() — возвращает очередной байт (символ), поступивший в буфер последовательного порта. При этом функция не удаляет считанный байт из буфера.
Синтаксис:
Serial.peek()
Параметры:
нет
Возвращаемые значения:
первый байт данных, доступный для чтения из буфера последовательного порта (либо -1, если таковой байт отсутствует) - int.
print() — функция выводит через последовательный порт заданный ASCII-текст в виде, понятном для человека. Эта команда может иметь несколько разных форм. При выводе числа каждой его цифре соответствует один ASCII-символ.
Синтаксис:
Serial.print(val)
Serial.print(val, format)
Параметры:
val: значение, которое необходимо вывести - любой тип данных
format: определяет систему счисления (для целочисленных типов), а также количество десятичных знаков после запятой (для чисел с плавающей точкой).
Возвращаемые значения:
size_t (long): функция print() возвращает количество выведенных байт. Считывание этого значения не обязательно.
Пример:
/*
Использования цикла FOR для обработки данных и вывода чисел в различных форматах.
*/
int x = 0; // переменная
void setup() {
Serial.begin(9600); // открываем последовательный порт на скорости 9600 бод
}
void loop() {
// print labels
Serial.print("NO FORMAT"); // выводим метку
Serial.print("\t"); // выводим символ табуляции
Serial.print("DEC");
Serial.print("\t");
Serial.print("HEX");
Serial.print("\t");
Serial.print("OCT");
Serial.print("\t");
Serial.print("BIN");
Serial.print("\t");
for(x=0; x< 64; x++){ // немного ASCII-графики, можете изменить код по своему вкусу
// выводим значение в различных форматах:
Serial.print(x); // выводим как десятичное число - то же, что и формат "DEC"
Serial.print("\t"); // выводим символ табуляции
Serial.print(x, DEC); // выводим десятичное число ASCII-символами
Serial.print("\t"); // выводим символ табуляции
Serial.print(x, HEX); // выводим шестнадатиричное число ASCII-символами
Serial.print("\t"); // выводим символ табуляции
Serial.print(x, OCT); // выводим восьмиричное число ASCII-символами
Serial.print("\t"); // выводим символ табуляции
Serial.println(x, BIN); // выводим двоичное число ASCII-символами
//с символом возврата каретки, который добавляет функция "println"
delay(200); // задержка в 200 миллисекунд
}
Serial.println(""); // выводим еще один символ возврата каретки
}
println() — выводит через последовательный порт ASCII-текст в понятном для человека виде с символами возврата каретки (ASCII 13 или '\r') и новой строки (ASCII 10 или 'n').
Синтаксис:
Serial.println(val)
Serial.println(val, format)
Параметры:
val: значение, которое необходимо вывести - любой тип данных
format: определяет систему счисления (для целочисленных типов), а также количество десятичных знаков после запятой (для чисел с плавающей точкой).
Возвращаемые значения:
size_t (long): функция println() возвращает количество выведенных байт. Считывание этого значения не обязательно.
Пример:
/*Аналоговый вход
считываем аналоговое значение с аналогового входа 0 и выводим его через последовательный порт.
*/
int analogValue = 0; // переменная для хранения аналоговой величины
void setup() {
// открываем последовательный порт на скорость 9600 бод:
Serial.begin(9600);
}
void loop() {
// считываем аналговую величиниу на выводе 0:
analogValue = analogRead(0);
// выводим считанное значение в различных форматах:
Serial.println(analogValue); // выводим десятичное число ASCII-символами
Serial.println(analogValue, DEC); // выводим десятичное число ASCII-символами
Serial.println(analogValue, HEX); // выводим шестнадатиричное число ASCII-символами
Serial.println(analogValue, OCT); // выводим восьмиричное число ASCII-символами
Serial.println(analogValue, BIN); // выводим двоичное число ASCII-символами
// пауза в 10 миллисекунд перед следующим опросом:
delay(10);
}
read() — считывает данные, поступающие по последовательному интерфейсу.
Синтаксис:
Serial.read()
Параметры:
нет
Возвращаемые значения:
Первый байт принятых данных (или -1, если таковых нет) - int
Пример:
int incomingByte = 0; // переменная для хранения байта данных,
//принятых по последовательному интерфейсу
void setup() {
Serial.begin(9600); // открываем последовательный порт
// задаем скорость передачи данных 9600 бод
}
void loop() {
// отправляем данные только после их получения:
if (Serial.available() > 0) {
// считываем принятый байт:
incomingByte = Serial.read();
// сообщаем, что именно мы получили:
Serial.print("I received: ");
Serial.println(incomingByte, DEC);
}
}
readBytes() — функция считывает символы, поступающие через последовательный порт, и помещает их в приемный буфер.
Синтаксис:
Serial.readBytes(buffer, length)
Параметры:
buffer: буфер для хранения считываемых данных (char[] или byte[])
length : количество символов, которое необходимо считать (int).
Возвращаемые значения:
byte
readBytesUntil() — функциясчитывает символы из приемного буфера последовательного порта и помещает их в массив.
Синтаксис:
Serial.readBytesUntil(character, buffer, length)
Параметры:
character: искомый символ (char).
buffer: буфер для хранения считываемых данных (char[] или byte[])
length: количество символов, которое необходимо считать (int).
Возвращаемые значения:
byte
setTimeout() — функция позволяет задать время ожидания данных, поступающих через последовательный интерфейс.
Синтаксис:
Serial.setTimeout(time)
Параметры:
time: величина таймаута в миллисекундах (long).
Возвращаемые значения:
нет
write() — записывает двоичные данные в последовательный порт. Эти данные отправляются в виде одного или нескольких байтов.
Синтаксис:
Serial.write(val)
Serial.write(str)
Serial.write(buf, len)
Параметры:
val: значение, которое необходимо отправить в виде байта
str: строка, которую необходимо отправить как последовательность байт
buf: массив, который необходимо отправить как последовательность байт
len: длина массива
Возвращаемые значения:
byte
Функция write() возвращает количество отправленных байт. Считывание этого параметра не обязательно.
Пример:
void setup(){
Serial.begin(9600);
}
void loop(){
Serial.write(45); // отправляем байт со значением 45
int bytesSent = Serial.write(“hello”); //отправляем строку "hello” и возвращаем длину строки.
}
serialEvent() — автоматически вызываетcя при поступлении новых данных. Чтобы считать их, используйте функцию Serial.read().
Синтаксис:
void serialEvent(){
//команды
}
Параметры:
команды - любые процедуры и функции Ардуино
Класс Stream
Является базовым классом для символьных и двоичных потоков.
Функции
available() — функция возвращает количество принятых, но не прочитанных байт из потока.
Синтаксис:
stream.available()
Параметры:
stream: экземпляр класса, наследуемого от Stream.
Возвращаемые значения:
int: количество непрочитанных байт
read() — функция осуществляет считывание символов из входящего потока в указанный буфер.
Синтаксис:
stream.read()
Параметры:
stream: экземпляр класса, наследуемого от Stream.
Возвращаемые значения:
первый байт принятых данных (или -1, если таковых нет)
flush() — функция очищает буфер сразу после отправки всех исходящих символов.
Синтаксис:
stream.flush()
Параметры:
stream: экземпляр класса, наследуемого от Stream.
Возвращаемые значения:
boolean
find() — функция считывает из потока данные до тех пор, пока не будет найдена искомая строка заданной длины.
Синтаксис:
stream.find(target)
Параметры:
stream: экземпляр класса, наследуемого от Stream.
target: искомая строка (char)
Возвращаемые значения:
boolean
findUntil() — функция осуществляет поиск строки в потоке данных. В процессе поиска считывание данных из потока осуществляется до тех пор, пока не будет найдена искомая строка заданной длины или символы конца строки.
Синтаксис:
stream.findUntil(target, terminal)
Параметры:
stream: экземпляр класса, наследуемого от Stream.
target: искомая строка (char)
terminal: символы конца строки (char)
Возвращаемые значения:
boolean
peek() — считывает из файла байт данных. При этом функция сохраняет положение указателя текущей позиции файла и не перемещает его на следующий байт. Т.е. при многократном вызове peek() функция будет возвращать одно и то же значение.
Синтаксис:
stream.peek()
Параметры:
stream: экземпляр класса, наследуемого от Stream.
Возвращаемые значения:
Байт данных (или символ), либо -1, если таковой отсутствует.
readBytes() — функция считывает символы из потока и помещает их в указанный буфер.
Синтаксис:
stream.readBytes(buffer, length)
Параметры:
stream: экземпляр класса, наследуемого от Stream.
buffer: буфер для хранения считываемых данных (char[] или byte[])
length: количество символов, которое необходимо считать (int).
Возвращаемые значения:
Количество байт, помещенных в буфер
readBytesUntil() — функция считывает символы из потока и помещает их в указанный буфер.
Синтаксис:
stream.readBytesUntil(character, buffer, length)
Параметры:
stream: экземпляр класса, наследуемого от Stream.
character: искомый символ (char).
buffer: буфер для хранения считываемых данных (char[] или byte[])
length: количество символов, которое необходимо считать (int).
Возвращаемые значения:
Количество байт, помещенных в буфер
readString() — функция считывает символы из потока, объединяя их в строку.
Синтаксис:
stream.readString()
Параметры:
нет
Возвращаемые значения:
Строка, состоящая из считанных символов.
readStringUntil() — функция считывает символы из потока, объединяя их в строку.
Синтаксис:
stream.readString(terminator)
Параметры:
terminator: искомый символ (char).
Возвращаемые значения:
Строка, состоящая из считанных символов.
parseInt() — осуществляет поиск целого числа во входном потоке. Процесс поиска заключается в следующем: начиная с текущей позиции, функция анализирует символы входного потока до тех пор, пока не встретится первое числовое значение. При этом все остальные символы (включая знак минус) функцией игнорируются.
Синтаксис:
stream.parseInt(list)
Параметры:
stream: экземпляр класса, наследуемого от Stream.
list: анализируемый поток, в котором необходимо найти целое число (char)
Возвращаемые значения:
Первое попавшееся целое число (int)
parsefloat() — осуществляет поиск во входном потоке числа с плавающей точкой. Процесс поиска заключается в следующем: начиная с текущей позиции, функция анализирует символы входного потока до тех пор, пока не встретится первое числовое значение. При этом все остальные символы (включая знак минус) функцией игнорируются.
Синтаксис:
stream.parseFloat(list)
Параметры:
stream: экземпляр класса, наследуемого от Stream.
list: анализируемый поток, в котором необходимо найти число с плавающей точкой (char)
Возвращаемые значения:
Первое попавшееся число с плавающей точкой (float)
setTimeout() — функция устанавливает максимальное время ожидания потока данных (значение по умолчанию - 1000 миллисекунд).
Синтаксис:
stream.setTimeout(time)
Параметры:
stream: экземпляр класса, наследуемого от Stream.
time: величина таймаута в миллисекундах (long).
Возвращаемые значения:
нет