Удаленное включение ПК при помощи ESP8266


• О проекте
• Обратная связь
• Полезные ссылки
• Полезные программы
• Друзья сайта


Последние комментарии

Владимир: Терминал для работы с RS-232 и RS-485
Спасибо огромное ...

Владимир: Терминал для работы с RS-232 и RS-485
ПРОГА СУПЕР!...




           

Библиотека для AVR





AXLIB Генератор





Помощь сайту


   
				

Удаленное включение ПК при помощи ESP8266

	
	
	

Дата: 2 Февраля 2019. Автор: Алексей

	
	
Всем привет! Давненько я не писал статейки...

Сегодня я хочу затронуть животрепесчушуую, тьфу, тему. Как-то за 40 километров от города приспичило мне поработать на своем домашнем ПК. Делов-то, TeamViewer и вся любовь. Да, это хорошо, но Хто ПК то включит??? Короче слава богу дома была родня и я позвонив попросил включить комп. А вот что делать если нет никого дома, а гандурас чешется достучаться до ПК? Правильно, сделать включение удаленно.

Тут в принципе есть несколько решений. Самый простой, это управление включением ПК по средством Wake-On-LAN, но блин у меня материнка сто летней давности и тратить 3,5 тыра вечнодеревянных на новую как-то не хочется. Так что этот вариант отпадает.

Вариант намбер ту.

Преобразователь Ethernet в UART

Да, да. Эта малышка может замутить из Ethernet виртуальный COM порт. Мега продвинутая FTDI или CP2102. Но и этот вариант не подходит. Для создания виртуального порта нужно на ПК устанавливать спецпрограмму, драйвер и только под форточную ось. Короче не пойдет)) У меня походный ноут работает на Ubuntu.

Вариант намбер сри.

SIM800C

Я думаю расписывать это чудо не надо. Но и тут есть жирный минус. Абонентская плата минимум 3 сотни вечнодеревянных. А если мне не нужно будет пол года подключаться? Не, лажа.

Думал я думал и надумал. Есть у меня вот такая штука.

ESP8266 NodeMCU

Кто не вкурсе, я расскажу. Это отладочная платка с WIFI модулем на базе микроконтроллера ESP8266 под управлением NodeMCU. Это такая штука, которую можно программировать на языке lua. И самое ценное, то что для нее написана большая библиотека с поддержкой работы в сети. Поэтому мы будем поднимать TCP сервер и писать TCP клиент. Сервером будет как раз наша платка и она при получении от клиента команды будет включать ПК. А клиент будет прогой под ПК и пихать серверу команду.
Начнем наверное со схемы, дабы знать на каких ногах что будет висеть.

Схема принципиальная

Покрупнее

Дык, описание. Модуль при получении команды дергает базу транзистора, а тот... А тот что?
А как сама кнопка включения ПК работает-то?
Я пытался это выяснить гуля и яндекся, а находил лишь заумные ответы типа: "Когда нажимают кнопку, то команду обрабатывает BIOS и разрешает БП подать напругу на материнку." В общем все в этом духе, а когда задавал прямой вопрос "Как на физическом уровне работает кнопка включения ПК?", мне говорили что я идиот, так как она просто замыкает контакты. Твою мать, логично. И не поспоришь.
Короче я забил на весь ентернеть и полез в системник с тестером. Что я выяснил. Кнопка работает следующим образом. Она замыкает контакты))) А именно два пина на гребенке на материнке с подписью SW PWR. Причем один пин железно прибит к корпусу, а именно на нем всегда GND, а на втором висит 3,3в. Данное напряжение подтянуто через резистор. То есть когда нажимается кнопка, то пин с питанием прижимается к корпусу и комп понимает что нужно включаться. Вывод, дабы заставить включиться ПК, нужно перевести ножку с 1 в 0. Вот для этого и прикручен на схеме транзистор. Да, можно было бы и напрямую от модуля ногу прикрутить и держать ее в 1, а при поступлении команды переводить в 0. Но есть одно большое НО. Представим себе ситуацию, наша железяка подключена к ПК и пихает 3,3в на ножку включения. Вроде все хорошо. Но тут случилось напасть, дома брат, сестра, мама, папа ну или бабушка на худой конец решили включить с кнопки. Чуете чем запахло? Ага, горелым. Мы модулем пихаем 3,3в, а кнопкой прижимают к корпусу. Так вот чтоб развязать этот недуг я и поставил транзистор. Пока команда на включение ПК не пришла, база транзистора жестко прижата к корпусу. Тот закрыт, а коллектор висит в воздухе. Можно обнажиматься на кнопку сколько угодно, ничего не будет, так как транзистор закрыт. А вот когда придет команда и модуль вжарит по базе единицей и транзистор откроется, то тоже ничего страшного не будет, так как он прижмет ножку включения на материнке к корпусу. И даже при выполнении команды кто-то нажмет на кнопку, замыкания не будет. Оба давят на корпус))).
Тэкс, с теорией закончили, топаем делать плату.

3D модель устройства

Зы, это модель в сборе модуля и платы. А вот это уже все готовое в реале.

Плата

Плата в корпусе

Плата в сборе

Железо готово, пора писать программу. Для железяки нам понадобиться ПО из статью про wifi термодатчик. Топаем туда и вникаем в суть происходящего. А именно ставим все ПО, качаем прошивку для NodeMCU, заливаем в модуль и возвращаемся сюда.

Если все готово, то пишем код.


-- =========================================  
--  ЭТИ ДАННЫЕ НУЖНО НАСТРОИТЬ ПОД СЕБЯ
-- =========================================  
-- Имя сети и пароль
station_cfg={}
station_cfg.ssid="Имя точки WIFI"
station_cfg.pwd="Пароль для подключения к точке"

--Номер пина
noga_pc = 1     -- Вкл ПК
noga_ip = 0     -- Регистрация в сети
noga_light = 2  -- Включения света

-- Данные для проверки 
-- Максимальная длинна команды 12 символов
com_1 = "PC_on"
com_2 = "L1_on"
com_3 = "L1_off"
--com_X = "Команда"

-- Флаг правильности полученной команды
errCom = 0

-- Номер порта
port = 80

-- =========================================  
--       КОНЕЦ НАСТРОЙКИ ДАННЫХ
-- ========================================= 

-- Режим клиента
wifi.setmode(wifi.STATION)
-- Запись конфигурации
wifi.sta.config(station_cfg)
-- Подключаемся к роутеру
wifi.sta.autoconnect(1)

--Настройка пина На вывод
gpio.mode(noga_pc, gpio.OUTPUT)
gpio.mode(noga_ip, gpio.OUTPUT)
gpio.mode(noga_light, gpio.OUTPUT)

--Создаем сервер
srv=net.createServer(net.TCP, 30)

--Ждем подключения к точке и получения IP адреса
--При удачном подключении гасим светодиод
do
    tmr.alarm(0, 10000, 1, function ()
        ipadress = wifi.sta.getip()
        if ipadress == nil then
            gpio.write(noga_ip, gpio.LOW)
        else
            gpio.write(noga_ip, gpio.HIGH)
        end
        print(ipadress)
    end)
end

function receiver(sck, data) 
    print(data)

    sck:on("sent", function(sck) sck:close() end)
-- =========================================   
--       КОМАНДА УПРАВЛЕНИЯ ТРАНЗИСТОРОМ
-- =========================================    

    if data == com_1 then
        tmr.alarm(0, 1500, 1, function ()
        gpio.write(noga_pc, gpio.LOW)
        end)
        gpio.write(noga_pc, gpio.HIGH)
        errCom = 1
    end 
-- =========================================  
--           КОМАНДА ВКЛЮЧИТЬ СВЕТ
-- ========================================= 

    if data == com_2 then
        gpio.write(noga_light, gpio.HIGH)
        errCom = 1
    end 
-- =========================================  
--           КОМАНДА ВЫКЛЮЧИТЬ СВЕТ
-- ========================================= 

    if data == com_3 then
        gpio.write(noga_light, gpio.LOW)
        errCom = 1
    end 
-- =========================================  
--           ШАБЛОН КОМАНДЫ
-- =========================================  
--    if data == com_X then
--        Какие-то действия при выполнении команды
--        errCom = 1
--    end 
-- ========================================= 

--Ответ клиенту
    if errCom == 1 then
        sck:send("Сделано!")
        errCom = 0
    else
        sck:send("Фигня!")
    end
end

if srv then
  srv:listen(port, function(conn)
    conn:on("receive", receiver)  
  end)
end


Далее заливаем в модуль и все готово. Да, да в коде сть две лишних команды на включение и выключение света. Эти команды я вставил для того чтобы можно было расширять функционал модуля. Например им можно будет чем-то управлять по сети. Далее в конце команд я закоментировал болванку для создания новых команд. Так как клиент будет принимать команды введенные вручную, то система становиться резиновой. Выполняемых команд можно напихать столько, сколько позволит память модуля.

Отлично, поехали кодить под ПК. С учетом того что я решил писать клиента под форточки и пингвина, то буду использовать не Visual Studio, а Qt Creator. Ее можно скачать с официального сайта бесплатно. Но для бесплатной версии есть ограничения. Проги не продавать, раздавая прикладывать исходники и она немного порезана по функционалу, но на нашу задачу это не повлияет. Выкладывать код С++ здесь я не буду, а лишь покажу вид программы. Все исходники, программы и описания будут в конце статьи для скачивания.

Qt Creator

TCP-Client

Чтобы послать команду, заполняем все поля и жмем кнопочку "Отправить".

Если сервер не ответил, то появится ответ "Пустой ответ!"
Если до сервера достучались, но команда не верная, то появится ответ "Фигня!"
Если до сервера достучались и команда выполнена, то появится ответ "Сделано!"


А теперь ссылочки на исходники и схемы с корпусом.

Проект DipTrace
3D модели корпуса
Проект QT форточный
Проект QT Ubuntu
Установщик для форточек
Прога для Ubuntu

Ну как-то так. Проект для lua я выкладывать не буду, просо скопируйте код из статьи и все. Программу под форточки я сделал с установщиком, так как мне лень расписывать какие файлы куда пихать. Так что просто качаем архив и устанавливаем на ПК. Для Ubuntu все сложнее. Я так и не смог разобраться как создать подобие инсталятора винды в линукс (если кто расскажет как, буду признателен.). Поэтому я в архиве приложил файл с инструкцией что куда скопировать для работы проги.
Вроде все))
Будут вопросы, пишите в коментах.




Алексейbird    10.03.19 16:43

Идея хорошая, хоть и не новая. Только обрати внимание, что включить можно только комп, который "смотрит" в глобальную сеть, или хотя бы есть свой маршрутизатор, который имеет белый IP и его можно настроить на проброс портов. В других случаях, а это большинство как раз так и выходит так в сеть, этот способ невозможен. Или искать девайсину, которая сама подключается к удалённому серверу и ждёт команды от него. А пользователь, где-нибудь далеко, также подключается к этому серверу и даёт команду на включение своего компа.

Алексей    11.03.19 06:27

Я думал об этом. Для этого есть серверы типа no-ip.com. Но тогда нужен включеный комп, а это порти всю картину. Либо 150р в месяц и статика обеспечена.

Антон    12.01.20 00:43

А не проще на есп веб-сервер сделать? Тогда и клиент таскать с собой не придется.

Владислав    12.01.20 16:30

Доброго дня!
Решаю вот ровно ту же проблему, только вместо ESP8266 ESP32(оверкилл, но оно просто есть).
Плюс хочется
1. Внутрикорпусное размещение.
2. Чуть более plugnplay, без резки проводов. Чтобы при апгрейде железа не пришлось снова браться за паяльник. В связи с этим вопрос, откуда на матери ещё можно снять дежурку? Пока что лучшая мысль - купить удлиннитель 24pin и впаяться в него. Тоже в каком то смысле порно, но всё же. На USB дежурки нет, все порты гаснут при выключении

Алексей    12.01.20 18:22

Антон, проще. Но я по любому подключаюсь удаленно через ноут и поэтому клиент удобнее.

Алексей    12.01.20 18:24

Владислав, не силен в питании ПК, но я думаю на БП точно дежурка есть. Нужно попробовать включить БП в розетку и прощупать все пины. Желтые по моему 12 вольт, а красные 5 вольт.

Алексей    12.01.20 18:29

На БП ATX 9-й пин фиолетовый провод и есть дежурка 5в 2А.

Владислав    13.01.20 10:23

На бп очевидно есть. Стандарт всё таки. Просто в своих голубых мечтах я хотел распаяться на некоей плате, подключающейся к одному из стандартных разъёмов, pci-e например.
Однако я так понял, что на видео вы именно к дежурке и паялись?
Не суть важно, я всё таки пришёл к некоей финишной концепции:
Питание забираю с 24pin разъёма через удлиннитель 24pin-24pin(в который уже впаиваюсь) на самой плате будет гребёнка со входами для pwr btn и pwr led и в свою очередь плата сама будет подключаться к материнке к разъёму фронтпанели.
И да, решил всё же делать на Wemos d1, т.к. китайские клоны этой платы имеют на борту дохленький преобразователь, не способный заьрать больше 150мА(что очень хорошо для дохленькой же дежурки). Плату страссировал, заказал детали, жду.
З.Ы. к вопросу о создании установочных пакетов под debian-подобными ОС - есть такая утилита checkinstall
https://wiki.debian.org/ru/CheckInstall

Алексей    14.01.20 08:08

А в чем проблема с током? Я же посмотрел мануал на БП. На 24-х пиновом разъеме фиолетовый, тот что 9-й пин, и есть дежурка. На нем всегда 5 вольт и 2 ампера максимум.

Владислав    14.01.20 15:12

На выключенном компе у бп не крутится вентиллятор. Как следствие, источник дежурного нарряжения, если его хорошо грузить, будет греться и, как следствие, быстрее выйдет из строя. Есть такие матери, у которых наличествует функционал зарядки телефона от выключенного компа по USB. Там питание на USB идёт тоже с дежурки и вот много жалоб что бп от этого дохнут. Пришёл к выводу, что разумным максимум по току будет 300мА, лучше меньше

Алексей    14.01.20 15:36

Ну я это отсюда взял. Распиновка БП ATX. Не думаю что у хороших БП так все плохо.




Чтобы вставить ссылку используйте форму вида[url]http://www.адрес.ru[/url][text]текст ссылки[/text]
Чтобы вставить код используйте форму вида[code]код[/code]

Имя:   





  







Рейтинг@Mail.ru Яндекс.Метрика