В этой статье показано как с помощью одноплатного компьютера и Pi4J сделать мигающий светодиод. Можно сказать, что это первый «урок для начинающих» из этой серии.
Проект Pi4J — это мост между оборудованием Raspberry Pi и Java с объектно-ориентированным подходом. Pi4J — проект с открытым исходным кодом. В дополнение к базовым функциональным возможностям доступа к аппаратным средствам, этот проект также пытается предоставить набор расширенных функций, которые делают работу с Raspberry Pi простой в использовании и более удобной для Java-разработчиков.
И так, для начала нужно установить библиотеки Pi4J на ваш компьютер. Pi4J поддерживает следующие платы: Raspberry Pi, Banana Pi, Banana Pro, Synovoip BPI, Odroid, Orange Pi и NanoPi. По умолчанию Pi4J настроен под Raspberry Pi.
Необходимые компоненты
Чтобы зажечь светодиод понадобится:
- одноплатный компьютер (в моём случае — это Orange Pi PC);
- светодиод;
- резистор 220 Ом.
Подключение светодиода
Мы подключаем резистор сопротивлением 220 Ом к выходу номер 24 (GPIO.24), к резистору в свою очередь подключаем анод (обычно длинная ножка) светодиода. Катод подсоединяем к земле (GND или 0v).
определить какой пин 24-й, так это колонка wpi после выполнения gpio readall
.
Инициализация компонентов
Если у вас есть Raspberry Pi, тогда вам не надо выбирать платформу. У меня Orange Pi PC, по этому я должны явно указывать платформу — Orange Pi.
PlatformManager.setPlatform(Platform.ORANGEPI);
Перед взаимодействием с Pi4J мы должны сначала создать экземпляр контроллера GPIO. GpioFactory
включает метод getInstance
для создания контроллера GPIO. Проект будет содержать только один экземпляр контроллера GPIO, так как паттерн Singleton гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа.
final GpioController gpio = GpioFactory.getInstance();
Чтобы получить доступ к пинам GPIO, мы должны сначала обеспечить нужный пин. С помощью методов provisionDigitalOutputPin
мы можем настроить пин в режиме выхода, задать имя и состояние пина при запуске (0 или 1).
GpioPinDigitalOutput myLed = gpio.provisionDigitalOutputPin( OrangePiPin.GPIO_24, // Номер пина по WiringPi "Светодиод", // Имя пина (необязательный) PinState.LOW); // Состояние пина при запуске (необязательный)
Pi4J обеспечивает реализацию для автоматического задания состояний выводов GPIO, когда приложение завершает работу. К примеру, нам нужно освободить пин, установить в режим входа, отключить подтягивающий резистор и задать состояние LOW (0), чтобы вернуть пин в исходное состояние.
myLed.setShutdownOptions( true, // освобождаем пин PinState.LOW, // задаём состояние 0 PinPullResistance.OFF, // отключаем подтягивающий резистор PinMode.DIGITAL_INPUT);// установливаем режим входа
Если необходимо исполнять какой-то код во время изменения состояния пина (из 0 в 1 или наоборот), тогда нужно создать «слушатель». Обычно они нужны в случае подключения, к примеру, кнопки или датчика движения. В этом примере мы просто будем выводить в консоль имя и состояние пина.
myLed.addListener(new GpioPinListenerDigital() { @Override public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) { System.out.println(" --> Состояние пина: " + event.getPin() + " = " + event.getState()); } });
Интерфейс GpioPinDigitalOutput
Интерфейс GpioPinDigitalOutput
содержит методы для подачи (логический «1
«) или снятия (логический «0
«) рабочего напряжения на пины GPIO. Все методы этого интерфейса описаны ниже.
void high();
отправляет на цифровой вывод значение HIGH
.
void low();
отправляет на цифровой вывод значение LOW
.
void toggle();
отправляет на цифровой вывод значение HIGH
, если текущее значение LOW
или LOW
— если HIGH
.
Future<?> blink(long delay);
непрерывно отправляет на цифровой вывод значение HIGH
и LOW
.
Параметры:
long delay
— интервал в миллисекундах;
Future<?> blink(long delay, PinState blinkState);
непрерывно отправляет на цифровой вывод значение HIGH
и LOW
.
Параметры:
long delay
— интервал в миллисекундах;PinState blinkState
— начальное значение:PinState.LOW
илиPinState.HIGH
.
Future<?> blink(long delay, long duration);
отправляет на цифровой вывод значение HIGH
и LOW
.
Параметры:
long delay
— это интервал в миллисекундах;long duration
— продолжительность в миллисекундах.
Future<?> blink(long delay, long duration, PinState blinkState);
отправляет на цифровой вывод значение HIGH
и LOW
.
Параметры:
long delay
— это интервал в миллисекундах;long duration
— продолжительность в миллисекундах;PinState blinkState
— начальное значение:PinState.LOW
илиPinState.HIGH
.
Future<?> pulse(long duration);
отправляет на цифровой вывод значение HIGH
.
Параметры:
long duration
— продолжительность в миллисекундах.
Future<?> pulse(long duration, Callable<Void> callback);
отправляет на цифровой вывод значение HIGH
.
Параметры:
long duration
— продолжительность в миллисекундах;Callable<Void> callback
— задача, которая будет выполняться по истечению времениduration
.
Future<?> pulse(long duration, boolean blocking);
отправляет на цифровой вывод значение HIGH
.
Параметры:
long duration
— продолжительность в миллисекундах;boolean blocking
—true
блокирует текущий поток на время выполнения импульса иfalse
— запуск импульса в отдельный поток (в фоновом режиме).
Future<?> pulse(long duration, boolean blocking, Callable<Void> callback);
отправляет на цифровой вывод значение HIGH
.
Параметры:
long duration
— продолжительность в миллисекундах;boolean blocking
—true
блокирует текущий поток на время выполнения импульса иfalse
— запуск импульса в отдельный поток (в фоновом режиме);Callable<Void> callback
— задача, которая будет выполняться по истечению времениduration
.
Future<?> pulse(long duration, PinState pulseState);
отправляет на цифровой вывод значение.
Параметры:
long duration
— это продолжительность в миллисекундах;PinState pulseState
— это, непосредственно, значениеPinState.LOW
илиPinState.HIGH
.
Future<?> pulse(long duration, PinState pulseState, Callable<Void> callback);
отправляет на цифровой вывод значение.
Параметры:
long duration
— продолжительность в миллисекундах;PinState pulseState
— значениеPinState.LOW
илиPinState.HIGH
;Callable<Void> callback
— задача которая будет выполняться по истечению времениduration
.
Future<?> pulse(long duration, PinState pulseState, boolean blocking);
отправляет на цифровой вывод значение.
Параметры:
long duration
— продолжительность в миллисекундах;PinState pulseState
— значениеPinState.LOW
илиPinState.HIGH
;boolean blocking
—true
блокирует текущий поток на время выполнения импульса иfalse
— запуск импульса в отдельный поток (в фоновом режиме).
Future<?> pulse(long duration, PinState pulseState, boolean blocking, Callable<Void> callback);
отправляет на цифровой вывод значение.
Параметры:
long duration
— продолжительность в миллисекундах;PinState pulseState
— значениеPinState.LOW
илиPinState.HIGH
;boolean blocking
—true
блокирует текущий поток на время выполнения импульса иfalse
— запуск импульса в отдельный поток (в фоновом режиме);Callable<Void> callback
— задача которая будет выполняться по истечению времениduration
.
void setState(PinState state);
отправляет на цифровой вывод значение HIGH
и LOW
.
Параметры:
PinState pulseState
— значениеPinState.LOW
илиPinState.HIGH
;
void setState(boolean state);
отправляет на цифровой вывод значение HIGH
и LOW
.
Параметры:
boolean state
— значениеtrue
илиfalse
.
Future — это интерфейс для получения результатов работы асинхронной операции. Ключевым методом здесь является метод get, который блокирует текущий поток (с таймаутом или без) до завершения работы асинхронной операции в другом потоке. Также, дополнительно существуют методы для отмены операции и проверки текущего статуса.
Мигающий светодиод — примеры
Мигать светодиодом можно несколькими способами. Первый способ — используя методы void high();
и void low();
— зажигаем и выключаем светодиод соответственно.
for (int i = 0; i < 10; i++) { myLed.high(); Thread.sleep(500); myLed.low(); Thread.sleep(500); }
Второй способ — используя методы void setState(PinState state);
и void setState(boolean state);
— задаёт состояние пина в зависимости от значения параметра arg0
: true
и false
или PinState.LOW
и PinState.HIGH
.
for (int i = 0; i < 10; i++) { myLed.setState(true); Thread.sleep(500); myLed.setState(PinState.LOW); Thread.sleep(500); }
Третий способ — используя метод void toggle();
. Этот метод работает как переключатель, если пин в состоянии «1», тогда меняет её в «0» и наоборот.
for (int i = 0; i < 20; i++) { myLed.toggle(); Thread.sleep(500); }
Четвёртый способ — используя методы Future<?> blink(long delay);
. Как по мне, так это самый интересный способ мигать светодиодом. К примеру, нам нужно мигать непрерывно светодиодом пока программа запущена.
Future<?> future = myLed.blink(500);
Или непрерывно мигать в течении некоторого времени.
// непрерывно мигает светодиод каждые 1/2 секунды в течение 15 секунд Future<?> future = myLed.blink(500, 15000); // Ждём окончания мигания while (!future.isDone()) { Thread.sleep(50); }
Завершение программы
Метод shutdown()
остановливает все действия/потоки GPIO, выключив контроллер GPIO, другими словами, этот метод будет принудительно отключать все потоки мониторинга GPIO и задачи.
gpio.shutdown();
Пример Java программы
Ниже привёл пример программы «мигающий светодиод» с использованием функции Future<?> blink(long arg0, long arg1);
. Программа непрерывно мигает светодиод каждые 1/4 секунды в течение 3 секунд.
import java.util.concurrent.Future; import com.pi4j.io.gpio.GpioController; import com.pi4j.io.gpio.GpioFactory; import com.pi4j.io.gpio.GpioPinDigitalOutput; import com.pi4j.io.gpio.OrangePiPin; import com.pi4j.io.gpio.PinMode; import com.pi4j.io.gpio.PinPullResistance; import com.pi4j.io.gpio.PinState; import com.pi4j.io.gpio.event.GpioPinDigitalStateChangeEvent; import com.pi4j.io.gpio.event.GpioPinListenerDigital; import com.pi4j.platform.Platform; import com.pi4j.platform.PlatformManager; public class LedBlinking { public static void main(String[] args) { try { /* * Поскольку мы не используем платформу Raspberry Pi, мы должны явно * указывать платформу, в нашем случае - это Orange Pi. */ PlatformManager.setPlatform(Platform.ORANGEPI); /* * Создаём экземпляр контроллера GPIO */ final GpioController gpio = GpioFactory.getInstance(); /* * настройка вывода GPIO.24, задаём режим выхода и установливаем значение * LOW при запуске */ GpioPinDigitalOutput myLed = gpio.provisionDigitalOutputPin( OrangePiPin.GPIO_24, // Номер пина по WiringPi "Светодиод", // Имя пина (необязательный) PinState.LOW); // Состояние пина при запуске (необязательный) /* * настроика поведения выключения */ myLed.setShutdownOptions( true, // освобождаем пин PinState.LOW, // задаём состояние 0 PinPullResistance.OFF, // отключаем подтягивающий резистор PinMode.DIGITAL_INPUT);// установливаем режим входа /* * Это объект, который "слушает" и исполняет код в зависимости от события. */ myLed.addListener(new GpioPinListenerDigital() { @Override public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) { System.out.println(" --> Состояние пина: " + event.getPin() + " = " + event.getState()); } }); // непрерывно мигает светодиод каждые 1/4 секунды в течение 3 секунд Future<?> future = myLed.blink(250, 3000); // ждёт окончания мигания while (!future.isDone()) { Thread.sleep(50); } gpio.shutdown(); } catch (Exception e) { e.printStackTrace(); } } }
Как скомпилировать Java файла
Для компиляции этой программы используйте следующую команду:
javac -classpath .:classes:/opt/pi4j/lib/'*' -d . LedBlinking.java
Как запуск class файла
Следующая команда запустит этот пример программы:
sudo java -classpath .:classes:/opt/pi4j/lib/'*' LedBlinking
банкротство отзывы
1win официальный сайт регистрация http://www.pboarders.borda.ru/?1-11-0-00000929-000-0-0-1742818701 .
mostbet kg https://www.shorts.borda.ru/?1-18-0-00000397-000-0-0 .
мостюет http://www.tagilshops.forum24.ru/?1-4-0-00000205-000-0-0 .
мостбет chrono https://kharkovbynight.forum24.ru/?1-15-0-00003047-000-0-0-1742814422 .
1win pro https://www.yamama.forum24.ru/?1-11-0-00000459-000-0-0-1742818616 .
мостбет казино maksipolinovtsu.forum24.ru/?1-1-0-00000194-000-0-0-1742815870 .
1win kg скачать http://mymoscow.forum24.ru/?1-6-0-00026928-000-0-0/ .
1 win.com https://dogzz.forum24.ru/?1-10-0-00000155-000-0-0-1742818537 .
mostbet официальный сайт http://corgan.borda.ru/?1-0-0-00000265-000-0-0 .
мостбет скачать на андроид http://ashapiter0.forum24.ru/?1-19-0-00001444-000-0-0-1742819001 .
сайт 1win https://www.knowledge.forum24.ru/?1-0-0-00000101-000-0-0-1742817704 .
мост бет http://mostbet6004.ru/ .
wan win http://www.belbeer.borda.ru/?1-6-0-00001583-000-0-0 .
мостбет официальный сайт https://girikms.forum24.ru/?1-1-0-00000361-000-0-0-1742819287/ .
мостбет казино войти https://alfatraders.borda.ru/?1-0-0-00004917-000-0-0-1743053068 .
мостбет зеркало http://cah.forum24.ru/?1-3-0-00000096-000-0-0-1743053764 .
1win вход на сайт https://fanfiction.borda.ru/?1-0-0-00029708-000-0-0-1743051664 .
1win сайт 1win сайт .
1вин вход с компьютера http://1win6020.ru/ .
1вин вход с компьютера http://www.1win6020.ru .
мостбет казино войти http://mostbet6006.ru/ .
mostbets mostbets .
мостбет кыргызстан https://mostbet6007.ru .
мостбет казино мостбет казино .
1 win pro http://balashiha.myqip.ru/?1-12-0-00000437-000-0-0-1743258848 .
1 win регистрация http://balashiha.myqip.ru/?1-12-0-00000437-000-0-0-1743258848/ .
Банкротство является прекрасной возможностью списать долги и начать жизнь с чистого листа. Не откладывайте решение проблемы, прочитайте отзывы тех, кто уже прошел процедуру банкротства https://bankrotstvo-v-moskve95.ru .
1vin казино http://balashiha.myqip.ru/?1-12-0-00000437-000-0-0-1743258848/ .
вход 1win https://www.balashiha.myqip.ru/?1-12-0-00000437-000-0-0-1743258848 .
скачать мостбет https://mostbet6008.ru/ .
служба поддержки мостбет номер телефона http://www.mostbet6008.ru .
мостбет войти мостбет войти .
скачать mostbet на телефон svstrazh.forum24.ru/?1-18-0-00000136-000-0-0-1743260517 .
mostbet apk скачать https://www.mostbet6008.ru .
мостбет скачать https://svstrazh.forum24.ru/?1-18-0-00000136-000-0-0-1743260517 .
мостбет скачать андроид http://svstrazh.forum24.ru/?1-18-0-00000136-000-0-0-1743260517/ .
мостбет вход https://mostbet6009.ru/ .
1 win pro 1 win pro .
1vin https://1win6051.ru/ .
1вин бет официальный сайт http://1win6051.ru/ .
mostbet kg отзывы https://mostbet6010.ru/ .
1вин официальный сайт мобильная http://1win6051.ru .
мост бет мост бет .
скачать 1win официальный сайт http://1win6005.ru .
мостбет кыргызстан http://mostbet6030.ru/ .
1 win сайт 1 win сайт .
mosbet mosbet .
мосбет казино мосбет казино .
мостбет официальный сайт mostbet6029.ru .
1win online games https://1win13.com.ng/ .
1вин сайт официальный 1win6054.ru .
1win com http://1win6054.ru/ .
1win pro 1win6005.ru .
1win site 1win13.com.ng .
мост бет мост бет .
mostbet https://mostbet6029.ru .
скачат мостбет https://www.mostbet6030.ru .
1win betting https://1win13.com.ng/ .
casino 1 win 1win1001.top .
1 win сайт http://1win6054.ru/ .
казино онлайн kg http://mostbet6031.ru .
sports betting 1win sports betting 1win .
1win mexico https://www.1win1001.top .
скачать мостбет скачать мостбет .
aplicația 1win http://1win5010.ru/ .
1 win вход https://1win6042.ru/ .
мостбет скачать казино https://mostbet6032.ru .
1win кыргызстан http://1win6054.ru/ .
1win bet deposit 1win bet deposit .
1 вин https://1win6042.ru .
служба поддержки мостбет номер телефона https://mostbet6032.ru .
1 вин официальный https://www.1win6043.ru .
portofele electronice casino portofele electronice casino .
1win mexico 1win1001.top .
1win cassino 1win cassino .
мостбет промокод http://www.mostbet6032.ru .
1win вход http://www.1win6042.ru .
поддержка мостбет https://www.mostbet6032.ru .
1win 1win .
cazinouri online moldova https://1win5010.ru/ .
1win молдова 1win молдова .
mostber http://www.mostbet6031.ru .
сайт 1win официальный сайт вход сайт 1win официальный сайт вход .
mostbet скачать на телефон бесплатно андроид mostbet скачать на телефон бесплатно андроид .
înregistrare 1win 1win5012.ru .
банкротство физических лиц отзывы банкротство физических лиц отзывы .
скачать 1win с официального сайта http://www.1win6007.ru .
мостбет скачать андроид http://mostbet6011.ru .
1вин http://1win6007.ru/ .
1win играть http://www.1win6008.ru .
mostbet игры http://www.mostbet6033.ru .
1vin 1win6044.ru .
скачать mostbet на телефон http://www.mostbet6011.ru .
1 вин вход https://1win6007.ru .
motsbet https://www.mostbet6011.ru .
1vin kg 1win6008.ru .
1 ван вин http://1win6008.ru/ .
1win http://www.1win5012.ru .
mostbet http://mostbet6011.ru .
1win online 1win6008.ru .
1 win.kg 1 win.kg .
1win.kg 1win.kg .
мостбет войти http://www.mostbet6034.ru .
1win uganda https://www.1win1003.top .
most bet http://mostbet6034.ru/ .
pariuri sportive moldova https://1win5013.ru .
мосбет казино мосбет казино .
1win login ug https://1win1003.top .
1win онлайн 1win онлайн .
1win md 1win5013.ru .
мостбет промокод http://mostbet6034.ru/ .
мостбет авиатор http://mostbet6034.ru/ .
партнёрка 1win https://1win6045.ru .
wan win 1win6010.ru .
mostbet kg отзывы https://www.mostbet6035.ru .
мостюет мостюет .
1вин официальный сайт вход http://1win6045.ru .
mostbet скачать на телефон бесплатно андроид http://mostbet6033.ru .
cazino md cazino md .
1вин приложение 1вин приложение .
1вин. 1вин. .
1win официальный сайт http://1win6045.ru .
зайти в 1вин http://1win6045.ru .
1win.com https://1win5015.ru .
jocuri de noroc online moldova http://1win5015.ru/ .
мостбет официальный сайт http://www.mostbet6033.ru .
мостбет кг https://mostbet6036.ru .
1 vin официальный сайт https://www.1win6045.ru .
мостбет вход mostbet6036.ru .
1wln http://1win7002.ru/ .
mostbet скачать mostbet скачать .
1win официальный сайт регистрация http://www.1win7014.ru .
1вин войти http://1win6045.ru/ .
1вин. https://1win7014.ru/ .
mostbet игры https://www.mostbet5002.ru .
1вин официальный регистрация http://1win5030.ru/ .
mostbet casino mostbet casino .
1 win.am https://1win5030.ru/ .
motsbet http://www.mostbet5002.ru .
mostbet kg скачать mostbet5003.ru .
баланс 1win http://1win5030.ru .
1 win http://1win7004.ru/ .
1 win сайт http://1win7004.ru/ .
мост бет http://www.mostbet5003.ru .
1winn 1win7004.ru .
aviator mostbet https://mostbet5003.ru/ .
мостбет chrono https://mostbet6038.ru/ .
1win sportsbook https://www.1win17.com.ng .
мостбет мостбет .
1win партнерка вход https://www.1win7004.ru .
мостбет скачать андроид мостбет скачать андроид .
мосбет казино http://mostbet7001.ru/ .
мостбет авиатор мостбет авиатор .
1 win moldova https://1win5026.ru .
мостбет скачать казино https://mostbet6038.ru/ .
1вин официальный мобильная http://www.1win7017.ru .
1win site https://www.1win18.com.ng .
1win md https://1win5026.ru/ .
1win betting http://www.1win18.com.ng .
1win online site https://www.1win18.com.ng .
1вин официальный сайт вход 1вин официальный сайт вход .
sports betting 1win sports betting 1win .
register with 1win website http://1win18.com.ng .
1win молдова http://www.1win5026.ru .
1 win moldova 1 win moldova .
1win pariuri http://1win5026.ru .
1win скачать 1win скачать .
1win онлайн https://www.1win7017.ru .
мостбет скачать андроид http://www.mostbet7003.ru .
1 вин скачать https://www.1win7006.ru .
1 win moldova http://1win5026.ru .
1вин официальный сайт мобильная https://1win7017.ru .
мостбет скачать на андроид mostbet7003.ru .
мостбет скачать бесплатно мостбет скачать бесплатно .
1win онлайн 1win онлайн .
cod promoțional 1win http://1win5027.ru/ .
1 ван вин http://1win7006.ru .
поддержка мостбет http://mostbet7003.ru .
1win зайти 1win зайти .
1 вин официальный сайт вход 1win7007.ru .
сайт 1win https://1win7018.ru/ .
мостбет скачать бесплатно mostbet6033.ru .
motbet https://www.1win5028.ru .
1win. com https://1win7007.ru/ .
mostbet https://www.1win5028.ru .
mostbet скачать на телефон бесплатно андроид https://www.mostbet6033.ru .
1win,com https://1win7007.ru .
мост бет мост бет .
мостбет промокод https://www.mostbet5008.ru .
мостбет скачать казино http://www.mostbet6033.ru .
1 win вход 1win7018.ru .
mostbet официальный сайт mostbet6033.ru .
mostbet chrono http://www.mostbet6033.ru .
melbet кыргызстан melbet кыргызстан .
melbet kg https://melbet1003.ru/ .
мост бет мост бет .
1win uganda http://1win1005.top/ .
поддержка мостбет http://www.mostbet5010.ru .
мелбет кыргызстан мелбет кыргызстан .
мостбет скачать бесплатно https://mostbet5010.ru .
мостбет скачать андроид мостбет скачать андроид .
wan win wan win .
казино онлайн kg http://mostbet5010.ru/ .
1вин официальный мобильная 1вин официальный мобильная .
mostbet kg скачать на андроид http://www.mostbet5010.ru .
1vin казино https://www.1win7009.ru .
mostbet скачать на телефон бесплатно андроид https://mostbet5009.ru/ .
скачать мостбет официальный сайт https://mostbet5009.ru/ .
1win,com https://1win7009.ru .
1 vin официальный сайт http://1win7009.ru/ .
скачать mostbet на телефон http://www.mostbet5009.ru .
1win 1win1005.top .
1 win вход http://1win7010.ru/ .
мостбет скачать на андроид http://mostbet7007.ru .
поддержка мостбет https://mostbet7006.ru/ .
mostbet kg mostbet kg .
мостбет chrono мостбет chrono .
Мы изготавливаем дипломы любых профессий по доступным ценам.
Вы покупаете диплом в надежной и проверенной временем компании. Купить диплом о высшем образовании— http://paintball-keller-lev.de/ucp.phpmode=login/ — paintball-keller-lev.de/ucp.phpmode=login
motbet http://mostbet6033.ru .
mostbet промокод https://mostbet7007.ru .
мостбет казино войти http://mostbet6040.ru/ .
mostbet chrono http://mostbet6040.ru .
Мы изготавливаем дипломы психологов, юристов, экономистов и любых других профессий по выгодным тарифам. Стараемся поддерживать для заказчиков адекватную политику цен. Для нас важно, чтобы дипломы были доступны для большого количества граждан.
Приобретение диплома, подтверждающего обучение в ВУЗе, — это грамотное решение. Купить диплом о высшем образовании: diplom-bez-problem.com/diplom-kupit-ekaterinburg-6/
1вин 1win7012.ru .
Заказать диплом о высшем образовании!
Мы готовы предложить дипломы любой профессии по приятным тарифам— ruobrazovanie.ru
pin up az pin up az .
вход 1win https://www.1win7012.ru .
aviator mostbet aviator mostbet .
pin up bet pin up bet .
мостбет скачать мостбет скачать .
мостбет кыргызстан скачать http://www.mostbet6040.ru .