цифровая электроника
вычислительная техника
встраиваемые системы

 

Контроллер заряда смартфона на основе Arduino своими руками

Автор: Mike(admin) от 18-01-2019, 07:55

Почти каждый пользователь мобильного телефона (либо модного смартфона, либо обычного телефона) сталкивается с одной проблемой: подключить телефон к зарядному адаптеру и забыть, что устройство подключено.


Контроллер заряда смартфона на основе Arduino своими руками

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


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


Поэтому, предлагаемый в данном материале проект контроллера зарядки смартфона на базе Arduino может помочь полностью контролировать время зарядки, и по истечении этого времени питание зарядного адаптера отключается. Звучит интересно и практично, теперь посмотрим, как это реализуется.


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


Принципиальная схема подключения системы контроллера зарядки смартфона на базе Arduino показана ниже.


Контроллер заряда смартфона на основе Arduino своими руками

Основными компонентами проекта, кроме Arduino UNO, являются энкодер, реле и ЖК-дисплей 16X2. Контакт IN1 модуля реле подключен к контакту 12 платы Arduino. Что касается поворотного энкодера, его контакты CLK, DT и SW подключены к контактам 10, 11 и 2 плты Arduino UNO. Наконец, ЖК-дисплей, контакты с 8 по 3 платы Arduino подключены к RS, E, D4 - D7 ЖК-дисплея.


Код для проекта контроллера зарядки смартфона на основе Arduino приведен далее.



#include<LiquidCrystal.h>
#include<EEPROM.h>
LiquidCrystal lcd (8,7,6,5,4,3); 
#define outputA 10 //clk-линия для энкодера 
#define outputB 11 //dt-линия для энкодера 
#define button 2   //sw-линия для энкодера 
#define led 13     //для индикаторного светодиода
#define relay 12   //in1 для реле

int count = 1; 
int current_state;
int previous_state;  
int hh =0;
int mm=0;
int ss=0;
int h=0;
int m=0;
int s=0;
int ledToggle;
int previousState = HIGH;
unsigned int previousPress;
volatile int buttonFlag;
int buttonDebounce = 20;



void setup() 
{ 
  lcd.begin(16,2);
  pinMode (outputA,INPUT);
  pinMode (outputB,INPUT);
  pinMode (button,INPUT_PULLUP);
  pinMode (led, OUTPUT);
  pinMode (relay, OUTPUT);
  digitalWrite(relay, HIGH);
  attachInterrupt(digitalPinToInterrupt(2), button_ISR, CHANGE);
  Serial.begin (9600);
  previous_state = digitalRead(outputA);   
  
   
    if(EEPROM.read(0)!=0 || EEPROM.read(1)!=0 || EEPROM.read(2)!=0)
    {
      lcd.setCursor(0,0);
      lcd.print("Load Preset ?");
      lcd.print(" ");
      lcd.setCursor(0,1);
      lcd.print("      <NO>      ");
      int temp=5;
      while(temp>0 && ledToggle==0)
      {
        lcd.setCursor(14,0);
        lcd.print(temp);
        temp--;
        delay(1000);
      }
      if(temp==0 && ledToggle==0)
      {
       hh=EEPROM.read(0);
       mm=EEPROM.read(1);
       ss=EEPROM.read(2);
       timer();
      }
      else 
      {
       EEPROM.write(0,0);
       EEPROM.write(1,0);
       EEPROM.write(2,0);
       ledToggle=0;
      }
    }
    lcd.clear();    
    lcd.setCursor(0,0);
    lcd.print(" HH  MM  SS  OK ");
    lcd.setCursor(0,1);
    lcd.print(" 0   0   0      ");
   
} 


void loop() 
{ 
  encoder();
  if(count==1)
  {
    lcd.setCursor(0,0);
      lcd.print("<HH> MM  SS  OK ");
      while(count==1)
      {
        encoder();
        if(ledToggle)
        {
          h=1;
          m=0;
          s=0;
          lcd.setCursor(0,0);
          lcd.print(" HH  MM  SS  OK ");
          lcd.setCursor(1,1);
          lcd.print(hh);
          lcd.setCursor(5,1);
          lcd.print(mm);
          lcd.setCursor(9,1);
          lcd.print(ss);
          lcd.setCursor(0,1);
          lcd.print('<');
          lcd.setCursor(3,1);
          lcd.print('>');
          
          while(ledToggle)
          {
            encoder();
            lcd.setCursor(1,1);            
            lcd.print(hh);
          }
        }
         EEPROM.write(0,hh);
         h=0;
         m=0;
         s=0;
        lcd.setCursor(0,0);
        lcd.print("<HH> MM  SS  OK ");
        lcd.setCursor(0,1);
        lcd.print(' ');
        lcd.setCursor(3,1);
        lcd.print(' ');
      }
  }
  else if(count==2)
   {
    lcd.setCursor(0,0);
      lcd.print(" HH <MM> SS  OK ");
      while(count==2)
      {
        encoder();
        if(ledToggle)
        {
          h=0;
          m=1;
          s=0;
          lcd.setCursor(0,0);
          lcd.print(" HH  MM  SS  OK ");
          lcd.setCursor(1,1);
          lcd.print(hh);
          lcd.setCursor(5,1);
          lcd.print(mm);
          lcd.setCursor(9,1);
          lcd.print(ss);
          lcd.setCursor(4,1);
          lcd.print('<');
          lcd.setCursor(7,1);
          lcd.print('>');
          
          while(ledToggle)
          {
            encoder();
            lcd.setCursor(5,1);            
            lcd.print(mm);
          }
        }
        EEPROM.write(1,mm);
        h=0;
        m=0;
        s=0;
        lcd.setCursor(0,0);
        lcd.print(" HH <MM> SS  OK ");
        lcd.setCursor(4,1);
        lcd.print(' ');
        lcd.setCursor(7,1);
        lcd.print(' ');
      }
  }
  else if(count==3)
  {
    lcd.setCursor(0,0);
      lcd.print(" HH  MM <SS> OK ");
      while(count==3)
      {
        encoder();
        if(ledToggle)
        {
          h=0;
          m=0;
          s=1;
          lcd.setCursor(0,0);
          lcd.print(" HH  MM  SS  OK ");
          lcd.setCursor(1,1);
          lcd.print(hh);
          lcd.setCursor(5,1);
          lcd.print(mm);
          lcd.setCursor(9,1);
          lcd.print(ss);
          lcd.setCursor(8,1);
          lcd.print('<');
          lcd.setCursor(11,1);
          lcd.print('>');
          while(ledToggle)
          {
            encoder();
            lcd.setCursor(9,1);            
            lcd.print(ss);
          }
         EEPROM.write(2,ss);
         h=0;
         m=0;
         s=0;
        }
          lcd.setCursor(0,0);
          lcd.print(" HH  MM <SS> OK ");
          lcd.setCursor(8,1);
          lcd.print(' ');
          lcd.setCursor(11,1);
          lcd.print(' ');
      }
  }
  else if(count==4)
  {
    lcd.setCursor(0,0);
    lcd.print(" HH  MM  SS <OK>");
      while(count==4)
      {
        encoder();
        if(ledToggle)
        {
          timer();
        }
      }
  }
}


void encoder (void)
{
  current_state = digitalRead(outputA);
  if (current_state != previous_state)
  {     
    if (digitalRead(outputB) != current_state) 
    { 
      if(count<4 && ledToggle==0)
      count ++;
      else
      {
        if(h==1)
        {
          if(hh<23)
          hh=hh+1;
        }
        else if(m==1)
        {
          if(mm<59)
          mm=mm+1;
        }
        else if(s==1)
        {
          if(ss<59)
          ss=ss+1;
        }
      }
      
    } 
    else 
    {
      if(count>1 && ledToggle==0)
      count --;
      else
      {
        if(h==1)
        {
          if(hh>0)
          hh=hh-1;
        }
        else if(m==1)
        {
          if(mm>0)
          mm=mm-1;
        }
        else if(s==1)
        {
          if(ss>0)
          ss=ss-1;
        }
      }
    }
    Serial.print("Position: ");
    Serial.println(count);
  } 
  previous_state = current_state; 
  
}

void button_ISR()
{
   buttonFlag = 1;
   if((millis() - previousPress) > buttonDebounce && buttonFlag)
  {
    previousPress = millis();
    if(digitalRead(button) == LOW && previousState == HIGH)
    {
      ledToggle =! ledToggle;
      digitalWrite(led, ledToggle);
      previousState = LOW;
      //Serial.println(ledToggle);
    }
    
    else if(digitalRead(button) == HIGH && previousState == LOW)
    {
      previousState = HIGH;
    }
    buttonFlag = 0;
  }
}

void timer (void)
{
  digitalWrite(relay, LOW);
  while(1)
  {
   lcd.setCursor(0,0);
   lcd.print("Charging...     ");
   lcd.setCursor(0,1);
   if(hh<10)
   {
    lcd.print('0');
    lcd.print(hh);
    lcd.print(':');
   }
   else 
   {
    lcd.print(hh);
    lcd.print(':');
   }
   if(mm<10)
   {
    lcd.print('0');
    lcd.print(mm);
    lcd.print(':');
   }
   else
   {
    lcd.print(mm);
    lcd.print(':');
   }
   if(ss<10)
   {
    lcd.print('0');
    lcd.print(ss);
    lcd.print("          ");
   }
   else
   {
    lcd.print(ss);
    lcd.print("          ");
   }
   Serial.println(ss);
   for(ss;ss>0;ss--)
   {
      Serial.println(ss);
    if(ss<10)
    {
     lcd.setCursor(6,1);
     lcd.print('0');
     lcd.print(ss);
     EEPROM.write(2,ss);
    }
    else
    {
     lcd.setCursor(6,1);
     lcd.print(ss);
     EEPROM.write(2,ss);
    }
    delay(1000);
   }
   if(ss==0 && mm==0 && hh==0)
   {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Charged");
    digitalWrite(relay, HIGH);
    EEPROM.write(0,0);
    EEPROM.write(1,0);
    EEPROM.write(2,0);
    while(1);
   }
   ss=59;
   if(mm!=0)
   mm=mm-1;
   if(hh!=0)
   hh=hh-1;
   EEPROM.write(0,hh);
   EEPROM.write(1,mm);
   EEPROM.write(2,ss);
   
  }
}

После выполнения необходимых подключений согласно электрической схеме, загрузите код в Arduino и включите источник питания. Вы получите часы (HH), минуты (MM), секунды (SS) на ЖК-дисплее 16 × 2. Выбрав часы, поверните ручку на поворотном энкодере, чтобы установить желаемое количество часов. Когда значение часов установлено, нажмите ручку, чтобы зафиксировать это значение. Точно так же вы можете установить минуты и секунды. После того, как все установлено, выберите OK на ЖК-дисплее и нажмите ручку. Теперь реле активируется (что означает, что телефон начинает заряжаться), и начинается отсчет времени, установленный вами. Как только обратный отсчет достигает «0», реле выключается (питание на адаптер будет отключено).


Контроллер заряда смартфона на основе Arduino своими руками

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


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




© digitrode.ru


Теги: Arduino



   Благодарим Вас за интерес к информационному проекту digitrode.ru.
   Если Вы хотите, чтобы интересные и полезные материалы выходили чаще, и было меньше рекламы,
   Вы можее поддержать наш проект, пожертвовав любую сумму на его развитие.


Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий