Компьютерные подсказки

Вылетает Сталкер: Зов Припяти Программа икс рей 1

Stalker lost alpha гид по прохождению

Pony Express отслеживание почтовых отправлений

Pony Express – время и сроки доставки с Алиэкспресс в Россию

Застряли посылки с Алиэкспресс со статусом Hand over to airline: что делать?

РФ (Nigma) — интеллектуальная поисковая система

Данные для семантики — Яндекс Вордстат

Пиар ВКонтакте при помощи бирж: особенности и использование

Почему я не могу отправить сообщение?

Предупреждение «Подключение не защищено» в Google Chrome по протоколу https Нарушена конфиденциальность данных яндекс браузер

Всё что известно о смартфоне Samsung Galaxy S9 Аккумуляторная батарея Galaxy S9 и мощность

Темы оформления и русификация форума SMF, а так же установка компонента JFusion в Joomla

Автоматическое определение движка форума Позже board powered by smf

Коды в игре скайрим - зелья, ингредиенты, заклинания Код на ингредиенты скайрим

Подробная инструкция, как в "скайриме" открыть дверь золотым когтем

Библиотека AVR для работы с шиной I2C и с часами реального времени PCF8583. Теория I2C, EEPROM от Atmel Описание библиотеки Wire

Пришла мне посылка из Китая в которой лежит микросхема EEPROM фирмы Atmel. Которую хочется подключить к Arduino. Но совершенно не хочется использовать готовую библиотека, а разобраться самому. По этому статья получиться немного объемной и скучной и разделем ее на три части:

  • Теория интерфейса I2C.
  • EEPROM, описания моей микросхемы(AT24C256) и подключение.
  • Написание библиотеки для работы с памятью.

Часть первая, I2C и библиотека «Wire».

Последовательный протокол обмена данными IIC (также называемый I2C — Inter-Integrated Circuits, межмикросхемное соединение). Разработана фирмой Philips Semiconductors в начале 1980-х как простая 8-битная шина внутренней связи для создания управляющей электроники. Так как право на использование его стоит денег фарма Atmel назвала его TWI , но смысл от этого не меняется.

Как это работает?

Для передачи данных используются две двунаправленные лини передачи данных. SDA (Serial Data) шина последовательных данных и SCL (Serial Clock) шина тактирования. Обе шины подтянуты резисторами к плюсовой шине питания. Передача/Прием сигналов осуществляется прижиманием линии в 0, в единичку устанавливается сама, за счет подтягивающих резисторов .

В сети есть хотя бы одно ведущее устройство (Master ), которое инициализирует передачу данных и генерирует сигналы синхронизации и ведомые устройства (Slave ), которые передают данные по запросу ведущего. У каждого ведомого устройства есть уникальный адрес, по которому ведущий и обращается к нему. Конечно понятно что Ведущий это наш микроконтроллер, а ведомый наша память. Ведущее устройство начинает прижимать шину SCL к нулю с определенной чистотой, а шину SDA прижимать или отпускать на определенное число тактов передавая Единичку или Нолик. Передача данных начинается с сигнала START потом передается 8 бит данных и 9-тым битом Ведомое устройство подтверждает прием байт прижимая шину SDA к минусу. Заканчивается передача сигналом STOP .

Библиотека «Wire».

Для облегчения обмена данными с устройствами по шине I2C для Arduino написана стандартная библиотека Wire которая есть уже в комплекте IDE . Она имеет следующие основные функции:

Wire.begin(Address) вызывается один раз для инициализации и подключения к шини как Ведущий или Ведомое устройство. Если Address не задан подключаемся как Мастер устройство.

Wire.beginTransmission(address) начинает передачу на ведомое I2C устройство с заданным адресом.

Wire.endTransmission() прекращает передачу данных ведомому. Функция возвращает значение типа byte :

  • 0 — успех.
  • 1- данные слишком длинны для заполнения буфера передачи.
  • 2 — принят NACK при передаче адреса.
  • 3 — принят NACK при передаче данных.
  • 4 — остальные ошибки.

Wire.write() запись данных от ведомого устройства в отклик на запрос от ведущего устройства, или ставит в очередь байты для передачи от мастера к ведомому устройству.Фактически записывает данные в буфер. Размер буфера 32 байт а (минус 2 байта адрес, фактически 30 байт ), а передает буфер функция Wire.endTransmission().

  • Wire.write(value) — value : значение для передачи, один байт.
  • Wire.write(string) — string : строка для передачи, последовательность байтов.
  • Wire.write(data, length) — data : массив данных для передачи, байты. length : количество байтов для передачи.

Wire.read() Считывает байт, который был передан от ведомого устройства к ведущему или который был передан от ведущего устройства к ведомому. Возвращаемое значение byte : очередной принятый байт.

Это самые основные функции библиотеке, остальные мы рассмотрим по ходу пьесы))

Часть вторая, EEPROM.

EEPROM (англ. Electrically Erasable Programmable Read-Only Memory ) - электрически стираемое перепрограммируемое ПЗУ (ЭСППЗУ), один из видов энергонезависимой памяти (таких, как PROM и EPROM). Память такого типа может стираться и заполняться данными до миллиона раз.

Мне прислали уже готовый модуль EEPROM с микросхемой AT24C256 фирмы Atmel объемом 32 кбайт. Что бы разобраться с этим чудом нам придется проштудировать datasheet который очень скучный и на английском. Так что я вам выдам уже готовый результат моих мук.

Характеристики:

  • Низковольтные и стандартные питание. VCC = 1.7V to 5.5V.
  • 400kHz (1.7V) and 1MHz (2.5V, 2.7V, 5.0V) совместим с частотой синхронизации.
  • Выносливость: 1,000,000 Циклов Записи.
  • Внутренне организованный как 32 768 страниц x 8 бит.

выводы:

  • WP — защита от записи. Если вывод подключен к GND то можно записывать данные в память.
  • A0…A2 — выводы задающие адрес устройства.
  • Vcc — питание плюс.
  • GND — питание минус.
Адрес памяти:

Задается тремя ногами A0..A2. Если нога прижата к Gnd то значение бита 0, если к Vcc то 1. Микросхема использует восьми битный адрес, последний бит отвечает за выбор операции . Если значение бита высокий то инициализируется операция чтения, если низкий(ноль) то операция записи.

То есть если все три вывода прижаты к GND и мы хотим записать в память, адрес устройства будет выглядеть как 10100000 (в библиотеке «Wire» используется 7-ми битный адрес, сдвигаем все в право на один бит 01010000 0x50 ).

Запись данных в память:

Для записи мы с начало обращаемся к памяти с битом Записи в адресе . Потом посылаем два 8-ми битных адреса(то есть у нас 0x8000 адресов) , затем байт данных и сигнал STOP . После этого EEPROM входит во внутренне синхронизированный цикл записи tWR(Write Cycle Time 5 ms) в энергонезависимую память. Все входные сигналы
отключено во время этого цикла записи, и EEPROM не ответит, пока запись не будет завершена .

Копаемся дальше и находим в datasheet что память микросхемы организована как 512 страниц по 64 байта . То есть мы может записать сразу до 64 байт информации за одну команду. Для этого мы передаем все 64 байта информации и только после этого посылаем сигнал STOP .

Чтение данных:

С чтением данных все интересней. Память поддерживает три варианта чтения:

  • Читать текущий адрес;
  • Читать случайный адрес;
  • Последовательное чтение;

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

Что бы прочитать случайный адрес нам нужно с начало отправить команду на запись и передать адрес который хотим прочитать(не забывайте что адрес состоит из двух 8-ми битных частей ). За тем отправить команду на чтение и получить искомый байт, завершив все командой STOP.

Последовательное чтение может выполняться как с текущего адреса так и со случайного и будет продолжаться пока микроконтроллер не отправит сигнал СТОП. При переполнении адреса память ее сбросить и адресация начнется с начала.

Ну что же пришло время попробовать что нибудь записать:
#include // Подключаем библиотеку #define EEPROM_ADDRESS 0x53 // Задаем адрес памяти word address = 0; // Адрес куда будем записывать byte data_send = 170 ; // Даные void setup() { Wire.begin(); // Инициализируем I2C Serial.begin(9600); Serial.print("Write byte to EEPROM memory..."); Serial.println (data_send); Wire.beginTransmission(EEPROM_ADDRESS); // Начинаем передачу Wire.write(address >> 8); Wire.write(address & 0xFF); // Отправляем два байта адреса Wire.write(data_send); // Отправляем данные byte status= Wire.endTransmission(); // Заканчиваем передачу и проверяем статус передачи. if (status == 0)Serial.println ("Ок"); // delay(10); Serial.println("Read byte from EEPROM memory..."); Wire.beginTransmission(EEPROM_ADDRESS); // Что бы прочитать данные отравляем сначала адрес где они лежат. Wire.write(address >> 8); Wire.write(address & 0xFF); status= Wire.endTransmission(); if (status == 0)Serial.println ("Ок"); // stop transmitting Wire.requestFrom(EEPROM_ADDRESS, (byte)1); // отправляем команду на чтение одного байта данных byte data = 0; if (Wire.available()) // проверяем что есть данные для чтения. { data = Wire.read(); //читаем данные } Serial.println (data, DEC); } void loop() { }

Wire.requestFrom(address, quantity) — Используется мастером для запроса байтов от ведомого устройства. Эти байты могут быть получены с помощью методов available() и read() . Размер буфера такой же 32 байта .

  • address : 7-битный адрес устройства, у которого запрашиваются байты;
  • quantity : количество запрашиваемых байтов;

Wire.available() — Возвращает количество байтов, доступных для получения с помощью read() .

Ну и пример с записью в память строки «Hello Word»:

#include #define EEPROM_ADDRESS 0x53 word address = 0; char data_send = "Hello Word" ; void setup() { Wire.begin(); // Serial.begin(9600); Serial.print("Write byte to EEPROM memory..."); Serial.println (data_send); Wire.beginTransmission(EEPROM_ADDRESS); Wire.write(address >> 8); Wire.write(address & 0xFF); Wire.write(data_send); byte status= Wire.endTransmission(); if (status == 0)Serial.println ("Ок"); delay(10); Serial.println("Read byte from EEPROM memory..."); Wire.beginTransmission(EEPROM_ADDRESS); Wire.write(address >> 8); Wire.write(address & 0xFF); status= Wire.endTransmission(); if (status == 0)Serial.println ("Ок"); // stop transmitting Wire.requestFrom(EEPROM_ADDRESS, (byte)10); byte data = 0; for (int i=0 ; i<10 ;i++) { if (Wire.available()) { data = Wire.read(); } Serial.write (data); } } void loop() { }

Организация памяти:

Так как в datasheet об этом написано смутно. Я на практике пытался разобраться с этим. В datasheet написано что память микросхемы организована как 512 страниц по 64 байта . Что это значит? Если мы захотим записать больше 64 байт сразу,скажем по адресу 0x40(адрес начало второй страницы), при выходе адреса за границы страницы внутренний счетчик микросхемы сбросит адрес на начало страницы . А лишние байты будут записаны в начало страницы и сотрут данные которые были там записаны.

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

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

С номиналами от 10 Ом до 1 МОм);

  • 2 резистора по 4,7 кОм (из того же набора);
  • соединительные провода (например, вот хороший набор);
  • компьютер с Arduino IDE.
  • 1 Описание интерфейса I2C

    Последовательный протокол обмена данными IIC (также называемый I2C - Inter-Integrated Circuits, межмикросхемное соединение) использует для передачи данных две двунаправленные линии связи, которые называются шина последовательных данных SDA (Serial Data) и шина тактирования SCL (Serial Clock) . Также имеются две линии для питания. Шины SDA и SCL подтягиваются к шине питания через резисторы.

    В сети есть хотя бы одно ведущее устройство (Master) , которое инициализирует передачу данных и генерирует сигналы синхронизации. В сети также есть ведомые устройства (Slave) , которые передают данные по запросу ведущего. У каждого ведомого устройства есть уникальный адрес, по которому ведущий и обращается к нему. Адрес устройства указывается в паспорте (datasheet). К одной шине I2C может быть подключено до 127 устройств, в том числе несколько ведущих. К шине можно подключать устройства в процессе работы, т.е. она поддерживает «горячее подключение».

    Давайте рассмотрим временную диаграмму обмена по протоколу I2C. Есть несколько различающихся вариантов, рассмотрим один из распространённых. Воспользуемся логическим анализатором, подключённым к шинам SCL и SDA.

    Мастер инициирует обмен. Для этого он начинает генерировать тактовые импульсы и посылает их по линии SCL пачкой из 9-ти штук. Одновременно на линии данных SDA он выставляет адрес устройства , с которым необходимо установить связь, которые тактируются первыми 7-ми тактовыми импульсами (отсюда ограничение на диапазон адресов: 2 7 = 128 минус нулевой адрес). Следующий бит посылки - это код операции (чтение или запись) и ещё один бит - бит подтверждения (ACK), что ведомое устройство приняло запрос. Если бит подтверждения не пришёл, на этом обмен заканчивается. Или мастер продолжает посылать повторные запросы.

    Это проиллюстрировано на рисунке ниже.. В первом случае, для примера, отключим ведомое устройство от шины. Видно, что мастер пытается установить связь с устройством с адресом 0x27, но не получает подтверждения (NAK). Обмен заканчивается.


    Теперь подключим к шине I2C ведомое устройство и повторим операцию. Ситуация изменилась. На первый пакет с адресом пришло подтверждение (ACK) от ведомого. Обмен продолжился. Информация передаётся также 9-битовыми посылками, но теперь 8 битов занимают данные и 1 бит - бит подтверждения получения ведомым каждого байта данных. Если в какой-то момент связь оборвётся и бит подтверждения не придёт, мастер прекратит передачу.

    2 Реализация I2C в Arduino

    Arduino использует для работы по интерфейсу I2C два порта. Например, в Arduino UNO и Arduino Nano аналоговый порт A4 соответствует SDA, аналоговый порт A5 соответствует SCL.


    Для других моделей плат соответствие выводов такое:

    3 Библиотека "Wire" для работы с IIC

    Для облегчения обмена данными с устройствами по шине I2C для Arduino написана стандартная библиотека Wire . Она имеет следующие функции:

    Функция Назначение
    begin(address) инициализация библиотеки и подключение к шине I2C; если не указан адрес, то присоединённое устройство считается ведущим; используется 7-битная адресация;
    requestFrom() используется ведущим устройством для запроса определённого количества байтов от ведомого;
    beginTransmission(address) начало передачи данных к ведомому устройству по определённому адресу;
    endTransmission() прекращение передачи данных ведомому;
    write() запись данных от ведомого в ответ на запрос;
    available() возвращает количество байт информации, доступных для приёма от ведомого;
    read() чтение байта, переданного от ведомого ведущему или от ведущего ведомому;
    onReceive() указывает на функцию, которая должна быть вызвана, когда ведомое устройство получит передачу от ведущего;
    onRequest() указывает на функцию, которая должна быть вызвана, когда ведущее устройство получит передачу от ведомого.

    4 Подключение I2C устройства к Arduino

    Давайте посмотрим, как работать с шиной I2C с помощью Arduino.

    Сначала соберём схему, как на рисунке. Будем управлять яркостью светодиода, используя цифровой 64-позиционный потенциометр AD5171 (см. техническое описание), который подключается к шине I2C. Адрес, по которому мы будем обращаться к потенциометру - 0x2c (44 в десятичной системе).


    5 Управление устройством по шине IIC

    Рассмотрим диаграммы информационного обмена с цифровым потенциометром AD5171, представленные в техническом описании:


    Нас тут интересует диаграмма записи данных в регистр RDAC . Этот регистр используется для управления сопротивлением потенциометра.

    Откроем из примеров библиотеки "Wire" скетч: Файл Образцы Wire digital_potentiometer . Загрузим его в память Arduino.

    #include // подключаем библиотеку "Wire" byte val = 0; // значение для передачи потенциометру void setup() { Wire.begin(); // подключаемся к шине I2C как мастер } void loop() { Wire.beginTransmission(44); // начинаем обмен с устройством с I2C адресом "44" (0x2C) Wire.write(byte(0x00)); // посылаем инструкцию записи в регистр RDAC Wire.write(val); // задаём положение 64-позиционного потенциометра Wire.endTransmission(); // завершаем I2C передачу val++; // инкрементируем val на 1 if (val == 63) { // по достижении максимума потенциометра val = 0; // сбрасываем val } delay(500); }

    После включения вы видите, как яркость светодиода циклически нарастает, а потом гаснет. При этом мы управляем потенциометром с помощью Arduino по шине I2C.

    Why another I2C library?

    The standard I2C library for the Arduino is the Wire library . While this library is sufficient most of the time, there are situations when it cannot be used:

    • the I2C pins A4/A5 (or SDA/SCL) are in use already for other purposes,
    • the code shall run on both an ATmega processor with 16 MHz and an ATtiny processor with 1 MHz ,
    • you are short on memory (flash and RAM).

    Features

    • compatible with all 8-bit AVR MCUs
    • can make use of almost any pin
    • clock stretching (by slaves) supported
    • timeout on clock stretching
    • timeout on ACK polling for busy devices (new!)
    • internal MCU pullup resistors can be used (new!)
    • very lightweight (roughly 250 bytes of flash and 0 byte of RAM, except for call stack)
    • very fast (standard and fast mode on UNO, 33 kHz with 1 MHz CPU clock)
    • Optional Wire library compatible interface
    • no bus arbitration (i.e., only one master allowed on bus)
    • supports only master mode
    • GPL license

    Using the library

    Alternative Interface

    Meanwhile, I have written a wrapper around SoftI2CMaster that emulates the Wire library (master mode only). It is another C++-header file called SoftWire .h which you need to include instead of SoftI2CMaster .h . Directly after this include statement you need to create a Wire instance.

    This interface sacrifices some of the advantages of the original library, in particular its small footprint, but comes handy if you need a replacement of the original Wire library. The following table lists the memory requirements.

    WireSoftI2CMaster SoftWire Flash memory RAM
    1956 252 712 208 0 64

    Мне нужно было сделать часы на основе микросхемы, имеющей I 2 C интерфейс. Микросхема RTC, т.н. "часы реального времени" PCF8583.

    Внутри микросхемы расположены: часы, будильник, таймер, календарь (кривой), и 240 байт оперативной памяти, куда можно записывать любую информацию, которую только вздумается. Оперативная память это очень полезная штука, в отличии от флеш-памяти, оперативная память не имеет ограничений по количеству циклов перезаписи, и в неё можно сохранять какие-то данные, настройки, сколь угодно часто.

    Но была одна проблемка - писАть код жутко не хотелось, и я решил найти готовый код в интернете. Как позже выяснилось, найти «на свою голову». Скачал пример работы с I 2 C, подправил, прошил микроконтроллер. Не заработало. Стал ковырять код, искать причину неработоспособности… и ужаснулся!! Запись в некоторых случаях велась во весь порт сразу, а не в конкретные биты. Таким образом, если на порт повесить ещё что-то, например, дисплей, то скорее всего, оно работать не будет. Также неправильно было реализовано чтение данных по шине (без генераций условия окончания приёма, или просто без NACK). Но это пол-беды. Основная проблема в другом. Зачастую автор кода выставлял в порт логическую «1», а как мы знаем, шина I 2 C управляется «притягиванием» выводов SDA и SCL к общему проводу. А логическая «1» на шине, в свою очередь, формируется за счёт подтяжки к плюсу питания резисторами на 4,7 килоом. Таким образом, если на выходе микроконтроллера выставить логическую «1», а ведомое устройство «притянет» этот выход к общему проводу, то получится «ба-бах» короткое замыкание. Мне это очень не понравилось, и я решил изобрести свой велосипед написать свою библиотеку, а вернее даже 2 библиотеки: одна для работы с шиной I 2 C, а другая непосредственно для работы с часами реального времени PCF8583. Да, кстати, код написан в .

    Для того, чтобы подключить библиотеку I 2 C к проекту, нужно прописать её через include, как на картинке, а также скопировать библиотеку в папку с проектом.

    После чего, необходимо открыть файл "i2c.h", и указать ножки микроконтроллера, которые будут выступать в роли шины I 2 C. По умолчанию шина настроена на ножки PC0 (SCL) и PC1 (SDA). А настройка делается вот тут:

    Всё, библиотеку I2C мы подключили, ножки настроили, библиотека готова к работе. Пример использования:

    I2c_init (); // Инициализация шины I2C i2c_start_cond(); // старт шины i2c_send_byte (0xA0); // адрес устройства, которое висит на шине i2c_send_byte (0x10); // байт данных, который записываем в устройство i2c_send_byte (0x10); // ещё один байт данных, который записываем в устройство i2c_stop_cond(); // стоп шины

    После стоп-условия, мы можем проверить, всё ли у нас в порядке с шиной I 2 C. Для этого нужно прочитать переменную «i2c_frame_error». Если всё нормально, то в ней будет 0. Если один из выводов шины не «подтянулся» к питанию, и логическая «1» не установилась на шине, то библиотека генерирует ошибку, и записвает в переменную «i2c_frame_error» циферку 1. Читать переменную «i2c_frame_error» нужно после стоп-условия. На рисунке ниже продемонстрирую как работает контроль ошибки:

    Теперь займёмся подключением библиотеки часов реального времени PCF8583. Для этого нужно проделать те же самые действия. Скопируем в папку с проектом файл "PCF8583.h", и пропишем его в include, как на фото:

    Готово. Библиотека часов реального времени PCF8583 подключена. Она не требует каких-либо настроек, поэтому можно сразу приступать к чтению времени и даты с микросхемы. Обращаю внимание, что библиотека PCF8583 работает при помощи библиотеки I2C, поэтому если хотим работать с PCF8583, то нужно подключить обе библиотеки!

    Пример использования библиотеки (запись и чтение времени и даты):

    // Инициализация шины I2C i2c_init (); // Подготавливаем время и дату для записи в микросхему PCF8583 PCF_hour=23; // 23 часа PCF_min=59; // 59 минут PCF_day=31; // 31 число PCF_month=12; // 12 месяц - декабрь PCF_year=0; // год (0 - не високосный) PCF_weekday=6; // 6 день недели (воскресенье) // Записываем время и дату в микросхему PCF8583 PCF_write_hh_mm_ss(); // Считываем время и дату из микросхемы PCF8583 PCF_read_hh_mm_ss(); Пример работы с оперативной памятью (запись и чтение): // Подготавливаем 5 байт для записи в микросхему PCF8583 PCF_data_ram_1=255; // байт 1 PCF_data_ram_2=255; // байт 2 PCF_data_ram_3=255; // байт 3 PCF_data_ram_4=255; // байт 4 PCF_data_ram_5=255; // байт 5 // Записываем 5 байт в микросхему PCF8583 PCF_write_ram(); // Считываем 5 байт из микросхемы PCF8583 PCF_read_ram();

    Чтение из микросхемы ещё проще – достаточно вызвать функцию PCF _ read _ hh _ mm _ ss () после чего, время и дата появятся в переменных, откуда их только забирай. Для чтения оперативной памяти соответственно используем функцию PCF _ read _ ram () после чего данные забираем в переменных PCF _ data _ ram _ N

    Вот список переменных, где и что хранится:

    // время и дата PCF_hour=0; // время, часы (от 0 до 23, защита от переполнения при записи и чтении) PCF_min=0; // время, минуты (от 0 до 59, защита от переполнения при записи и чтении) PCF_sec=0; // время, секунды (только для чтения, при записи сбрасываются в 00) PCF_day=0; // день (от 1 до 31, защита от переполнения при записи и чтении) PCF_weekday=0 // день недели (0-понедельник; 6-воскресенье, защита от переполнения при записи и чтении) PCF_month=0; // месяц (от 1 до 12, защита от переполнения при записи и чтении) PCF_year=0; // год (0-високосный; 1,2,3-невисокосные, защита от переполнения при записи и чтении) // оперативная память PCF_data_ram_1; // Данные (ОЗУ PCF8583), байт 1 PCF_data_ram_2; // Данные (ОЗУ PCF8583), байт 2 PCF_data_ram_3; // Данные (ОЗУ PCF8583), байт 3 PCF_data_ram_4; // Данные (ОЗУ PCF8583), байт 4 PCF_data_ram_5; // Данные (ОЗУ PCF8583), байт 5

    Теперь расскажу про защиту от переполнения. Допустим, мы забыли подключить микросхему. Прочитаем данные с микросхемы, и… прочитается байт 11111111, или число 255. Всё дело в том, что в основе шины I 2 C лежат 2 подтягивающих резистора, вот они то и выдают нам логические «единички» если микросхема не подключена. Для защиты от подобных случаев, в библиотеке PCF8583 я сделал защиту от переполнений, которая следит за тем, чтобы часики не показывали вам 62 часа 81 минуту… Наличие переполнения можно проследить, прочитав переменную «PCF_overflow». Если в ней 0, значит ошибок переполнения не было. Если в ней 1 или более, значит ошибки переполнения имеются. Читать переменную «PCF_overflow» нужно после функции чтения даты и времени PCF _ read _ hh _ mm _ ss ()

    Для наглядности, проект AVR Studio 6 под ATmega32 прилагается. Перекомпилировать можно под любой AVR. В проекте я также подключил дисплей для визуального контроля. При подаче питания, микроконтроллер устанавливает 23 часа 59 минут, 31 декабря, Воскресенье. И через минуту становится 00 часов 00 минут, 1 января, Понедельник.

    Теперь расскажу, почему я говорил про «кривой» календарь этой микросхемы. Всё дело в том, что микросхема не умеет хранить текущий календарный год, а хранит лишь флаг високосного года. Короче говоря:
    0 – високосный год
    1 – не високосный год
    2 – не високосный год
    3 – не високосный год

    И так по циклу 0-1-2-3-0-1-2-3-0…

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

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

    Список радиоэлементов

    Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
    МК AVR 8-бит

    ATmega32

    1 В блокнот
    Часы реального времени (RTC)

    PCF8583

    1 В блокнот
    LCD-дисплей WH1602 1

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

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

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

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

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

    Список встроенных библиотек (они поставляются вместе с дистрибутивом 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. Об этом мы поговорим в отдельной статье.

    Вам также будет интересно:

    Читы и консольные команды для Counter-Strike: Global Offensive Команда в кс го чтобы летать
    В этой статье мы рассмотрим некоторые из наиболее полезных и забавных консольных команд в...
    Arduino и четырехразрядный семисегментный индикатор Семисегментный индикатор 4 разряда распиновка
    В сегодняшней статье поговорим о 7-сегментных индикаторах и о том, как их «подружить» с...
    «Рабочие лошадки» Hi-Fi: собираем бюджетную систему Хороший бюджетный hi fi плеер
    Выбор плеера - это сложный процесс, иногда человек желает получить не просто коробочку,...
    Как правильно пользоваться сургучными печатями
    На самом деле, сургуч - это смесь смол, окрашенная в определенный цвет. Если у вас на руках...
    Лагает fallout 4 как снизить графику
    10 ноября состоялся релиз долгожданной игры на ПК, PlayStation 4 и Xbox One, и постепенно...