Our dryer’s timer broke just when it was needed most. We just had guests arrive with kids (the type that soil clothing by the minute). We just had a blizzard. And of course, it was the weekend; no repair shops.
I opened the dryer’s front panel to look for an easy fix. At this point, I’d not known the cause of the breakdown; the symptom was that the dryer didn’t start. Inside the front panel, I found a schematic with some troubleshooting instructions. By the time I determined that the timer had gone bad, I also realized that the timer really was just a buzzer, coil, and about 7 relays on a board.
Figure 1: Dryer Circuit Schematics

Why not create an electronic version of timer; maybe not the entire timer replacement but just get one cycle to function. Fortunately, I’d all the gizmos I needed:

  • Raspberry pi Zero
  • Protoboard
  • Relay board
  • WiFi Adapter
  • I2C 4x20 Display. Sort of optional, but quite handy for feedback.
Figure 2: Raspberry PI, Relay & Display
It took about an hour to assemble the hardware (see Figure 2Pi Dryer). Raspberry pi Zero is in the wooden case with room for protoboard. It is powered by AC/DC adapter using USB port A. WiFi adapter is connected with USB port B. Relay logic strip is connected to the appropriate GPIO pins, with first and last pins connected to ground and power (VCC) respectively. High Voltage end of the relays are connected to the dryer.

When pi boots, an rc.local launches Pi Dryer’s startup script which display’s the board’s IP address and initializes the relays.

import socket
import fcntl
import struct

def get_ip_address(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    return socket.inet_ntoa(fcntl.ioctl(
        s.fileno(),
        0x8915,  SIOCGIFADDR
        struct.pack('256s', ifname[:15])
    )[20:24])

lo =  get_ip_address('lo')
wlan = get_ip_address('wlan0')

I can then ssh into the device and run timer script.

import RPi.GPIO as GPIO
import time

relay_pins = {'one'11'two':7'three':12'four':16'five':18'six':22'seven':15'eight':13}

GPIO.setmode(GPIO.BOARD)  # use P1 header pin numbering convention
GPIO.setwarnings(False)   # don't want to hear about how pins are already in use

for relay_pin, board_pin in relay_pins.iteritems():
        GPIO.setup(board_pin, GPIO.OUT)
        GPIO.output(board_pin, GPIO.LOW) # turn off

cycle_time = 1.0 # in seconds

GPIO.output(relay_pins['one'], GPIO.HIGH)
time.sleep(cycle_time)
GPIO.output(relay_pins['one'], GPIO.LOW)

This was a very simple project to make and pretty unintelligent at that. But it was very useful, at least for me. By the way, I’d bought Raspberry PI Zero for one dollar. (Altogether, about $25 worth of components).