analogReference (INTERNAL), подробности о работе АЦП в МК AVR см. главу 20 и книгу [21]). Потому коэффициент пересчета не вычисляется теоретически, а должен устанавливаться именно путем калибровки, причем с реальным источником питания (набором батареек), а не при подключении к USB или внешнему адаптеру.
Делитель напряжения R5/R6 (он добавляет к общему потреблению менее микроампера) нужен для «подгонки» измеряемого значения под опорное. Не стоит бояться, что входное сопротивление АЦП внесет погрешность при установке столь высокоомного делителя — в МК AVR оно измеряется десятками гигаом. В данном случае выходной код АЦП определяется формулой ADC = 1024Vin/Vref (подробности см. в главах 17 и 20). При превышении входным напряжением опорного этот код «застынет» на максимальном значении 1023, так что нам необходимо иметь на входе АЦП напряжение, заведомо меньшее опорного. А опорное напряжение определяется в нашем случае внутренним источником и имеет величину примерно 1,2 В с довольно большим разбросом. Отсюда соотношение сопротивлений резисторов этого делителя должно быть около 5, а точное значение величины коэффициента в программе, с помощью которого вычисляется реальная величина напряжения (переменная voltage, см. строку 105 исходного текста скетча) и должно быть определено с помощью калибровки. Коэффициент будет равен частному от деления реального напряжения батареи в вольтах на величину кода АЦП (переменная val) — у меня он получился равным 0,0059. Если задаться величиной опорного напряжения, равной 1,1 В, то теоретический расчет даст близкое значение.
Чтобы проверить и при надобности уточнить значение коэффициента, измерьте напряжение батарейки мультиметром во время работы датчика, затем сравните с тем, что запишется в файл на карте (см. далее). Поделив записанное значение на измеренное, вы получите поправку, на которую необходимо умножить значение коэффициента из программы. В случае ЖК-индикатора без записи на карту, операция калибровки будет сложнее — вам придется временно подправить программу так, чтобы вывести на дисплей значение напряжения, получаемое с датчика.
* * *
Во время работы в соответствии с программой датчик основное время потребляет примерно 500 мкА, и каждые 8 секунд по WD-таймеру включается примерно на 0,8 с — снимает показания с SHT-модуля, измеряет напряжение батарейки и передает данные через Xbee-модуль. Напряжение батарейки во избежание случайных выбросов усредняется за каждые 16 показаний. Измерения показали, что во включенном состоянии потребление всего выносного датчика в среднем составляет около 15 мА. Пиковое потребление обычного Xbee-модуля в момент передачи может превышать 40 мА, но это происходит лишь в течение нескольких миллисекунд, и мы этими выбросами можем пренебречь в своих расчетах. Итого среднее потребление датчика составит приблизительно 2 мА — в соответствии с данными приложения 2 АА-батареек должно хватить примерно на два месяца непрерывной работы.
Заметим, что если бы мы писали программу на ассемблере, то могли бы уменьшить время активного состояния в несколько десятков раз, и батарейки работали бы гораздо дольше.
Ресурс батареек можно увеличить, если задать снятие показаний и их передачу не каждое пробуждение по WD-таймеру, а, например, каждое седьмое (т. е. примерно раз в минуту), но отладка такой медленной программы резко усложнится.
У нас уже все готово для того, чтобы представить версию метеостанции без записи на SD-карту. Реализацию этой версии мы оформим в виде варианта с ЖК-дисплеем MT-12864J, рассмотренным в главе 21. Для подключения SPI-интерфейса карты вместе с дисплеем у нас все равно не хватит выводов, так что запись на карту мы реализуем отдельно.
Схема метеостанции в таком варианте представлена на рис. 22.5.
Рис. 22.5.Схема метеостанции с ЖК-дисплеем MT-12864J
Подключение датчиков и часов ничем не отличается от рассмотренного ранее, а подключение ЖК-дисплея и обращение с ним описано в главе 21. Полную программу для этого случая можно скачать с сайта автора по ссылке http://revich.lib.ru/AVR/Meteo_LCD.zip. Внешний вид дисплея при работе этой программы показан на рис. 22.6.
Рис. 22.6.Отображение результатов работы метеостанции на ЖК-дисплее
Если внешний датчик будет недоступен (отключен, пропадет связь, закончатся батарейки), то в верхней строке после слов «На улице» будут отображаться прочерки. Если передаваемая устройством величина напряжения батарейки станет меньше порога (установленного нами в 3,3 В), то строка с данными начнет мигать. После включения питания внешнего датчика в течение первых 16 переданных показаний вместо значения напряжения батарейки станут передаваться одни нули, соответственно, дисплей главного модуля также будет миганием напоминать, что батареи в датчике якобы разряжены. Однако примерно через 2 минуты начнет передаваться измеренное среднее значение, и все должно встать на свои места.
* * *
Подробности
Величину порога, возможно, придется подкорректировать по результатам испытаний. Arduino Mini фактически ничего, кроме контроллера, не содержит, и она должна вообще «тянуть» вплоть до полного истощения батареек (согласно документации, у ATmega328 нижний предел питания 1,8 В[52]). У сенсора SHT1x нижний порог повыше (2,4 В), но это тоже далеко за пределами того, что дадут три даже истощенных элемента. То есть, нас будет лимитировать Xbee-модуль, который, согласно документации фирмы Digi, функционирует до 2,1 В. Из этих соображений и выбран порог в 1,1 В на элемент: 2,2 В на модуль или 3,3 В на все питание. В реальности это требует тщательной проверки, причем с реальными батарейками, а не в искусственно созданных условиях. Что же касается дальности работы выносного датчика, то Xbee-модули проявили себя наилучшим образом — в процессе испытаний данные уверенно принимались через три гипсолитовых межкомнатных перегородки толщиной 20 см каждая (уровень сигнала Wi-Fi в тех же условиях падает примерно на 70–80 дБ, что снижает скорость передачи до почти полной неработоспособности канала). Впрочем, если вас дальность работы не удовлетворит, то та же фирма Digi выпускает намного более мощный Xbee Pro.
Наличие библиотеки для работы с SD-картой— один из самых ярких примеров преимуществ Arduino. Можно только представить себе, сколько трудов стоило бы написание на ассемблере кода доступа к флэш-карте, отформатированной в системе FAT32. Не невозможная задача, конечно, но весьма трудновыполнимая, особенно для любителя, да и вряд ли кто-нибудь когда-нибудь пытался выполнить ее на ассемблере. В моей книжке [21] есть пример кода записи/чтения применительно к картам типа ММС — «младшему брату» карт Secure Digital. Ни о каких именах файлов, разумеется, там и речи не идет — данные пишутся просто в ячейки памяти карты, и считаны могут быть только таким же способом, через контроллер. А здесь такие операции, как создание, удаление файла или проверка его существования, стандартные для «больших» компьютеров, выполняются не сложнее, чем в Windows. С единственным ограничением — собственно форматирование карты должно быть выполнено заранее.
Обычно карты продаются уже отформатированными в нужной нам системе FAT 16 или FAT32. Однако оно может «слететь» в процессе эксплуатации или наших с вами издевательств над картой, кроме того, изредка встречаются карты, отформатированные в системе, отличной от FAT. Для того, чтобы проверить систему и при необходимости заново отформатировать карту, ее надо вставить в кардридер компьютера, подождать, пока она появится в Проводнике и через контекстное меню выбрать пункт Свойства. Там на самой первой вкладке Общие будет показана Система, в которой отформатирована эта карта. Если она отличается от FAT 16 (просто FAT) или FAT32, то закройте окно свойств, заново вызовите контекстное меню и выберите пункт Форматировать.
Мы воспользуемся уже упоминавшимся модулем Wireless Shield SD, кроме разъема для Xbee-модуля, имеющим также слот для миниатюрной карты MicroSD. Более универсальным будет отдельный SD Card shield V4.0,4 куда можно вставлять SD-карты обычного типоразмера (карты MicroSD вставляются в него через адаптер). Обращение с этими модулями совершенно одинаково, и заняты у них одни и те же контакты, ориентированные на применение библиотеки SD, входящей в комплект Arduino IDE.
Недостаток большинства подобных стандартных Arduino-модулей с разъемом для SD-карты состоит в том, что они в качестве вывода «выбор кристалла» задействуют вывод номер 4. Это сделано по понятным причинам — чтобы освободить стандартный вывод SS порта SPI (вывод 10) для использования этого интерфейса в каких-то иных целях. Однако такой прием приводит к ограничениям на применение вывода 10 — он должен быть установлен только «на выход», иначе стандартные функции SPI контроллера работать не будут. Потому вместо одного дополнительного вывода карта фактически занимает два. К счастью, в качестве выходного мы можем применять порт 10 по своему усмотрению — в нашей схеме он служит одной из линий данных.
Полную программу метеостанции с OLED-индикаторами, построенной согласно схеме на рис. 22.1 с добавленными функциями записи на SD-карту, можно скачать с сайта автора по ссылке http://revichJib.ru/AVR/Meteo_OLED.zip. Внешний вид индикационной панели с отображением данных показан на рис. 22.7 далее, в разд. «Конструкция». Согласно этой программе, при каждом включении питания в файл data.txt будет записываться строка Arduino meteostation data