P14J предоставляет серию триггеров, которые могут выполнять действия на пины GPIO на основе изменения состояния другого пина. Триггеры также предоставляют расширяемый интерфейс, который позволяет расширять и создавать собственные пользовательские триггеры.
Триггеры GpioBlinkStateTrigger и GpioBlinkStopStateTrigger
Триггеры GpioBlinkStateTrigger и GpioBlinkStopStateTrigger используются для включения и, соответственно, выключения мигания на пины GPIO. К примеру, мы хотим подключить датчик движения (к примеру HC-SR501) и светодиод, мигать им, когда датчик обнаружит движение и выключить мигание в противном случае.
Схема подключения
Код программы
В этом примере кода показано, как настроить и использовать мигающие триггеры GpioBlinkStateTrigger и GpioBlinkStopStateTrigger для контактов GPIO на Orange Pi. Триггер GpioBlinkStateTrigger мигает светодиодом «myLed» с интервалом в 100 мс, когда на пин «myButton» меняется состояние из «0» в «1», а GpioBlinkStopStateTrigger отключает мигание, когда состояние переходит из «1» в «0».
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalInput;
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.trigger.GpioBlinkStateTrigger;
import com.pi4j.io.gpio.trigger.GpioBlinkStopStateTrigger;
import com.pi4j.platform.Platform;
import com.pi4j.platform.PlatformManager;
import com.pi4j.util.Console;
public class PushButtonGpioBlinkStateTrigger {
public static void main(String[] args) {
try {
/*
* Поскольку мы не используем платформу Raspberry Pi, мы должны явно
* указывать платформу, в нашем случае - это Orange Pi.
*/
PlatformManager.setPlatform(Platform.ORANGEPI);
/*
* Создаём экземпляр консоли
*/
Console console = new Console();
/*
* Позволяем пользователю выйти из программы с помощью CTRL-C
*/
console.promptForExit();
/*
* Создаём экземпляр контроллера GPIO
*/
GpioController gpio = GpioFactory.getInstance();
/*
* настройка вывода GPIO.22, задаём режим входа и включаем подтягивающий
* резистор в "1"
*/
GpioPinDigitalInput myButton = gpio.provisionDigitalInputPin(
OrangePiPin.GPIO_23, // Номер пина по WiringPi
"HC-SR501", // Имя пина (необязательный)
PinPullResistance.PULL_UP);
/*
* настроика поведения выключения
*/
myButton.setShutdownOptions(
true, // освобождаем пин
PinState.LOW, // задаём состояние 0
PinPullResistance.OFF, // отключаем подтягивающий резистор
PinMode.DIGITAL_INPUT);// установливаем режим входа
/*
* настройка вывода 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" с интервалом в
* 100 мс. Триггер срабатывает, когда на пин myButton меняется состояние
* из "0" в "1"
*/
myButton.addTrigger(new GpioBlinkStateTrigger(PinState.HIGH, myLed, 100));
/*
* добавляем триггер, который отключает мигание. Триггер срабатывает,
* когда на пин myButton меняется состояние из "1" в "0"
*/
myButton.addTrigger(new GpioBlinkStopStateTrigger(PinState.LOW, myLed));
/*
* ждёт, пока пользователь нажмёт CTRL-C
*/
console.waitForExit();
gpio.shutdown();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Проверяем код:
- создаём java файл и вставляем код;
nano PushButtonGpioBlinkStateTrigger.java
- компилируем файл;
javac -classpath .:classes:/opt/pi4j/lib/'*' PushButtonGpioBlinkStateTrigger.java
- запускаем программу.
sudo java -classpath .:classes:/opt/pi4j/lib/'*' PushButtonGpioBlinkStateTrigger
Результат
Триггер GpioToggleStateTrigger
Триггер GpioToggleStateTrigger используется для изменения состояния GPIO пинов на противоположное. Если выходной пин в состоянии «1», при срабатывании триггера (к примеру нажали на кнопку) состояние пина меняется в лог. «0» и на оборот, если пин в состоянии «0» — тогда менится в лог. «1». Срабатывание триггера GpioToggleStateTrigger можно настроить тремя способами:
- при переходе из «1» в «0» —
new GpioToggleStateTrigger(PinState.LOW, myLed); - при переходе из «0» в «1» —
new GpioToggleStateTrigger(PinState.HIGH, myLed); - любое изменение состояния —
new GpioToggleStateTrigger(myLed);
Чтобы проверить как GpioToggleStateTrigger работает, мы можем подключить кнопку и светодиод как показано на схеме ниже и выполнить приведённый код программы.
Схема подключения
Код программы
В этом примере показано, как настроить и использовать триггер GpioToggleStateTrigger. Триггер включает и выключает светодиод если нажимать на кнопку, т.е. когда пин «myButton» меняет состояние из «1» в «0».
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalInput;
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.trigger.GpioToggleStateTrigger;
import com.pi4j.platform.Platform;
import com.pi4j.platform.PlatformManager;
import com.pi4j.util.Console;
public class PushButtonGpioToggleStateTrigger {
public static void main(String[] args) {
try {
/*
* Поскольку мы не используем платформу Raspberry Pi, мы должны явно
* указывать платформу, в нашем случае - это Orange Pi.
*/
PlatformManager.setPlatform(Platform.ORANGEPI);
/*
* Создаём экземпляр консоли
*/
Console console = new Console();
/*
* Позволяем пользователю выйти из программы с помощью CTRL-C
*/
console.promptForExit();
/*
* Создаём экземпляр контроллера GPIO
*/
GpioController gpio = GpioFactory.getInstance();
/*
* настройка вывода GPIO.22, задаём режим входа и включаем подтягивающий
* резистор в "1"
*/
GpioPinDigitalInput myButton = gpio.provisionDigitalInputPin(
OrangePiPin.GPIO_22, // Номер пина по WiringPi
"Кнопка", // Имя пина (необязательный)
PinPullResistance.PULL_UP);
/*
* настроика поведения выключения
*/
myButton.setShutdownOptions(
true, // освобождаем пин
PinState.LOW, // задаём состояние 0
PinPullResistance.OFF, // отключаем подтягивающий резистор
PinMode.DIGITAL_INPUT);// установливаем режим входа
/*
* настройка вывода 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".
* Триггер срабатывает при нажатии кнопки (когда на пин "myButton"
* меняется состояние из "1" в "0")
*/
myButton.addTrigger(new GpioToggleStateTrigger(PinState.LOW, myLed));
/*
* ждёт, пока пользователь нажмёт CTRL-C
*/
console.waitForExit();
gpio.shutdown();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Проверяем код:
- создаём java файл и вставляем код;
nano PushButtonGpioToggleStateTrigger.java
- компилируем файл;
javac -classpath .:classes:/opt/pi4j/lib/'*' PushButtonGpioToggleStateTrigger.java
- запускаем программу.
sudo java -classpath .:classes:/opt/pi4j/lib/'*' PushButtonGpioToggleStateTrigger
Результат
Триггеры GpioSyncStateTrigger и GpioInverseSyncStateTrigger
Триггеры GpioSyncStateTrigger (также называется «follow-me») и GpioInverseSyncStateTrigger можно использовать для синхронизации и, соответственно, обратной синхронизации состояния одного пина с другим. GpioSyncStateTrigger работает по принципу «делай как я», т.е. если на входном пине менится состояние из «1» в «0», на выходном также менится. GpioInverseSyncStateTrigger работает по принципу «делай наоборот», если на входном пине состояние менится из «0» в «1», на выходном менится из «1» в «0».
Схема подключения
Код программы
Следующий пример демонстрирует простую реализацию триггера «follow-me» (следи за мной). При нажатии кнопки загорается синий светодиод, а при отжатии — красный.
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalInput;
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.trigger.GpioSyncStateTrigger;
import com.pi4j.io.gpio.trigger.GpioInverseSyncStateTrigger;
import com.pi4j.platform.Platform;
import com.pi4j.platform.PlatformManager;
import com.pi4j.util.Console;
public class PushButtonGpioInverseSyncStateTrigger {
public static void main(String[] args) {
try {
/*
* Поскольку мы не используем платформу Raspberry Pi, мы должны явно
* указывать платформу, в нашем случае - это Orange Pi.
*/
PlatformManager.setPlatform(Platform.ORANGEPI);
/*
* Создаём экземпляр консоли
*/
Console console = new Console();
/*
* Позволяем пользователю выйти из программы с помощью CTRL-C
*/
console.promptForExit();
/*
* Создаём экземпляр контроллера GPIO
*/
GpioController gpio = GpioFactory.getInstance();
/*
* настройка вывода GPIO.22, задаём режим входа и включаем подтягивающий
* резистор в "1"
*/
GpioPinDigitalInput myButton = gpio.provisionDigitalInputPin(
OrangePiPin.GPIO_22, // Номер пина по WiringPi
"Кнопка", // Имя пина (необязательный)
PinPullResistance.PULL_UP);
/*
* настроика поведения выключения
*/
myButton.setShutdownOptions(
true, // освобождаем пин
PinState.LOW, // задаём состояние 0
PinPullResistance.OFF, // отключаем подтягивающий резистор
PinMode.DIGITAL_INPUT);// установливаем режим входа
/*
* настройка вывода GPIO.24, задаём режим выхода и установливаем значение
* LOW при запуске
*/
GpioPinDigitalOutput redLed = gpio.provisionDigitalOutputPin(
OrangePiPin.GPIO_24, // Номер пина по WiringPi
"Светодиод", // Имя пина (необязательный)
PinState.LOW); // Состояние пина при запуске (необязательный)
/*
* настроика поведения выключения
*/
redLed.setShutdownOptions(
true, // освобождаем пин
PinState.LOW, // задаём состояние 0
PinPullResistance.OFF, // отключаем подтягивающий резистор
PinMode.DIGITAL_INPUT);// установливаем режим входа
/*
* настройка вывода GPIO.23, задаём режим выхода и установливаем значение
* LOW при запуске
*/
GpioPinDigitalOutput blueLed = gpio.provisionDigitalOutputPin(
OrangePiPin.GPIO_23, // Номер пина по WiringPi
"Светодиод", // Имя пина (необязательный)
PinState.LOW); // Состояние пина при запуске (необязательный)
/*
* настроика поведения выключения
*/
blueLed.setShutdownOptions(
true, // освобождаем пин
PinState.LOW, // задаём состояние 0
PinPullResistance.OFF, // отключаем подтягивающий резистор
PinMode.DIGITAL_INPUT);// установливаем режим входа
/*
* добавляем триггер, который синхронизирует состояние пина GPIO.24 с
* обратным состоянием пина GPIO.22
*/
myButton.addTrigger(new GpioSyncStateTrigger(redLed));
/*
* добавляем триггер, который синхронизирует состояние пина GPIO.23 с
* состоянием пина GPIO.22
*/
myButton.addTrigger(new GpioInverseSyncStateTrigger(blueLed));
/*
* ждёт, пока пользователь нажмёт CTRL-C
*/
console.waitForExit();
gpio.shutdown();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Проверяем код:
- создаём java файл и вставляем код;
nano PushButtonGpioInverseSyncStateTrigger.java
- компилируем файл;
javac -classpath .:classes:/opt/pi4j/lib/'*' PushButtonGpioInverseSyncStateTrigger.java
- запускаем программу.
sudo java -classpath .:classes:/opt/pi4j/lib/'*' PushButtonGpioInverseSyncStateTrigger
Результат
Триггер GpioPulseStateTrigger
Триггер GpioPulseStateTrigger используются для отправки импульсов на пины GPIO на определённое время. Срабатывание триггера GpioPulseStateTrigger можно настроить тремя способами:
- при переходе из «1» в «0» —
new GpioPulseStateTrigger(PinState.LOW, myLed, 1000); - при переходе из «0» в «1» —
new GpioPulseStateTrigger(PinState.HIGH, myLed, 1000); - любое изменение состояния —
new GpioPulseStateTrigger(myLed, 1000);
Схема подключения
Код программы
В этом примере я добавил два триггера GpioPulseStateTrigger, чтобы при нажатии на кнопку (переход из «1» в «0») загорелся красный светодиод, а при отжатии (переход из «0» в «1») — синий. Оба светодиода будут гореть по 1000 мс.
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalInput;
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.trigger.GpioPulseStateTrigger;
import com.pi4j.platform.Platform;
import com.pi4j.platform.PlatformManager;
import com.pi4j.util.Console;
public class PushButtonGpioPulseStateTrigger {
public static void main(String[] args) {
try {
/*
* Поскольку мы не используем платформу Raspberry Pi, мы должны явно
* указывать платформу, в нашем случае - это Orange Pi.
*/
PlatformManager.setPlatform(Platform.ORANGEPI);
/*
* Создаём экземпляр консоли
*/
Console console = new Console();
/*
* Позволяем пользователю выйти из программы с помощью CTRL-C
*/
console.promptForExit();
/*
* Создаём экземпляр контроллера GPIO
*/
GpioController gpio = GpioFactory.getInstance();
/*
* настройка вывода GPIO.22, задаём режим входа и включаем подтягивающий
* резистор в "1"
*/
GpioPinDigitalInput myButton = gpio.provisionDigitalInputPin(
OrangePiPin.GPIO_22, // Номер пина по WiringPi
"Кнопка", // Имя пина (необязательный)
PinPullResistance.PULL_UP);
/*
* настроика поведения выключения
*/
myButton.setShutdownOptions(
true, // освобождаем пин
PinState.LOW, // задаём состояние 0
PinPullResistance.OFF, // отключаем подтягивающий резистор
PinMode.DIGITAL_INPUT);// установливаем режим входа
/*
* настройка вывода GPIO.24, задаём режим выхода и установливаем значение
* LOW при запуске
*/
GpioPinDigitalOutput redLed = gpio.provisionDigitalOutputPin(
OrangePiPin.GPIO_24, // Номер пина по WiringPi
"Светодиод", // Имя пина (необязательный)
PinState.LOW); // Состояние пина при запуске (необязательный)
/*
* настроика поведения выключения
*/
redLed.setShutdownOptions(
true, // освобождаем пин
PinState.LOW, // задаём состояние 0
PinPullResistance.OFF, // отключаем подтягивающий резистор
PinMode.DIGITAL_INPUT);// установливаем режим входа
/*
* настройка вывода GPIO.23, задаём режим выхода и установливаем значение
* LOW при запуске
*/
GpioPinDigitalOutput blueLed = gpio.provisionDigitalOutputPin(
OrangePiPin.GPIO_23, // Номер пина по WiringPi
"Светодиод", // Имя пина (необязательный)
PinState.LOW); // Состояние пина при запуске (необязательный)
/*
* настроика поведения выключения
*/
blueLed.setShutdownOptions(
true, // освобождаем пин
PinState.LOW, // задаём состояние 0
PinPullResistance.OFF, // отключаем подтягивающий резистор
PinMode.DIGITAL_INPUT);// установливаем режим входа
/*
* добавляем триггер, который включает красный светодиодом "redLed" на
* 1000 мс. Триггер срабатывает, когда пин "myButton" меняет состояние из
* "1" в "0"
*/
myButton.addTrigger(new GpioPulseStateTrigger(PinState.LOW, redLed, 1000));
/*
* добавляем триггер, который включает синий светодиодом "blueLed" на 1000
* мс. Триггер срабатывает, когда пин "myButton" меняет состояние из "0" в
* "1"
*/
myButton.addTrigger(new GpioPulseStateTrigger(PinState.HIGH, blueLed, 1000));
/*
* ждёт, пока пользователь нажмёт CTRL-C
*/
console.waitForExit();
gpio.shutdown();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Проверяем код:
- создаём java файл и вставляем код;
nano PushButtonGpioPulseStateTrigger.java
- компилируем файл;
javac -classpath .:classes:/opt/pi4j/lib/'*' PushButtonGpioPulseStateTrigger.java
- запускаем программу.
sudo java -classpath .:classes:/opt/pi4j/lib/'*' PushButtonGpioPulseStateTrigger
Результат
Триггер GpioSetStateTrigger
С помощью триггера GpioSetStateTrigger можно задать состояние GPIO пинам. Его можно настроить, чтобы срабатывал при переходе из лог. «0» в лог. «1» (и наоборот) и задал «0» или «1» (PinState.LOW или PinState.HIGH) на другой пин.
Схема подключения
Код программы
В этом примере я добавил два триггера GpioSetStateTrigger, чтобы при нажатии на кнопку светодиод включился, а при отжатии — отключился.
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalInput;
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.trigger.GpioSetStateTrigger;
import com.pi4j.platform.Platform;
import com.pi4j.platform.PlatformManager;
import com.pi4j.util.Console;
public class PushButtonGpioSetStateTrigger {
public static void main(String[] args) {
try {
/*
* Поскольку мы не используем платформу Raspberry Pi, мы должны явно
* указывать платформу, в нашем случае - это Orange Pi.
*/
PlatformManager.setPlatform(Platform.ORANGEPI);
/*
* Создаём экземпляр консоли
*/
Console console = new Console();
/*
* Позволяем пользователю выйти из программы с помощью CTRL-C
*/
console.promptForExit();
/*
* Создаём экземпляр контроллера GPIO
*/
GpioController gpio = GpioFactory.getInstance();
/*
* настройка вывода GPIO.22, задаём режим входа и включаем подтягивающий
* резистор в "1"
*/
GpioPinDigitalInput myButton = gpio.provisionDigitalInputPin(
OrangePiPin.GPIO_22, // Номер пина по WiringPi
"Кнопка", // Имя пина (необязательный)
PinPullResistance.PULL_UP);
/*
* настроика поведения выключения
*/
myButton.setShutdownOptions(
true, // освобождаем пин
PinState.LOW, // задаём состояние 0
PinPullResistance.OFF, // отключаем подтягивающий резистор
PinMode.DIGITAL_INPUT);// установливаем режим входа
/*
* настройка вывода GPIO.24, задаём режим выхода и установливаем значение
* LOW при запуске
*/
GpioPinDigitalOutput redLed = gpio.provisionDigitalOutputPin(
OrangePiPin.GPIO_24, // Номер пина по WiringPi
"Светодиод", // Имя пина (необязательный)
PinState.LOW); // Состояние пина при запуске (необязательный)
/*
* настроика поведения выключения
*/
redLed.setShutdownOptions(
true, // освобождаем пин
PinState.LOW, // задаём состояние 0
PinPullResistance.OFF, // отключаем подтягивающий резистор
PinMode.DIGITAL_INPUT);// установливаем режим входа
/*
* добавляем триггер, который включает красный светодиодом "redLed".
* Триггер срабатывает, когда пин "myButton" меняет состояние из "0" в "1"
*/
myButton.addTrigger(new GpioSetStateTrigger(PinState.LOW, redLed, PinState.LOW));
/*
* добавляем триггер, который отключает красный светодиодом "redLed".
* Триггер срабатывает, когда пин "myButton" меняет состояние из "1" в "0"
*/
myButton.addTrigger(new GpioSetStateTrigger(PinState.HIGH, redLed, PinState.HIGH));
/*
* ждёт, пока пользователь нажмёт CTRL-C
*/
console.waitForExit();
gpio.shutdown();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Проверяем код:
- создаём java файл и вставляем код;
nano PushButtonGpioSetStateTrigger.java
- компилируем файл;
javac -classpath .:classes:/opt/pi4j/lib/'*' PushButtonGpioSetStateTrigger.java
- запускаем программу.
sudo java -classpath .:classes:/opt/pi4j/lib/'*' PushButtonGpioSetStateTrigger
Результат
Триггер GpioCallbackTrigger
Если вам нужно выполнять какую-то задачу при нажатии кнопки, тогда вы можете использовать триггер GpioCallbackTrigger. Срабатывание триггера можно настроить тремя способами:
- при переходе из «1» в «0»
new GpioCallbackTrigger(PinState.LOW, new Callable<Void>() { public Void call() throws Exception { System.out.println(" --> GPIO 0 "); return null; } }); - при переходе из «0» в «1»
new GpioCallbackTrigger(PinState.HIGH, new Callable<Void>() { public Void call() throws Exception { System.out.println(" --> GPIO 1 "); return null; } }); - любое изменение состояния
new GpioCallbackTrigger(new Callable<Void>() { public Void call() throws Exception { System.out.println(" --> GPIO 0 | 1 "); return null; } });
Схема подключения
Код программы
Этот пример выводит в консоль текст при нажатии/отжатии кнопки.
import java.util.concurrent.Callable;
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalInput;
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.trigger.GpioCallbackTrigger;
import com.pi4j.platform.Platform;
import com.pi4j.platform.PlatformManager;
import com.pi4j.util.Console;
public class PushButtonGpioCallbackTrigger {
public static void main(String[] args) {
try {
/*
* Поскольку мы не используем платформу Raspberry Pi, мы должны явно
* указывать платформу, в нашем случае - это Orange Pi.
*/
PlatformManager.setPlatform(Platform.ORANGEPI);
/*
* Создаём экземпляр консоли
*/
Console console = new Console();
/*
* Позволяем пользователю выйти из программы с помощью CTRL-C
*/
console.promptForExit();
/*
* Создаём экземпляр контроллера GPIO
*/
GpioController gpio = GpioFactory.getInstance();
/*
* настройка вывода GPIO.22, задаём режим входа и включаем подтягивающий
* резистор в "1"
*/
GpioPinDigitalInput myButton = gpio.provisionDigitalInputPin(
OrangePiPin.GPIO_22, // Номер пина по WiringPi
"Кнопка", // Имя пина (необязательный)
PinPullResistance.PULL_UP);
/*
* настроика поведения выключения
*/
myButton.setShutdownOptions(
true, // освобождаем пин
PinState.LOW, // задаём состояние 0
PinPullResistance.OFF, // отключаем подтягивающий резистор
PinMode.DIGITAL_INPUT);// установливаем режим входа
/*
* добавляем триггер, который выполняет задачу, когда на пин "myButton"
* меняется состояние из "0" в "1"
*/
myButton.addTrigger(new GpioCallbackTrigger(PinState.HIGH, new Callable<Void>() {
public Void call() throws Exception {
System.out.println(" --> GPIO 1 ");
return null;
}
}));
/*
* добавляем триггер, который выполняет задачу, когда на пин "myButton"
* меняется состояние из "1" в "0"
*/
myButton.addTrigger(new GpioCallbackTrigger(PinState.LOW, new Callable<Void>() {
public Void call() throws Exception {
System.out.println(" --> GPIO 0 ");
return null;
}
}));
/*
* добавляем триггер, который выполняет задачу, когда на пин "myButton"
* меняется состояние
*/
myButton.addTrigger(new GpioCallbackTrigger(new Callable<Void>() {
public Void call() throws Exception {
System.out.println(" --> GPIO 0 | 1 ");
return null;
}
}));
/*
* ждёт, пока пользователь нажмёт CTRL-C
*/
console.waitForExit();
gpio.shutdown();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Проверяем код:
- создаём java файл и вставляем код;
nano PushButtonGpioCallbackTrigger.java
- компилируем файл;
javac -classpath .:classes:/opt/pi4j/lib/'*' PushButtonGpioCallbackTrigger.java
- запускаем программу.
sudo java -classpath .:classes:/opt/pi4j/lib/'*' PushButtonGpioCallbackTrigger
Результат

Надеюсь данные примеры будут вам полезны. Если возникнут какие-то вопросы, пишите, буду рад вам помочь.









To maximize the benefits of these workout routines, it is
essential to use correct kind techniques. This contains keeping the shoulders slightly in entrance
of the barbell during the deadlift, and aggressively
hinging from the hips during the Romanian deadlift.
Common faults in the Romanian deadlift include locking the knees,
bending the knees too much, going down too far, and not
keeping the bar on the thighs. By utilizing proper type and incorporating these workouts right
into a well-rounded training program, individuals can construct muscle mass and strength, improve bone mineral density,
and reduce the risk of injury. In this article, we are going to explore the shape, benefits,
and variations between deadlift and Romanian deadlift.
Deadlifts and Romanian deadlifts, which require using multiple muscle groups,
could be effective in selling bone health. Nonetheless,
you will need to consult with a healthcare professional before beginning any new exercise program, significantly if you have a historical past of
osteoporosis or different bone-related conditions. By coaching the
physique to take care of stability and stability underneath different situations, people can improve their
general performance in strength coaching and day by day actions.
Enhancing physique consciousness, coordination, and balance is a crucial side of any
energy coaching program, as research have shown that resistance coaching can improve stability by up to
45%. To correctly execute these workouts, you will need to perceive the
differences in vary of motion between the two
variations. Whereas these are both deadlifts, the biomechanics differ drastically.
This is seen in a few variables, including hip flexion, knee flexion, and vary of movement.
Whether you perform the motion with dumbbells, a kettlebell or a
barbell, all of them deserve a spot in your workout routine.
RDLs develop the energy of the posterior chain muscles, together with the erector spinae, glutes, hamstrings and
adductors. The RDL is a superb accent movement used to strengthen a lifter’s conventional deadlift.
Now you’ve worked on your kind, and you would possibly be ready for that heavy deadlift.
Remember to take the identical precautions whereas finishing a Romanian deadlift as
you would for the standard deadlift. The primary and secondary muscles used in the Romanian deadlift are similar
to the deadlift. The deadlift works some muscle tissue directly
(primary), and others are serving to to stabilize (secondary).
The shoulders within the deadlift are stored barely
in front of the barbell, whereas the shoulders within the Romanian deadlift are a lot additional in front of the barbell.
Romanian deadlifts are the most secure choice for folks with low back pain.
And with a bar shaft that’s balanced, floor, polished, and examined, you’ll
all the time have the right quantity of fluid, flexing motion through your raise.
Plus, a shiny zinc coating protects towards scratches and
corrosion, whereas bronze bushings between the shaft and sleeve provide a easy and consistent roll.
Let’s break down the differences between these two important lifts—and how to choose between them
for your coaching. You will be in a position to raise more weight with the deadlift vs Romanian deadlift.
The Romanian deadlift was rated as one of my top deadlift progressions to take
your lift from a newbie to advanced stage.
Rounding your decrease back throughout heavy deadlifts puts
uneven pressure on your backbone. At All Times carry with a
neutral decrease back, permitting for the pure inward curve of your decrease backbone.
Both the standard and Romanian Deadlifts are great
energy and muscle constructing exercises.
In this text we are going to concentrate on the difference between the Romanian Deadlift and commonplace deadlifts.
It is carried out by standing with your feet hip-width aside, knees slightly bent, and again straight.
You will then lower your torso by bending at the hips, keeping your again straight and core engaged.
Decrease the weight until you’re feeling a stretch in your hamstrings, then return to the beginning place.
When comparing the two workout routines,
you will want to think about individual goals, coaching focus,
and biomechanics.
Deadlifts and Romanian deadlifts are both wonderful workout routines for
building strength and muscle mass. The best exercise for you
is determined by your particular person fitness goals and desires.
If you want to construct power in the again, legs, and glutes,
then each deadlifts and Romanian deadlifts are good
choices. However, if you are seeking to specifically goal the
hamstrings and glutes, then the Romanian deadlift may be a more smart choice.
Basically, if your goal is maximal strength and powerlifting efficiency, typical deadlifts should be your go-to.
References:
what does steroids do to the body (https://choose-for-me.com/)
перепродажа аккаунтов гарантия при продаже аккаунтов
площадка для продажи аккаунтов профиль с подписчиками
Purchase Ready-Made Accounts Account Selling Service
Account market Buy Pre-made Account
Secure Account Purchasing Platform Account marketplace
Accounts market Accounts for Sale
ready-made accounts for sale sell accounts
account trading account exchange
secure account sales sell account
online account store account trading platform
buy pre-made account account exchange service
purchase ready-made accounts account marketplace
profitable account sales secure account sales
buy and sell accounts website for selling accounts
account purchase buy accounts
account catalog gaming account marketplace
gaming account marketplace guaranteed accounts
account marketplace buy and sell accounts
sell accounts buy and sell accounts
account trading platform https://accounts-marketplace.xyz/
find accounts for sale https://social-accounts-marketplaces.live/
online account store https://accounts-marketplace-best.pro
продать аккаунт https://akkaunt-magazin.online
facebook ad accounts for sale buy facebook account for ads
cheap facebook account cheap facebook accounts
buy google ads verified account https://buy-ads-invoice-account.top/
buy verified google ads account buy-account-ads.work
buy verified facebook business manager https://buy-bm-account.org/
buy bm facebook business-manager-for-sale.org
buy tiktok ads accounts https://tiktok-ads-account-for-sale.org
tiktok ads account for sale https://buy-tiktok-ads-accounts.org
facebook ads accounts sell accounts account market
https://t.me/s/play_1win_online
pure cocaine in prague vhq cocaine in prague
электрокарниз двухрядный цена elektrokarnizy797.ru .
перепланировка нежилого помещения в нежилом здании перепланировка нежилого помещения в нежилом здании .
перепланировка нежилых помещений перепланировка нежилых помещений .
согласовать перепланировку нежилого помещения http://pereplanirovka-nezhilogo-pomeshcheniya9.ru .
автоматический карниз для штор karniz-elektroprivodom.ru .
потолочкин ру самара https://stretch-ceilings-samara.ru .
натяжные потолки цена самара натяжные потолки цена самара .
потолку потолку .
натяжной потолок цена нижний новгород http://www.stretch-ceilings-nizhniy-novgorod.ru .
большая кухня на заказ kuhni-spb-3.ru .
где согласовать перепланировку квартиры https://www.soglasovanie-pereplanirovki-kvartiry14.ru .
проект перепланировки проект перепланировки .
перепланировка https://www.soglasovanie-pereplanirovki-kvartiry3.ru .
перепланировка квартиры согласование перепланировка квартиры согласование .
продвижение сайта москва продвижение сайта москва .
продвижение сайтов топ 10 компаний http://reiting-seo-agentstv.ru/ .
топ seo топ seo .
seo продвижение сайта цена в москве seo продвижение сайта цена в москве .
1xbet mobi http://www.1xbet-giris-2.com/ .
1xbet giris 1xbet giris .
1xbet tr 1xbet-giris-1.com .
1xbet mobil giri? 1xbet mobil giri? .
1xbet spor bahislerinin adresi 1xbet spor bahislerinin adresi .
1xbet t?rkiye 1xbet t?rkiye .
1xbet resmi giri? 1xbet-13.com .
1xbet ?yelik https://1xbet-10.com .
кухни спб на заказ http://www.kuhni-spb-2.ru/ .
медтехника http://www.medicinskaya-tehnika.ru .
медицинский наркологический центр http://www.narkologicheskaya-klinika-23.ru/ .
медицинское оборудование медицинское оборудование .
наркологическая помощь наркологическая помощь .
гидроизоляция подвала цена гидроизоляция подвала цена .
торкретирование москва torkretirovanie-1.ru .
top clock radio alarm-radio-clocks.com .
melbet официальный сайт melbet официальный сайт .
продвижение по трафику продвижение по трафику .
локальное seo блог http://www.statyi-o-marketinge7.ru .
seo с нуля http://kursy-seo-11.ru/ .
курс seo http://www.kursy-seo-12.ru/ .
электрокарнизы купить в москве электрокарнизы купить в москве .
сайт натяжной потолок http://www.natyazhnye-potolki-nizhniy-novgorod-1.ru .
горизонтальные жалюзи с электроприводом горизонтальные жалюзи с электроприводом .
онлайн трансляции мероприятий онлайн трансляции мероприятий .
лучшие seo компании https://www.reiting-seo-kompanii.ru .
сео фирмы http://reiting-seo-agentstv.ru .
услуги раскрутки сайта в топ http://reiting-kompanii-po-prodvizheniyu-sajtov.ru/ .
seo компания москва http://reiting-seo-kompaniy.ru/ .
1xbet yeni adresi http://www.1xbet-giris-2.com .
1xbet lite http://www.1xbet-giris-6.com .
узаконивание перепланировки нежилого помещения http://pereplanirovka-nezhilogo-pomeshcheniya16.ru .
стоимость услуг экскаватора погрузчика стоимость услуг экскаватора погрузчика .
съемка подкаста под ключ съемка подкаста под ключ .
платный наркологический стационар http://www.narkologicheskaya-klinika-23.ru/ .
1xbet g?ncel 1xbet g?ncel .
стоимость гидроизоляции подвала стоимость гидроизоляции подвала .
гидроизоляция подвала москва гидроизоляция подвала москва .
торкретирование стен цена за м2 http://torkretirovanie-1.ru/ .
наркологический частный центр https://www.narkologicheskaya-klinika-23.ru .
1xbet mobil giri? 1xbet mobil giri? .
электрокарнизы цена электрокарнизы цена .
торкретирование стен торкретирование стен .
автоматические карнизы автоматические карнизы .
наркологическая клиника трезвый выбор https://narkologicheskaya-klinika-27.ru/ .
наркология лечение http://www.narkologicheskaya-klinika-23.ru/ .
bahis siteler 1xbet bahis siteler 1xbet .
автоматические карнизы автоматические карнизы .
торкретирование цена торкретирование цена .
электрические гардины для штор http://www.elektrokarniz-kupit.ru/ .
электрокарнизы цена электрокарнизы цена .
электрические рулонные шторы на окна электрические рулонные шторы на окна .
рулонные шторы в москве рулонные шторы в москве .
рулонные шторы с электроприводом и дистанционным управлением https://rulonnye-shtory-s-elektroprivodom7.ru .
1xbet yeni giri? https://www.1xbet-giris-2.com .
медицинская техника медицинская техника .
рулонные шторы с электроприводом рулонные шторы с электроприводом .
медтехника http://medicinskaya-tehnika.ru .
1xbet tr giri? http://1xbet-giris-8.com .
медтехника https://www.medicinskaya-tehnika.ru .
1xbet resmi giri? 1xbet resmi giri? .
1x giri? https://www.1xbet-giris-8.com .
рулонные шторы на пластиковые окна с электроприводом https://www.rulonnye-shtory-s-elektroprivodom7.ru .
1xbet yeni giri? http://www.1xbet-giris-2.com .
поисковое продвижение сайта в интернете москва поисковое продвижение сайта в интернете москва .
статьи о маркетинге статьи о маркетинге .
согласование перепланировок нежилых помещений https://pereplanirovka-nezhilogo-pomeshcheniya18.ru/ .
руководства по seo руководства по seo .
ооо смартвэй https://sajt-smart-way.ru/ .
управление жалюзи смартфоном avtomaticheskie-zhalyuzi.ru .
seo рейтинг seo рейтинг .
перепланировка в нежилом помещении pereplanirovka-nezhilogo-pomeshcheniya18.ru .
smart way sajt-smart-way.ru .
топ компаний по продвижению сайтов топ компаний по продвижению сайтов .
жалюзи для пластиковых окон с электроприводом http://www.avtomaticheskie-zhalyuzi.ru .
швейное производство в спб http://www.arbuztech.ru .
раскрутка сайта москва раскрутка сайта москва .
internet seo http://www.optimizaciya-i-seo-prodvizhenie-sajtov-moskva.ru .
стратегия продвижения блог http://www.statyi-o-marketinge7.ru .
статьи про продвижение сайтов статьи про продвижение сайтов .
согласование проекта перепланировки нежилого помещения pereplanirovka-nezhilogo-pomeshcheniya18.ru .
рейтинг seo рейтинг seo .
фабрика пошива одежды спб http://www.arbuztech.ru .
аудит продвижения сайта аудит продвижения сайта .
проект перепланировки нежилого помещения проект перепланировки нежилого помещения .
surewin http://surewin-online.com .
good day 4 casino good day 4 casino .
стоимость оформления перепланировки стоимость оформления перепланировки .
jompay99 slot http://www.jp99-online.com/ .
good day for play casino good day for play casino .
топ компаний по продвижению сайтов топ компаний по продвижению сайтов .
safe medications from Mexico п»їmexican pharmacy verified Mexican pharmacies USA delivery
проект на перепланировку квартиры цена http://skolko-stoit-uzakonit-pereplanirovku-1.ru .
стоимость согласования перепланировки в бти стоимость согласования перепланировки в бти .
Dr Meds Advisor: mexican pharmacy — generic medicine from Mexico
online pharmacy india: safe Indian generics for US patients — doctor recommended Indian pharmacy
Indian pharmacy coupon codes Indian pharmacy coupon codes Indian pharmacy coupon codes
mexico pharmacy Dr Meds Advisor safe medications from Mexico
doctor recommended Indian pharmacy: no prescription pharmacy India — indian pharmacy
стоимость согласования перепланировки квартиры стоимость согласования перепланировки квартиры .
affordable medications from Canada: canadian pharmacy online — DoctorNorthRx
doctor recommended Mexican pharmacy: doctor recommended Mexican pharmacy — generic medicine from Mexico
trusted Mexican drugstores online: doctor recommended Mexican pharmacy — trusted Mexican drugstores online
сколько стоит узаконить перепланировку сколько стоит узаконить перепланировку .
newsky88 http://www.newsky-online.com .
beepbeep casino login http://www.beepbeepcasino-online.com/ .
mostbet букмекерская контора сайт mostbet букмекерская контора сайт
affordable medications from Canada: affordable medications from Canada — verified Canada drugstores
перепланировка квартиры цена оформления москва http://www.skolko-stoit-uzakonit-pereplanirovku.ru .
DrMedsAdvisor: doctor recommended Mexican pharmacy — mexico pharmacy
jp 99 slot http://jp99-online.com .
valor casino download valor casino download .
good day 4 play promo code free spins https://www.goodday4play-online.com .
buy amoxicillin 500mg generic amoxil Navikara Pharmacy
1xbet giri? linki 1xbet-7.com .
generic amoxil: cheap amoxil — amoxil online
StromectaDirect: Stromectol over the counter — Stromectol over the counter
https://stromectadirect.com/# Stromectol buy cheap
ganabet entrar http://www.ganabet-online.com .
PrednexaMed: buy prednisone — Prednexa Med
prednisone price: buy prednisone — prednisone prescription online
valor casino valor casino .
https://stromectadirect.xyz/# Stromectol over the counter
PrednexaMed: buy prednisone — Prednexa Med
https://navikarapharmacy.xyz/# amoxil online
good day 4 play casino good day 4 play casino .
newsky https://www.newsky-online.com .
bahis siteler 1xbet http://www.1xbet-7.com .
согласование перепланировок согласование перепланировок .
beep casino beepbeepcasino-online.com .
surewin casino https://www.surewin-online.com .
Stromecta Direct: StromectaDirect — ivermectin side effects
buy amoxicillin without prescription: amoxil online — Amoxicillin 500mg buy online
cheap amoxil how much is amoxicillin prescription Navikara Pharmacy
indian pharmacy: india pharmacy — online medicine
india pharmacy: Indiava Meds — online medicine
online site for medicine: IndiavaMeds — online medicine
generic amoxil: buy amoxicillin canada — amoxil online
PrednexaMed: Prednexa Med — buy prednisone
Navikara Pharmacy: cheap amoxil — Navikara Pharmacy
StromectaDirect: Ivermectin tablets for humans — Ivermectin tablets for humans
ivermectin in covid Stromecta Direct Ivermectin tablets for humans
скачать бк осталось именно выбрать подходящее скачать бк осталось именно выбрать подходящее
1xbet lite http://1xbet-14.com/ .
777bet login 777bet login .
icebet88 icebet88 .
goliath casino login https://goliath-casino.com/ .
безрамное остекление мансарды http://www.telegra.ph/Prevratite-vashu-terrasu-v-lyubimuyu-komnatu-Polnoe-rukovodstvo-po-ostekleniyu-ot-SK-Grani-10-21 .
купить душевое ограждение из стекла без поддона https://www.dzen.ru/a/aPfJd1pLPXEE534U .
buying amoxicillin online: generic amoxil — where to buy amoxicillin
перепланировка в москве перепланировка в москве .
PrednexaMed: prednisone price — PrednexaMed
PrednexaMed: prednisone canada — Prednexa Med
Indiava Meds: indian pharmacy — indian pharmacy
кухни на заказ в спб kuhni-spb-9.ru .
Stromectol buy cheap: buy ivermectin online — buy ivermectin online
download kiss918 lama download kiss918 lama .
heaps of wins heaps of wins .
кухни на заказ в спб кухни на заказ в спб .
https://prednexamed.com/# buy prednisone
перила из стекла для лестницы изготовление лестниц https://telegra.ph/Steklyannye-perila-i-ograzhdeniya-kak-vybrat-kompaniyu-kotoraya-ne-sorvyot-sroki-10-21/ .
1xbet giri? linki 1xbet giri? linki .
безрамное остекление в спб http://telegra.ph/Prevratite-vashu-terrasu-v-lyubimuyu-komnatu-Polnoe-rukovodstvo-po-ostekleniyu-ot-SK-Grani-10-21/ .
seo интенсив https://www.kursy-seo-12.ru .
seo firm ranking reiting-seo-kompanii.ru .
goliath casino bedr?geri https://goliath-casino.com/ .
изготовление кухни на заказ в спб kuhni-spb-11.ru .
prednisone 50 mg tablet cost: how to get prednisone tablets — prednisone 12 mg
кухни на заказ спб http://kuhni-spb-9.ru .
изготовление кухонь на заказ в санкт петербурге изготовление кухонь на заказ в санкт петербурге .
юридический перевод текстов юридический перевод текстов .
IndiavaMeds india pharmacy indian pharmacy
cheap amoxil: Navikara Pharmacy — Amoxicillin 500mg buy online
http://indiavameds.com/# online medicine
Indiava Meds indian pharmacy Indiava Meds
кухни от производителя спб http://www.kuhni-spb-10.ru .
buy prednisone: PrednexaMed — buy prednisone
icebet casino bonuses http://www.icebet-online.com/ .
goliath casino recension http://www.goliath-casino.com/ .
купить кухню на заказ в спб https://www.kuhni-spb-11.ru .
устный переводчик teletype.in/@alexd78/D1bRUvZKB7G .
юридический перевод текстов юридический перевод текстов .
seo optimization agency http://www.reiting-seo-kompanii.ru .
синхронный перевод цена dzen.ru/a/aRDuRn3LkCngCegS .
устный переводчик в москве teletype.in/@alexd78/D1bRUvZKB7G .
юридический переводчик стоимость юридический переводчик стоимость .
учиться seo http://kursy-seo-12.ru .
IndiavaMeds: online medicine — IndiavaMeds
buy prednisone prednisone 10mg price in india prednisone price
amoxil online Navikara Pharmacy generic amoxil
Prednexa Med: buy prednisone — prednisone price
синхронный перевод стоимость dzen.ru/a/aRDuRn3LkCngCegS .
топ бюро переводов в Мск teletype.in/@alexd78/iF-xjHhC3iA .
aviator bonus game https://aviator-game-cash.com/ .
indian pharmacy: IndiavaMeds — online medicine
Navikara Pharmacy: amoxil online — amoxil online
http://navikarapharmacy.com/# buy amoxil
buy prednisone: prednisone 1 mg for sale — prednisone 20mg for sale
battery aviator game apk battery aviator game apk .
it перевод стоимость telegra.ph/Oshibka-lokalizacii-pochemu-vash-IT-produkt-ne-ponimayut-za-granicej-11-09 .
топ бюро переводов teletype.in/@alexd78/iF-xjHhC3iA .
https://indiavameds.xyz/# indian pharmacy
https://navikarapharmacy.com/# amoxicillin pharmacy price
amoxil online: Navikara Pharmacy — Navikara Pharmacy
it переводчик услуги telegra.ph/Oshibka-lokalizacii-pochemu-vash-IT-produkt-ne-ponimayut-za-granicej-11-09 .
бюро переводов с нотариальным заверением teletype.in/@alexd78/iF-xjHhC3iA .
buy prednisone: prednisone price — Prednexa Med
Stromecta Direct: StromectaDirect — buy ivermectin online
Navikara Pharmacy: Amoxicillin 500mg buy online — buy amoxil
prednisone price Prednexa Med iv prednisone
PrednexaMed Prednexa Med canine prednisone 5mg no prescription
http://prednexamed.com/# Prednexa Med
https://prednexamed.xyz/# Prednexa Med
aviator game https://aviator-game-deposit.com .
hawai jahaj wala game http://aviator-game-predict.com/ .
электрокарниз двухрядный https://prokarniz36.ru .
prednisone price: PrednexaMed — prednisone 20 mg in india
https://stromectadirect.com/# Ivermectin tablets for humans
Indiava Meds: Indiava Meds — IndiavaMeds
https://stromectadirect.com/# Ivermectin tablets for humans
электрокарнизы для штор купить в москве provorota.su .
электрокранизы https://elektrokarniz2.ru/ .
гардина с электроприводом https://www.elektrokarniz98.ru .
карнизы с электроприводом https://elektrokarniz1.ru/ .
карниз для штор электрический карниз для штор электрический .
https://bluewavemeds.com/# online pharmacy for Kamagra
trusted Kamagra supplier in the US: fast delivery Kamagra pills — BlueWaveMeds
электрические карнизы купить http://elektrokarnizy77.ru/ .
EveraMeds: EveraMeds — EveraMeds
карниз моторизованный elektrokarniz495.ru .
электрокарнизы купить в москве https://elektrokarniz2.ru .
электрокарниз москва http://www.elektrokarniz1.ru .
Cialis 20mg price in USA cheapest cialis Cialis 20mg price in USA
карниз электроприводом штор купить elektrokarniz-dlya-shtor11.ru .
электрокарнизы москва https://elektrokarniz-dlya-shtor15.ru .
BlueWaveMeds: Blue Wave Meds — online pharmacy for Kamagra
http://bluewavemeds.com/# kamagra
https://aeromedsrx.xyz/# Generic Viagra online
Cialis without a doctor prescription EveraMeds EveraMeds
электрокарнизы для штор цена электрокарнизы для штор цена .
online pharmacy for Kamagra: trusted Kamagra supplier in the US — fast delivery Kamagra pills
cialis for sale Tadalafil Tablet EveraMeds
Viagra online price: AeroMedsRx — cheap viagra
http://bluewavemeds.com/# online pharmacy for Kamagra
AeroMedsRx AeroMedsRx buy viagra here
электрокарнизы электрокарнизы .
автоматические рулонные шторы автоматические рулонные шторы .
Cialis 20mg price Cheap Cialis EveraMeds
online pharmacy for Kamagra: fast delivery Kamagra pills — kamagra oral jelly
https://bluewavemeds.com/# BlueWaveMeds
https://aeromedsrx.xyz/# AeroMedsRx
EveraMeds EveraMeds Generic Tadalafil 20mg price
AeroMedsRx: AeroMedsRx — Viagra online price
sildenafil 50 mg price AeroMedsRx sildenafil over the counter
https://bluewavemeds.com/# BlueWaveMeds
https://aeromedsrx.xyz/# cheapest viagra
Tadalafil price Cialis without a doctor prescription EveraMeds
https://everameds.xyz/# EveraMeds
электрические рулонные шторы купить электрические рулонные шторы купить .
https://bluewavemeds.xyz/# kamagra
автоматические шторы на окна автоматические шторы на окна .
generic sildenafil: Buy Viagra online cheap — Sildenafil Citrate Tablets 100mg
https://aeromedsrx.xyz/# Sildenafil 100mg price
order Kamagra discreetly: trusted Kamagra supplier in the US — BlueWaveMeds
https://aeromedsrx.xyz/# AeroMedsRx
AeroMedsRx: AeroMedsRx — AeroMedsRx
fast delivery Kamagra pills BlueWaveMeds kamagra oral jelly
рулонные шторы на панорамные окна рулонные шторы на панорамные окна .
https://everameds.xyz/# Tadalafil Tablet
AeroMedsRx best price for viagra 100mg Sildenafil 100mg price
kamagra: BlueWaveMeds — online pharmacy for Kamagra