Pull to refresh

Chargebox на Arduino

Reading time 4 min
Views 6.3K
Создания автомата для зарядки планшетов и телефонов

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

  • 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.


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

Листинг и схему показываю в том виде, в которым нашел.
Tags:
Hubs:
0
Comments 10
Comments Comments 10

Articles