• GPIO gpio robot


  • Use four GPIO buttons as forward/back/left/right controls for a robot:


  •  
    from gpiozero import Robot, Button
    from signal import pause
    
    robot = Robot(left=(4, 14), right=(17, 18))
    
    left = Button(26)
    right = Button(16)
    fw = Button(21)
    bw = Button(20)
    
    fw.when_pressed = robot.forward
    fw.when_released = robot.stop
    
    left.when_pressed = robot.left
    left.when_released = robot.stop
    
    right.when_pressed = robot.right
    right.when_released = robot.stop
    
    bw.when_pressed = robot.backward
    bw.when_released = robot.stop
    
    pause()
    
    
  • GPIO gpio light sensor


  • Make a robot drive forward when it detects motion:


  •  
    from gpiozero import Robot, MotionSensor
    from signal import pause
    
    robot = Robot(left=(4, 14), right=(17, 18))
    pir = MotionSensor(5)
    
    pir.when_motion = robot.forward
    pir.when_no_motion = robot.stop
    
    pause()
    
      
    
  • Alternatively:


  •  
    from gpiozero import Robot, MotionSensor
    from gpiozero.tools import zip_values
    from signal import pause
    
    robot = Robot(left=(4, 14), right=(17, 18))
    pir = MotionSensor(5)
    
    robot.source = zip_values(pir, pir)
    
    pause()
    
    
  • GPIO gpio potentiometer


  • Continually print the value of a potentiometer (values between 0 and 1) connected to a MCP3008 analog to digital converter:


  •  
    from gpiozero import MCP3008
    
    pot = MCP3008(channel=0)
    
    while True:
        print(pot.value)
        
    
  • Present the value of a potentiometer on an LED bar graph using PWM to represent states that won’t “fill” an LED:


  •  
    from gpiozero import LEDBarGraph, MCP3008
    from signal import pause
    
    graph = LEDBarGraph(5, 6, 13, 19, 26, pwm=True)
    pot = MCP3008(channel=0)
    
    graph.source = pot
    
    pause()
    
    
  • Wire a TMP36 temperature sensor to the first channel of an MCP3008 analog to digital converter:


  •  
    from gpiozero import MCP3008
    from time import sleep
    
    def convert_temp(gen):
        for value in gen:
            yield (value * 3.3 - 0.5) * 100
    
    adc = MCP3008(channel=0)
    
    for temp in convert_temp(adc.values):
        print('The temperature is', temp, 'C')
        sleep(1)
        
    
  • GPIO gpio light sensor


  • Wire up three potentiometers (for red, green and blue) and use each of their values to make up the colour of the LED:


  •  
    from gpiozero import RGBLED, MCP3008
    
    led = RGBLED(red=2, green=3, blue=4)
    red_pot = MCP3008(channel=0)
    green_pot = MCP3008(channel=1)
    blue_pot = MCP3008(channel=2)
    
    while True:
        led.red = red_pot.value
        led.green = green_pot.value
        led.blue = blue_pot.value
    
    
  • Alternatively, the following example is identical, but uses the source property rather than a while loop:


  •  
    from gpiozero import RGBLED, MCP3008
    from gpiozero.tools import zip_values
    from signal import pause
    
    led = RGBLED(2, 3, 4)
    red_pot = MCP3008(0)
    green_pot = MCP3008(1)
    blue_pot = MCP3008(2)
    
    led.source = zip_values(red_pot, green_pot, blue_pot)
    
    pause()
    
    
  • If you have a pet (e.g. a tortoise) which requires a heat lamp to be switched on for a certain amount of time each day, you can use an Energenie Pi-mote to remotely control the lamp, and the TimeOfDay class to control the timing:


  •  
    from gpiozero import Energenie, TimeOfDay
    from datetime import time
    from signal import pause
    
    lamp = Energenie(1)
    daytime = TimeOfDay(time(8), time(20))
    
    lamp.source = daytime
    lamp.source_delay = 60
    
    pause()
    
    
  • You can use a pair of green and red LEDs to indicate whether or not your internet connection is working. Simply use the PingServer class to identify whether a ping to google.com is successful. If successful, the green LED is lit, and if not, the red LED is lit:


  •  
    from gpiozero import LED, PingServer
    from gpiozero.tools import negated
    from signal import pause
    
    green = LED(17)
    red = LED(18)
    
    google = PingServer('google.com')
    
    green.source = google
    green.source_delay = 60
    red.source = negated(green)
    
    pause()
    
    
  • You can read the Raspberry Pi’s own CPU temperature using the built-in CPUTemperature class, and display this on a “bar graph” of LEDs:


  •  
    from gpiozero import LEDBarGraph, CPUTemperature
    from signal import pause
    
    cpu = CPUTemperature(min_temp=50, max_temp=90)
    leds = LEDBarGraph(2, 3, 4, 5, 6, 7, 8, pwm=True)
    
    leds.source = cpu
    
    pause()
    
    
  • You can iterate over the LEDs in a LEDBoard object one-by-one:


  •  
    from gpiozero import LEDBoard
    from time import sleep
    
    leds = LEDBoard(5, 6, 13, 19, 26)
    
    for led in leds:
        led.on()
        sleep(1)
        led.off()
       
    
  • LEDBoard also supports indexing. This means you can access the individual LED objects using leds[i] where i is an integer from 0 up to (not including) the number of LEDs:


  •  
    from gpiozero import LEDBoard
    from time import sleep
    
    leds = LEDBoard(2, 3, 4, 5, 6, 7, 8, 9)
    
    leds[0].on()  # first led on
    sleep(1)
    leds[7].on()  # last led on
    sleep(1)
    leds[-1].off()  # last led off
    sleep(1)
    
    
  • This also means you can use slicing to access a subset of the LEDs:


  •  
    from gpiozero import LEDBoard
    from time import sleep
    
    leds = LEDBoard(2, 3, 4, 5, 6, 7, 8, 9)
    
    for led in leds[3:]:  # leds 3 and onward
        led.on()
    sleep(1)
    leds.off()
    
    for led in leds[:2]:  # leds 0 and 1
        led.on()
    sleep(1)
    leds.off()
    
    for led in leds[::2]:  # even leds (0, 2, 4...)
        led.on()
    sleep(1)
    leds.off()
    
    for led in leds[1::2]:  # odd leds (1, 3, 5...)
        led.on()
    sleep(1)
    leds.off()
    
    
  • LEDBoard objects can have their LED objects named upon construction. This means the individual LEDs can be accessed by their name:


  •  
    from gpiozero import LEDBoard
    from time import sleep
    
    leds = LEDBoard(red=2, green=3, blue=4)
    
    leds.red.on()
    sleep(1)
    leds.green.on()
    sleep(1)
    leds.blue.on()
    sleep(1)
    
    
  • LEDBoard objects can also be nested within other LEDBoard objects:


  •  
    from gpiozero import LEDBoard
    from time import sleep
    
    leds = LEDBoard(red=LEDBoard(top=2, bottom=3), green=LEDBoard(top=4, bottom=5))
    
    leds.red.on() ## both reds on
    sleep(1)
    leds.green.on()  # both greens on
    sleep(1)
    leds.off()  # all off
    sleep(1)
    leds.red.top.on()  # top red on
    sleep(1)
    leds.green.bottom.on()  # bottom green on
    sleep(1)
    
    
  • Using a number of green-red LED pairs, you can show the status of who’s home, according to which IP addresses you can ping successfully. Note that this assumes each person’s mobile phone has a reserved IP address on the home router.


  •  
    from gpiozero import PingServer, LEDBoard
    from gpiozero.tools import negated
    from signal import pause
    
    status = LEDBoard(
        mum=LEDBoard(red=14, green=15),
        dad=LEDBoard(red=17, green=18),
        alice=LEDBoard(red=21, green=22)
    )
    
    statuses = {
        PingServer('192.168.1.5'): status.mum,
        PingServer('192.168.1.6'): status.dad,
        PingServer('192.168.1.7'): status.alice,
    }
    
    for server, leds in statuses.items():
        leds.green.source = server
        leds.green.source_delay = 60
        leds.red.source = negated(leds.green)
    
    pause()