[Из песочницы] Просто об «умном доме»: как сделать «умную» подсветку

Приходя домой, всегда было неудобно: открываешь дверь, а дальше темно, тогда появилась идея сделать подсветку в коридоре, да непростую, а что бы с телефона можно было включить до прихода домой. Ну сказано — значит надо начинать.

Так как в дальнейшем планируются расширения этой системы (или нет), было решено взять одноплатный компьютер за основу. Легким движением мыши на али был подобран самый дешевый<

spoiler title=«orange pi zero 256mb»>
orange pi zero 256mb.
jxwhyq_cjcmhsvlptfbdsoxlkuk.jpeg

Подключение


Дальше механичекая часть, тут ничего сложного. Точно так же, как к плате ардуино, только в соответсвии с выходами на orange pi.

8onsx7mrwglfjj_grmejo2dpx1o.jpeg

Берем обычное реле для «самоделкиных». С одной стороны подключаем питание и управляющий пин, с другой стороны разрезаем провод питания нашего светильника и вставляем в реле (в моем случае это была диодная лента).

ogpy0niwfzdxugl6hoj7qbiuvpy.jpeg

Схема:

bpuuhugk5quejtarxesuakzeyac.jpeg

Вот и все, вы гений.

Немного кода


С технической частью на этом закончили. Переходим к софту, тут тоже все просто:

  1. Устанавливаем на sd карту armbian или любой другой линукс, но я выбрал именно этот. Рекомендую записать образ с помощью etcher.
  2. Далеее через apt-get устанавливаем java в 3 команды:
    #sudo add-apt-repository ppa:webupd8team/java   
    #sudo apt-get update
    #sudo apt-get install oracle-java8-installer
            
    
  3. С помощью гита добавим набор wiringPi для нашей платы (он содержит в себе различные библиотеки для работы с gpio и всякие тулзы для этого же)
    Тоже не сложно:
    #git clone https://github.com/vladikoms/WiringOP-Zero.git
    #cd WiringOP-Zero
    #chmod +x ./build
    #sudo ./build
    

    Ну и проверим:
    #gpio -v
    #gpio readall
    


На этой части с платой закончили, переходим к компьютеру и любимым ide.

Сервер мы будем разворачивать на spring, так что идем на их сайт или же в ide создаем спринговый проект с градлом.

0z2bi9goqonrdfaza1giw5oxmya.png

Для работы с gpio необходимо установить библиотеку pi4j, для этого нужно добавить репозиторий и зависимость.

И тогда финальный скрипт долже выглядеть как-то так:

build.gradle
buildscript {
    ext {
        springBootVersion = '2.1.0.RELEASE'
    }
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group = 'com.lary.sh'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

jar{
    baseName = 'SH'
    version = '0.0.1-SNAPSHOT'
}
repositories {
    mavenCentral()
    maven{

        url  "https://oss.sonatype.org/content/groups/public" //вот репозиторий
    }
}

dependencies {
    implementation('org.springframework.boot:spring-boot-starter-data-rest')
    implementation('org.springframework.boot:spring-boot-starter-web')
    runtimeOnly('org.springframework.boot:spring-boot-devtools')
    testImplementation('org.springframework.boot:spring-boot-starter-test')
    compile 'com.pi4j:pi4j-core:1.2-SNAPSHOT' //а вот зависимость
}



Отлично переходим к управляющему gpio классу:

Gpio.java
public class MyGpio{
    private  GpioController gpio ;
    private GpioPinDigitalOutput myLed;

    public Gpio() {

        try { // с ошибками не особо пока что запариваемся только прототип же( наверное)
            PlatformManager.setPlatform(Platform.ORANGEPI);// указываем , что  работаем с OrangePI
        } catch (PlatformAlreadyAssignedException e) {
            e.printStackTrace();
        }

        gpio= GpioFactory.getInstance();
        myLed = gpio.provisionDigitalOutputPin(OrangePiPin.GPIO_08); // инициализируем 8 пин как выход
                                                                    // то есть будем управлять его напряжением                              
    }
     
    public void light(){ // метод отвечающий за свечение
        if(myLed.isHigh()) myLed.low(); // если на выбранном пине высокое напряжение сделать его равным напряжению на земле
        else myLed.high();// иначе подать высокое напряжение на выбранный пин (8)
    }   
     public void blink(){ // ну и так помигать для виду
        for (int i =0;i<10;i++) {
            try {
                light();
                Thread.sleep(500);               
            }
            catch (Exception e){
                e.printStackTrace();
            }
        }
    }                        
}


Представленный код достаточно простой и не предполагает хорошего управления пинами платы, но открывает дверь на пути к этому.

Ну и завершающая стадия создание контроллера в spring

GpioController.java
@Controller
public class GpioController {

    @RequestMapping("/blink")
    @ResponseBody
    public String blink(HttpServletResponse response, HttpServletRequest request )
    {
        Gpio gpio =new Gpio();
        gpio.blink();
        return "blink";
    }

    @RequestMapping("/light")
    @ResponseBody
    public void light(){
        Gpio gpio =new Gpio();
        gpio.light();
    }
}



Теперь пара последних телодвижений в виде создания jar файла при помощи gradle. После этого перенос по sftp на плату (во многих иде можно настроить деплой напрямую) и запустить jar на устройстве. Далее идем в браузере на заветные 192.168.0.***:8080/light
и наслаждаемся, попутно надеясь, что это поможет сохранить наши пальцы ночью или включать свет, до прихода домой.

В следующей части (если когда нибудь доберусь до нее) обязательно покажу разные способы взаимодействия с нашим «умным» домом.

вот тут исходники
а тут работа с гребенкой (gpio)

© Habrahabr.ru