Оглавление:

Магия оттенка: 4 шага (с изображениями)
Магия оттенка: 4 шага (с изображениями)

Видео: Магия оттенка: 4 шага (с изображениями)

Видео: Магия оттенка: 4 шага (с изображениями)
Видео: ЭТА ИЛЛЮЗИЯ ДЕЙСТВИТЕЛЬНО СТРАННАЯ - ПЕРЕВЕРНИ ИЗОБРАЖЕНИЕ! 2024, Июнь
Anonim
Image
Image

Добро пожаловать, волшебники!

Пару месяцев назад я создал маленькую волшебную шкатулку с палочкой для своего 3-летнего сына. Когда он коснется коробки палочкой, из коробки начнет излучать свет меняющегося цвета. Когда он видит цвет, который ему особенно нравится, он может направить палочку на настольную лампу (с лампочкой Philips Hue внутри), наложить заклинание, и цвет из коробки волшебным образом перейдет на лампу! Лампа и свет из ящика вдруг стали одного цвета …

Через несколько секунд цвет тускнеет, и настольная лампа возвращается в свое состояние до заклинания. Пока не будет наложено новое заклинание …

Шаг 1. Что вам нужно для создания этого проекта

Что вам нужно для создания этого проекта
Что вам нужно для создания этого проекта
Что вам нужно для создания этого проекта
Что вам нужно для создания этого проекта
Что вам нужно для создания этого проекта
Что вам нужно для создания этого проекта

Для создания этого проекта вам потребуются следующие материалы:

    • 1 (или более) цветная лампа Philips Hue и мост Hue
    • 1 Wemos D1 mini или аналогичный микроконтроллер на базе esp8266
    • 1 (Arduino) сенсорный датчик (например, TTP223R)
    • 1 (Arduino) кнопка мгновенного действия
    • 1 конденсатор 10 мкФ
    • 1 светодиод RGB (с общим анодом)
    • 5 резисторов (10, 22 и 47 Ом, 2x 10 кОм)
    • 2 небольших прототипа печатных плат (2x3 дюйма или около 5x7 см должно быть достаточно большим)
    • некоторые (перемычки) провода
    • паяльник
    • волшебная палочка (можно купить в магазине игрушек в готовом виде, а можно сделать самому)
    • небольшая коробка из картона или дерева (может быть уже существующая коробка, но вы также можете построить коробку с нуля, конечно)
    • немного ленты
    • немного клея и / или гаек и болтов для крепления печатных плат в коробке.
    • по желанию: оберточная бумага для коробки

NB: Небольшой опыт чтения принципиальных схем будет полезен при прохождении этой инструкции. Моя диаграмма не слишком сложна: если вы можете отличить конденсатор от резистора, у вас, вероятно, все будет хорошо.

Также полезен некоторый опыт программирования Arduino с использованием Arduino IDE. Достаточно базового опыта, так как я предоставлю вам полный код для копирования / вставки. Однако вам нужно будет адаптировать несколько вещей, чтобы заставить его работать в вашей конкретной настройке (например, ваши сетевые настройки и некоторые детали из вашей конфигурации Hue). Если это звучит немного пугающе, не волнуйтесь, я помогу вам получить всю необходимую информацию.

Шаг 2: Коробка и Жезл

Коробка и палочка
Коробка и палочка
Коробка и палочка
Коробка и палочка

Первые шаги обычно самые трудные, но не в этой инструкции! Для легкого начала вы можете просто купить волшебную палочку в магазине игрушек, а для коробки вы можете просто повторно использовать существующую небольшую коробку, которую вы уже валяете. Просто убедитесь, что коробка не сделана из металла, так как это заблокирует сигналы Wi-Fi, а они нам понадобятся для магии;-).

Когда вы изменяете назначение существующей коробки, единственное, что вам нужно сделать, это проделать два отверстия в верхней части коробки: 1 маленькое отверстие (размер 5 мм = 0,2 дюйма) для светодиода RGB и отверстие большего размера (около 12 дюймов). 14 мм или около 0,5 дюйма) для сенсорного датчика.

Точное расположение отверстий не имеет решающего значения, просто разместите их в соответствии с вашим эстетическим чувством, но помните о нескольких вещах:

  • Сохраняйте некоторое расстояние между обоими отверстиями, чтобы убедиться, что компоненты, которые будут установлены под отверстиями (светодиод RGB и сенсорный датчик), могут занимать достаточно места для монтажа и подключения.
  • Самое большое отверстие - для сенсорного датчика. Этот датчик будет установлен прямо под отверстием таким образом, чтобы его можно было коснуться (и даже слегка прижать) палочкой. Поэтому убедитесь, что палочка, которую вы покупаете, не слишком толстая!

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

Если этот первый шаг вам не по душе, пожалуйста, создайте коробку и палочку полностью с нуля! Есть несколько инструкций, которые помогут вам создать красивую палочку.

Какой бы путь вы ни выбрали, пришло время исследовать внутреннюю часть коробки.

Шаг 3. Аппаратное обеспечение внутри

Аппаратное обеспечение внутри
Аппаратное обеспечение внутри
Аппаратное обеспечение внутри
Аппаратное обеспечение внутри
Аппаратное обеспечение внутри
Аппаратное обеспечение внутри

Используйте паяльник для подключения электронных компонентов в соответствии со схемой выше. Есть несколько вещей, на которые следует обратить особое внимание:

  • Провода между Wemos D1 Mini и светодиодом RGB должны быть достаточно длинными, чтобы светодиод RGB можно было установить в отверстие, которое вы сделали в крышке коробки.
  • То же самое относится к проводам, подключенным к переключателю без фиксации и сенсорному датчику, поскольку они должны быть доступны через другое отверстие в крышке.
  • Кнопка переключателя мгновенного действия должна быть приклеена к нижней стороне (нечувствительной стороне) сенсорного датчика таким образом, чтобы вы могли положить кнопку обратно на переключатель мгновенного действия, приклеив сенсорный датчик сверху (см. Рисунок). Сенсор прикосновения установлен на верхней части переключателя мгновенного действия, чтобы обнаруживать нажатия кнопок, сделанные пальцем, и в этом случае нажатие кнопки будет проигнорировано. Только когда кнопка будет нажата волшебной палочкой (которая должна быть непроводящей, поэтому пластик и дерево в порядке), магический цикл начнется.
  • Установите кнопку мгновенного действия с сенсорным датчиком сверху, не слишком глубоко под отверстием в крышке, потому что до нее нужно дотянуться для волшебной палочки, чтобы запустить магию.
  • Обязательно соблюдайте полярность конденсатора при его пайке. Если вы поменяете местами положительный и отрицательный выводы, конденсатор, скорее всего, испустит волшебный дым и погрузит вашу схему в вечный сон.
  • Приклейте, скотчем или прикрутите держатель батареи и печатную плату (и) на место. Он не должен быть аккуратным, его не будет на виду. Это должно быть просто защита от падения.

Переходим к программному обеспечению!

Шаг 4: Программное обеспечение

Убедитесь, что у вас установлена последняя (бесплатная) версия редактора программного обеспечения Arduino, которую можно загрузить по адресу https://www.arduino.cc/en/Main/Software. Чтобы добавить поддержку Wemos D1 mini и других плат на базе ESP8266, выполните следующие действия:

  • После установки запустите программное обеспечение Arduino и откройте окно настроек.
  • Введите https://arduino.esp8266.com/stable/package_esp8266com_index.json в поле «Дополнительные URL-адреса Board Manager». Вы можете добавить несколько URL-адресов, разделяя их запятыми.
  • Откройте Boards Manager из меню «Инструменты»> «Плата» и установите платформу esp8266 (и не забудьте выбрать плату ESP8266 в меню «Инструменты»> «Плата» после установки. «LOLIN (WEMOS) D1 R2 & mini» лучше всего подходит для Wemos D1 mini v2 и v3. доски.

Если вам нужна дополнительная помощь в установке Arduino и настройке драйверов, вы можете взглянуть на

В редакторе Arduino откройте новый файл (File> New) и скопируйте / вставьте приведенный ниже код в только что открывшееся окно. Просто перезапишите строки, которые уже присутствуют в новом окне (установка void и цикл void).

Теперь вы почти готовы, но вам придется адаптировать несколько фрагментов кода для вашей конкретной настройки.

Первое, что нужно сделать, это изменить IP-адрес в строке 34 (в редакторе Arduino строки кода пронумерованы) на IP-адрес вашего моста Hue. Если вы не знаете свой IP-адрес Hue Bridge, посетите https://discovery.meethue.com/, и правильный IP-адрес сразу появится в вашем браузере. IP-адрес - это число, разделенное точками, которому предшествует "internalipaddress".

Чтобы взаимодействовать с источниками Hue, вам необходимо создать пользователя Hue API для Wemos D1 mini, чтобы Wemos мог взаимодействовать с Hue Light через Hue API. Для этого следуйте инструкциям на https://developers.meethue.com/develop/get-started-2/ и скопируйте / вставьте сгенерированное (довольно длинное) имя пользователя в окно кода Arduino. Просто замените каждое «ВАШЕ ИМЯ ПОЛЬЗОВАТЕЛЯ HUE API» на созданное имя пользователя API.

Затем вам нужно выбрать правильный оттенок света, чтобы изменить цвет. В Hue API у каждого источника света есть номер, поэтому вам нужно узнать номер, который соответствует источнику света, который вы хотите использовать в этом проекте. Один из самых простых способов узнать, какой номер имеет конкретный источник света, - это загрузить приложение Hue Viewer для Android или iOS. Замените текст «ВАШ НОМЕР СВЕТА» на правильный номер везде в окне кода Arduino.

Последнее, что нужно сделать, - это настроить Wemos для подключения к вашей сети Wi-Fi. Это делается путем загрузки кода в Wemos и переключения вашего ноутбука в другую сеть Wi-Fi: в «AutoConnectAP». Затем ваш браузер отобразит страницу, на которой вы можете добавить SSID (имя) и пароль вашей сети Wi-Fi, которые контроллер Wemos будет использовать для подключения к вашей сети Wi-Fi (и к мосту Hue).

NB: Если загрузка кода на наш Wemos D1 mini через USB не работает, вам может потребоваться загрузить драйвер для USB-чипа на Wemos. Драйвер для вашей платформы (Windows, Mac) можно скачать по адресу

Теперь вы готовы протестировать свое творение!

// ESP8266 Hue Magic Wand // Ричард ван Кампен - 2018 // Этот код протестирован на Wemos D1 mini, но, вероятно, также будет работать на других платах разработки на базе ESP8266 // Чтобы добавить поддержку Wemos D1 mini и других плат ESP8266 в редактор Arduino выполните следующие действия: // - Запустите Arduino и откройте окно настроек. // - Введите https://arduino.esp8266.com/stable/package_esp8266com_index.json в поле Additional Board Manager URLs. Вы можете добавить несколько URL-адресов, разделяя их запятыми. // - Откройте Boards Manager из меню Tools> Board и установите платформу esp8266 (и не забудьте выбрать свою плату ESP8266 в меню Tools> Board после установки). // используемые библиотеки: #include "ESP8266WiFi.h" // ESP8266 Core WiFi Library #include "DNSServer.h" // Локальный DNS-сервер, используемый для перенаправления всех запросов на портал конфигурации WiFiManager, если нет настроек WIFI (SSID, пароль) еще не установлено. #include "ESP8266WebServer.h" // Локальный веб-сервер, используемый для обслуживания портала конфигурации WiFiManager. #include "WiFiManager.h" // Волшебная библиотека конфигурации Wi-Fi, если она еще не установлена, обратитесь к https://github.com/tzapu/WiFiManager # install-through-library-manager #include "RestClient.h" // https://github.com/fabianofranca/ESP8266RestClient, необходимый для использования API Philips Hue (см. https://developers.meethue.com/develop/ оттенок-апи /). #include "ArduinoJson.h" // https://github.com/bblanchon/ArduinoJson, необходим для анализа ответа Hue API, установите версию 5.x через диспетчер библиотек в Arduino (меню «Эскиз»> Включить библиотеку> Управление Библиотеки> найдите ArduinoJson и измените версию на последнюю 5.x). Версия 6 (в настоящее время находится в стадии бета-тестирования) выдает ошибку. // переменные и инициализация: String response; const int redPin = 13; // на Wemos это d7 const int greenPin = 12; // на Wemos это d6 const int bluePin = 14; // на Wemos это d5 const int touchSensor = 5; // на Wemos это is d1 const int activatePin = 4; // на Wemos это d2 bool Activation = HIGH; bool touch = LOW; const char * aan_restore; int bri_restore; двойной x_restore; двойной y_restore; двойной x_magic; двойной y_magic; bool first = true; беззнаковый длинный startMillis; беззнаковый длинный currentMillis; unsigned long durationMillis; RestClient client = RestClient («192.168.178.23»); // «ваш IP-адрес Hue Bridge» // Если вы не знаете свой IP-адрес Hue Bridge, посетите https://discovery.meethue.com, и он сразу же появится в вашем браузере. IP-адрес - это число с точками, которому предшествует "internalipaddress" void setup () {analogWriteRange (255); Serial.begin (9600); // Начинаем с выключенным светодиодом. pinMode (ActivationPin, INPUT_PULLUP); pinMode (touchSensor, ВХОД); startMillis = millis (); checkWand (); } void loop () {// здесь нечего делать, оставим пустым…} void checkWand () {int rgbColour [3]; // Цветовой код RGB Джеймса Хартона, https://gist.github.com/jamesotron/766994 // Начните с красного. rgbColour [0] = 255; rgbColour [1] = 0; rgbColour [2] = 0; Activation = digitalRead (activatePin); // НИЗКИЙ означает, что используется палочка. touch = digitalRead (touchSensor); // ВЫСОКИЙ означает, что вместо палочки используется палец, чего не должно быть. while (Activation == LOW && touch == LOW) {// Выберите цвета для увеличения и уменьшения. for (int decColour = 0; decColour <3; decColour + = 1) {int incColour = decColour == 2? 0: decColour + 1; // = тернарный оператор, означает: int incColour; if (decColour == 2) {incColour = 0;} else {incColour = decColour +1;} // перекрестное затухание двух цветов. для (int я = 0; я <255; я + = 1) {rgbColour [decColour] - = 1; rgbColour [incColour] + = 1; // поскольку наш светодиод RGB имеет общий анод вместо катода (поэтому нам нужно подключиться к + 3,3 В вместо земли), нам нужны обратные значения для RGB: int red = 255 - rgbColour [0]; int green = 255 - rgbColour [1]; int blue = 255 - rgbColour [2]; analogWrite (redPin, красный); analogWrite (greenPin, зеленый); analogWrite (bluePin, синий); задержка (8); Activation = digitalRead (ActivationPin); if (активация == ВЫСОКИЙ) {// ВЫСОКИЙ означает, что палочка поднята. goto stopColorCycling; }}}} stopColorCycling: currentMillis = millis (); durationMillis = (currentMillis - startMillis); если (durationMillis> 1000) {RGBtoxy (rgbColour [0], rgbColour [1], rgbColour [2]); } else {// переводим Wemos в спящий режим: ESP.deepSleep (0); }} void RGBtoxy (int red, int green, int blue) {// см. https://developers.meethue.com/documentation/color-conversions-rgb-xy double R = map (red, 0, 255, 0, 1000); R / = 1000; двойной G = карта (зеленый, 0, 255, 0, 1000); G / = 1000; двойной B = карта (синий, 0, 255, 0, 1000); В / = 1000; R = (R> 0,04045f)? pow ((R + 0,055f) / (1,0f + 0,055f), 2,4f): (R / 12,92f); G = (G> 0,04045f)? pow ((G + 0,055f) / (1,0f + 0,055f), 2,4f): (G / 12,92f); B = (B> 0,04045f)? pow ((B + 0,055f) / (1,0f + 0,055f), 2,4f): (B / 12,92f); двойной X = R * 0,649926f + G * 0,103455f + B * 0,197109f; двойной Y = R * 0,234327f + G * 0,743075f + B * 0,022598f; двойной Z = R * 0,0000000f + G * 0,053077f + B * 1,035763f; двойной x = X / (X + Y + Z); двойной y = Y / (X + Y + Z); // преобразование не полностью завершено, но, вероятно, достаточно хорошо для того, чего мы хотим достичь, поэтому оставьте это на этом и отправьте значения XY в lamp: sendtoHue (x, y); } void sendtoHue (double a, double b) {// фактическое изменение цвета от волшебной палочки if (first) {// первый проход: получить текущее состояние лампы getCurrentValues (); } // затем отправляем волшебную палочку colors: // ждать заклинания: long wait; x_magic = а; y_magic = b; // лампа в волшебной палочке color: response = ""; интервал темп = случайный (2, 9); const char * state = "истина"; for (int i = 1; i <= temp; i ++) {// создаем массив символов для отправки на мост: String temp_body1 = "{" on / ":" + String (state) + ", \" bri / ": 220, / "xy \": ["+ String (x_magic) +", "+ String (y_magic) +"], / "transitiontime \": 1} "; int str_len1 = temp_body1.length () + 1; char post_body1 [str_len1]; temp_body1.toCharArray (post_body1, str_len1); // теперь у нас есть post_body1 как массив char; // сделать вызов для отдыха: int statusCodePut1 = client.put ("/ api / ИМЯ ПОЛЬЗОВАТЕЛЯ API HUE / lights / НОМЕР ВАШЕГО СВЕТА / состояние", post_body1, & response); ждать = случайный (100, 600); задержка (ждать); если (состояние == "истина") {состояние = "ложь"; } еще {состояние = "истина"; }} // уменьшаем яркость…: response = ""; temp = random (4, 17); // создаем массив символов для отправки мосту: String temp_body2 = "{" on / ": true, \" bri / ": 154, \" transitiontime / ":" + String (temp) + "}"; int str_len2 = temp_body2.length () + 1; char post_body2 [str_len2]; temp_body2.toCharArray (post_body2, str_len2); // теперь у нас есть post_body2 как char array; // сделать вызов отдыха: int statusCodePut2 = client.put ("/ api / ВАШ ИМЯ ПОЛЬЗОВАТЕЛЯ HUE API / lights / ВАШ НОМЕР СВЕТА / состояние", post_body2, & response); ждать = случайный (1000, 2500); задержка (ждать); //..и снова сделаем ярче: response = ""; temp = random (4, 17); // создаем массив символов для отправки на мост: String temp_body3 = "{" bri_inc / ": 100, \" transitiontime / ":}"; int str_len3 = temp_body3.length () + 1; char post_body3 [str_len3]; temp_body3.toCharArray (post_body3, str_len3); // теперь у нас есть post_body3 как char array; // сделать вызов для отдыха: int statusCodePut3 = client.put ("/ api / ИМЯ ПОЛЬЗОВАТЕЛЯ HUE API / lights / НОМЕР ВАШЕГО СВЕТА / состояние", post_body3, & response); ждать = случайный (2500, 5000); // ждать 2-5 секунд delay (wait); // и вернуться к старому значению: response = ""; // создаем массив символов для отправки на мост: String temp_body4 = "{" on / ":" + String (aan_restore) + ", \" bri / ":" + String (bri_restore) + ", \" xy / ": ["+ String (x_restore) +", "+ String (y_restore) +"], / "transitiontime \": "+ String (20) +"} "; int str_len4 = temp_body4.length () + 1; char post_body4 [str_len4]; temp_body4.toCharArray (post_body4, str_len4); // теперь у нас есть post_body4 как массив символов; // сделать вызов отдыха: int statusCodePut4 = client.put ("/ api / ИМЯ ПОЛЬЗОВАТЕЛЯ HUE API / lights / НОМЕР ВАШЕГО СВЕТА / состояние", post_body4, & response); ESP.deepSleep (0); // снова засыпаем…. } unsigned int getCurrentValues () {connectWifi (); // сначала подключаемся к Wi-Fi response = ""; // сделать вызов для отдыха: int statusCodeGet = client.get ("/ api / ИМЯ ПОЛЬЗОВАТЕЛЯ HUE API / lights / НОМЕР ВАШЕГО СВЕТА", & response); Serial.print ("Код состояния с сервера после GET:"); Serial.println (statusCodeGet); Serial.print ("Тело ответа от сервера:"); Serial.println (ответ); StaticJsonBuffer jsonBuffer; // Разбор ответа Json // Корень дерева объектов. // // Это ссылка на JsonObject, фактические байты // находятся внутри jsonBuffer со всеми остальными узлами дерева объектов. // Память освобождается, когда jsonBuffer выходит за пределы области видимости. JsonObject & root = jsonBuffer.parseObject (ответ); JsonObject & state = root ["state"]; // Проверяем успешность синтаксического анализа. если (! root.success ()) {Serial.println ("сбой parseObject ()"); } // Извлекаем значения. aan_restore = состояние ["включено"]; Serial.println (aan_restore); bri_restore = состояние ["bri"]; x_restore = состояние ["ху"] [0]; y_restore = состояние ["ху"] [1]; first = false;} void connectWifi () {// Локальная инициализация. После того, как его бизнес завершен, нет необходимости держать его около WiFiManager wifiManager; // сброс настроек - для тестирования: //wifiManager.resetSettings (); // установить обратный вызов, который вызывается при сбое подключения к предыдущему Wi-Fi и входит в режим точки доступа wifiManager.setAPCallback (configModeCallback); // выбирает ssid и передает и пытается подключиться // если не подключается, запускает точку доступа с указанным именем // здесь «AutoConnectAP» // и переходит в цикл блокировки, ожидая конфигурации if (! wifiManager.autoConnect ()) {Serial.println ("не удалось подключиться, истекло время ожидания"); // сбросить и повторить попытку или, может быть, перевести его в режим глубокого сна ESP.reset (); задержка (1000); } // если вы попали сюда, значит, вы подключились к WiFi Serial.println ("connected… yeey:)"); Serial.print («Подключено к:»); Serial.println (WiFi. SSID ()); Serial.print ("IP-адрес:"); Serial.println (WiFi.localIP ()); // IP-адрес, назначенный вашему ESP (Wemos) // вывод мощности полученного сигнала: long rssi = WiFi. RSSI (); Serial.print ("мощность сигнала (RSSI):"); Serial.println (rssi); } void configModeCallback (WiFiManager * myWiFiManager) {Serial.println («Введен в режим конфигурации»); Serial.println (WiFi.softAPIP ()); // если вы использовали автоматически сгенерированный SSID, распечатайте его Serial.println (myWiFiManager-> getConfigPortalSSID ()); }

Рекомендуемые: