Создания автомата для зарядки планшетов и телефонов

Основные компоненты:

  • Arduino Uno
  • LСD Display 2x16
  • Coin Receiver Wei-Ya HI 07
  • Реле




Задача

Создать автомат, который будет принимать монеты, далее включать таймер, и выводить питания на USB HUB.

Уже к хабу подключаются разные шнуры. Приблизительные показатели 5V, 1A, зависит от блока питания.

Конструкция

Подача питания к хабу управляется с помощью реле.

Блок питания подключается в сеть, а сам его кабель проходить через реле, которым будем управлять Arduino плата (Вкл/Выкл).

Монетоприемник подключается к Arduino для передачи сигнала о монете, а сам питается от блока на 12 Вольт.

Ардуино нужно прошить, делается это через USB порт компьютера и редактор кода Ардуино.

Зарядка стартует после нажатия на кнопку.

Схема и Код



  • Красный и Синий провод — силовой, питание
  • Кнопка — Старт зарядки
  • Подстроечный резистор — Яркость дисплея
  • 2 Подтягивающих резистора (pull-up-резистор) +-4,7 кОм
  • Салатовый провод — логический вход для кнопки
  • Желтый, Фиолетовый(12,11) — логические входы к дисплею
  • Белый — логический вход для монетника
  • Фиолетовый(13) — для реле (Вкл/Выкл)


// WEI-YA HI-07
const int moneyPin3=3;
const int button1Pin = 2; //Кнопка 1 пин 2
const int add5V = 10;
const int ledPin =  13;  //Реле
float sum=0.0; //Сумма
int time; //Время
int button1State;
int moneyPin; 
int pulse1=0;
unsigned long timeCount1=0;
// дисплей WH1602 
#include <LiquidCrystal.h> //Библиотека
LiquidCrystal lcd(12,11,7,6,5,4);


byte p20[8] = { //Создаем символы для анимации заряда
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
};
byte p40[8] = {
  B11000,
  B11000,
  B11000,
  B11000,
  B11000,
  B11000,
  B11000,
  B11000,
};
byte p60[8] = {
  B11100,
  B11100,
  B11100,
  B11100,
  B11100,
  B11100,
  B11100,
  B11100,
};
byte p80[8] = {
  B11110,
  B11110,
  B11110,
  B11110,
  B11110,
  B11110,
  B11110,
  B11110,
};
byte p100[8] = {
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
};


void setup()
{
   
  Serial.begin(9600); //Подключаем монитор порта для просмотра данных на компьютере
  
  pinMode(button1Pin, INPUT); //Кнопка, на прием
  pinMode(ledPin, OUTPUT);  //13, на подачу
  pinMode(moneyPin3,INPUT); //Монетник, на прием
  pinMode(add5V,INPUT); //+5V pin
  
   attachInterrupt(1,count_pulse1,FALLING);
  
  Serial.println("Coin ready!");
  lcd.begin(16,2);
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("Coin ready!");
  lcd.setCursor(0,0);
  lcd.print("Hello=)");
  
  
  lcd.createChar(0, p20); //Создаем перемение для анимации заряда (j)
  lcd.createChar(1, p40);
  lcd.createChar(2, p60);
  lcd.createChar(3, p80);
  lcd.createChar(4, p100);
  
}

void loop()
{
    moneyPin = digitalRead(moneyPin3);//Cчитываем
      
    if (pulse1=0) //Проверка 
   
    {
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("Coin ready!");
  lcd.setCursor(0,0);
  lcd.print("Hello=)");
  delay(200);
     }
         
   if (pulse1>0 && timeCount1<300) //Проверка 
   
    {
  lcd.clear();
  lcd.setCursor(0,0);lcd.print("Error:/");
  lcd.setCursor(0,1);lcd.print("Fast pulse!");
  delay(1100);
  pulse1=0;
  lcd.clear();
  lcd.setCursor(0,0);lcd.print("Waiting!"); 
  lcd.setCursor(0,1);lcd.print("Check the power!");
  delay(1100);
  pulse1=0;
    }
    
  if(pulse1>0 && timeCount1>300) //Проверка условий
    {
    sum+=0.25;
    
    time=sum*4; 
    
  lcd.clear();
  lcd.setCursor(0,0);lcd.print(time);
  lcd.setCursor(4,0);lcd.print("minute"); //Вывод показателей на ЖКД.

    lcd.setCursor(0,1);lcd.print("Total="); //Вывод показателей на ЖКД.
    lcd.setCursor(6,1);lcd.print(sum);   
    }
     
  button1State = digitalRead(button1Pin); //Запись показателей кнопки в переменную
  
digitalWrite(add5V, HIGH );  //Задаем значение
digitalWrite(ledPin, HIGH ); //Задаем значение
  if ((button1State == LOW) && (sum != 0))// если жмём на кнопку и сумма не 0

  // тогда
  {
    
    digitalWrite(ledPin, LOW);  
    
     lcd.clear();  
  
    lcd.setCursor(0,0);lcd.print("Power ok!"); 
    
     for (int i = 0; i<16; i++)  // Запуск анимации (16 раз)
 {
   
   for (int j=0; j<5; j++) {
      lcd.setCursor(i, 1); //Определяем блок ЖКД
      lcd.write(j); //Определяем символ в блоке
      delay(sum*3200); //в суме = 64 сек ((0.25*3100/1000)*(16*5))
    } 
   
    
 }
         
     digitalWrite(ledPin, HIGH );
     
    lcd.clear();  
    lcd.setCursor(0,0);lcd.print("Power off!");
 sum=0;
      }


//Проверка на переполнение 
if (sum==20 || sum>20){
lcd.clear(); 
lcd.setCursor(0,0);lcd.print("It's too much!!!"); 
lcd.setCursor(0,1);lcd.print("Start Now!!!"); 
delay(1000);
}
 
if (sum<0){

  lcd.clear(); 
lcd.setCursor(0,0);lcd.print("Error=("); 
sum=0.0;
delay(1000);
} 
}

void count_pulse1(){
  //detachInterrupt(0);
  detachInterrupt(1);
  pulse1++;
  if(pulse1==1)
    timeCount1=millis();
  //attachInterrupt(0,count_pulse,FALLING);
  attachInterrupt(1,count_pulse1,FALLING);
  }
  

Функция setup и loop, выписка из оригинально документации

The setup() function is called when a sketch starts. Use it to initialize variables, pin modes, start using libraries, etc. The setup function will only run once, after each powerup or reset of the Arduino board.

After creating a setup() function, which initializes and sets the initial values, the loop() function does precisely what its name suggests, and loops consecutively, allowing your program to change and respond. Use it to actively control the Arduino board.


Весь код и схема проверена на работоспособность.

Листинг и схему показываю в том виде, в которым нашел.
Поделиться с друзьями
-->

Комментарии (10)


  1. Duti_Fruti
    10.08.2016 15:43
    +1

    Практический смысл есть или учебный проект?


    1. dimapopov
      10.08.2016 15:56

      Проект можно окультурить и в релиз


  1. al_sh
    10.08.2016 15:52

    Может я ошибаюсь, но для того, чтобы телефоны/планшеты брали 1A необходимо подтягивать сигнальные контакты USB резисторами + и земле. Причем номиналы этих резисторов зависят от производителя. В противном случае тел. берет не больше, помоему, 300мА.


    1. dimapopov
      10.08.2016 15:56
      -1

      Все правильно, 1A — 5V это потенциал блока, телефон берет столько сколько ему надо, в аккумуляторах есть плата которая ограничивает силу тока


      1. LynXzp
        10.08.2016 17:56

        Не, там с резисторами полный абсурд. Моя motorola заряжается от чего хочешь, а другие телефоны могут показывать статус charging, но вообще не заряжаться. Если поискать в интернете то можно встретить вообще целый зоопарк схем установок резисторов для разных телефонов. http://www.mobipower.ru/modules.php?name=News&file=print&sid=527 Но это еще мало разных схем, где-то было больше. Надеюсь это по большей части устарело.


        1. Urvin
          10.08.2016 17:59
          +1

          Есть спецмикросхема, правильно выстанавлювающая потенциалы в зависимости от устройства на линии данных. Упоминалась, в том числе, и на GT/HR, но все никак не найду.


          1. zloe_morkoffko
            10.08.2016 19:44
            +1

            Например MAX14630/MAX14632


    1. sashabeep
      10.08.2016 17:40
      -1

      Зарядка включается через реле


  1. unixwz
    10.08.2016 23:00

    Очень интересная идея, в реальности, где нибудь уже встречали такие автоматы?


    1. dimapopov
      11.08.2016 10:37

      Я на основе этой схемы сделал автомат, было даже видео, но к сожалению затерялось