Организация пространства. Советы и идеи. Сад и участок

Мигаем светодиодом. Мигаем светодиодом Blink проекты

В этой статье мы сделали попытку собрать в одном месте ссылки на все самые популярные библиотеки Ардуино, а также подготовили подборку наиболее популярных библиотек. Рано или поздно, любой ардуинщик сталкивается с необходимостью использования той или иной библиотеки. Ведь использование готового кода сильно сокращает время на программирование. Надеемся, что собранные в одном месте и снабженные ссылками для скачивания и короткими примерами использования, сведения о популярных библиотеках помогут вам в ваших проектах.

Библиотека ардуино – это некий программный код, хранящийся не в скетче, а во внешних файлах, которые можно подключить к вашему проекту. В библиотеке хранятся различные методы и структуры данных, которые нужны для упрощения работы с датчиками, индикаторами, модулями и другими компонентами. Использование готовых программ существенно упрощает работу над проектами, потому что можно сосредоточиться на основной логике, не тратя время на множество мелочей.

Сегодня создано огромное количество библиотек, которые можно легко найти и скачать в интернете. Подавляющее большинство библиотек распространяются по свободной лицензии, поэтому необходимости в поиске “пиратских” версий нет. Главное, это научиться .

Стандартные библиотеки Ардуино

Начать знакомство с библиотеками лучше с официального сайта, на котором можно найти внушительный список стандартных модулей и ссылки на официальные библиотеки партнеров.

Список встроенных библиотек (они поставляются вместе с дистрибутивом Arduino IDE):

  • EEPROM
  • Ethernet / Ethernet 2
  • Firmata
  • LiquidCrystal
  • Servo
  • SoftwareSerial
  • Stepper

Подборка библиотек в одном архиве

Если у вас нет времени на детальный анализ множества сайтов и вы хотите скачать все необходимое для работы с внешними устройствами Ардуино в одном архиве, мы подготовили список 40 самых популярных библиотек. Просто и распакуйте его содержимое (папку libraries) в папку Arduino.

Библиотеки для экранов, индикаторов и дисплеев

Библиотека I2C

Библиотека, предназначенная для работы периферийного устройства по протоколу I2C.

Пример использования:

#ifndef I2C_MASTER_H

#define I2C_MASTER_H

void I2C_init (void) – создание объекта, настройка на правильную частоту для шины.

uint8_t I2C_start () – установка соединения с новым устройством.

uint8_t I2C_write() – запись данных на текущее устройство.

uint8_t I2C_read_ack() – считывание байта с устройства, запрос следующего байта.

Библиотека LiquidCrystal

Стандартная библиотека, установленная в Arduino IDE. Предназначена для управления жидкокристаллическими дисплеями LCD.

Пример использования:

#include . Также, чтобы не ошибиться при написании, можно подключить через меню Sketch – Import Library – LiquidCrystal.

Конструктор класса – LiquidCristal(…). Аргументами являются rs, rw, en, do…d7. Первые 3 соответствую выводам сигналов RS, RW и Enable. Выводы d соответствуют номерам шин данных, к которым подключен дисплей.

void begin(cols, rows) – метод, который инициализирует интерфейс дисплея. Аргументами являются количество знаков в строке (cols) и число строк (rows). Этот метод должен задаваться первым.

void createChar(num, data) – метод, необходимый для создания пользовательских символов.

Библиотека UTFT

Стандартная библиотека, необходимая для работы Ардуино с TFT экранами разных типов. Все поддерживаемые дисплеи представлены в сопроводительном документе с библиотекой.

Пример использования:

#include

UTFT(); – создание экземпляра UTFT.

textRus(char*st, int x, int y); – метод, позволяющий выводить строку из указателя. Например, char *dht = “Температура,С”;

textRus(string st, int x, int y); – вывод строки с указанием в параметре. Например, g.textRus(“Температура, С”, 0, 20);

Библиотека LedControl

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

Пример использования:

#include

LedControl lc1= LedControl();

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

writeArduinoOn7Segment() – отображение на дисплее всех чисел от 0 до 15. Использует функции setChar() для символов a и d и setRow() для создания макета пропущенных символов.

LedControl.shutdown() – отключение изображения.

setIntensity() – контроль яркости.

Библиотеки для работы с датой и временем ардуино

Библиотека RTClib

Библиотека для работы с часами реального времени, упрощающая взаимодействие с Ардуино.

Пример использования:

#include

RTC_DS1307 RTC; – выбор датчика (в данном случае DS1307).

rtc.adjust(DateTime(Date, Time)); – настройка времени и календаря.

dayOfTheWeek () – вывод дня недели. Аргумент от 0 до 6, 0 – воскресенье.

Библиотека Timelib

Позволяет Ардуино получать информацию о дате и времени в данный момент.

Пример использования:

#include

Time(); – создание экземпляра.

setTime (t); – установка времени. Аргумент t – час, минута, секунда, день, месяц и год.

timeStatus(); – показывает, установлено ли время.

adjustTime(adjustment); – настройка времени.

Библиотека Ds1307

Библиотека для удобного взаимодействия часов DS1307 с Ардуино c использованием библиотеки Wire.

Пример использования:

#include

class DS1307RTC – создание объекта DS1307.

SetTime() – установка времени.

get() – считывает RTC, возвращает полученную дату в формате POSIX.

Set(time_t t) – запись даты в RTC

Библиотека DS 3231

Предназначена для управления датой и временем в модуле ds3231.

#include “ds3231.h”

DS3231 Clock(SDA, SCL); – создание объекта DS3231, подключение к линии тактирования и линии данных.

getTime(); – считывание даты и времени с часов.

setDate(date, mon, year); – установка даты.

Системные библиотеки ардуино

Библиотека EEPROM

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

Пример использования:

#include

EEPROM.read(); – создание объекта, считывание байта по адресу из энергонезависимой памяти.

EEPROM.write(address, value)– запись байта в энергонезависимую память.

EEPROM.put() – запись строк чисел с плавающей запятой.

EEPROM.get() – чтение строк и чисел с плавающей запятой.

Библиотека SoftwareSerial

Библиотека, которая позволяет реализовывать последовательные интерфейсы с любых цифровых пинов. Также позволяет создавать несколько последовательных портов, которые работают на скорости до 115200 бод.

#include

SoftwareSerial mySerial(RX, TX) – создание объекта, аргументы – выводы, к которым подключены RX и TX.

Serial.begin(); – устанавливает скорость порта для связи ардуино и компьютера.

mySerial.overflow() – проверка входного буфера на переполнение.

Библиотека Math

Включает в себя большое количество математических функций для работы с числами с плавающей запятой.

Пример использования:

#include

Math(); – создание экземпляра Math.

Serial.print(“cos num = “); – возвращает косинус числа.

Serial.println (fmod (double__x, double__y)); – возвращает числа по модулю.

Библиотека Scheduler

Предназначена для работы с Arduino Due, позволяет работать в режиме многозадачности. Пока является экспериментальной библиотекой.

Пример использования:

#include

Scheduler; – создание экземпляра.

Scheduler.startLoop() – позволяет добавить функцию, которая будет выполняться вместе с loop().

yield() – позволяет передать управление другим задачам.

Библиотеки серво моторов и шаговых двигателей

Библиотека Servo

Стандартная библиотека. Необходима для управления серводвигателями и часто используется в робототехнических проектах с манипуляторами.

Пример использования:

#include

Servo myservo; – создание объекта для серводвигателя..

myservo.attach(); – номер выхода, к которому подключен серводвигатель.

myservo.write(180, 30, true); – движение на 180 градусов, скорость 30, ожидание окончания движения.

Библиотека Stepper

Небходима для управления шаговым униполярным и биполярным двигателем.

#include

const int stepsPerRevolution = ; – количество шагов, за которое двигатель проходит полный поворот.

Stepper myStepper = Stepper(steps, pin1, pin2) – создает экземпляр класса с указанным количеством шагов и выводами, к которым подключается двигатель.

Библиотеки датчиков ардуино

Библиотека DHT

#include < DHT.h>

DHT dht(DHTPIN, DHT11); – инициализирует датчик (в данном случае DHT11).

dht.begin(); – запуск датчика.

float t = dht.readTemperature(); – считывание текущего значения температуры в градусах Цельсия.

Библиотека DallasTemperature

Предназначается для работы с датчиками Dallas. Работает совместно с библиотекой OneWire.

#include

DallasTemperature dallasSensors(&oneWire); – передача объекта oneWire для работы с датчиком.

положить ее в регистр.

printTemperature(sensorAddress); – запрос получить измеренное значение температуры.

Библиотека Ultrasonic

Обеспечивает работу Ардуино с ультразвуковым датчиком измерения расстояния HC-SR04.

#include

Ultrasonic ultrasonic (tig , echo) – объявление объекта, аргументы – контакт Trig и контакт Echo.

dist = ultrasonic.distanceRead(); – определение расстояния до объекта. Агрумент – сантиметры(СМ) или дюймы (INC).

Timing() – считывание длительности импульса на выходе Echo, перевод в необходимую систему счисления.

Библиотека ADXL345

Предназначается для работы с акселерометром ADXL345.

Пример использования:

#include

ADXL345_ADDRESS – создание объекта, указание его адреса.

ADXL345_REG_DEVID – идентификация устройства.

ADXL345_REG_OFSX – смещение по оси Х.

ADXL345_REG_BW_RATE – управление скоростью передачи данных.

Библиотека BME280

Предназначается для работы с датчиком температуры, влажности и давления BME280.

Пример использования:

#include

BME280_ADDRESS – создание объекта BME280, указание его адреса.

begin(uint8_t addr = BME280_ADDRESS); – начало работы датчика.

getTemperature – получение измеренной температуры.

getPressure – получение измеренного давления.

Библиотека BMP280

Требуется для работы с датчиком атмосферного давления BMP280.

Пример использования:

#include

BMP280_CHIPID – создание экземпляра, указание его адреса.

getTemperature(float *temp); – получение измеренной температуры.

getPressure(float *pressure); – получение измеренного значения давления.

Библиотека BMP085

Требуется для работы с датчиком давления BMP085.

Пример использования:

#include

Adafruit_BMP085 bmp; – создание экземпляра BMP085.

dps.init(MODE_ULTRA_HIGHRES, 25000, true); – измерение давления, аргумент 25000 – высота над уровнем моря (в данном случае 250 м. над уровнем моря).

dps.getPressure(&Pressure); – определение давления.

Библиотека FingerPrint

Требуется для работы со сканером отпечатков пальцев.

Пример использования :

#include

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial); – объявление объекта Finger. Параметр – ссылка на объектр для работы с UART, кокторому подключен модуль.

finger.begin(); – инициализация модуля отпечатков пальцев.

Func_sensor_communication(); – вызов модуля отпечатков пальцев.

Библиотеки коммуникации

Библиотека Wire

Требуется для работы с двухпроводным интерфейсом I2C.

Пример использования:

#include

Wire.begin() – инициализация библиотеки, подключение к шине I2C.

Wire.requestFrom() – запрос мастером байтов от ведомого устройства.

Wire.beginTransmission() – начало передачи на ведомое устройство.

Библиотека Irremote

Требуется для работы ардуино с ИК приемником.

Пример использования:

#include

IRrecv irrecv(RECV_PIN); – пин, к которому подключен ИК приемник.

SetPinAndButton(int ir1,int ir2,int pin) – позволяет настроить определенный выход на срабатывание при заданных значениях ir1, ir2.

Библиотека GSM

Требуется для соединения через GSM-плату с сетью GSM/GRPS. С ее помощью можно реализовать операции, свершаемые GSM-телефоном, работать с голосовыми вызовами и подключаться к сети интернет через GRPS.

Пример использования:

#include

GSM GSMAccess – инициализирует экземпляр класса.

gprs.powerOn() – включение питания.

GPRS – настройка подключения к интернету.

GSM – управление радио-модемом.

Библиотека RFID

Требуется для соединения Ардуино и RFID -модуля.

Пример использования:

#include

RFID rfid(SS_PIN, RST_PIN); – создание экземпляра rfid, аргументы – пины, к которым подключен модуль.

rfid.init(); – инициализация модуля RFID.

Библиотека MFRC 522

Требуется для соединения Ардуино и MFRC522 -модуля.

Пример использования:

#include

MFRC522 mfrc522(SS_PIN, RST_PIN); – создание экземпляра MFRC522, аргументами указаны выходы, к которым подключен модуль.

mfrc522.PCD_Init(); – инициализация MFRC522.

Библиотека Ethershield

Новая версия https://github.com/jcw/ethercard

Требуется для подключения Ардуино к локальной сети или сети интернет. Библиотека больше не поддерживается, более новая версия Ethercard. Также существует стандартная библиотека Ethernet.

Пример использования:

#include «EtherShield.h»

#include

EtherShield es = EtherShield (); – подготовка веб-страницы

ether.begin(sizeof Ethernet::buffer, mymac,); – начало работы, аргументы – адрес Mac и номер порта, к которому подключен выход CS.

Библиотека Nrf24l01

Требуется для работы с RF24-радиомодулем.

Пример использования:

#include “RF24.h”

RF24 – Конструктор создает новый экземпляр драйвера. Перед тем, как использовать, нужно создать экземпляр и указать пины, к которым подключен чип (_cepin: контакт модуля Enable, cspin: контакт модуля Select).

Begin – начало работы чипа.

setChannel – каналы для связи RF.

setPayloadSize – установка фиксированного размера передачи.

getPayloadSize – получение фиксированного размера.

Библиотека TinyGPS

Требуется для чтения сообщений GPGGA и GPRMC. Помогает считывать данные о положении, дате, времени, высоте и других параметрах.

Пример использования:

#include

TinyGPS gps; – создание экземпляра TinyGPS.

encode () – подача на объект последовательных данных по одному символу.

gps.stats() – метод статистики. Показывает, получены корректные данные или нет.

Библиотеки в Arduino IDE

Среди всего разнообразия библиотек можно выделить 3 основных группы:

  • Встроенные – это библиотеки, изначально установленные в среде Arduino IDE. Их не нужно скачивать и устанавливать дополнительно, они доступны для использования в программе сразу после запуска среды разработки.
  • Дополнительные – это библиотеки, которые нужно самостоятельно скачивать устанавливать. Обычно такой вид библиотек разрабатывает производитель датчиков, сенсоров и других компонентов для облегчения работы с ардуино.
  • Зависимые библиотеки – устанавливаются как помощник дополнительной библиотеки, отдельно от нее не работает.

Самым простым способом работы с библиотеками в ардуино является использование встроенных возможностей среды разработки Arduino IDE. Об этом мы поговорим в отдельной статье.

В этом примере показано как с помощью контроллера Arduino заставить мигать светодиод.

Необходимые компоненты

  • контроллер Arduino
  • светодиод
  • резистор 220 Ом

Подключение

Мы подключаем резистор сопротивлением 220 Ом к выходу номер 13 (pin 13), к резистору в свою очередь подключаем анод (обычно длинная ножка) светодиода. Катод подсоединяем к земле (Grd). Затем подключаем контроллер через USB кабель к компьютеру и загружаем приведенный ниже код на котроллер Arduino.

Большинство плат Arduino имеют встроенный SMT (Surface-mount techology)светодиод, подключенный к выходу 13. Если вы запустите код на таких платах без подключения внешниего светодиода, то вы должны увидеть мигание встроенного светодиода на плате.

Схема

Код

В коде мы первой строк задаем режим выхода для вход/выхода (pin) 13:

pinMode(13, OUTPUT);

В основном цикле (loop) программы зажигаем светодиод:

digitalWrite(13, HIGH);

На выходе 13 появляется напряжение 5 В. Светодиод зажигается. Затем мы выключаем светодиод:

digitalWrite(13, LOW);

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

/* Зажигаем светодиод на одну секунду, затем выключаем его на одну секунду в цикле. */ void setup() { // Инициализируем цифровой вход/выход в режиме выхода. // Выход 13 на большинстве плат Arduino подключен к светодиоду на плате. pinMode(13, OUTPUT); } void loop() { digitalWrite(13, HIGH); // зажигаем светодиод delay(1000); // ждем секунду digitalWrite(13, LOW); // выключаем светодиод delay(1000); // ждем секунду }

Смотрите также

На этом уроке Вы научитесь программировать свою плату Arduino на примере мигания встроенным светодиодом.

Необходимые элементы

Для данного примера Вам понадобится плата Arduino (в данном случае – Arduino Uno R3 , но Вы сможете проработать данный пример, имея в наличии и другую плату) и кабель USB (типа A (4х12 мм) – B (7х8 мм) – более подробно можно почитать на Вики).

Что такое ” L” светодиод


На Arduino Uno присутствуют ряды коннекторов типа мама по бокам платы, которые используются для подключения периферийных электронных устройств или “шилдов” .

Кроме того, на плате присутствует встроенный светодиод (англ. – LED), которым Вы можете управлять с помощью скетчей. Этот встроенный светодиод условно назовем “L” светодиод, как это принято на многих англоязычных ресурсах.

Расположение данного светодиода на плате отмечено на фото снизу.


Загрузка примера “Blink” (мигание) в Arduino IDE

При подключении новой платы к персональному компьютеру, обратите внимание, что светодиод начинает мигать, так как все платы от производителей поступают с уже “залитым” скетчем “Blink ”.

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

Пришло время проверить Ваше подключение и запрограммировать плату.

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

Откройте пример “Blink”, который находится в пункте меню File – Examples – 01.Basics

После открытия, расширьте окно оболочки Arduino IDE, чтобы Вы могли весь скетч в одно окне.

Скетчи из примеров, включенные в Arduino IDE предусматривают режим “только чтение” (“read only”). То есть, загрузить их на плату Вы сможете, но после изменения кода, Вы не сможете их сохранить в том же файле.

Мы будем изменять скетч, так что в первую очередь Вам необходимо сохранить собственную копию, которую Вы сможете изменять.

Вы сохранили копию скетча “Blink” в Вашей библиотеке. Теперь открыть этот файл Вы можете в любой момент, перейдя по вкладке File – Scetchbook.

Загрузка примера “Blink” (мигание) на плату

Подключите свою плату Arduino к компьютеру с помощью USB и проверьте тип платы (“Board type”) и серийный порт (“Serial Port”), по которому она подключена.

Текущие настройки отображаются внизу окна оболочки Arduino IDE

Кликните на кнопку “Загрузить” (“Upload”)

Во время загрузки в нижней части окна IDE появятся ползунок загрузки и сообщения. Вначале появляется фраза “Компилирование” (“Compiling scetch..”), что означает процесс конвертирования Вашего скетча в формат, подходящий для загрузки на плату Arduino.

В конце статус сменится на ”Загрузка завершена” (“Done uploading”). В сообщении, которое появится в текстовой строке отобразится информация о том, что загруженный скетч занимает 1,084 байта из 32,256 доступных.

Иногда при компиляции у Вас может возникнуть подобная ошибка:

Причин может быть несколько: Вы не подключили плату к компьютеру; Вы не установили необходимые драйвера; Вы выбрали некорректный серийный порт.

Пояснения к скетчу “Blink”

Ниже представлен код скетча “Blink”.

Turns on an LED on for one second, then off for one second, repeatedly.

This example code is in the public domain.

// Pin 13 has an LED connected on most Arduino boards.

// give it a name:

pinMode(led, OUTPUT);

delay(1000); // wait for a second

Первое, на что стоит обратить внимание: в данном скетче множество “комментариев”. Обратите внимание, что комментарии не являются инструкцией по работе программы. Это исключительно пояснения отдельных функций и задач, которые выполняются на определенном этапе кода. Это не обязательная часть кода. Все между символами /* и */ в верхней части скетча – это комментарии, в которых описаны задачи программы. Так же есть комментарии, которые ограничиваются одной строкой. Они начинаются с символов // и заканчиваются по умолчанию в конце строки. Первая важная, по сути, часть данного кода это строка:

В комментариях над строкой указано, что мы присваиваем имя пину, к которому подключен светодиод. На большинстве плат Arduino это будет 13 пин. Дальше используется функция “Setup”. Опять-таки, в комментариях указано, что функция срабатывает после нажатия кнопки “reset”. Также эта функция срабатывает, когда плата перезагрузится по каким-либо другим причинам. Например, подача питания или после загрузки скетча.

// the setup routine runs once when you press reset:

// initialize the digital pin as an output.

pinMode(led, OUTPUT);

Каждый скетч Arduino обязан включать в себя функцию “setup” и часть, в которую вы можете добавлять собственные инструкции, заключенные между { }. В нашем примере в функции присутствует только одна команда, в которой указано, что пин, который мы используем, настраивается на “вывод” (“Output”). Также обязательным для любого скетча является функция цикла “Loop”. В отличие от функции “Setup ”, которая отрабатывает один раз после перезагрузки, функция “Loop” после окончания работы команд, вновь запустится.

// the loop routine runs over and over again forever:

digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)

delay(1000); // wait for a second

digitalWrite(led, LOW); // turn the LED off by making the voltage LOW

delay(1000); // wait for a second

В теле функции “Loop” светодиод включается (HIGH), данное значение задерживается на 1000 миллисекунд (1 секунда), светодиод отключается (LOW) и остается выключенным на 1 секунду, после чего цикл повторится.

Изменение частоты мигания светодиода

Для того, чтобы обеспечить более частое мигание светодиода, необходимо изменить параметр, указываемый в скобках () в команде “delay ”.

Как уже было указано, период задержки указывается в миллисекундах. То есть, для того, чтобы заставить светодиод мигать в два раза чаще, необходимо изменить значение с 1000 на 500. В результате, пауза между включением/выключением светодиода составит половину секунды и светодиод будет мигать быстрее.

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

  • 220 ohm resistor

Circuit

This example uses the built-in LED that most Arduino and Genuino boards have. This LED is connected to a digital pin and its number may vary from board type to board type. To make your life easier, we have a constant that is specified in every board descriptor file. This constant is LED_BUILTIN and allows you to control the built-in LED easily. Here is the correspondence between the constant and the digital pin.

  • D13 - 101
  • D13 - Due
  • D1 - Gemma
  • D13 - Intel Edison
  • D13 - Intel Galileo Gen2
  • D13 - Leonardo and Micro
  • D13 - LilyPad
  • D13 - LilyPad USB
  • D13 - MEGA2560
  • D13 - Mini
  • D6 - MKR1000
  • D13 - Nano
  • D13 - Pro
  • D13 - Pro Mini
  • D13 - UNO
  • D13 - Yún
  • D13 - Zero

If you want to lit an external LED with this sketch, you need to build this circuit, where you connect one end of the resistor to the digital pin correspondent to the LED_BUILTIN constant. Connect the long leg of the LED (the positive leg, called the anode) to the other end of the resistor. Connect the short leg of the LED (the negative leg, called the cathode) to the GND. In the diagram below we show an UNO board that has D13 as the LED_BUILTIN value.

The value of the resistor in series with the LED may be of a different value than 220 ohm; the LED will lit up also with values up to 1K ohm.

Schematic

Code

After you build the circuit plug your Arduino or Genuino board into your computer, start the Arduino Software (IDE) and enter the code below. You may also load it from the menu File/Examples/01.Basics/Blink . The first thing you do is to initialize LED_BUILTIN pin as an output pin with the line

pinMode(LED_BUILTIN, OUTPUT);

In the main loop, you turn the LED on with the line:

digitalWrite(LED_BUILTIN, HIGH);

This supplies 5 volts to the LED anode. That creates a voltage difference across the pins of the LED, and lights it up. Then you turn it off with the line:

digitalWrite(LED_BUILTIN, LOW);

That takes the LED_BUILTIN pin back to 0 volts, and turns the LED off. In between the on and the off, you want enough time for a person to see the change, so the delay() commands tell the board to do nothing for 1000 milliseconds, or one second. When you use the delay() command, nothing else happens for that amount of time. Once you"ve understood the basic examples, check out the example to learn how to create a delay while doing other things.

Once you"ve understood this example, check out the example to learn how read a switch connected to the board.

Итак, приступаем к освоению. Первый урок не потребует от вас никаких материалов и просто призван ознакомить с простотой ARDUINO. Как в большинстве программ ознакомление начинается с «Hello World!» так и мы начнем с самого простого- мигания светодиодом. Что вам для этого потребуется: собственно сама плата ARDUINO, USB кабель для подключения ARDUINO к компьютеру, оболочка программирования ARDUINO. Оболочки выпускаются новые, но самой стабильной признана версия 1.0.6. Скачать вы ее можете на официальном сайте . Это версия для Windows, для Linux качаете . Сразу стоит понять что для продолжения изучения вам понадобится макетная плата (заказать в Китае или купить в интернет- магазине), провода (можно купить там же или найти старые системные блоки и вытащить провода идущие на переднюю панель, раньше даже USB на лицевой панели соединялись одинарными проводами а не целым разъемом, именно они вам и подойдут- вытаскиваете провод, на другой конец напаять штырьки от разъемов на плате, затем надеваете на место пайки небольшой кусочек термоусадочной трубки, чтобы провод не переломился на месте пайки, нагреваете и у вас готовый провод мама(штеккер с отверстием)- папа (штырек от платы).

Самодельные провода для ARDUINO

Таким же образом сделайте провода- папа-папа, они пригодятся для коммутации на макетной плате и присоединения ARDUINO к макетной плате. Кстати можно, даже нужно, сделать такие провода в виде шлейфа- так гораздо удобнее соединять ARDUINO с блоками), ну и блоки с которыми вы будете работать (покупаются тоже в Китае или в интернет- магазинах). Выбор датчиков и исполнительных механизмов огромен и не ограничивает вашу фантазию. Но на первых порах будет достаточно термодатчика Dallas , индикатора (можно конечно и 7- сегментные светодиодные но они кушают ток в несколько раз больший чем 1602 а это отрицательно скажется при питании от аккумуляторов и батарей, да и выводят они только цифровую информацию), реле , все что вам будет нужно вы всегда сможете докупить. Для тех кто не стеснен в средствах лучше сразу купить набор. Хоть это и дороговато но он сразу отбрасывает все проблемы с приобретением датчиков и вы сможете изготавливать устройства сразу. Выбор все равно будет только за вами. Ладно, заговорился, ближе к теме.

Подключаем ARDUINO к компьютеру, запускаем программу, в программе заходим Сервис- Плата-выбираете вашу плату, все- можете работать!

Кстати, китайский клон может быть собран микросхеме ch340 и у вас компьютер будет требовать драйвер на USB порт. Для установки скачайте драйвер , распакуйте и при запросе драйвера укажите на папку с распакованными файлами.

Не теряя времени делаем следующее: Файл-Примеры-Basics-Blink . Откроется новое окно


Blink на ARDUINO

в котором вы увидите программу, можете сразу нажать на вторую кнопку в панели программы с изображением стрелки, программа скомпилируется и передастся в ARDUINO, светодиод на плате начнет мигать! 1 секунду горит, 1 секунду не горит. Рассмотрим саму программу. Вы увидите прежде всего комментарии отмеченные знаками /* текст */ и // текст . Первый значит что текст от знака /* до знака */ является комментарием и компилятор просто не обрабатывает и не учитывает эту информацию, очень удобно писать в таких комбинациях описание программы, ее алгоритм, авторство и многое другое. Знак // комментирует только строку. Причем вы можете писать этот знак как в начале строки, так и после каких либо строк программы, но ни в коем случае не перед строками программы- программа посчитает всю строку за комментарий.

Например:

digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level) — правильно

// turn the LED on (HIGH is the voltage level) digitalWrite(13, HIGH); — неправильно

Если вы хотите сделать комментарий перед оператором в одной строке то воспользуйтесь комбинацией /* текст */ , т.е. строка будет выглядеть так: /* turn the LED on (HIGH is the voltage level) */ digitalWrite(13, HIGH);

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

Следующее что вы увидите- следующий текст:

// the setup function runs once when you press reset or power the board
void setup () {
// initialize digital pin 13 as an output.
pinMode (13, OUTPUT);
}

В комментарии написано что функция установки вызывается только один раз когда вы сбрасываете или перезапитываете ARDUINO. Т.е. или нажимаете кнопку сброса на самой плате или вновь подключаете питание.

Затем идет оператор void setup () {….} — начинающий собственно секцию установок для данного скетча (так называется программа для ARDUINO).

В следующем комментарии написано что определяем 13 пин ARDUINO как выход. Хочу напомнить что на странице описаны пины платы, так вот 13 вывод является цифровым (о чем написано в подписях к выходам) и может принимать только 2 состояния- включено (при этом на него подается напряжения порядка 5В), т.е. логическая 1(единица), или выключено (напряжения нет) т.е. логический 0 (ноль). При ноле все равно есть небольшое напряжение на пине но они низкое по отношению к логической единице. Кроме того к 13 пину подключен через резистор светодиод на самой плате, именно он и мигает при выполнении программы.

pinMode (13, OUTPUT); — pinMode- переводится как режим пина, 13- номер пина, OUTPUT- выход, т.е. строка означает что 13 вывод будет работать как выход, OUTPUT , если написать INPUT то это уже будет ЦИФРОВОЙ ВХОД, т.е. вы можете обрабатывать поступающие на этот пин ЦИФРОВЫЕ данные.

Если вы подключите к 13 пину светодиод с последовательно подсоединенным резистором на 1кОм, а другую ножку к пину GND то светодиод будет мигать вместе со светодиодом на плате. Если он у вас не замигал- поменяйте полярность светодиода.

Следующие строки являются программой описывающей действия с портом:

// the loop function runs over and over again forever
void loop () {
digitalWrite (13, HIGH); // turn the LED on (HIGH is the voltage level)

digitalWrite (13, LOW); // turn the LED off by making the voltage LOW
delay (1000); // wait for a second


void loop () {…}
— секция программы где описываются действия для работы, данные в этом цикле могут меняться и обрабатываться в соответствии с условиями.Комментарий сообщает что следующий цикл будет выполняться снова и снова всегда

digitalWrite (13, HIGH); // turn the LED on (HIGH is the voltage level)- digitalWrite- записать ЦИФРОВОЙ сигнал, 13- номер пина, HIGH- высокий уровень, т.е. логическая единица (напряжение около 5В), дальше комментарий что включаем светодиод высоким логическим уровнем.

delay (1000); // wait for a second- delay (задержка), ждем 1000 миллисекунд или 1 секунду. Нужный оператор, особенно при обработке нажатий кнопки, в данном случае он используется как указание ждать 1 секунду после включения 13 пина.

digitalWrite (13, LOW); // turn the LED off by making the voltage LOW- как и первая строка цикла указывает что 13 пин надо переключить, только теперь на уровень LOW- низкий уровень, логический ноль (напряжение около 0В).

delay (1000); // wait for a second- опять задержка 1 сек прежде чем цикл начнется выполняться заново.

Попробуйте поменять значения delay, вы увидите что меняются длительность включения и паузы между вспышками.

Программа простейшая, понятная с первого раза но в ней есть недостатки: оператор delay заставляет ARDUINO ждать пока он не закончит свою работу, т.е. в этот момент МК не обрабатывает никакие данные, попросту говоря он ждет исполнения оператора, ладно если значения невысокие, а если нужно оперативно обработать данные? За 1 секунду данные могут поменяться не одну сотню раз, а МК не учитывает их, он ждет выполнения программы. Для того чтобы не пропускать поступающие данные можно воспользоваться следующим скетчем. Открываем скетч: Файл- Примеры- Digital- BlinkWithoutDelay . Откроется окно следующего содержания:

/* Blink without Delay

Turns on and off a light emitting diode(LED) connected to a digital
pin, without using the delay() function. This means that other code
can run at the same time without being interrupted by the LED code.

The circuit:
* LED attached from pin 13 to ground.
* Note: on most Arduinos, there is already an LED on the board
that’s attached to pin 13, so no hardware is needed for this example.

created 2005
by David A. Mellis
modified 8 Feb 2010
by Paul Stoffregen
modified 11 Nov 2013
by Scott Fitzgerald

This example code is in the public domain.

http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
*/

// constants won’t change. Used here to set a pin number:
const int ledPin = 13; // the number of the LED pin

// Variables will change:
int ledState = LOW; // ledState used to set the LED

// Generally, you shuould use «unsigned long» for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0; // will store last time LED was updated

// constants won’t change:
const long interval = 1000; // interval at which to blink (milliseconds)

void setup () {

pinMode (ledPin, OUTPUT);
}

void loop ()
{




// blink the LED.

if (currentMillis — previousMillis >= interval) {


if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;



}
}

Пропускаем все комментарии и переходим к строке:

// constants won’t change. Used here to set a pin number:
const int ledPin = 13; // the number of the LED pin

Строка комментария гласит что константы не надо изменять, т.е менять название констант. Но можно поменять цифру означающую номер пина.

const int ledPin = 13; // the number of the LED pin- const означает константу, т.е постоянную величину которую нельзя изменить в программе, int- сокращенно от слова integer, означает тип данных который может принимать значения от -32768 до 32768. Кроме integer есть еще 5 типов данных. Чем они отличаются? Они отличаются размерами, т.е. например в переменную типа byte можно записать всего 256 значений, разница в размерах- int-2 байта (кроме ARDUINO DUE, в нем INT занимает уже 4 байта но значения принимает от -2147483648 до 2147483647), byte как и написано- 1 байт. В больших программах экономия памяти является очень важным моментом и поэтому старайтесь избегать где только можно применения более «тяжелых» типов если можно обойтись «легкими» типами. Например здесь хватило бы типа byte т.к. 13 вписывается в предел между 0 и 255, да и остальные цифровые пины тоже бы вписались в этот тип данных. ledPin — название самой константы. 13- значение константы, из комментария выше понятно что эта константа будет использована для выбора пина.

// Variables will change:
int ledState = LOW; // ledState used to set the LED

Комментарий говорит что переменная будет меняться в программе

int ledState = LOW; // ledState used to set the LED- объявляет переменную ledState имеющую начальное значение LOW (логический ноль) и комментарий что переменная ledState будет использоваться для светодиода (LED по не нашему).

// Generally, you shuould use «unsigned long» for variables that hold time
// The value will quickly become too large for an int to store
// will store last time LED was updated

Комментарий говорит что вы должны использовать переменную типа unsigned long для времени, следующая строка предупреждает что значение будет слишком большим для переменной типа int для хранения. Unsigned long применяется для хранения ЧИСЕЛ и может хранить значения от 0 до 4294967295 занимая 4 байта.

unsigned long previousMillis = 0; // will store last time LED was updated- создает переменную previousMillis типа unsigned long и присваивает значение 0, в ней будет хранится время когда было обновлено состояние светодиода.

// constants won’t change:
const long interval = 1000; // interval at which to blink (milliseconds)

Тоже константа, типа long, предназначена для хранения ЧИСЕЛ, занимает 4 байта и может принимать значения от -2147483648 до 2147483647, interval- название переменной, 1000- значение переменной. В комментарии подписано что это будет интервал мигания в миллисекундах.

void setup () {
// set the digital pin as output:
pinMode (ledPin, OUTPUT);
}

Функция знакомая по предыдущему примеру, только здесь указывается пин не явно а через переменную ledPin , которая описана у нас как константа и имеет значение 13. Т.е это равносильно тому что если было бы написано pinMode (13, OUTPUT);

Ну и собственно тело программы:

void loop ()
{
// here is where you’d put code that needs to be running all the time.

// check to see if it’s time to blink the LED; that is, if the
// difference between the current time and last time you blinked
// the LED is bigger than the interval at which you want to
// blink the LED.

Здесь комментариях описано как работает программа. Кстати, можно было использовать комбинацию /*текст*/ вместо того чтобы писать в каждой строке // . Здесь написано что когда разница между текущим и последним временем когда светодиод мигнул больше чем указанный интервал то нужно снова зажечь светодиод.

unsigned long currentMillis = millis ();

Объявляется переменная currentMillis типа unsigned long которая хранит данные оператора millis () . millis () — внутренний оператор МК указывает сколько миллисекунд проработал ARDUINO.

if (currentMillis — previousMillis >= interval) {
// save the last time you blinked the LED
previousMillis = currentMillis;

Дошли до вычисления. Теперь есть замечательный оператор условия if (если)- которым пользовались, пользуются и будут пользоваться еще очень долго. Рассмотрим его более подробно. Конструкция условия выглядит так:

if (условие==значение){

Действие если условие выполняется

else {

Действие если условие не выполняется

Знак == может меняться на любые другие знаки >,<,>=, <=, != (не равно). Условие как и значение может высчитываться. Если условие не выполнено то программа переходит в секцию else. Довольно часто секцию else не используют а просто пишут программу дальше. Это уже зависит от алгоритма работы программы и должно быть продумано заранее. Условий может быть сколько угодно и они могу быть вложены друг в друга, т.е. пока не выполнится одно условие- другое даже выполняться не начнет.

Итак оператор if вычитает из текущих миллисекунд предыдущее значение и сравнивает с переменной interval. Если значение меньше то программа выходит из условия и начинается сначала, если больше или равно то переменной previousMillis присваивается значение currentMillis и программа переходит на следующий шаг:

// if the LED is off turn it on and vice-versa:
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;

В этой секции выясняется какое состояние у светодиода, если на светодиод подавался низкий уровень LOW то переменной ledState присваивается значение HIGH, и наоборот (секция else) если был высокий уровень HIGH то переменной ledState присваивается значение LOW. Заметьте что здесь if используется уже без {}. Это допускается если нужно обработать в секции выполнения не более 1 строки.

// set the LED with the ledState of the variable:
digitalWrite (ledPin, ledState);

Ну и наконец записываем на значение переменной ledPin (оно было равно 13), значение переменной ledState. Т.е. данная строка может быть записана как digitalWrite(13, LOW); или digitalWrite(13, HIGH); в зависимости от времени работы МК. Обратите внимание что использован оператор digitalWrite- именно он указывает что надо передать значение в логическом формате, т.е. ноль или единицу. Больше он никаких значений принять не может. Любые другие значения ledState будут автоматически приведены к логической 1.

}
}

Вот и разобрана работа второй программы. Какая разница между первой и второй программой если они выполняют одно и тоже действие но во второй написано раз в 5 больше строк? Как я и говорил что первая программа просто ждет когда закончит свою работу оператор delay и только потом продолжит работу. Во время delay вы не сможете обрабатывать никаких данных. Вторая программа позволяет получать, обрабатывать и отдавать данные во время мигания светодиода. Просто дописываете нужный код в секцию loop и наслаждаетесь работой! Мы с моим другом подсчитали что код пробегается во втором случае около 4 млн. раз в секунду, поэтому задержек практически нет.

Ну а теперь самое главное. Спустя некоторые время, наигравшись, вы скажете- «Че толку то мигать лампочкой… Где это можно использовать? Только индикатор того что устройство работает…» Вы будете не совсем правы. У вас есть инструмент, что вы с его помощью можете сделать- это только ваша вина если вы ничего не можете придумать. Это как любому человеку дать полный набор инструментов и попросить что нибудь сделать, например комплект столярного инструмента вручить мужчине, кто то будет всю жизнь строгать одну и ту же доску, поражаясь чистоте с которой рубанок строгает и пытаясь наточить железку как можно острее, а кто-то будет делать в это самое время высококачественную мебель. Кем будете вы- решать только Вам. Еще мой совет, где то я вычитал, даже не помню-«НЕ ИЩИТЕ ПРОБЛЕМЫ, ИЩИТЕ ИХ РЕШЕНИЕ!» Если вы будете пользоваться таким подходом у вас возникнет гораздо меньше всяких КАК и ПОЧЕМУ. Ну а теперь про мигание светодиодом. В интернете куча советов по пользованию различными индикаторами, конечно это красиво, придает какую то значимость автору и т.д… но это задевает самое главное- экономия пинов и памяти. Для того чтобы подключить индикатор 1602 надо занять 6 цифровых пинов + 2 провода питания! Это если не пользоваться протоколом I2C. К тому же библиотека на LCD занимает 4кБ. И никто не думает о дальнейшей функциональности, ну поигрались индикатором и все- тоже бросили. Неужто никто не задавался вопросом что можно одним светодиодом получать всю необходимую информацию? Например ошибки. Написали функцию и передаете в нее код ошибки. Это же удобно- не надо опять разбирать код а просто посмотреть что не так работает. Или, к примеру, мой друг собрал на ARDUINO mini контроллер газового котла, т.е. по температуре в дому (снимаемой датчиком Dallas), включался/отключался циркуляционный насос. Когда насос был отключен, котел нагревался до 40°С и стоял на запальнике, температура в комнате падала- включался насос и при остывании теплоносителя котел сам включался. Очень удобно и появилась существенная экономия газа! Всего за каких то 200-300 рублей он экономил каждый день по несколько кубов газа! Он тогда все думал- как же отследить температуру в комнате без подключения всяких WiFi и компьютеров, я предложил- пускай светодиод мигает столько раз, сколько градусов в комнате… Посмеялись конечно- 20-25 раз считать по любому ошибешься, тогда я предложил- пусть мигает сначала десятки градусов а через паузу- единицы, например 24 градуса, сначала 2 раза мигнул, через паузу еще 4. Все! Никаких больше индикаторов! И это можно применить в любой области! Ищите нестандартные подходы и старайтесь экономить энергию и входы. Даже если используете I2C. Всем удачи в освоении МК и, в частности, ARDUINO.