Хранение состояния заряда с помощью Arduino

В этом уроке мы узнаем как сохранить последнюю команду, использованную для активации или деактивации заряда/устройства.

Применение

Такие идеи могут применяться в ряде проектов, которые должны хранить информацию и данные в течение неопределенного времени, даже если устройство выключено. Среди некоторых типов проектов можно упомянуть, например: сохранение заданного значения температуры для запуска нагрузки, сохранение текущего времени и сохранение последней команды, выполненной оператором оборудования.

В этом уроке мы постараемся понять как разработать систему для хранения последней команды, выполненной пользователем.

Этот проект может быть использован в случае возникновения нехватки энергии в электрической сети, а когда питание или подключение к электрической сети вновь появляется, микроконтроллер получает последнюю команду на отключение энергии или отключает оборудование на основе последней команды пользователя. Чтобы решить эти проблемы, мы можем использовать память EEPROM.

Шаг 1. Комплектующие

Для нашего проекта понадобятся несколько деталей, включая Arduino Uno и программное обеспечение Arduino IDE.

  • PCBWay печатная плата × 1
  • Макет (универсальный) × 1
  • Arduino UNO × 1
  • Перемычки (на выбор) × 1
  • Кнопочный переключатель SparkFun (12 мм) x 1

Шаг 2. Электрическая цепь

На основе схемы на рисунке 1 (ниже) был создан весь проект. В основном использовалась кнопка с выпадающей конфигурацией, подключенная к цифровому выводу 10.

Рис. 1. Электрическая цепь
Рис. 1. Электрическая цепь

Когда кнопка нажата, светодиод, подключенный к цифровому выводу 13 светодиода, будет активирован, а при повторном нажатии кнопки (второй раз) светодиод будет деактивирован. Физическая схема представлена на рисунке ниже.

В собранном виде устройство будет выглядеть так:

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

Шаг 3. Код проекта

Для решения проблемы мы используем код, представленный ниже. Во-первых, мы включаем библиотеку EEPROM, потому что мы используем память EEPROM для хранения состояния команды, используемой для активации или деактивации зарядки. Директива #define использовалась для определения имен цифровых номеров выводов и положения в памяти, чтобы мы могли использовать их в коде.

Позиция числа 120 использовалась для хранения значения состояния команды зарядки. В функции настройки вывод 10 (pino) был сконфигурирован как вход, а цифровой вывод 13 был сконфигурирован как выход.

Ниже вы можете скачать или скопировать код для Ардуино:

#include <EEPROM.h>
#define pino 10
#define LED 13
#define PosiMem 120
int botao = 0;
int estado = 0;
int cont = 0; 
void setup() 
{
   pinMode(pino, INPUT);
   pinMode(LED, OUTPUT);
   cont = EEPROM.read(PosiMem);
}
void loop() 
{
   botao = digitalRead(pino);
   if(botao == 0 && estado == 1)
   {  
       estado = 0;
   }
   if(botao == 1 && estado == 0)
   {  
       cont++;
       if(cont > 1)
       {
       cont = 0;  
       }
       estado = 1; 
   }
   if(cont == 0)
   {
       digitalWrite(LED, LOW);
       EEPROM.write(PosiMem, cont);
   }
   if(cont == 1)
   {
       digitalWrite(LED, HIGH);
       EEPROM.write(PosiMem, cont);
   }
}

Теперь обратите внимание, что есть кое-что очень важное для понимания рабочей логики проекта на следующей строке:

cont = EEPROM.read(PosiMem);

Всякий раз, когда код начинает выполняться, первое действие, которое требуется выполнить, - это прочитать последнюю команду, сделанную для включения или выключения нагрузки, которая была сохранена в позиции 120 (PosiMem) памяти EEPROM.

Если значение, сохраненное в переменной cont, равно 0 и хранит значение в памяти EEPROM, заряд будет деактивирован или, если значение равно 1, заряд будет активирован и сохранит значение в памяти EEPROM в соответствии с кодом, представленным ниже:

 if(cont == 0)
   {
       digitalWrite(LED, LOW);
       EEPROM.write(PosiMem, cont);
   }
   if(cont == 1)
   {
       digitalWrite(LED, HIGH);
       EEPROM.write(PosiMem, cont);
   }

После этого в цикле loop контролируется кнопка, чтобы узнать, нажата ли она или нет. Когда кнопка нажата, выполняется следующий код:

if(botao == 1 && estado == 0)
   {  
       cont++;
       if(cont > 1)
       {
       cont = 0;  
       }
       estado = 1; 
   }

Когда условие истинно, переменная cont увеличивается и ее значение проверяется, если оно больше 1. Если результат сравнения был истинным, значение будет равно 0. Но, если ваше значение равно false, 0 не будет и переменная estado будет равна 1. Переменная estado используется для управления логикой ввода в условии увеличения переменной cont.

Когда кнопка не нажата, переменная botao будет равна 0, а переменная estado со значением 0 и, следовательно, будет выполнено следующее условие:

if (botao == 0 && estado == 1){  
       estado = 0;
   }

Когда условие истинно, переменная estado будет иметь значение 0. Это позволяет выполнению ввести условие для увеличения переменной cont.

При повторном нажатии кнопки условие (if (botao == 1 && estado == 0)) будет выполнено, а переменная cont будет увеличена. Её значение будет 2, но в условии (if(cont > 1)) результат будет истинным. В данный момент переменная cont равна нулю, потому что значение cont больше одного.

После этого светодиод отключится и нулевое значение будет сохранено в позиции 120 памяти EEPROM.

Следовательно, используя эту логику, её можно применять в различных проектах, которым необходимо хранить постоянные данные на микроконтроллере.

14 января 2019 в 15:04 | Обновлено 19 февраля 2020 в 23:32 (редакция)
Опубликовано:
Уроки,

Добавить комментарий

Ваш E-mail не будет никому виден. Обязательные поля отмечены *