В этой статье показано как с помощью одноплатного компьютера и Pi4J сделать мигающий светодиод. Можно сказать, что это первый «урок для начинающих» из этой серии.
Проект Pi4J — это мост между оборудованием Raspberry Pi и Java с объектно-ориентированным подходом. Pi4J — проект с открытым исходным кодом. В дополнение к базовым функциональным возможностям доступа к аппаратным средствам, этот проект также пытается предоставить набор расширенных функций, которые делают работу с Raspberry Pi простой в использовании и более удобной для Java-разработчиков.
И так, для начала нужно установить библиотеки Pi4J на ваш компьютер. Pi4J поддерживает следующие платы: Raspberry Pi, Banana Pi, Banana Pro, Synovoip BPI, Odroid, Orange Pi и NanoPi. По умолчанию Pi4J настроен под Raspberry Pi.
Необходимые компоненты
Чтобы зажечь светодиод понадобится:
- одноплатный компьютер (в моём случае — это Orange Pi PC);
- светодиод;
- резистор 220 Ом.
Подключение светодиода
Мы подключаем резистор сопротивлением 220 Ом к выходу номер 24 (GPIO.24), к резистору в свою очередь подключаем анод (обычно длинная ножка) светодиода. Катод подсоединяем к земле (GND или 0v).
определить какой пин 24-й, так это колонка wpi после выполнения gpio readall
.
Инициализация компонентов
Если у вас есть Raspberry Pi, тогда вам не надо выбирать платформу. У меня Orange Pi PC, по этому я должны явно указывать платформу — Orange Pi.
PlatformManager.setPlatform(Platform.ORANGEPI);
Перед взаимодействием с Pi4J мы должны сначала создать экземпляр контроллера GPIO. GpioFactory
включает метод getInstance
для создания контроллера GPIO. Проект будет содержать только один экземпляр контроллера GPIO, так как паттерн Singleton гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа.
final GpioController gpio = GpioFactory.getInstance();
Чтобы получить доступ к пинам GPIO, мы должны сначала обеспечить нужный пин. С помощью методов provisionDigitalOutputPin
мы можем настроить пин в режиме выхода, задать имя и состояние пина при запуске (0 или 1).
GpioPinDigitalOutput myLed = gpio.provisionDigitalOutputPin( OrangePiPin.GPIO_24, // Номер пина по WiringPi "Светодиод", // Имя пина (необязательный) PinState.LOW); // Состояние пина при запуске (необязательный)
Pi4J обеспечивает реализацию для автоматического задания состояний выводов GPIO, когда приложение завершает работу. К примеру, нам нужно освободить пин, установить в режим входа, отключить подтягивающий резистор и задать состояние LOW (0), чтобы вернуть пин в исходное состояние.
myLed.setShutdownOptions( true, // освобождаем пин PinState.LOW, // задаём состояние 0 PinPullResistance.OFF, // отключаем подтягивающий резистор PinMode.DIGITAL_INPUT);// установливаем режим входа
Если необходимо исполнять какой-то код во время изменения состояния пина (из 0 в 1 или наоборот), тогда нужно создать «слушатель». Обычно они нужны в случае подключения, к примеру, кнопки или датчика движения. В этом примере мы просто будем выводить в консоль имя и состояние пина.
myLed.addListener(new GpioPinListenerDigital() { @Override public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) { System.out.println(" --> Состояние пина: " + event.getPin() + " = " + event.getState()); } });
Интерфейс GpioPinDigitalOutput
Интерфейс GpioPinDigitalOutput
содержит методы для подачи (логический «1
«) или снятия (логический «0
«) рабочего напряжения на пины GPIO. Все методы этого интерфейса описаны ниже.
void high();
отправляет на цифровой вывод значение HIGH
.
void low();
отправляет на цифровой вывод значение LOW
.
void toggle();
отправляет на цифровой вывод значение HIGH
, если текущее значение LOW
или LOW
— если HIGH
.
Future<?> blink(long delay);
непрерывно отправляет на цифровой вывод значение HIGH
и LOW
.
Параметры:
long delay
— интервал в миллисекундах;
Future<?> blink(long delay, PinState blinkState);
непрерывно отправляет на цифровой вывод значение HIGH
и LOW
.
Параметры:
long delay
— интервал в миллисекундах;PinState blinkState
— начальное значение:PinState.LOW
илиPinState.HIGH
.
Future<?> blink(long delay, long duration);
отправляет на цифровой вывод значение HIGH
и LOW
.
Параметры:
long delay
— это интервал в миллисекундах;long duration
— продолжительность в миллисекундах.
Future<?> blink(long delay, long duration, PinState blinkState);
отправляет на цифровой вывод значение HIGH
и LOW
.
Параметры:
long delay
— это интервал в миллисекундах;long duration
— продолжительность в миллисекундах;PinState blinkState
— начальное значение:PinState.LOW
илиPinState.HIGH
.
Future<?> pulse(long duration);
отправляет на цифровой вывод значение HIGH
.
Параметры:
long duration
— продолжительность в миллисекундах.
Future<?> pulse(long duration, Callable<Void> callback);
отправляет на цифровой вывод значение HIGH
.
Параметры:
long duration
— продолжительность в миллисекундах;Callable<Void> callback
— задача, которая будет выполняться по истечению времениduration
.
Future<?> pulse(long duration, boolean blocking);
отправляет на цифровой вывод значение HIGH
.
Параметры:
long duration
— продолжительность в миллисекундах;boolean blocking
—true
блокирует текущий поток на время выполнения импульса иfalse
— запуск импульса в отдельный поток (в фоновом режиме).
Future<?> pulse(long duration, boolean blocking, Callable<Void> callback);
отправляет на цифровой вывод значение HIGH
.
Параметры:
long duration
— продолжительность в миллисекундах;boolean blocking
—true
блокирует текущий поток на время выполнения импульса иfalse
— запуск импульса в отдельный поток (в фоновом режиме);Callable<Void> callback
— задача, которая будет выполняться по истечению времениduration
.
Future<?> pulse(long duration, PinState pulseState);
отправляет на цифровой вывод значение.
Параметры:
long duration
— это продолжительность в миллисекундах;PinState pulseState
— это, непосредственно, значениеPinState.LOW
илиPinState.HIGH
.
Future<?> pulse(long duration, PinState pulseState, Callable<Void> callback);
отправляет на цифровой вывод значение.
Параметры:
long duration
— продолжительность в миллисекундах;PinState pulseState
— значениеPinState.LOW
илиPinState.HIGH
;Callable<Void> callback
— задача которая будет выполняться по истечению времениduration
.
Future<?> pulse(long duration, PinState pulseState, boolean blocking);
отправляет на цифровой вывод значение.
Параметры:
long duration
— продолжительность в миллисекундах;PinState pulseState
— значениеPinState.LOW
илиPinState.HIGH
;boolean blocking
—true
блокирует текущий поток на время выполнения импульса иfalse
— запуск импульса в отдельный поток (в фоновом режиме).
Future<?> pulse(long duration, PinState pulseState, boolean blocking, Callable<Void> callback);
отправляет на цифровой вывод значение.
Параметры:
long duration
— продолжительность в миллисекундах;PinState pulseState
— значениеPinState.LOW
илиPinState.HIGH
;boolean blocking
—true
блокирует текущий поток на время выполнения импульса иfalse
— запуск импульса в отдельный поток (в фоновом режиме);Callable<Void> callback
— задача которая будет выполняться по истечению времениduration
.
void setState(PinState state);
отправляет на цифровой вывод значение HIGH
и LOW
.
Параметры:
PinState pulseState
— значениеPinState.LOW
илиPinState.HIGH
;
void setState(boolean state);
отправляет на цифровой вывод значение HIGH
и LOW
.
Параметры:
boolean state
— значениеtrue
илиfalse
.
Future — это интерфейс для получения результатов работы асинхронной операции. Ключевым методом здесь является метод get, который блокирует текущий поток (с таймаутом или без) до завершения работы асинхронной операции в другом потоке. Также, дополнительно существуют методы для отмены операции и проверки текущего статуса.
Мигающий светодиод — примеры
Мигать светодиодом можно несколькими способами. Первый способ — используя методы void high();
и void low();
— зажигаем и выключаем светодиод соответственно.
for (int i = 0; i < 10; i++) { myLed.high(); Thread.sleep(500); myLed.low(); Thread.sleep(500); }
Второй способ — используя методы void setState(PinState state);
и void setState(boolean state);
— задаёт состояние пина в зависимости от значения параметра arg0
: true
и false
или PinState.LOW
и PinState.HIGH
.
for (int i = 0; i < 10; i++) { myLed.setState(true); Thread.sleep(500); myLed.setState(PinState.LOW); Thread.sleep(500); }
Третий способ — используя метод void toggle();
. Этот метод работает как переключатель, если пин в состоянии «1», тогда меняет её в «0» и наоборот.
for (int i = 0; i < 20; i++) { myLed.toggle(); Thread.sleep(500); }
Четвёртый способ — используя методы Future<?> blink(long delay);
. Как по мне, так это самый интересный способ мигать светодиодом. К примеру, нам нужно мигать непрерывно светодиодом пока программа запущена.
Future<?> future = myLed.blink(500);
Или непрерывно мигать в течении некоторого времени.
// непрерывно мигает светодиод каждые 1/2 секунды в течение 15 секунд Future<?> future = myLed.blink(500, 15000); // Ждём окончания мигания while (!future.isDone()) { Thread.sleep(50); }
Завершение программы
Метод shutdown()
остановливает все действия/потоки GPIO, выключив контроллер GPIO, другими словами, этот метод будет принудительно отключать все потоки мониторинга GPIO и задачи.
gpio.shutdown();
Пример Java программы
Ниже привёл пример программы «мигающий светодиод» с использованием функции Future<?> blink(long arg0, long arg1);
. Программа непрерывно мигает светодиод каждые 1/4 секунды в течение 3 секунд.
import java.util.concurrent.Future; import com.pi4j.io.gpio.GpioController; import com.pi4j.io.gpio.GpioFactory; import com.pi4j.io.gpio.GpioPinDigitalOutput; import com.pi4j.io.gpio.OrangePiPin; import com.pi4j.io.gpio.PinMode; import com.pi4j.io.gpio.PinPullResistance; import com.pi4j.io.gpio.PinState; import com.pi4j.io.gpio.event.GpioPinDigitalStateChangeEvent; import com.pi4j.io.gpio.event.GpioPinListenerDigital; import com.pi4j.platform.Platform; import com.pi4j.platform.PlatformManager; public class LedBlinking { public static void main(String[] args) { try { /* * Поскольку мы не используем платформу Raspberry Pi, мы должны явно * указывать платформу, в нашем случае - это Orange Pi. */ PlatformManager.setPlatform(Platform.ORANGEPI); /* * Создаём экземпляр контроллера GPIO */ final GpioController gpio = GpioFactory.getInstance(); /* * настройка вывода GPIO.24, задаём режим выхода и установливаем значение * LOW при запуске */ GpioPinDigitalOutput myLed = gpio.provisionDigitalOutputPin( OrangePiPin.GPIO_24, // Номер пина по WiringPi "Светодиод", // Имя пина (необязательный) PinState.LOW); // Состояние пина при запуске (необязательный) /* * настроика поведения выключения */ myLed.setShutdownOptions( true, // освобождаем пин PinState.LOW, // задаём состояние 0 PinPullResistance.OFF, // отключаем подтягивающий резистор PinMode.DIGITAL_INPUT);// установливаем режим входа /* * Это объект, который "слушает" и исполняет код в зависимости от события. */ myLed.addListener(new GpioPinListenerDigital() { @Override public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) { System.out.println(" --> Состояние пина: " + event.getPin() + " = " + event.getState()); } }); // непрерывно мигает светодиод каждые 1/4 секунды в течение 3 секунд Future<?> future = myLed.blink(250, 3000); // ждёт окончания мигания while (!future.isDone()) { Thread.sleep(50); } gpio.shutdown(); } catch (Exception e) { e.printStackTrace(); } } }
Как скомпилировать Java файла
Для компиляции этой программы используйте следующую команду:
javac -classpath .:classes:/opt/pi4j/lib/'*' -d . LedBlinking.java
Как запуск class файла
Следующая команда запустит этот пример программы:
sudo java -classpath .:classes:/opt/pi4j/lib/'*' LedBlinking
1win официальный сайт войти https://1win715.ru .
1win. com http://1win114.com.kg/ .
1win armenia http://1win708.ru .
Мы изготавливаем дипломы психологов, юристов, экономистов и любых других профессий по приятным тарифам. Всегда стараемся поддерживать для покупателей адекватную ценовую политику. Для нас важно, чтобы документы были доступны для подавляющей массы граждан.
Приобретение диплома, подтверждающего окончание института, — это выгодное решение. Приобрести диплом о высшем образовании: diplomc-v-ufe.ru/kupit-diplom-provizora-9/
мостбет chrono http://agility.forum24.ru/?1-0-0-00000756-000-0-0-1742360323 .
1win online http://agility.forum24.ru/?1-0-0-00000755-000-0-0-1742359870 .
1win moldova download http://www.1win5002.ru .
They offer world-class service, bar none.
gabapentin 400 mg
Their health and beauty section is fantastic.
купить диплом грузия
1вин вход 1вин вход .
поддержка мостбет ongame.forum24.ru/?1-18-0-00001219-000-0-0-1742360461 .
1с купить москва 1с купить москва .
масляные трансформаторы купить масляные трансформаторы купить .
1win online http://1win822.ru/ .
мостбет https://mostbet782.ru .
wan win https://1win823.ru/ .
соут в москве соут в москве .
win 1 https://www.1win810.ru .
скачать мостбет https://www.mostbet783.ru .
скачать мостбет официальный сайт https://eisberg.forum24.ru/?1-0-0-00000327-000-0-0-1742579529/ .
motbet http://taksafonchik.borda.ru/?1-14-0-00002042-000-0-0-1742473173 .
Мы готовы предложить дипломы любой профессии по доступным тарифам. Всегда стараемся поддерживать для заказчиков адекватную ценовую политику. Важно, чтобы документы были доступными для подавляющей массы наших граждан.
Покупка документа, подтверждающего окончание института, — это грамотное решение. Заказать диплом ВУЗа: diplomk-vo-vladivostoke.ru/kuplyu-diplom-o-visshem-obrazovanii-9/
Где заказать диплом по актуальной специальности?
Готовый диплом со всеми печатями и подписями полностью отвечает условиям и стандартам Министерства образования и науки, никто не отличит его от оригинала. Не стоит откладывать личные мечты на несколько лет, реализуйте их с нами — отправляйте заявку на диплом прямо сейчас! Заказать диплом о среднем специальном образовании — запросто! vacshidiplom.com/mozhno-li-kupit-attestat-2/
Мы изготавливаем дипломы любой профессии по приятным тарифам. Всегда стараемся поддерживать для покупателей адекватную политику цен. Важно, чтобы документы были доступными для большого количества наших граждан.
Приобретение диплома, подтверждающего окончание института, — это выгодное решение. Купить диплом любого университета: diplomdoc.ru/kupit-diplom-texnicheskij/
1win официальный сайт войти https://1win824.ru/ .
1win win https://www.1win825.ru .
скачать 1win с официального сайта 1win811.ru .
1вин сайт официальный http://www.1win826.ru .
1win скачать https://www.1win812.ru .
Мы изготавливаем дипломы психологов, юристов, экономистов и любых других профессий по приятным ценам.— bluebirds.pk
Купить документ ВУЗа вы сможете в нашей компании. diplom-kaluga.ru/kupit-diplom-ivanovo-2
1 win сайт https://www.1win827.ru .
cazino md cazino md .
мостбет chrono https://mostbet786.ru/ .
Купить диплом ВУЗа по доступной цене возможно, обратившись к надежной специализированной фирме. Мы предлагаем документы престижных ВУЗов, расположенных в любом регионе России. diplomh-40.ru/gde-kupit-diplom-obrazovanie-7
банкротство отзывы
1win кейсы https://1win6011.ru .
1вин официальный сайт http://1win813.ru/ .
1win официальный сайт регистрация http://www.pboarders.borda.ru/?1-11-0-00000929-000-0-0-1742818701 .
mostbet kg https://www.shorts.borda.ru/?1-18-0-00000397-000-0-0 .
Привет!
Мы предлагаем дипломы любой профессии по приятным тарифам. Цена может зависеть от определенной специальности, года выпуска и образовательного учреждения: rdiplomans.com/
Заказать диплом института по доступной стоимости можно, обращаясь к надежной специализированной фирме. Мы оказываем услуги по продаже документов об окончании любых университетов РФ. Купить диплом о высшем образовании— diploma-groups24.ru/diplomy-po-specialnosti/diplom-landshaftnogo-dizajnera.html
1win com http://www.1win814.ru .
1win официальный сайт скачать http://1win6012.ru/ .
мостюет http://www.tagilshops.forum24.ru/?1-4-0-00000205-000-0-0 .
1вин официальный сайт http://1win815.ru/ .
ваучер 1win http://1win6014.ru/ .
мостбет chrono https://kharkovbynight.forum24.ru/?1-15-0-00003047-000-0-0-1742814422 .
1win pro https://www.yamama.forum24.ru/?1-11-0-00000459-000-0-0-1742818616 .
ван вин http://1win816.ru/ .
1 vin 1win6015.ru .
мостбет казино maksipolinovtsu.forum24.ru/?1-1-0-00000194-000-0-0-1742815870 .
1win kg скачать http://mymoscow.forum24.ru/?1-6-0-00026928-000-0-0/ .
1 win pro 1 win pro .
1 win.com https://dogzz.forum24.ru/?1-10-0-00000155-000-0-0-1742818537 .
mostbet официальный сайт http://corgan.borda.ru/?1-0-0-00000265-000-0-0 .
1win футбол http://1win6016.ru .
mosbet https://www.mostbet789.ru .
мостбет скачать на андроид http://ashapiter0.forum24.ru/?1-19-0-00001444-000-0-0-1742819001 .
1win. http://1win6013.ru/ .
1win. https://1win9109.ru .
сайт 1win https://www.knowledge.forum24.ru/?1-0-0-00000101-000-0-0-1742817704 .
мост бет http://mostbet6004.ru/ .
wan win http://www.belbeer.borda.ru/?1-6-0-00001583-000-0-0 .
мостбет официальный сайт https://girikms.forum24.ru/?1-1-0-00000361-000-0-0-1742819287/ .
партнёрка 1win http://1win6018.ru/ .
мостбет кыргызстан скачать https://www.kharkovbynight.forum24.ru/?1-15-0-00003047-000-0-0 .
Всегда считал, что покупка диплома о высшем образовании — это миф и невозможно. Но, к счастью, оказался неправ. Сначала искал информацию по теме: поддельный диплом купить, диплом купить стоимость, купить аттестаты об основном общем образовании, купить аттестат в пскове, купить диплом о высшем образовании в севастополе, а затем переключился на дипломы вузов. Подробности здесь: diplomybox.com/kupit-diplom-kemerovo
1вин http://www.obmen.forum24.ru/?1-1-0-00004428-000-0-0-1742816292 .
1win rossvya 1win rossvya .
мостбет казино войти https://alfatraders.borda.ru/?1-0-0-00004917-000-0-0-1743053068 .
Мы предлагаем дипломы психологов, юристов, экономистов и других профессий по невысоким ценам. Дипломы производятся на фирменных бланках Купить диплом университета diplomers.com
Мы изготавливаем дипломы психологов, юристов, экономистов и других профессий по приятным ценам.— diplomj-irkutsk.ru/kupit-diplom-s-reestrom-otzivi/
Диплом ВУЗа России!
Без ВУЗа очень сложно было продвинуться по карьере. Именно из-за этого решение о заказе диплома стоит считать рациональным. Приобрести диплом университета office.listbb.ru/posting.php?mode=post&f=2&sid=a1185760123531387c00a1341e6aa39e