По величине потребляемого тока этот скетч практически совпадает с примером на основе библиотеки Narcoleptic, с той лишь разницей, что во время, когда светодиод мигает, уровень потребляемого тока в данном примере выше из-за того, что используется обычная функция delay.
Использование цифровых выходов для управления питанием
Хотя в этой главе обсуждается проблема снижения энергопотребления программным способом, здесь нелишне будет дать полезный совет по уменьшению энергопотребления аппаратным способом.
На рис. 5.4 изображена схема датчика освещенности на основе фоторезистора (изменяет сопротивление в зависимости от освещенности) и постоянного сопротивления, подключенных к аналоговому входу Arduino, посредством которого измеряется степень освещенности.
Проблема данной реализации в том, что через постоянное сопротивление и фоторезистор течет постоянный ток напряжением 5 В. Если при полной освещенности она имеет сопротивление 500 Ом, то согласно закону
Рис. 5.4. Измерение освещенности с применением фоторезистора
Ома протекающий ток будет иметь значение I = V/R = 5 В/(1000 Ом + + 500 Ом) = 3,3 мА.
Вместо источника постоянного напряжения 5 В на плате Arduino можно использовать цифровой выход (рис. 5.5) и подавать на него уровень напряжения HIGH только в момент чтения значения с аналогового входа, а затем устанавливать на нем уровень LOW. В этом случае ток 3,3 мА будет протекать только в течение очень короткого промежутка времени, когда выполняется чтение, благодаря чему можно снизить общий уровень энергопотребления.
Рис. 5.5. Экономичная схема измерения освещенности
Это решение иллюстрирует следующий скетч:
// sketch_05_07_light_sensing
const int inputPin = A0;
const int powerPin = 12;
void setup()
{
pinMode(powerPin, OUTPUT);
Serial.begin(9600);
}
void loop()
{
Serial.println(takeReading());
delay(500);
}
int takeReading()
{
digitalWrite(powerPin, HIGH);
delay(10); // фоторезистору требуется некоторое время
int reading = analogRead(inputPin);
digitalWrite(powerPin, LOW);
return reading;
}
Этот подход можно использовать не только при измерении освещенности. Можно, например, с помощью цифрового выхода управлять полевым транзистором, включающим и выключающим мощные потребители электроэнергии в вашем проекте.
В заключение
Лучшие способы уменьшить потребление электроэнергии:
• переводить микроконтроллер в режим энергосбережения, когда не требуется выполнять никаких действий;
• использовать для питания Arduino пониженное напряжение;
• уменьшать тактовую частоту Arduino.
6. Память
Объем памяти в большинстве компьютеров исчисляется гигабайтами, но в Arduino Uno ее всего 2 Кбайт. То есть более чем в миллион раз меньше, чем в обычном компьютере. Однако ограниченный объем памяти удивительным образом способствует концентрации мысли в процессе программирования. Здесь нет места для расточительства, которым страдает большинство компьютеров.
Писать эффективный код, конечно, важно, но необязательно делать это за счет усложнения чтения и сопровождения. Даже при таких ограниченных ресурсах, как в Arduino, большинство скетчей оказываются далеки от использования всего объема оперативного запоминающего устройства (ОЗУ). Беспокоиться о нехватке памяти приходится, только когда создается действительно очень сложный скетч, использующий массу данных.
Память в Arduino
Сравнивать объем памяти в Arduino и в обычных компьютерах не совсем корректно, так как в них память ОЗУ используется для разных целей. На рис. 6.1 показано, как используется память в компьютере, когда запускается программа.
Когда компьютер запускает программу, он сначала копирует ее целиком с жесткого диска в ОЗУ, а затем запускает эту копию. Переменные в программе занимают дополнительный объем ОЗУ. Для сравнения на рис. 6.2 показано, как используется память в Arduino, когда запускается программа. Сама программа действует, находясь во флеш-памяти. Она не копируется в ОЗУ.
Рис. 6.1. Как используется память в компьютере
Рис. 6.2. Как используется память в Arduino
ОЗУ в Arduino используется только для хранения переменных и других данных, имеющих отношение к выполняющейся программе. ОЗУ является энергозависимой памятью, то есть после отключения питания оно очищается. Чтобы сохранить данные надолго, программа должна записать их в ЭСППЗУ. После этого скетч сможет считать данные в момент повторного запуска.