Raspberry Pi и Pi4J. Урок 3. GPIO Триггеры

P14J предоставляет серию триггеров, которые могут выполнять действия на пины GPIO на основе изменения состояния другого пина. Триггеры также предоставляют расширяемый интерфейс, который позволяет расширять и создавать собственные пользовательские триггеры.

Триггеры GpioBlinkStateTrigger и GpioBlinkStopStateTrigger

Триггеры GpioBlinkStateTrigger и GpioBlinkStopStateTrigger используются для включения и, соответственно, выключения мигания на пины GPIO. К примеру, мы хотим подключить датчик движения (к примеру HC-SR501) и светодиод, мигать им, когда датчик обнаружит движение и выключить мигание в противном случае.

Схема подключения

Raspberry Pi и Pi4J. Урок 3. GPIO Триггеры - GpioBlinkStateTrigger и GpioBlinkStopStateTrigger (Fritzing - Orange Pi One + HC-SR501 + LED)

Код программы

В этом примере кода показано, как настроить и использовать мигающие триггеры 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();
    }
  }
}

Проверяем код:

  1. создаём java файл и вставляем код;
    nano PushButtonGpioBlinkStateTrigger.java
  2. компилируем файл;
    javac -classpath .:classes:/opt/pi4j/lib/'*' PushButtonGpioBlinkStateTrigger.java
  3. запускаем программу.
    sudo java -classpath .:classes:/opt/pi4j/lib/'*' PushButtonGpioBlinkStateTrigger

Результат

Raspberry Pi и Pi4J. Урок 3. GPIO Триггеры - PushButtonGpioBlinkStateTrigger

Триггер GpioToggleStateTrigger

Триггер GpioToggleStateTrigger используется для изменения состояния GPIO пинов на противоположное. Если выходной пин в состоянии «1», при срабатывании триггера (к примеру нажали на кнопку) состояние пина меняется в лог. «0» и на оборот, если пин в состоянии «0» — тогда менится в лог. «1». Срабатывание триггера GpioToggleStateTrigger можно настроить тремя способами:

  1. при переходе из «1» в «0» — new GpioToggleStateTrigger(PinState.LOW, myLed);
  2. при переходе из «0» в «1» — new GpioToggleStateTrigger(PinState.HIGH, myLed);
  3. любое изменение состояния — new GpioToggleStateTrigger(myLed);

Чтобы проверить как GpioToggleStateTrigger работает, мы можем подключить кнопку и светодиод как показано на схеме ниже и выполнить приведённый код программы.

Схема подключения

Raspberry Pi и Pi4J. Урок 3. GPIO Триггеры - PushButtonGpioToggleStateTrigger (Fritzing - Orange Pi One + Push Button + LED)

Код программы

В этом примере показано, как настроить и использовать триггер 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();
    }
  }
}

Проверяем код:

  1. создаём java файл и вставляем код;
    nano PushButtonGpioToggleStateTrigger.java
  2. компилируем файл;
    javac -classpath .:classes:/opt/pi4j/lib/'*' PushButtonGpioToggleStateTrigger.java
  3. запускаем программу.
    sudo java -classpath .:classes:/opt/pi4j/lib/'*' PushButtonGpioToggleStateTrigger

Результат

Raspberry Pi и Pi4J. Урок 3. GPIO Триггеры - PushButtonGpioToggleStateTrigger

Триггеры GpioSyncStateTrigger и GpioInverseSyncStateTrigger

Триггеры GpioSyncStateTrigger (также называется «follow-me») и GpioInverseSyncStateTrigger можно использовать для синхронизации и, соответственно, обратной синхронизации состояния одного пина с другим. GpioSyncStateTrigger работает по принципу «делай как я», т.е. если на входном пине менится состояние из «1» в «0», на выходном также менится. GpioInverseSyncStateTrigger работает по принципу «делай наоборот», если на входном пине состояние менится из «0» в «1», на выходном менится из «1» в «0».

Схема подключения

Raspberry Pi и Pi4J. Урок 3. GPIO Триггеры - GpioSyncStateTrigger и GpioInverseSyncStateTrigger (Fritzing - Orange Pi One + Push Button + 2xLED)

Код программы

Следующий пример демонстрирует простую реализацию триггера «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();
    }
  }
}

Проверяем код:

  1. создаём java файл и вставляем код;
    nano PushButtonGpioInverseSyncStateTrigger.java
  2. компилируем файл;
    javac -classpath .:classes:/opt/pi4j/lib/'*' PushButtonGpioInverseSyncStateTrigger.java
  3. запускаем программу.
    sudo java -classpath .:classes:/opt/pi4j/lib/'*' PushButtonGpioInverseSyncStateTrigger

Результат

Raspberry Pi и Pi4J. Урок 3. GPIO Триггеры - GpioSyncStateTrigger и GpioInverseSyncStateTrigger

Триггер GpioPulseStateTrigger

Триггер GpioPulseStateTrigger используются для отправки импульсов на пины GPIO на определённое время. Срабатывание триггера GpioPulseStateTrigger можно настроить тремя способами:

  1. при переходе из «1» в «0» — new GpioPulseStateTrigger(PinState.LOW, myLed, 1000);
  2. при переходе из «0» в «1» — new GpioPulseStateTrigger(PinState.HIGH, myLed, 1000);
  3. любое изменение состояния — new GpioPulseStateTrigger(myLed, 1000);

Схема подключения

Raspberry Pi и Pi4J. Урок 3. GPIO Триггеры - GpioPulseStateTrigger (Fritzing - Orange Pi One + Push Button + 2xLED)

Код программы

В этом примере я добавил два триггера 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();
    }
  }
}

Проверяем код:

  1. создаём java файл и вставляем код;
    nano PushButtonGpioPulseStateTrigger.java
  2. компилируем файл;
    javac -classpath .:classes:/opt/pi4j/lib/'*' PushButtonGpioPulseStateTrigger.java
  3. запускаем программу.
    sudo java -classpath .:classes:/opt/pi4j/lib/'*' PushButtonGpioPulseStateTrigger

Результат

Raspberry Pi и Pi4J. Урок 3. GPIO Триггеры - GpioPulseStateTrigger

Триггер GpioSetStateTrigger

С помощью триггера GpioSetStateTrigger можно задать состояние GPIO пинам. Его можно настроить, чтобы срабатывал при переходе из лог. «0» в лог. «1» (и наоборот) и задал «0» или «1» (PinState.LOW или PinState.HIGH) на другой пин.

Схема подключения

Raspberry Pi и Pi4J. Урок 3. GPIO Триггеры - GpioSetStateTrigger (Fritzing - Orange Pi One + Push Button + LED)

Код программы

В этом примере я добавил два триггера 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();
    }
  }
}

Проверяем код:

  1. создаём java файл и вставляем код;
    nano PushButtonGpioSetStateTrigger.java
  2. компилируем файл;
    javac -classpath .:classes:/opt/pi4j/lib/'*' PushButtonGpioSetStateTrigger.java
  3. запускаем программу.
    sudo java -classpath .:classes:/opt/pi4j/lib/'*' PushButtonGpioSetStateTrigger

Результат

Raspberry Pi и Pi4J. Урок 3. GPIO Триггеры - PushButtonGpioSetStateTrigger

Триггер GpioCallbackTrigger

Если вам нужно выполнять какую-то задачу при нажатии кнопки, тогда вы можете использовать триггер GpioCallbackTrigger. Срабатывание триггера можно настроить тремя способами:

  1. при переходе из «1» в «0»
    new GpioCallbackTrigger(PinState.LOW, new Callable<Void>() {
      public Void call() throws Exception {
        System.out.println(" --> GPIO 0 ");
        return null;
      }
    });
  2. при переходе из «0» в «1»
    new GpioCallbackTrigger(PinState.HIGH, new Callable<Void>() {
      public Void call() throws Exception {
        System.out.println(" --> GPIO 1 ");
        return null;
      }
    });
  3. любое изменение состояния
    new GpioCallbackTrigger(new Callable<Void>() {
      public Void call() throws Exception {
        System.out.println(" --> GPIO 0 | 1 ");
        return null;
      }
    });

Схема подключения

Raspberry Pi и Pi4J. Урок 3. GPIO Триггеры - GpioCallbackTrigger (Fritzing - Orange Pi One + Push Button)

Код программы

Этот пример выводит в консоль текст при нажатии/отжатии кнопки.

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();
    }
  }
}

Проверяем код:

  1. создаём java файл и вставляем код;
    nano PushButtonGpioCallbackTrigger.java
  2. компилируем файл;
    javac -classpath .:classes:/opt/pi4j/lib/'*' PushButtonGpioCallbackTrigger.java
  3. запускаем программу.
    sudo java -classpath .:classes:/opt/pi4j/lib/'*' PushButtonGpioCallbackTrigger

Результат

Raspberry Pi и Pi4J. Урок 3. GPIO Триггеры - GpioCallbackTrigger
Надеюсь данные примеры будут вам полезны. Если возникнут какие-то вопросы, пишите, буду рад вам помочь.

Похожие записи

Комментарии 37

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *