Arduino

и не только...

Instagram TikTok VK

Дополнительные функции ввода/вывода

Функция tone()

Описание

Генерирует на пине сигнал - прямоугольную волну заданной частоты. Можно указать продолжительность, иначе сигнал продолжается до вызова noTone(). К пину может быть подключен пьезо- или другой динамик для воспроизведения различных тонов.

Одновременно может генерироваться только один сингал. Если сигнал уже воспроизводится на одном пине, то вызов функции для другого пина ни к чему не приведет. Повторный вызов же функции для того же пина изменит частоту сигнала на новую.

При использовании функции tone() невозможно генерировать ШИМ-сигнал на 3 и 11 пинах всех плат, кроме Arduino Mega.

Невозможно генерировать сигнал с частотой ниже 31 Гц.

Синтаксис

tone(pin, frequency)

tone(pin, frequency, duration)

Параметры

pin - пин для генерации звука

frequency - частота тона в герцах

duration - длительность тона в миллисекундах (необязательно)

Возвращаемое значение

нет

Пример
const beepPin = 7;

void setup()
{
  // использование с передачей длительности
  tone(beepPin, 440, 250);
}

void loop()
{
}

Функция noTone()

Описание

Останавливает генерацию сигнала на пине. Если сигнал не генерируется, то никакого эффекта от вызова функции не будет.

Синтаксис

noTone(pin)

Параметры

pin - пин, на котором прекращается генерация сигнала

Возвращаемое значение

нет

Пример
const beepPin = 7;

void setup()
{
  // без передачи длительности с использованием noTone()
  tone(7, 820);
  delay(300);
  noTone(beepPin);
}

void loop()
{
}

Функция shiftIn()

Описание

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

Синтаксис

byte incoming = shiftIn(dataPin, clockPin, bitOrder)

Параметры

dataPin - пин для вывода данных

clockPin - пин для синхронизации

bitOrder - порядок сдвига: MSBFIRST или LSBFIRST (младший бит первым или старший)

Возвращаемое значение

Считанное значение

Пример

Для понимания работы функции, вместо примера приведу ее реализацию:

uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder) {
  uint8_t value = 0;
  uint8_t i;

  for (i = 0; i < 8; ++i) {
    digitalWrite(clockPin, HIGH);
    if (bitOrder == LSBFIRST) {
      value |= digitalRead(dataPin) << i;
    } else {
      value |= digitalRead(dataPin) << (7 - i);
    }
    digitalWrite(clockPin, LOW);
  }
  return value;
}
Примечания

Перед передачей не забыть сконфигурировать оба пина на тип работы OUTPUT.

Для более удобного и быстрого использования данного протокола, можно воспользоваться библиотекой SPI. Однако она поддерживает не все пины.

Функция shiftOut()

Описание

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

Данный способ передачи информации называется последовательной передачей с синхронизацией.

Синтаксис

shiftOut(dataPin, clockPin, bitOrder, value)

Параметры

dataPin - пин для вывода данных

clockPin - пин для синхронизации

bitOrder - порядок передачи: MSBFIRST или LSBFIRST (младший бит первым или старший)

value - данные для передачи (байт)

Возвращаемое значение

нет

Пример

Отправка последовательно от 0 до 255:

int dataPin = 7;
int syncPin = 8;

void setup() 
{
  pinMode(dataPin, OUTPUT);
  pinMode(syncPin, OUTPUT);
}

void loop() 
{
  for (int i = 0; i < 256; i++) {
    shiftOut(dataPin, syncPin, LSBFIRST, i);
    delay(1000);
  }
}
Примечания

Перед передачей не забыть сконфигурировать оба пина на тип работы OUTPUT.

Для более удобного и быстрого использования данного протокола, можно воспользоваться библиотекой SPI.. Однако она поддерживает не все пины.

Функция pulseIn()

Описание

Функция ждет появления импульса (HIGH или LOW) на заданном пине и после его завершения возвращает его длину или 0, если импульса не было на протяжении заданного времени (тайм-аута).

Работает с импульсами от 10 микросекунд до 3 минут.

Синтаксис

pulseIn(pin, value)

pulseIn(pin, value, timeout)

Параметры

pin - номер пина, на которой ожидается импульс

value - тип импульса для чтения: HIGH или LOW

timeout (необязательный параметр) - количество микросекунд ожидания начала импульса, по умолчанию одна секунда

Возвращаемое значение

Длительность импульса (в микросекундах) или 0, если до истечения времени (тайм-аута) не было ни одного импульса

Пример
const int pin = 8;
unsigned long duration;

void setup() 
{
  Serial.begin(9600);
  pinMode(pin, INPUT);
}

void loop() 
{
  duration = pulseIn(pin, HIGH);
  Serial.println(duration);
}