Джереми Блум - Изучаем Arduino: инструметы и методы технического волшебства
- Название:Изучаем Arduino: инструметы и методы технического волшебства
- Автор:
- Жанр:
- Издательство:БХВ-Петербург
- Год:2015
- Город:Санкт-Петербург
- ISBN:978-5-9775-3585-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Джереми Блум - Изучаем Arduino: инструметы и методы технического волшебства краткое содержание
Для радиолюбителей
Изучаем Arduino: инструметы и методы технического волшебства - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Часы реального времени DS1307 поддерживают связь с Arduino по протоколу I 2C и подключаются к круглой батарейке, что обеспечивает ход часов в течение нескольких лет. К микросхеме подключается кварцевый резонатор, определяющий точность хронометража. Я выбрал плату расширения adafruit-DS1307-breakout (http://www.exploringarduino.com/parts/adafruit-DS1307-breakout), которая содержит микросхему DS1307, кварцевый резонатор, батарейку размером с монету, конденсатор развязки и I 2C подтягивающие резисторы. Плату легко подключить к Arduino (рис. 13.18).

Рис. 13.18. Подключение платы расширения adafruit-DS1307-breakout к Arduino
Далее предполагается, что вы используете эту плату. Тем не менее, можно просто собрать схему из элементов на макетной плате и подключить непосредственно к Arduino. Потребуется кварцевый резонатор на 32,768 кГц, подтягивающие резисторы номиналом 2,2 кОм и круглая батарейка 3,0 В размером с монету. Если вы решили собрать плату самостоятельно, можете приобрести эти компоненты и собрать их на макетной плате по схеме, приведенной на рис. 13.19.
- 290 -

Рис. 13.19. Схема часов реального времени, собранная на макетной плате
Как и в предыдущей главе, мы снова воспользуемся сторонней библиотекой для Arduino. На этот раз для облегчения связи с микросхемой часов реального времени (RTC). Библиотека называется RTClib, первоначально она была разработана JeeLabs, затем обновлена Adafruit Indusrtries. Ссылку для загрузки библиотеки можно найти на веб-странице http://www.exploringarduino.com/content/ch13. Скачайте библиотеку и распакуйте в папку libraries, как вы это делали в главе 12.
Работать с библиотекой просто. При первом выполнении кода нужно вызвать функцию RTC.adjust() для получения времени с компьютера и настройки часов.
Далее RTC работают автономно и можно получать текущее время и дату посредством команды RTC.now(). В следующем примере мы будем использовать эту функцию для ведения журнала регистрации в режиме реального времени.
Теперь объединим SD-карту и часы реального времени, чтобы включить ведение журнала с помощью временных меток. Мы модифицируем программу, добавив запись показаний часов реального времени вместо значений, выдаваемых функцией millis().
- 291 -
Подключение модулей SD card shield и RTC
Подключим к Arduino модули SD card shield и RTC. Если вы используете платы расширения Cooking Hacks Micro SD shield и adafruit-DS1307-breakout, то подключение будет выглядеть так, как на рис. 13.20.

Рис. 13.20. Плата Arduino с подключенными платами расширения Cooking Hacks Micro SD shield и adafruit-DS1307-breakout
Отметим, что последний контакт на RTC не связан с Arduino; это меандр, генерируемый RTC, в нашем примере он не задействован. В программе следует подать на контакт А2 уровень LOW и на A3 уровень HIGH (+5 В), чтобы обеспечить питание RTC. Если вы собрали свой модуль RTC на макетной плате, то установка будет выглядеть немного по-другому.
Теперь нужно добавить функционал RTC в нашу предыдущую программу. Необходимо сделать следующее:
• подключить библиотеку RTC;
• организовать питание модуля RTC (А2- LOW, A3-HIGH);
- 292 -
• инициализировать объект RTC;
• установить время RTC с помощью компьютера;
• записывать фактические временные метки в файл журнала.
Кроме того, в код программы добавлен вывод в файл заголовка столбца при каждом перезапуске журнала. Таким образом, вы легко найдете в журнале, записанном в файл CSV, моменты перезапуска.
ВНИМАНИЕ!
Если после запуска программы вы заметите, что она через некоторое время останавливается, то причина может заключаться в нехватке оперативной памяти. Так происходит из-за строк, которые занимают большой объем оперативной памяти, это относится к командам вывода в последовательный порт Serial.print() и Serial.println(). Проблему можно решить, удалив из программы указанные команды и поручив компилятору хранить строки не в оперативной памяти, а во флэшпамяти Arduino. Для этого для строк используем обертку F(), например Serial.println ( F ( "Hello") ). Описанный метод реализован в листинге 13.6.
Обновленная программа (листинг 13.6) использует RTC в качестве таймера для регистрации данных. Программа перемещает большинство строк во флэш-память, чтобы предотвратить переполнение оперативной памяти.
Листинг 13.6. Чтение и запись данных на SD-карту с использованием RTC - sd_read_write_rtc.ino
// Чтение и запись данных на SD-карту с использованием RTC
#include
// Подключение библиотеки SD
#include
// Для работы с RTC
#include "RTClib.h" // Подключение библиотеки RTC
// Подключение устройств SPI и I 2C с контактами по умолчанию
// SD-карта SPI контакты
// RTC - стандартные I 2C контакты
const int CS_PIN =10;
const int SD_POW_PIN =8;
const int RTC_POW_PIN =A3;
const int RTC_GND_PIN =А2.;
// Скорость опроса по умолчанию 5 секунд
int refresh rate = 5000;
// Создание объекта RTC
RTC_DS1307 RTC;
// Переменные для даты и времени
String year, month, day, hour, minute, second, time, date;
void setup()
{
Serial.begin(9600);
Serial.println(F("Initializing Card"));
// Настроить контакты CS и питания как выходы
pinMode(CS_PIN, OUTPUT);
- 293 -
pinMode(SD_POW_PIN, OUTPUT);
pinMode(RTC_POW_PIN, OUTPUT);
pinMode(RTC_GND_PIN, OUTPUT);
// Установка питания карты и RTC
digitalWrite(SD_POW_PIN, HIGH);
digitalWrite(RTC_POW_PIN, HIGH);
digitalWrite(RTC_GND_PIN, LOW);
// Инициализация Wire и RTC
Wire.begin();
RTC.begin();
// Если RTC не запущены, загрузить дату/время с компьютера
if ( ! RTC. isrunning())
{
Serial.println( F ( "RTC is NOT running ! ") );
RTC.adjust(DateTime(__DATE__, __TIME__ ));
}
// Инициализация SD-карты
if ( !SD.begin(CS_PIN))
{
Serial.println(F("Card Failure"));
return;
}
Serial.println(F("Card Ready"));
// Чтение конфигурационного файла (speed. txt)
File commandFile = SD.open("speed.txt");
if (commandFile)
{
Serial.println ( F ( "Reading Command File") );
while(commandFile.available())
{
refresh_rate = commandFile.parseInt();
}
Serial.print(F("Refresh Rate = "));
Serial.print(refresh_rate);
Serial.println(F("ms"));
commandFile.close();
}
else
{
Serial.println(F("Could not read command file."));
return;
}
// Запись заголовка
File dataFile = SD.open("log.csv", FILE_WRITE);
if (dataFile)
{
dataFile.println ( F ( "\nNew Log Started ! ") );
- 294 -
dataFile.println(F("Date,Time,Phrase"));
dataFile.close();
// Запись в последовательный порт
Serial.println(F("\nNew Log Started!"));
Serial.println(F("Date,Time,Phrase"));
}
else
{
Serial.println(F("Couldn't open log file"));
}
}
void loop()
{
// Получить значение даты и времени и перевести в строковые значения
DateTime datetime = RTC.now();
year = String(datetime.year(), DEC);
month = String(datetime.month(), DEC);
day = String(datetime.day(), DEC);
hour = String(datetime.hour(), DEC);
minute = String(datetime.minute(), DEC);
second = String(datetime.second(), DEC);
// Собрать строку текущей даты и времени
Читать дальшеИнтервал:
Закладка: