Для платы Arduino Due была создана сторонняя библиотека, позволяющая выполнять операции чтения/записи с флеш-памятью, чтобы компенсировать отсутствие ЭСППЗУ в этой модели. Более полную информацию об этом проекте можно получить по адресу http://pansenti.wordpress.com/2013/04/19/simple-flash-library-for-arduino-due/.
Самый простой способ создать строковую константу, хранящуюся во флеш-памяти, — использовать функцию F, упоминавшуюся в одном из предыдущих разделов. Напомню ее синтаксис:
Serial.println(F("Program Started"));
Этот прием работает только при использовании строковых констант непосредственно в вызове функции вывода. Нельзя, например, присвоить результат указателю на тип char.
Более гибкий, но более сложный способ заключается в использовании директивы PROGMEM (Program Memory — память программы) для сохранения любых структур данных. Однако данные должны быть постоянными — они не могут изменяться в процессе выполнения сценария.
Следующий пример иллюстрирует, как можно определить массив целых чисел (int), хранящийся во флеш-памяти:
// sketch_06_10_PROGMEM_array
#include
PROGMEM int value[] = {10, 20, 25, 25, 20, 10};
void setup()
{
Serial.begin(9600);
for (int i = 0; i < 6; i++)
{
int x = pgm_read_word(&value[i]);
Serial.println(x);
}
}
void loop()
{
}
Директива PROGMEM перед объявлением массива гарантирует, что он будет храниться только во флеш-памяти. Но прочитать значение элемента из такого массива можно только с помощью функции pgm_read_word из библиотеки avr/pgmspace:
int x = pgm_read_word(&value[i]);
Символ & перед именем массива в параметре указывает, что функции передается адрес данного элемента массива во флеш-памяти, а не его значение.
Функция pgm_read_word читает из флеш-памяти слово (2 байта). В библиотеке имеются также функции pgm_read_byte и pgm_read_dword, возвращающие 1 и 4 байта соответственно.
Использование SD-карты
Несмотря на то что сами платы Arduino не имеют слота для SD-карт, некоторые платы расширения, включая Ethernet и MP3 (рис. 6.6), имеют слоты для карт SD или microSD.
Для подключения карт SD используется интерфейс SPI (обсуждается в главе 9). К счастью, чтобы использовать карту SD с платой Arduino, не требуется писать низкоуровневый код для взаимодействия с интерфейсом SPI, так как в состав Arduino IDE входит специализированная библиотека с простым названием SD.

Рис. 6.6.Плата расширения MP3 со слотом для карты microSD

Рис. 6.7.Результат работы примера Cardinfo
Эта библиотека включает множество примеров скетчей, выполняющих разные операции с картой SD, включая поиск информации о карте SD и ее вывод в монитор последовательного порта (рис. 6.7).
Запись на карту SD выполняется очень просто, как показано в следующем фрагменте кода:
File dataFile = SD.open("datalog.txt", FILE_WRITE);
// Если файл существует, записать в него
if(dataFile) {
dataFile.println(dataString);
dataFile.close();
// вывести также в монитор последовательного порта
Serial.println(dataString);
}
В заключение
В этой главе вы познакомились со всеми аспектами использования памяти и хранения данных в Arduino. В следующих главах мы займемся исследованием приемов программирования различных последовательных интерфейсов в Arduino, начав с шины I2C.
7. Интерфейс I2C
Интерфейсная шина I2C (произносится «и квадрат си») — стандартный способ подключения периферийных устройств к микроконтроллерам. Иногда интерфейс I2C называют двухпроводным интерфейсом (Two Wire Interface, TWI). Все платы Arduino имеют хотя бы один интерфейс I2C, к которому можно подключать широкий диапазон периферийных устройств. Некоторые из таких устройств представлены на рис. 7.1.
Все три устройства в верхнем ряду на рис. 7.1 являются модулями отображения информации, выпускаемыми компанией Adafruit. В нижнем ряду слева находится модуль УКВ-приемника TEA5767. Эти модули можно приобрести на сайте eBay или где-то в другом месте за несколько долларов. Приобретая модуль TEA5767, вы получаете полноценный приемник УКВ, который можно настроить на определенную частоту командами через интерфейс I2C. В центре находится модуль часов реального времени (Real-Time Clock, RTC), включающий микросхему обслуживания шины I2C и кварцевый резонатор, обеспечивающий высокую точность измерения времени. Установив текущие время и дату через интерфейс I2C, вы сможете в любой момент прочитать текущие время и дату через тот же интерфейс I2C. Этот модуль включает также литиевую батарейку с длительным сроком службы, обеспечивающую работу модуля даже в отсутствие электропитания от внешнего источника. Наконец, справа находится 16-канальный ШИМ/сервопривод, добавляющий к вашей плате Arduino 16 дополнительных аналоговых выходов.
Читать дальше