Idea

My son has this new habit of getting up at 04:00 and wandering into the living room alone. He gets scared and confused because he doesn't realize that no one else is awake. This light was designed to be a "go / no-go" signal for him to get back to bed. It's green during "woke up" hours and red during "sleepy time."

 

Build

This design includes multiple layers: A Raspberry Pi Zero, some Python code, NeoPixel RGB LEDs, and some 3D prints in both clear and black designed in Fusion 360.

The Raspberry Pi uses something called "GPIO" to physically interface with the outside world. Connecting wires to things like relays or LEDs allows the Raspberry Pi to communicate through Python code.

In the case of NeoPixel LEDs, only GPIO 10, 12, 18, or 21 will work. Note that the GPIO number is not equal to the pin number on the Pi. GPIO 10 for example is pin 19.

These are the steps I took to get this project going:

  • Burn Raspbian to a micro SD Card (more info)
  • Create a blank file called "ssh" on the micro SD Card
  • Create a "WPA-Supplicant" file on the micro SD Card (more info)
  • SSH to Pi
  • Immediately change user password using command passwd
  • sudo apt-get update
  • sudo apt-get upgrade
  • Set the Pi to the correct timezone (more info)
  • sudo apt-get install python3
  • sudo apt-get install python-rpi.gpio python3-rpi.gpio
  • apt install python3-pip
  • sudo pip3 install adafruit-circuitpython-neopixel

I created a new file called "led.py" in a folder under /home/pi/scripts/ and ran > chmod 755 led.py to give it generally acceptable permissions.

In led.py, I wrote the following:

import board
import neopixel
import datetime
import time

pixel_pin = board.D18     # GPIO number (not pin number)
num_pixels = 5            # total number of LEDs
BRIGHTNESS = 0.2          # value from 0.1 to 1.0
ORDER = neopixel.RGB
pixels = neopixel.NeoPixel(pixel_pin, num_pixels, brightness=BRIGHTNESS,auto_write=False,pixel_order=ORDER)

while True:
  x = datetime.datetime.now()
  if 7 <= x.hour < 21:
    pixels.fill((255,0,0))
    pixels.show()
    time.sleep(60)
  else:
    pixels.fill((0,255,0))
    pixels.show()
    time.sleep(60)

The last little bit was to get this running automatically on startup. For that we use a tool called CronTab. Typing > sudo crontab -e will bring you into the root user's cron scheduler. Adding the following line will get your Python script running without needing to login to your Pi. Note the "&" puts the task in the background.

@reboot python3 /home/pi/scripts/led.py &

 

Thoughts

This was a great learning experience as I'm just starting to get good at Python. It's a great scripting language and is incredibly fun to use. Let's see if this continues to work well and if it prevents my son from having some late night scary moments.