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/)
olympe casino: olympe casino cresus — olympe casino avis
olympe: olympe casino en ligne — olympe
Achat mГ©dicament en ligne fiable: Pharmacie en ligne France — pharmacie en ligne france livraison belgique pharmafst.com
Pharmacie en ligne livraison Europe: pharmacie en ligne — Pharmacie en ligne livraison Europe pharmafst.com
Kamagra Oral Jelly pas cher: achat kamagra — Kamagra Oral Jelly pas cher
Acheter Kamagra site fiable kamagra oral jelly kamagra en ligne
https://tadalmed.shop/# Tadalafil achat en ligne
Tadalafil 20 mg prix en pharmacie: Tadalafil 20 mg prix en pharmacie — Cialis sans ordonnance pas cher tadalmed.shop
cialis sans ordonnance: Cialis generique prix — cialis prix tadalmed.shop
https://kamagraprix.com/# acheter kamagra site fiable
pharmacie en ligne livraison europe: Meilleure pharmacie en ligne — Achat mГ©dicament en ligne fiable pharmafst.com
Achat mГ©dicament en ligne fiable: Livraison rapide — vente de mГ©dicament en ligne pharmafst.com
pharmacie en ligne livraison europe: Pharmacie en ligne France — pharmacie en ligne pharmafst.com
http://tadalmed.com/# Pharmacie en ligne Cialis sans ordonnance
Tadalafil 20 mg prix sans ordonnance Cialis sans ordonnance 24h Acheter Viagra Cialis sans ordonnance tadalmed.com
kamagra pas cher: kamagra gel — kamagra gel
https://kamagraprix.shop/# achat kamagra
cialis prix: Cialis generique prix — Tadalafil achat en ligne tadalmed.shop
pharmacie en ligne sans ordonnance: Medicaments en ligne livres en 24h — pharmacie en ligne livraison europe pharmafst.com
Kamagra Oral Jelly pas cher: kamagra 100mg prix — kamagra 100mg prix
kamagra gel: kamagra en ligne — Acheter Kamagra site fiable
Pharmacie en ligne Cialis sans ordonnance Cialis sans ordonnance 24h Cialis en ligne tadalmed.com
pharmacie en ligne fiable: Pharmacies en ligne certifiees — Pharmacie Internationale en ligne pharmafst.com
acheter kamagra site fiable: kamagra gel — Acheter Kamagra site fiable
kamagra gel: acheter kamagra site fiable — Kamagra pharmacie en ligne
kamagra pas cher Acheter Kamagra site fiable kamagra oral jelly
Achat mГ©dicament en ligne fiable Livraison rapide pharmacie en ligne france livraison internationale pharmafst.shop
Kamagra Commander maintenant: achat kamagra — kamagra pas cher
Kamagra pharmacie en ligne: kamagra livraison 24h — kamagra 100mg prix
pharmacie en ligne fiable Livraison rapide pharmacie en ligne fiable pharmafst.shop
Cialis sans ordonnance 24h: Cialis sans ordonnance pas cher — Tadalafil sans ordonnance en ligne tadalmed.shop
Kamagra Oral Jelly pas cher: kamagra pas cher — kamagra pas cher
Kamagra pharmacie en ligne: Kamagra Oral Jelly pas cher — kamagra gel
http://tadalmed.com/# Cialis en ligne
cialis generique: cialis sans ordonnance — Cialis sans ordonnance 24h tadalmed.shop
kamagra gel: acheter kamagra site fiable — Achetez vos kamagra medicaments
kamagra en ligne kamagra livraison 24h Kamagra Commander maintenant
kamagra 100mg prix kamagra 100mg prix kamagra pas cher
pharmacie en ligne france livraison belgique: pharmacie en ligne sans ordonnance — pharmacie en ligne france livraison belgique pharmafst.com
Achetez vos kamagra medicaments: kamagra en ligne — Acheter Kamagra site fiable
Acheter Cialis Tadalafil sans ordonnance en ligne Tadalafil 20 mg prix sans ordonnance tadalmed.com
Tadalafil 20 mg prix sans ordonnance: cialis prix — Tadalafil 20 mg prix en pharmacie tadalmed.shop
Cialis sans ordonnance 24h: Tadalafil 20 mg prix en pharmacie — Cialis sans ordonnance 24h tadalmed.shop
https://kamagraprix.com/# Acheter Kamagra site fiable
kamagra en ligne Kamagra pharmacie en ligne Kamagra pharmacie en ligne
https://pharmafst.shop/# pharmacie en ligne livraison europe
Acheter Cialis: Pharmacie en ligne Cialis sans ordonnance — Achat Cialis en ligne fiable tadalmed.shop
Tadalafil sans ordonnance en ligne: cialis sans ordonnance — cialis generique tadalmed.shop
Kamagra pharmacie en ligne kamagra en ligne Kamagra Commander maintenant
cialis sans ordonnance Cialis sans ordonnance 24h Tadalafil achat en ligne tadalmed.com
https://medicinefromindia.com/# Medicine From India
mexico pharmacies prescription drugs: mexican online pharmacy — Rx Express Mexico
canadian discount pharmacy: Express Rx Canada — canadian online pharmacy reviews
Rx Express Mexico: Rx Express Mexico — mexican rx online
http://expressrxcanada.com/# canadian drugs pharmacy