Дети часто просыпаются и не знают, сколько сейчас времени, поэтому часы-тренажеры, подобные изображенному ниже, также встречаются довольно часто. Звезды ночью, а затем в назначенное время появляется мистер Саншайн.

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

Некоторое время мне было интересно узнать о ярких светодиодах NeoPixels от Adafruit, и я подумал, могут ли они быть объединены с более эстетичным подходом к нашей бесконечной погоне за ночлегами после 5 часов утра!

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

После поиска в Google Snapology Origami я с радостью обнаружил, что попал в еще одну кроличью нору в Интернете.

Большинство источников указывают на Хайнца Стробла как на первооткрывателя, и, по его словам, Snapology Origami ...

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

Между его сайтом и сайтом Дэйва Хонда я обнаружил несколько довольно завораживающих дизайнов и не мог не задаться вопросом, какие узоры света будут падать от источника света в центре.

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

Вскоре я стал гордым создателем разноцветного Икосаэдра.

Но именно с этой моделью, по-видимому, называемой икосододекаэдром, у меня был момент лампочки… буквального типа.

Немного погуглив, я наткнулся на этот дизайн Эда Чу. Он использовал переработанные картонные коробки Tetrapak для создания сферической лампы, за которую получил награду за дизайн. Я немного сомневался в подлинности показанных световых узоров, но подумал, что было бы здорово создать что-то в том же духе и выяснить, смогу ли я получить аналогичные результаты. И, как вы увидите, мне не нужно было сомневаться в созданном свете и тени.

Приложения NeoPixel

Я читал и видел несколько интересных приложений NeoPixels от Adafruit и понял, что они достаточно яркие. Они бывают всех форм и размеров, и их можно соединить вместе. Их также можно соединить индивидуально или даже вшить в ткань с помощью токопроводящей нити, как показано здесь, на канале Adafruit.

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

Мой дизайн

Я начал экономить картонные коробки Tetrapak, но после того, как понял, что моей жене нужно будет выпить 400 литров соевого молока, прежде чем мне будет достаточно, я потерял терпение, направился в Tesco и купил еще кучу цветной бумаги. Я сделал быстрый макет, используя равносторонние сложенные треугольники, и хотя свет от светодиода моего телефона давал приятный узор, каналы вокруг частей пятиугольника выглядели как пропасти, что уменьшало сферический вид, к которому я стремился.

В ходе экспериментов с геодезическими куполами я узнал, что в основе геометрической сферы лежит икосаэдр, 20-гранная форма, состоящая из равносторонних треугольных граней, каждая вершина которой является точкой пересечения пяти ребер. Чтобы придать граням изгиб, каждый треугольник разбивают на меньшие треугольники с ребрами разной длины. Чем меньше треугольники, тем более сферический вид.

Моя геодезическая тюрьма, солнце и земля, и мой картонный купол были тремя частотными куполами: между каждой вершиной было по три точки. Лампа Ed Chews Tetrapak представляла собой чрезвычайно сложную шестичастотную сферу! Для своей лампы я решил выбрать четырехчастотную структуру.

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

Я использовал тот же калькулятор эодезического купола, который использовал ранее, который показал, что для четырехчастотной сферы мне теоретически потребовалось бы шесть разных длин краев внутренних треугольников, но, поскольку сложить это было бы кошмаром, я пошел только для двух треугольников: равнобедренные треугольники для вершин, в которых части пятиугольника будут формироваться с двумя меньшими ребрами, а затем равносторонние треугольники для всего остального. Согласно расчету купола, получится сфера диаметром 15 см.

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

Теперь я понимаю, что поклонники Raspberry Pi и Adafruit, возможно, устали от всех этих разговоров о складывании бумаги, поэтому вот быстрый взгляд на какой-то воображаемый код оригами на Python.

Я сознательно не работал с этим заранее, так как знал, что цифры будут пугающими, но каждая из 20 граней состояла из 16 меньших треугольников, в общей сложности 320 треугольников и более 600 соединительных элементов.

По правде говоря, на самом деле это было довольно успокаивающе - я могу порекомендовать это, если вы ищете занятие по типу осознанности или пытаетесь бросить курить. Я даже могу представить себе класс, полный детей, уклоняющихся, слушая учителя. Ох уж аргументы! Сэр, Джонни не вернет мой частично завершенный ромбокубооктаэдр! Что ж, было приятно сидеть перед телевизором и смотреть старые серии про друзей. Немного похоже на вязание.

Это действительно начало обретать форму, и на полпути я начал понимать, как это может выглядеть с сияющими Neo Pixels. Или как было бы, если бы кот Оскар занялся фехтованием!

Я купил Raspberry Pi Zero W за 13 фунтов стерлингов, пластиковый корпус за 3 фунта стерлингов и кольцо NeoPixel за 7 фунтов стерлингов. Кольцо оснащено 12 светодиодами RGB, которые можно индивидуально запрограммировать. Я также купил SD-карту с предустановленным NOOBS и настроил ее с помощью нашего телевизора в гостиной. Вскоре все было подключено, и я смог войти в него через SSH.

Хотя у Raspberry Pi были предварительно припаяны разъемы, не было необходимости извлекать паяльник для подключения кольца NeoPixel Ring к перемычкам, что я, к счастью, сделал без проблем.

Я следил за обучающими материалами на веб-сайтах Pi Hut и Adafruit, чтобы настроить Pi и запустить его с Circuit Python, версией Python, разработанной для микроконтроллеров. Удивительно, но все прошло без сучка и задоринки!

После завершения было относительно легко получить мой «Hello world», или, лучше сказать, «Hello Green»!

В файле Python вам просто нужно импортировать плату, а NeoPixels определить переменную, указывающую пи, к какому выводу вы подключены, количество пикселей и уровень яркости.

import board
import neopixel
pixels = neopixel.NeoPixel(board.D18,12,brightness=1)

Затем вы можете заполнить все светодиоды таким цветом, как этот, со значением до 255 для RGB - так что здесь показано полностью зеленое! Привет, Грин!

pixels.fill((0, 255, 0)

Или укажите только один светодиод так (первый пиксель синий).

pixels[0] = (0, 0, 255)

Было действительно приятно видеть, как загорелся свет - я немного волновался, что мне может понадобиться второй источник питания сверх 5 В, которые выдает вывод Pi, но с 12 пикселями Neo это не было проблемой.

В предыдущих проектах Pi я кодировал прямо на Pi с подключенным монитором. Однако наличие монитора рядом с лампой на полке убило бы взгляд, к которому я стремился, поэтому я быстро начал редактировать код с помощью Juice SSH Android. Приложение на моем телефоне, но, как вы понимаете, вскоре это оказалось немного неприятно и проблематично. В процессе установки я выполнил несколько команд wget, и поэтому подумал, что, возможно, я смогу просто отредактировать и разместить файлы python на моем собственном веб-сайте, а затем wget к пи. Вот что я в итоге сделал, используя веб-IDE CodeTasty на своем Chromebook.

С 12 светодиодами и 16 миллионами цветовых комбинаций возможности были безграничны, и вскоре я закодировал несколько последовательностей и сумел поместить кольцо NeoPixel в основание лампы. Посмотрите видео выше, чтобы увидеть, как работает лампа.

У меня было две программы, заменяющие дневные и ночные настройки часов GRO: программа с плавным отключением, которая медленно гаснет с синего цвета, а затем остается на низком уровне, как ночник; Г-н Саншайн медленно нагревается до полной яркости в назначенное время утром.

До свидания, мистер Саншайн:

def goodbye_mr_sunshine():
 for x in range(5, 256, 5):
  brightness = 256 - x
  print(brightness)
  for y in range(12):
   pixels[y]=(0,0,brightness)
   time.sleep(0.5)
   print(y)
goodbye_mr_sunshine()

Здравствуйте, мистер Саншайн:

pixels = neopixel.NeoPixel(board.D18,12)
def hello_mr_sunshine():
 for x in range(5, 256, 5):
  print(x)
  for y in range(12):
   pixels[y]=(x,x,0)
   time.sleep(0.1)
   print(y)
hello_mr_sunshine()

Чтобы эти программы запускались удаленно, я сначала подумал, могу ли Pi транслировать свою собственную сеть Wi-Fi для подключения устройства, а затем каким-то образом управлять лампой.

В конце концов, я написал сценарий python для выбора программ, который проверяет файл JSON на моем сайте, чтобы узнать, изменился ли статус программы. Супер простая веб-форма устанавливает программу, передавая ее имя в файл JSON через переменную URL и скрипт PHP.

import urllib.request
import datetime
import time
import json
import re
import mechanize
import psutil
import os
url = 'https://reveleigh.com/lamp/sunshine-lamp/alarm.json'
req = urllib.request.Request(url)
r = urllib.request.urlopen(req).read()
cont = json.loads(r.decode('utf-8'))
h = cont["hour"]
m = cont["minute"]
#Get times info
now = datetime.datetime.now()
alarm = now.replace(hour=h, minute=m, second=0, microsecond=0)
alarmEnd = alarm.replace(hour=h, minute=m+5, second=0, microsecond=0)
alarmReset = alarm.replace(hour=h, minute=m+10, second=0, microsecond=0)
#killing process function.
def killAllButParent():
 for proc in psutil.process_iter():
    pinfo = proc.as_dict(attrs=['pid', 'name'])
    procname = str(pinfo['name'])
    procpid = str(pinfo['pid'])
    if "python" in procname and procpid != str(os.getpid()):
     print("Stopped Python Process ", proc)
     proc.kill()
#I it time to wake up?
if now > alarm and now < alarmEnd:
#If alarm is inactive run alarm
 try:
  url = 'https://reveleigh.com/lamp/sunshine-lamp/alarm-status.json'
  req = urllib.request.Request(url)
  r = urllib.request.urlopen(req).read()
  cont = json.loads(r.decode('utf-8'))
  print(cont["status"])
  
  if cont["status"] == "I":
   
   br = mechanize.Browser()
   br.open("https://reveleigh.com/lamp/sunshine-lamp/alarm.php?a=A")
#Kill any other programs running
   killAllButParent()
#Run the morning alarm
   import morning
#Set alarm to active
except:
  print("An alarm error occurred")
else:
try:
  url = 'https://reveleigh.com/lamp/sunshine-lamp/program.json'
  req = urllib.request.Request(url)
  r = urllib.request.urlopen(req).read()
  cont = json.loads(r.decode('utf-8'))
  br = mechanize.Browser()
  
  #Stop other Python processes if not clear
  if cont["program"] != "Clear":
   killAllButParent()
    
  print(cont["program"])
  if cont["program"] == "Off":
   br.open("https://reveleigh.com/lamp/sunshine-lamp/program-select.php?p=Clear")
   import off
  elif cont["program"] == "Morning":
   br.open("https://reveleigh.com/lamp/sunshine-lamp/program-select.php?p=Clear")
   import morning
  elif cont["program"] == "Drifting":
   br.open("https://reveleigh.com/lamp/sunshine-lamp/program-select.php?p=Clear")
   import drifting
  elif cont["program"] == "Maze of Triangles":
   br.open("https://reveleigh.com/lamp/sunshine-lamp/program-select.php?p=Clear")
   import random_triangle
  elif cont["program"] == "Vortex":
   br.open("https://reveleigh.com/lamp/sunshine-lamp/program-select.php?p=Clear")
   import single_dance
  elif cont["program"] == "Shimmer":
   br.open("https://reveleigh.com/lamp/sunshine-lamp/program-select.php?p=Clear")
   import shimmer
  elif cont["program"] == "Colour Wheel":
   br.open("https://reveleigh.com/lamp/sunshine-lamp/program-select.php?p=Clear")
   import colour_pulse
  elif cont["program"] == "Reboot":
   br.open("https://reveleigh.com/lamp/sunshine-lamp/program-select.php?p=Clear")
   import reboot
  elif cont["program"] == "Shutdown":
   br.open("https://reveleigh.com/lamp/sunshine-lamp/program-select.php?p=Clear")
   import shutdown
  else:
   print("Clear")
 
 except:
  print("An light exception occurred")
#Set the alarm to inactive
if now > alarmEnd and now < alarmReset:
 #Reset the alarm
 br = mechanize.Browser()
 br.open("https://reveleigh.com/lamp/sunshine-lamp/alarm.php?a=I")

Наконец, я использовал файл crontab на пи, чтобы запланировать запуск сценария селектора программ один раз в минуту, что показалось немного странным, если честно. Я знаю, что это всего лишь компьютер, но мне показалось странным думать о лампе, проверяющей мой сайт более тысячи раз в день, будет ли раздражаться мой веб-сервер?

* * * * * python3 /home/pi/program-selector.py

Будет ли мой веб-сервер делать то же самое, что и крик «Заткнись» на веб-сервере? Возможно, я мог бы начать продавать лампу какую-нибудь рекламу - скажем, для наборов для увеличения нити накала.

Лампа не только доставляет удовольствие, но и служит источником утреннего восхода солнца. Смысл ясен: если желтый, пусть смягчится, если коричневый - смойте. Ждать. Это не так. Что ж, если сейчас ночь, он будет синим, так что оставайтесь в постели, желтый означает вставать, а когда он исчезает, это мягкий сигнал для пробуждения без поджаривания сетчатки.

Я определенно собираюсь поиграть с NeoPixels в будущем. Я бы с удовольствием завернул их в стеганое одеяло - может быть, в стеганый будильник или в стеганую стену с подсветкой для класса. Или, возможно, луна Snapology с фазами. Или маяк, который загорается каждый раз, когда проходит международная космическая станция. Или есть твит Илона Маска. Или когда машина сзади подходит слишком близко.

Больше контента на plainenglish.io