Делаем недорогую WiFi розетку на ESP8266

Компоненты для недорогой WiFi розеткиПродолжая цикл статей о WiFi-модулях ESP8266 расскажу как сделать очень бюджетную WiFi розетку

Для этого нам нужно:

Итого, бюджет $5-$8 в зависимости от выбора компонентов

Компоненты для недорогой WiFi розетки

Розетка под переделку в WiFi

Подробнее про омроновские реле я писал статью здесь

Схема нашей WiFi розетки будет такой

Схема WiFi розетки

Собираем все внутри корпуса розетки

WiFi розетка

 

Теперь загружаем программу через  Arduino IDE. Статья про программирование ESP8266 в Arduino IDE

Скетч WiFi розетки для...

Включаем розетку, а в нее лампу в 25Вт. Теперь можно подключаться с компьютера/планшета/телефона к нашей розетке по HTTP

Подключаюсь с планшета к веб-серверу ESP-шки по имени или IP-адресу

Подключение к WiFi розетке

Подключение к WiFi розеьке

Видео работы WiFi розетки

А это мечтающий об умном доме кот )))
2001

 

 

Скетч ESP8266 WiFi розетки
2.4 KiB
3098 Downloads
Детали
Вы можете оставить отзыв или трекбек со своего сайта.

65 комментариев на «Делаем недорогую WiFi розетку на ESP8266»

  1. igneus:

    Спасибо огромное за скетч. Не могли бы вы сделать версию с 2мя кнопками под 2 реле, чтобы можно было разобраться как добавлять новые реле.

    P.S. и еще у меня почему-то не работает адрес который выдается в мониторе порта, подключиться удается только по http://192.168.1.4

  2. AVL:

    Спасибо.
    Прошил скетч.
    В терминале: HTTP server ok! Open http://esp8266-power.local in your browser
    На мой взгляд это абсолютно сбивающее с толку сообщение.
    Лучше б оно выдавало адрес в локальной сети, а то я пол часа потратил, пока запустил веб-интерфейс.
    Использовал сторонний сканер ай-пи что б выловить адрес нашего девайса.
    Разве в термнал не может выводиться его значение?
    Спасибо.

  3. AVL:

    И ещё два неприятных момента из моих наблюдений.
    1-й.
    После РЕСЕТа розетка принимает ВЫКЛЮЧЕННОЕ состояние, хотя до РЕСЕТа была включена.

    2-й.
    Во время РЕСЕТа светодиод мна управляющем пине мигает. Значит, если в реальной жизни к розетке подключён, к примеру, привод гаражных ворот, то ворота или приоткроются или вообще неснкционированно откроются, что не есть хорошо.

    • Alexey Alexey:

      Во время загрузки и прошивки порты ESP принимают неопределенное состояние. Попробуйте подтягивающий резистор на землю поставить

  4. Michael:

    не могу загрузить, выдаёт ошибку в этой строке

    server.onNotFound ( HTTP_handleRoot );

    • Alexey Alexey:

      Ошибку то какую? Не найдена функция?
      Библиотеки?
      Версия Arduino IDE?

      • Michael:

        я начинающий, и это мой первые попытки знакомства с arduino
        а ошибку пишет так:

        exit status 1
        ‘HTTP_handleRoot’ was not declared in this scope

        версия 1.6.7

        • Alexey Alexey:

          Читал, что на последних версиях Arduino IDE глючит Core ESP8266
          Попробуйте версию 1.6.5

          • Michael:

            спосибо, на 1.6.5 всё работает…

          • Николай:

            На самом деле функцию HTTP_handleRoot просто нужно разместить до того, как она будет использована.

  5. motor:

    С прошивкой от homes-smart.ru будет эта схема работать?

  6. Александр:

    Добрый день

    Меня мучает вопрос, каким образом реле на 5В управляется напрямую напряжением 3.3В?
    Везде пишут, что для этого надо подключать его через транзистор и дополнительный источник питания на 5В. Не хочется заморачиваться с дополнительным питанием, потому и спрашиваю.

    • Alexey Alexey:

      Это реле состоит из оптопары и симистора, к ней подключенного.
      Оптопара открывается загоранием светодиода. В цепи светодиода стоит ограничивающий резистор. При 3.3В на управляющем светодиоде ток меньше чем при 5В, но достаточный для открытия симистора.

  7. Александр:

    Прошу прощения, не заметил ссылки на статью про это реле, что оно работает и от пониженного напряжения.

  8. IROBOT:

    Спасибо за статью.Залил в Node MCU.Адрес пришлось через роутер узнавать.Добавить еще пару команд и можно дистанционно управлять роботом ))

  9. no_nic:

    а с esp8266 esp-14 не сталкивались?

  10. Алексей:

    я начинающий. скажите а какое реле можно использовать, чтобы не 220V наргрузку, а постоянный ток 12v.
    Спасибо

    • Alexey Alexey:

      Либо любое механическое реле. (Только они в большинстве своем питаются от 5 В и выше), либо мощный MOSFET транзистор. Причем вторым можно настроить диммирование 12В, то есть если у вас лента светодиодная, управлять яркостью

  11. Omega:

    У мены несколько блоков реле. Механические, синие. Самые распространенные, расчитанные на 5В по управлению. В общем начинают срабатывать от 3.1, и на 3.3 уверенно отрабатывают. Причем для опытов я не только управляющий сигнал подавал 3.3 Вольта на оптопары, но и саму обмотку запитывал от 3.3.

    Заметил следующее- реле срабатывает (мое, механическое) если на вход подать логический ноль (на GND т.е. замкнуть).
    Соответственно работает инверсно. Т.е . пишет состояние «выключено», когда оно включено, и наоборот. Но это подправить не проблема. Смущает, как уже выше упоминалось, что плата при отключении питания (иммитация отключения света) НЕ запоминает состояние. В моем случае (управление нулем) реле переходит в состояние ВКЛ. Т.е если, предположим, управляем поливом воды на даче, то если свет перемигнул, то реле перейдет в состояние ВКЛ (предположим было ВЫКЛ до пропадания электричества) и зальет весь огород.
    Ведь я-то не проверяю состояние регулярно в телефоне.
    Можно, конечно инвертировать управление, но тогда все равно я буду думать что включил полив огорода….засеку например часа три и буду выключать воду. А окажется что электричество пропадало сразу же и полива по факту не было.

    PS: возможно можно в вебсервере врисовать еще и его uptime, по которому ориентироваться когда был ребут платы.

    • Alexey Alexey:

      Видел такую схему. С питания диод шоттки + большой электролит. А один из входов на питание до диода.
      Вся периферия сильноточная тоже до диода. Получается следующее. При выключении питания вся периферия вырубается, а контроллеру еще есть драгоценные секунды, пока электролит держит. Вход, что к питанию подключен фиксирует что напряжение пропало и контролер валит текущее состояние в EEPROM.
      А потом при возобновлении питания восстанавливает состояние из EEPROM

      • Ged:

        А почему нельзя писать в EEPROM при установке состояния? Там ограниченное количество перезаписи?

        • Alexey Alexey:

          Можно и так
          EEPROM имеет ограниченное количество циклов записи. Например, у той что большинстве ESP — 100000, так что «на наш век хватит», если не выключать много раз в секунду.
          На крайний случай, ставится хороший кондер по питанию и один вход через диод заводится на питание.
          При пропадании питания на этом входе производится запись в EEPROM до того как микроконтроллер выключится.

          • Максим:

            Есть еще один вариант — использовать бистабильное реле. Валялось у меня такое с серебряными контактами, советского образца))). Там две переключающие катушки, вроде на 220в, перемотал их на 5в., собрал схему на мосфетах с таймером (реле срабатывает после полу-секундной задержки, иначе щелкало бы при включении т.к. у меня ESP-01) одинаковые для каждой катушки. Управляется реле секундными импульсами от выводов GPIO0 и GPIO2. Получилась механическая память)

  12. Дмитрий:

    Алексей, спасибо за полезную и рабочую штуку! А как все-таки сделать, чтобы реле было 2 (или несколько, если пользовать ESP с большим количеством gpio)? Для чайников дайте, пожалуйста, понятное объяснение, как добавлять в скетч нужные строчки!
    Спасибо.
    С уважением,
    Дмитрий

    • Alexey Alexey:

      Подключите ко второму GPIO и управляйте им. Это основы программирования, тут не объяснишь в двух словах )))

  13. Александр:

    Приветствую алексей. Пробую организовать гет запрос на примере вашего проекта. Подскажите, что не так? Не идёт гет отправка на страницу. Вы как бывалый программист должны знать.
    Вот код. Я добавил всего две строчки.
    #include
    #include
    #include
    #include

    // GPIO, куда подцелено реле
    uint8_t PowerPin = 2;
    bool PowerOn = false;

    // Имя хоста
    const char* host = «esp8266-power»;
    // Вместо звездочек свои параметры WiFi сети
    const char* ssid = «INGR»;
    const char* password = «hotswf»;

    ESP8266WebServer server(80);

    WiFiClient client;
    IPAddress ip1(192,168,83,80);

    void setup() {

    if (!client.connect(ip1, 80)) {
    Serial.println(«Connection %s failed»);
    }
    String out1 = «GET http://192.168.83.80/site1.ru/www/index.php?t=32 HTTP/1.1\r\n\r\n»;
    client.print(out1);

    // Последовательный порт для отладки
    Serial.begin(115200);
    Serial.printf(«\n\nFree memory %d\n»,ESP.getFreeHeap());

    // Инициализация выхода реле
    pinMode(PowerPin , OUTPUT);
    digitalWrite(PowerPin , PowerOn);

    // Подлючение к WiFi

    WiFi.mode(WIFI_AP_STA);
    WiFi.begin(ssid, password);
    if(WiFi.waitForConnectResult() == WL_CONNECTED){
    // Запуск WEB-сервера
    MDNS.begin(host);
    server.on ( «/», HTTP_handleRoot );
    server.onNotFound ( HTTP_handleRoot );
    server.begin();
    Serial.printf( «HTTP server ok! Open http://%s.local in your browser\n», host);
    }
    else {
    Serial.printf(«WiFi started is fail»);
    }

    }

    void loop() {
    server.handleClient();
    delay(50);
    }

    /*
    * Оработчик главной страницы сервера
    */
    void HTTP_handleRoot(void) {
    bool stat = false;

    if( server.hasArg(«stat») ){
    if( strncmp(server.arg(«stat»).c_str(),»1″,1) == 0 )stat = true;
    }
    else {
    stat = PowerOn;
    }

    String out = «»;

    out =
    «\
    \
    \
    WiFi розетка\
    \
    body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
    \
    \
    \
    WiFi розетка. Версия 1.0\n»;

    if( stat ){
    out+=»\
    Состояние: Включено\
    Выключить\
    «;
    }
    else {
    out+=»\
    Состояние: Выключено\
    Включить\
    «;
    }
    out+= «\
    \
    «;
    server.send ( 200, «text/html», out );
    if( stat != PowerOn ){
    PowerOn = stat;
    digitalWrite(PowerPin , PowerOn);
    if( PowerOn )Serial.println(«Power is ON»);
    else Serial.println(«Power is OFF»);
    }

    }

    • Алексей:

      Вполне вероятно, что переменная client не проинициализирована в тот момент, когда её пытаетесь позвать.
      Попробуйте
      WiFiClient client = server.available();
      а потом уже что-то посылать, но есть ощущение, что врядли этот GET пройдёт.
      GET я так понял нужно с web клиента делать, а не с WiFiClient`а.
      Надеюсь, я ошибаюсь.

  14. Стас:

    А возможно как-нибудь сделать управление этой розеткой с приложения E-control
    http://4pda.ru/forum/index.php?showtopic=573779&st=3580

    • Alexey Alexey:

      Если HTTP запрос сможете настроить.
      А так посмотрел ссылку — китайсая проприоритарщина закрытая

  15. Александр:

    Добрый день не могу скомпелировать WiFi_power.ino версия 1.6.5 дает ошибки
    Arduino: 1.6.5 (Windows XP), Плата»Generic ESP8266 Module, Serial, 80 MHz, 40MHz, DIO, 115200, 512K (64K SPIFFS), ck, Disabled, None»

    Изменена опция сборки, пересобираем все
    WiFi_power.ino: In function ‘void setup()’:
    WiFi_power:22: error: redefinition of ‘void setup()’
    sketch_mar25a:1: error: ‘void setup()’ previously defined here
    WiFi_power.ino: In function ‘void loop()’:
    WiFi_power:50: error: redefinition of ‘void loop()’
    sketch_mar25a:6: error: ‘void loop()’ previously defined here
    redefinition of ‘void setup()’
    версия 1.6.7
    Arduino: 1.6.7 (Windows XP), Плата:»Generic ESP8266 Module, Serial, 80 MHz, 40MHz, DIO, 115200, 1M (512K SPIFFS), ck, Disabled, None»

    In file included from c:\documents and settings\admin\local settings\application data\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\memory:63:0,

    from C:\Documents and Settings\Admin\Local Settings\Application Data\Arduino15\packages\esp8266\hardware\esp8266\2.1.0-rc2\libraries\ESP8266WiFi\src/WiFiClient.h:24,

    from C:\Documents and Settings\Admin\Local Settings\Application Data\Arduino15\packages\esp8266\hardware\esp8266\2.1.0-rc2\libraries\ESP8266WiFi\src/ESP8266WiFi.h:39,

    from D:\ARDUINO\WiFi_power\WiFi_power.ino:5:

    c:\documents and settings\admin\local settings\application data\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\bits\allocator.h:46:75: fatal error: bits/c++allocator.h: No such file or directory

    #include // Define the base class to std::allocator.

    ^

    compilation terminated.

    Что делать посоветуйте может какую другую версию Arduino IDE предложите качал с оф сайта https://www.arduino.cc/en/Main/Software. Помогите я в программировании не силен.

    • Alexey Alexey:

      Я увидел параметр сборки «Версия 1.6.7». Нормально работает ESP Core for Arduino IDE под версию 1.6.5

      • Александр:

        Я пробовал и 1.6.5 посмотрите в начале ошибки 1.6.5

        • Александр:

          Arduino: 1.6.5 (Windows XP), Плата»Generic ESP8266 Module, Serial, 80 MHz, 40MHz, DIO, 115200, 512K (64K SPIFFS), ck, Disabled, None»

          Изменена опция сборки, пересобираем все
          WiFi_power.ino: In function ‘void setup()’:
          WiFi_power:22: error: redefinition of ‘void setup()’
          sketch_mar25a:1: error: ‘void setup()’ previously defined here
          WiFi_power.ino: In function ‘void loop()’:
          WiFi_power:50: error: redefinition of ‘void loop()’
          sketch_mar25a:6: error: ‘void loop()’ previously defined here
          redefinition of ‘void setup()’

          • Alexey Alexey:

            Мне кажется, в папке со скетчем лежит два файла имеющих setup() и loop()

  16. Александр:

    Спасибо Вы были правы два фйла. Прошлась но ничего в WiFi не появилось. Может сначала прошить чем нибудь стандартным ? Чем посоветуете?
    Вот что при прошивке говорит:
    Sketch uses 248 796 bytes (57%) of program storage space. Maximum is 434 160 bytes.
    Global variables use 36 652 bytes (44%) of dynamic memory, leaving 45 268 bytes for local variables. Maximum is 81 920 bytes.
    Uploading 252944 bytes from C:\DOCUME~1\Admin\LOCALS~1\Temp\build6809773912049107277.tmp/WiFi_power.cpp.bin to flash at 0x00000000
    ………………………………………………………………………………………………………………………………………………………………………………………………..

  17. Александр:

    Спасибо огромное перепрошил ECP залил прогу и все заработало!

  18. Спасибо! Классно работает!

    А как можно привязать к MQTT серверу с вашим скриптом (с сохранением веб странички)? Перерыл вес гитхуб, ничего не нашел.

    • Alexey Alexey:

      Поставить туда MQTT библиотеку
      Сходу нашлось это и это

      В принципе большинство ардуиновских библиотек, если они не «низкоуровневые» переносятся на ESP8266 без проблем

      • Да, по этим линкам я уже тоже бывал. Проблема в том что в коде я ничего не соображаю, как связать два проекта в один для меня тёмный лес. В наличии имеется парочка таких вот бутербродов http://mysku.ru/blog/aliexpress/38586.html и парочка Sonoff HT.

        Этот проект вроде совмещает оба удовольствия но у меня не компилется, ругается на «callback»

        • Alexey Alexey:

          Возьмите прошивку HOME-SMART как в этой статье
          Возможно для ваших задач бесплатной версии хватит. В крайнем случае, заплатите 100 руб на развитие проекта и получите полную версию

          Очень богатый функционал и ничего не нужно программировать

          • Там получаю ошибку

            mqtt-0 2016-04-21 17:15:03 error Cannot parse {«system»:{«hostname»:»ESP000CD343″,»uptime»:3,»rssi»:-57,»freemem»:33720},»sensors»:},»gpio»:{«12″:0,»13»:0}}
            mqtt-0 2016-04-21 17:15:03 info Client [ESP8266000cd343] subscribes on topic «timestamp»
            mqtt-0 2016-04-21 17:15:03 info publishOnSubscribe send all known states
            mqtt-0 2016-04-21 17:15:03 info Client [ESP8266000cd343] subscribes on «ESP000CD343.#» with regex /^mqtt\.0\.ESP000CD343\..*/
            mqtt-0 2016-04-21 17:15:03 info Client [ESP8266000cd343] subscribes on «ESP000CD343.#» with regex /^ESP000CD343\..*/
            mqtt-0 2016-04-21 17:15:03 info Client [ESP8266000cd343] connected
            mqtt-0 2016-04-21 17:11:51 info Starting MQTT server on port 1883

            12 — пин релюшки
            13 — пин светодиода

  19. Петр:

    Чтоб не ломать голову какой там локальный IP Просто добавьте такую команду » Serial.println(WiFi.localIP()); »
    после того как модуль отчитается о том что подключился к вашей локалке в порт вылетит локальный IP и всё заработает.

  20. Никита:

    Какие резисторы нужны (лучше ссылку на али)
    Сам на али нашёл набор из 30 видов по 10 шт всё за 100 руб
    Но наверное ,я больше половины из них не придумаю как использовать.
    (Работу резисторов и ост буду изучать во время их пути ко мне)

    • Alexey Alexey:

      На первое время набор сгодиться. Потом закажите те, которые кончатся. Хотя, если недалеко есть радиолавка, то резисторы можно и там покупать. Выходят аза в два дороже чем на Али, зато берете только те, которые нужно

  21. Vladimir:

    Здравствуйте.

    Спасибо огромное за скетч. Можно попросить добавить возможность переключать реле через кнопку (например D3 — поключается на «-«) и дополнительно показывать статус реле через светодиод (например через D4).

    Зарание спасибо если это не трудно.

    • Alexey Alexey:

      А не хотите самостоятельно попробовать?
      Если вы уж залили скетч в ESP-шку, то разобраться в несложном коде и добавить несколько строк просто

      • Sergey:

        Здраствуйте. скетч залил без проблем, непонятно почему ESP работает одновременно и сервером и клиентом, тоесть она подключилась к моей сети через указанный пароль и логин и тут же сама работает как точка доступа причём на том же канале где и роутер к которому подключилась, при этом доступ к ней незащищён подключайся кто хочеш. как так вышло ?

  22. Albert:

    спасибо за скетч. именно с него и начинал, пока не пришел к majordomo.
    единственный минус — модуль не сохраняет состояние пина на случай неожиданного пропадания питания. в прошивке от wi-iot.ru решили эту ситуацию. там в коде добавляется приставка &flash. это позволяет записать состояние в память модуля и при перезагрузке он неожиданно не включает реле.
    такой фокус можно провернуть и с esp-01, проверял.

    • Alexey Alexey:

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

  23. Albert:

    единственно вопрос. сейчас выпускают бутерброды по типу такого https://ru.aliexpress.com/item/ESP8266-serial-WIFI-Witty-cloud-Development-Board-ESP-12F-module-MINI-nodemcu/32577398010.html?spm=2114.10010208.1000014.27.5DY9h5&scm=1007.13338.49932.0&pvid=db157451-5b23-46e2-b675-fa8a020a6ace&tpp=1&detailNewVersion=&categoryId=400103

    надо ли на них подтяжку ног делать или там уже все есть ?

  24. Никита:

    Купил поняжающий преобразователь AC-DC Преобразователь Питания Понижающий Преобразователь Сыходзь Модуль 3.3 В 600mA
    http://s.aliexpress.com/fIBZ3uYf
    (from AliExpress Android)
    А он выдаёт не 3.3v а 9 .может это я чтото не так делаю или что то не то прислали (1в 1 как на фото)

    • Alexey Alexey:

      Попробуйте на выход посадить нагрузку 100Ом
      Может преобразователь на холостом ходу не хочет работать

  25. Никита:

    Вольтаж упал до 4.5 вольт (16 резисторов по 10 кОм)Это нормально ?
    Мне esp напрямую подключать ?(без резисторов(не сгорит?)

  26. Рахат Лукумович:

    Кот шикарный.

  27. Никита:

    Блин вроде по схеие подключил а в com порт ничего не посылает и не прошивается.
    Что может быть не так ?
    ESP-07 ESP8266
    FT232RL FT232 FTDI TTL
    rts у него сбоку распаян как я понял

Ваш отзыв