Всем знакомо это чувство, когда возникает навязчивое желание сделать что-либо: что-то купить, что-то создать, что-то написать, кому-то позвонить… Вот и у меня возникло желание сделать что-нибудь своими руками. В поисках подходящего проекта на instructables.com, я наткнулся на этот и понял – это то, что нужно!

Прежде всего, я адаптировал этот проект светильника под себя:

  • вместо настроения всего мира, я решил взять настроение моего города
  • вместо raspberry pi, я решил использовать arduino (так как она уже была в наличии)
  • конструкцию коробки из оргстекла я тоже немного изменил по своему усмотрению
  • возможность настройки светильника без перепрошивки, через sd карточку.

Первым этапом я решил написать программу под arduino. Проблема заключалось в том, что у arduino нет wifi, но решение нашлось довольно быстро – esp8266. ESP8266 — микроконтроллер с интерфейсом Wi-Fi. Помимо Wi-Fi микроконтроллер отличается возможностью исполнять программы из внешней флэш-памяти с интерфейсом SPI. Программирование ESP8266 производится через serial адаптер, в качестве которого можно использовать arduino. Кроме того, написание и прошивку программ можно также производить через arduino IDE.



Во время работы с платой ESP-01 я быстро понял, что использование связки arduino unо + ESP-01 не лучшее решение. Дело в том, что для программирования платы нужно было собрать небольшую схему программатора. Это, конечно же, несложно, но очень неудобно: для прошивки модуля нужно подключить ESP-01 через программатор к arduino uno, которая работает в режиме serial адаптера, а для проверки работы программы нужно было переподключить ESP-01 напрямую к arduino uno в штаном режиме, чтобы две платы могли обмениваться информацией через serial порт.



Поэтому я решил использовать в качестве микроконтроллера плату NodeMCU, которая представляет собой что-то вроде esp8266 и arduino mini на одной плате. К тому же, у неё есть micro usb вход, что значительно упрощает процедуру работы с ней.



Сама программа получилась довольно простой. Сначала она подключается к wifi сети, логин и пароль к которой хранятся на sd карте. После этого, скачивается json с сайта ip-api.com/json для определения местоположения светильника (из пакета берутся только название города и географические координаты). Когда местоположение светильника становится известно, программа начинает формировать запросы для твиттера, используя ключевые слова, описывающие каждое запрограммированное «настроение». После окончания обработки запросов, программа подсчитывает общее число твитов и определяет процентную долю каждого настроения на текущем цикле. Чтобы сделать расчёт текущего настроения более «живым» — программа сравнивает текущее настроение с предыдущим и высчитывает процентное изменение. Например, если на первом цикле работы распределение настроений составило 0.4 для счастья и 0.05 для романтики, а на втором цикле – 0.5 и 0.1 соответственно, программа выберет «романтику» в качестве текущего настроения (так как прирост счастья составил 25%, а романтики – 100%). Такой подход позволяет быстрее реагировать на резкие изменения настроения в городе, а также отслеживать смешанные настроения (если массовая доля двух настроений примерно одинакова – программа будет по очереди переключаться между ними).

Вторым этапом стала сборка корпуса светильника. С материалом определился сразу – матовое оргстекло (44% светопропускания) толщиной 2 мм. При этом по задумке, нижняя полочка – на которой располагается вся электроника, была из прозрачного оргстекла. При этом появляется ощущение, что когда светильник работает, свет как бы выливается снизу и создаёт иллюзию левитации самого светильника.

Нарезанные из оргстекла стенки я хотел склеить между собой горячим клеем. Но такая конструкция оказалось неустойчивой (возможно из-за маленькой ширины стенок) и постоянно разваливалась. Тогда я решил скрепить стенки при помощи уголков и винтов. Такой вариант оказался надёжней (хотя и не такой симпатичный), поэтому на нём я и остановился.

После сборки корпуса, я перешёл к третьему и последнему этапу – установке электроники на нижнюю полку. Тут всё было довольно просто, разве что вместо запланированных 4 светодиодов я использовал 8 – дополнительные 4 направлены вниз для создания эффекта левитации. Дело в том, что я промахнулся с размерами светильника и 30% полочки съел отсек для 4-х АА батареек, блокирующий свет светодиодов.



А ещё было обнаружено, что закупленные мной светодиоды плохо справляются с отображением сложных цветов. Поэтому пришлось ограничиться 7-ю простыми: красным, зелёным, синим, розовым (красный + синий), жёлтым (красный + зелёный), бирюзовым (зелёный + синий) и белым.

Конечный результат работы можно увидеть в видео.

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

Бюджет проекта составил чуть больше 2 тысяч рублей. При этом самые дорогие части: 4х АА аккумуляторы 700р, лист матового оргстекла 600р, китайский nodemcu 500р.

Что можно улучшить:

  • При сборке корпуса можно использовать прозрачные уголки, чтобы они не так сильно выделялись.
  • Стоимость коробки из оргстекла можно существенно снизить, если купить большой лист оргстекла и разрезать его самому.
  • Можно использовать более дорогие светодиоды, которые позволят нормально отображать промежуточные цвета вроде оранжевого, фиолетового и т.д.
  • Можно использовать другой источник питания, например крону. Это связано в главную очередь с тем, что батарейный отсек для 4х АА батареек слишком большой и блокирует большое количество света с нижней стороны светильника. Правда неизвестно как долго светильник сможет проработать от одной кроны.
  • Можно сделать простой веб интерфейс для настройки светильника. Так как библиотека для работы с sd картами не поддерживает русский язык, не получается задавать ключевые слова для поиска таким способом.

Код программы можно найти на гитхабе. Если будет интересно — могу в отдельной статье подробнее рассказать про программу.

Комментарии (11)


  1. KevinMitnick
    05.08.2018 18:50

    Вот программа то как раз и интересна, особенно в моменте анализа твитов. Если не сложно, осветите пожалуйста.


  1. pec-orange Автор
    05.08.2018 18:56
    -1

    Там всё просто, твиты не анализируются, а считается их количество. Например:
    Создаём запрос с ключевыми словами «счастлив+OR+счастлива+OR+ура+OR+взволнована+OR+отлично+OR+супер», добавляем ему координаты места, радиус поиска и язык. И начинаем считывать по одному твиту до тех пор, пока дата публикации твита не превысит два часа (twitter API возвращает json со всей информацией о найденом твите). Последний твит отбрасываем и получаем количество твитов с заданным «настроением» за последнии два часа.


    1. saboteur_kiev
      05.08.2018 19:17

      В этом случае светильник не умный, показывает настроение не города а одного из мессенжеров твиттера и то не точно.


      1. pec-orange Автор
        05.08.2018 19:23

        Да, всё верно — этот прибор нельзя назвать умным в полном смысле этого слова. Однако, от обычного светильника его отличает наличие wifi и способность самостоятельно определять какой цвет сейчас подходит лучше всего.
        Точность определения настроения по твиттеру может быть под вопросом, но я думаю, что в больших городах твиттер даёт вполне объективную оценку. Протестировано во время матчей нашей сборной на чемпионате мира по футболу :)


  1. An_private
    05.08.2018 19:26
    +1

    Что-то посмотрел на железо, посмотрел на софт и возникло много вопросов.
    Алюминиевые уголки с торчащими разнокалиберными винтами выглядят совершенно ужасно. Понятно, что термоклей к оргстеклу не липнет, но им же ассортимент клеев не исчерпывается.
    Вместо RGB светодиодов куда проще использовать WS2812B на готовых круглых печатных платах — можно задать любой цвет и монтаж их простейший.
    И зачем здесь вообще NodeMCU? ESP прекрасно программируются из среды ардуино непосредственно.
    Посмотрел код и несколько удивился. Однообразные конструкции вида:
    if (SERIAL_FULL)
    Serial.println("Colour display mode. The sequence is:");

    Смотрим — что такое SERIAL_FULL:
    github.com/esp8266/Arduino/blob/master/cores/esp8266/HardwareSerial.h
    enum SerialMode {
    SERIAL_FULL = UART_FULL,
    SERIAL_RX_ONLY = UART_RX_ONLY,
    SERIAL_TX_ONLY = UART_TX_ONLY
    };

    github.com/esp8266/Arduino/blob/master/cores/esp8266/uart.h
    #define UART_FULL 0
    Хм.
    Функция moodIndx2colour ввела меня в ступор. Через switch делать выбор цвета от индекса? А почему не задать простейший массив цветов?
    Это только так, очень поверхностно глянул.


    1. pec-orange Автор
      05.08.2018 19:35

      Винты использовал те, что были в наличии, они все одинаковые.
      Проблему с ESP я обозначил. По деньгам получается примерно одинаково: ардуино нано (китайская) 350р + esp8266 100р = 450р.
      nodemcu (китайский) = 500р, и намного удобнее в использовании.
      По коду можно найти очень много вопросов — я не программист и буду рад любым советам по улучшению и оптимизации. SERIAL_FULL — проcто флаг вывода отладочной информации в сериал порт, объявлен в основном файле twitterProject.ino

      // debug print settings
      #define SERIAL_FULL false
      #define SERIAL_COMPACT true

      За наводку на WS2812B спасибо.


      1. DCNick3
        05.08.2018 22:01
        +1

        Это можно сделать проще (и чуть логичнее), если использовать препроцессор.

        #define BE_VERBOSE
        ...
        #ifdef BE_VERBOSE
        Serial.println("debug info");
        #endif
        

        Когда нужно — расскомментируете строку с #define, а когда не нужно — комментируете.


        1. Lertmind
          05.08.2018 22:28

          К слову, каждый раз писать ifdef неудобно. Иногда оборачивают функции для отладки. Например вот для Arduino (не тестировал). Только придётся продумать уровни подробности (в лоб будет добавление ещё обёрток, но думаю можно изысканней).


  1. An_private
    05.08.2018 21:07
    +1

    ардуино нано (китайская) 350р + esp8266 100р = 450р.

    Так а зачем nano то? ESP8266 прекрасно работает без Nano — достаточно купить переходник USB-UART и всё. Понятно — когда нужна «жирная» периферия, но в данном случае весь обмен по WiFi — нужен всего один свободный пин на WS2812B и всё.
    SERIAL_FULL — проcто флаг вывода отладочной информации в сериал порт, объявлен в основном файле twitterProject.ino

    А, понятно. Переопределение системных констант — не очень хорошая идея. Лучше как-то иначе обозвать.


  1. pec-orange Автор
    05.08.2018 21:12

    нужен всего один свободный пин на WS2812B и всё.

    Разумно, мне как-то в голову не пришло (шаблонное мышление — все дырки затыкать ардуино). Спасибо, возьму на заметку.


  1. tutam
    06.08.2018 09:51
    +1

    Посмотрите сюда: https://github.com/tretyakovsa/Sonoff_WiFi_switch, там много всего понавешено, но есть неплохое управление светодиодами, и все это может работать на одной esp. Но там используются WS2811/WS2812