Raspberry Pi и Pi4J. Урок 2. Как подключить кнопку

В первом уроке мы заставили светодиод мигать и таким образом научились отправлять единички и нули (логические) на пины GPIO. Во втором уроке по изучению Pi4J, мы узнаем как считывать цифровые данные с GPIO, а для тестирования мы будем подключить кнопку и инфракрасный датчик движения  HC-SR501.

Как подключить кнопку

Самый простой способ изменения состояния пина из «1» в «0» и наоборот — это подключить и нажать обычную кнопку.

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

Схема, как мы видим, очень простая и состоит из: Orange Pi, макетной платы, кнопки и двух проводов. Нарисована в fritzing, очень удобная штука, да и красиво выглядит.

Raspberry Pi и Pi4J. Урок 2. Как подключить кнопку (Fritzing - Orange Pi One + Push Button)

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

Если для подачи и снятия рабочего напряжения на пины GPIO используется интерфейс GpioPinDigitalOutput, то для чтения используется GpioPinDigitalInput.

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.event.GpioPinDigitalStateChangeEvent;
import com.pi4j.io.gpio.event.GpioPinListenerDigital;
import com.pi4j.platform.Platform;
import com.pi4j.platform.PlatformManager;
import com.pi4j.util.Console;

public class PushButton {
  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.23, задаём режим входа и включаем подтягивающий
       * резистор в "1"
       */
      GpioPinDigitalInput myButton = gpio.provisionDigitalInputPin(
          OrangePiPin.GPIO_23, // Номер пина по WiringPi
          "Кнопка", // Имя пина (необязательный)
          PinPullResistance.PULL_UP); // включаем подтягивающий (необязательный)

      /*
       * настроика поведения выключения
       */
      myButton.setShutdownOptions(
          true, // освобождаем пин
          PinState.LOW, // задаём состояние 0
          PinPullResistance.OFF, // отключаем подтягивающий резистор
          PinMode.DIGITAL_INPUT);// установливаем режим входа

      /*
       * Это объект, который "слушает" и исполняет код в зависимости от события.
       */
      myButton.addListener(new GpioPinListenerDigital() {
        @Override
        public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) {
          if (event.getState() == PinState.LOW) {
            System.out.println(" --> Кнопка нажата: " + event.getPin() + " = " + event.getState());
          } else {
            System.out.println(" --> Кнопка не нажата: " + event.getPin() + " = " + event.getState());
          }
        }
      });

      /*
       * ждёт, пока пользователь нажмёт CTRL-C
       */
      console.waitForExit();
      gpio.shutdown();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

Чтобы проверить данный код нужно:

  1. создать java файл, вставить код (в PuTTY это делается правой кнопкой мыши) и сохранить файл (CTRL+X, Y, ENTER);
    nano PushButton.java
  2. скомпилировать этот файл;
    javac -classpath .:classes:/opt/pi4j/lib/'*' -d . PushButton.java
  3. запустить программу.
    sudo java -classpath .:classes:/opt/pi4j/lib/'*' PushButton

Результат

Raspberry Pi и Pi4J. Урок 2. Как подключить кнопку - результат

Как подключить HC-SR501

Подключить кнопку и нажать её — это хорошо, но давайте попробуем что-то поинтереснее, к примеру, датчик движения и присутствия — HC-SR501. Более того мы подключим светодиод и включим его, когда датчик обнаружит играющегося кота. Всё это можно сделать и без этих одноплатных компьютеров, но мы-то не ищем лёгких путей.

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

Raspberry Pi и Pi4J. Урок 2. Как подключить HC-SR501 (Fritzing - Orange Pi One + HC-SR501 + LED)

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

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.GpioPinShutdown;
import com.pi4j.io.gpio.OrangePiPin;
import com.pi4j.io.gpio.PinMode;
import com.pi4j.io.gpio.PinPullResistance;
import com.pi4j.io.gpio.PinState;
import com.pi4j.io.gpio.event.GpioPinDigitalStateChangeEvent;
import com.pi4j.io.gpio.event.GpioPinListenerDigital;
import com.pi4j.io.gpio.impl.GpioPinShutdownImpl;
import com.pi4j.platform.Platform;
import com.pi4j.platform.PlatformManager;
import com.pi4j.util.Console;

public class PushButtonHcSr501 {
  /**
   * @param args
   */
  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.23, задаём режим входа и включаем подтягивающий
       * резистор в "1"
       */
      GpioPinDigitalInput myButton = gpio.provisionDigitalInputPin(
          OrangePiPin.GPIO_23, // Номер пина по WiringPi
          "HC-SR501", // Имя пина (необязательный параметр)
          PinPullResistance.PULL_UP); // включаем подтягивающий (необязательный
                                      // параметр)

      /*
       * настройка вывода GPIO.24, задаём режим выхода и установливаем значение
       * LOW при запуске
       */
      GpioPinDigitalOutput myLed = gpio.provisionDigitalOutputPin(
          OrangePiPin.GPIO_24, // Номер пина по WiringPi
          "Светодиод", // Имя пина (необязательный параметр)
          PinState.LOW); // Состояние пина при запуске (необязательный параметр)

      GpioPinShutdown pinShutdown = new GpioPinShutdownImpl();
      /*
       * установливаем режим входа
       */
      pinShutdown.setMode(PinMode.DIGITAL_INPUT);
      /*
       * отключаем подтягивающий резистор
       */
      pinShutdown.setPullResistor(PinPullResistance.OFF);
      /*
       * задаём состояние "0"
       */
      pinShutdown.setState(PinState.LOW);
      /*
       * освобождаем пин
       */
      pinShutdown.setUnexport(true);

      /*
       * настроика поведения выключения
       */
      myLed.setShutdownOptions(pinShutdown);
      myButton.setShutdownOptions(pinShutdown);

      /*
       * Это объект, который "слушает" и исполняет код в зависимости от события.
       */
      myButton.addListener(new GpioPinListenerDigital() {
        @Override
        public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) {
          System.out.println(" --> Состояние пина: " + event.getPin() + " = " + event.getState());
          /*
           * Включаем/выключаем светодиод
           */
          myLed.setState(event.getState());
        }
      });

      /*
       * ждёт, пока пользователь нажмёт CTRL-C
       */
      console.waitForExit();
      gpio.shutdown();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

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

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

Результат

Raspberry Pi и Pi4J. Урок 2. Как подключить HC-SR501 - результат
Удачи! Если у вас возникнут какие-то вопросы, пишите, буду рад вам помочь.

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

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

  • При подключении к Orange Pi Zero к пину OrangePiPin.GPIO_01 и на некоторых других пинах (10, 4, 1, 5) в коде с кнопкой выдает ошибку «Unable to open GPIO edge interface for pin 1: Permission denied» (Даже если запускать от sudo), но на некоторых пинах работает. Подскажите пожалуйста, как заставить работать код?

  • Betzula guncel giris, casino oyunlar? konusunda benzersiz secenekler sunar. derbi heyecan? icin en h?zl? sekilde yuksek oranlar? kesfedebilirsiniz.

    Betzula’n?n mobil uyumlu tasar?m?, her cihazdan erisim imkan? tan?r. Bet Zula sosyal medya hesaplar?yla ozel promosyonlardan haberdar olabilirsiniz.

    Turkiye Super Lig derbilerinin en iyi oranlarla kazanc saglayabilirsiniz.

    Ayr?ca, platformun en yeni versiyonu, kullan?c?lara s?n?rs?z erisim sunar. Ozel olarak, fenerbahce galatasaray betzula, profesyonel bir deneyim saglar.

    Betzula, en genis bahis seceneklerinden ozel turnuvalara kadar tum kullan?c?lar?n ihtiyaclar?n? kars?lar. Fenerbahce Galatasaray derbisi icin bahis yapmak icin simdi giris yap?n!
    371212+

  • Betzula guncel giris, spor bahisleri konusunda benzersiz secenekler sunar. Fenerbahce Galatasaray derbisi icin en h?zl? sekilde canl? bahis oynamaya baslayabilirsiniz.

    Betzula’n?n yuksek guvenlik onlemleri, her cihazdan erisim imkan? tan?r. Betzula Twitter hesab?n? takip ederek bonus f?rsatlar?ndan haberdar olabilirsiniz.

    en onemli spor etkinliklerinin bahislerinizi an?nda yapabilirsiniz.

    Ayr?ca, bet zula giris linki, mobil cihazlar uzerinden kolay erisim sunar. Ozel olarak, betzula giris, profesyonel bir deneyim saglar.

    Betzula, spor bahislerinden canl? casino oyunlar?na kadar tum kullan?c?lar?n ihtiyaclar?n? kars?lar. favori tak?m?n?z?n galibiyetini kutlamak icin simdi giris yap?n!
    707707+

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

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