[
  {
    "path": "README.md",
    "content": "raspberrypi_cookbook\n====================\n\nThe source code from the book 'The Raspberry Pi Cookbook' by Simon Monk."
  },
  {
    "path": "code/AlaModeShield/AlaModeShield.ino",
    "content": "\n#include <LiquidCrystal.h>\n\n// pins for Freetronics LCD Shield\n\nLiquidCrystal lcd(8, 9, 4, 5, 6, 7);\n\nvoid setup() \n{\n  lcd.begin(16, 2);\n  lcd.print(\"Counting!\");\n}\n\nvoid loop() \n{\n  lcd.setCursor(0, 1);\n  lcd.print(millis() / s1000);\n}\n\n"
  },
  {
    "path": "code/ArduinoHello/ArduinoHello.ino",
    "content": "// ArduinoHello\n\nvoid setup()\n{\n  Serial.begin(9600); \n}\n\nvoid loop()\n{\n  Serial.println(\"Hello Raspberry Pi\");\n  delay(1000);\n}\n"
  },
  {
    "path": "code/ArduinoI2C/ArduinoI2C.ino",
    "content": "#include <Wire.h>\n\nint SLAVE_ADDRESS = 0x04;\nint ledPin = 13;\nint analogPin = A0;\n\nboolean ledOn = false;\n\nvoid setup() \n{\n    pinMode(ledPin, OUTPUT);\n    Wire.begin(SLAVE_ADDRESS);\n    Wire.onReceive(processMessage);\n    Wire.onRequest(sendAnalogReading);\n    Serial.begin(9600);\n}\n\nvoid loop()\n{\n}\n\nvoid processMessage(int n)\n{\n  Serial.println(\"In processMessage\");\n    char ch = Wire.read();\n    if (ch == 'l')\n    {\n      toggleLED();\n    }\n}\n\nvoid toggleLED()\n{\n  ledOn = ! ledOn;\n  digitalWrite(ledPin, ledOn);\n}\n\nvoid sendAnalogReading()\n{\n  Serial.println(\"In sendAnalogReading\");\n  int reading = analogRead(analogPin);\n  Wire.write(reading >> 2);\n}\n"
  },
  {
    "path": "code/ArduinoSerial/ArduinoSerial.ino",
    "content": "#include \"SoftwareSerial.h\"\n\nint ledPin = 13;\nint analogPin = A0;\n\nSoftwareSerial ser(8, 9); // RX, TX\n\nboolean ledOn = false;\n\nvoid setup()\n{\n  ser.begin(9600); \n  pinMode(ledPin, OUTPUT);\n}\n\nvoid loop()\n{\n  if (ser.available())\n  {\n    char ch = ser.read();\n    if (ch == 'l')\n    {\n      toggleLED();\n    }\n    if (ch == 'r')\n    {\n      sendAnalogReading();\n    }\n  }   \n}\n\nvoid toggleLED()\n{\n  ledOn = ! ledOn;\n  digitalWrite(ledPin, ledOn);\n}\n\nvoid sendAnalogReading()\n{\n  int reading = analogRead(analogPin);\n  ser.println(reading);\n}\n"
  },
  {
    "path": "code/adc_accelerometer.py",
    "content": "import spidev, time\n\nspi = spidev.SpiDev()\nspi.open(0,0)\n\ndef analog_read(channel):\n    r = spi.xfer2([1, (8 + channel) << 4, 0])\n    adc_out = ((r[1]&3) << 8) + r[2]\n    return adc_out\n \nwhile True:\n    x = analog_read(0)\n    y = analog_read(1)\n    z = analog_read(2)\n    print(\"X=%d\\tY=%d\\tZ=%d\" % (x, y, z))\n    time.sleep(1)"
  },
  {
    "path": "code/adc_scaled.py",
    "content": "import spidev\n\nR1 = 10000.0\nR2 = 3300.0\n\nspi = spidev.SpiDev()\nspi.open(0,0)\n\ndef analog_read(channel):\n    r = spi.xfer2([1, (8 + channel) << 4, 0])\n    adc_out = ((r[1]&3) << 8) + r[2]\n    return adc_out\n \nreading = analog_read(0)\nvoltage_adc = reading * 3.3 / 1024\nvoltage_actual =  voltage_adc / (R2 / (R1 + R2))\nprint(\"Battery Voltage=\" + str(voltage_actual))"
  },
  {
    "path": "code/adc_test.py",
    "content": "import spidev, time\n\nspi = spidev.SpiDev()\nspi.open(0,0)\n\ndef analog_read(channel):\n    r = spi.xfer2([1, (8 + channel) << 4, 0])\n    adc_out = ((r[1]&3) << 8) + r[2]\n    return adc_out\n \nwhile True:\n    reading = analog_read(0)\n    voltage = reading * 3.3 / 1024\n    print(\"Reading=%d\\tVoltage=%f\" % (reading, voltage))\n    time.sleep(1)"
  },
  {
    "path": "code/adc_tmp36.py",
    "content": "import spidev, time\n\nspi = spidev.SpiDev()\nspi.open(0,0)\n\ndef analog_read(channel):\n    r = spi.xfer2([1, (8 + channel) << 4, 0])\n    adc_out = ((r[1]&3) << 8) + r[2]\n    return adc_out\n \nwhile True:\n    reading = analog_read(0)\n    voltage = reading * 3.3 / 1024\n    temp_c = voltage * 100 - 50\n    temp_f = temp_c * 9.0 / 5.0 + 32\n    print(\"Temp C=%f\\t\\tTemp f=%f\" % (temp_c, temp_f))\n    time.sleep(1)"
  },
  {
    "path": "code/ardu_adc.py",
    "content": "import pyfirmata\nimport time\n\nboard = pyfirmata.Arduino('/dev/ttyACM0')\nanalog_pin = board.get_pin('a:0:i')\nit = pyfirmata.util.Iterator(board)\nit.start()\nanalog_pin.enable_reporting()\n\nwhile True:\n    reading = analog_pin.read()\n    if reading != None:\n        voltage = reading * 5.0\n        print(\"Reading=%f\\tVoltage=%f\" % (reading, voltage))\n        time.sleep(1)"
  },
  {
    "path": "code/ardu_flash.py",
    "content": "import pyfirmata\nimport time\n\nboard = pyfirmata.Arduino('/dev/ttyACM0')\nled_pin = board.get_pin('d:10:o')\n\nwhile True:\n    led_pin.write(1)\n    time.sleep(0.5)\n    led_pin.write(0)\n    time.sleep(0.5)"
  },
  {
    "path": "code/ardu_flash_micro.py",
    "content": "import pyfirmata\nimport time\n\nboard = pyfirmata.Arduino('/dev/ttyACM0')\nled_pin = board.get_pin('d:10:o')\n\nwhile True:\n    led_pin.write(1)\n    time.sleep(0.5)\n    led_pin.write(0)\n    time.sleep(0.5)\n"
  },
  {
    "path": "code/ardu_flash_ser.py",
    "content": "import pyfirmata\nimport time\n\nboard = pyfirmata.Arduino('/dev/ttyAMA0')\nled_pin = board.get_pin('d:13:o')\n\nwhile True:\n    led_pin.write(1)\n    time.sleep(0.5)\n    led_pin.write(0)\n    time.sleep(0.5)"
  },
  {
    "path": "code/ardu_gui_slider.py",
    "content": "from Tkinter import *\nimport time\nimport pyfirmata\n\nboard = pyfirmata.Arduino('/dev/ttyACM0')\nled_pin = board.get_pin('d:10:p')\n\nclass App:\n\t\n    def __init__(self, master):\n        frame = Frame(master)\n        frame.pack()\n        scale = Scale(frame, from_=0, to=100, \n              orient=HORIZONTAL, command=self.update)\n        scale.grid(row=0)\n\n\n    def update(self, duty):\n        led_pin.write(float(duty) / 100.0)\n\nroot = Tk()\nroot.wm_title('PWM Power Control')\napp = App(root)\nroot.geometry(\"200x50+0+0\")\nroot.mainloop()\n\n"
  },
  {
    "path": "code/ardu_gui_switch.py",
    "content": "from Tkinter import *\nimport pyfirmata\nimport time\n\nboard = pyfirmata.Arduino('/dev/ttyACM0')\nled_pin = board.get_pin('d:10:o')\n\nclass App:\n\t\n    def __init__(self, master):\n        frame = Frame(master)\n        frame.pack()\n        self.check_var = BooleanVar()\n        check = Checkbutton(frame, text='Pin 10', \n                 command=self.update,\n                 variable=self.check_var, onvalue=True, offvalue=False)\n        check.grid(row=1)\n\n    def update(self):\n        led_pin.write(self.check_var.get())\n\nroot = Tk()\nroot.wm_title('On / Off Switch')\napp = App(root)\nroot.geometry(\"200x50+0+0\")\nroot.mainloop()\n"
  },
  {
    "path": "code/ardu_pi_i2c.py",
    "content": "import smbus\nimport time\n\n# for RPI version 1, use \"bus = smbus.SMBus(0)\"\nbus = smbus.SMBus(1)\n\n# This must match in the Arduino Sketch\nSLAVE_ADDRESS = 0x04\n\ndef request_reading():\n    reading = int(bus.read_byte(SLAVE_ADDRESS))\n    print(reading)\n\n\nwhile True:\n    command = raw_input(\"Enter command: l - toggle LED, r - read A0 \")\n    if command == 'l' :\n        bus.write_byte(SLAVE_ADDRESS, ord('l'))\n    elif command == 'r' :\n        request_reading()\n"
  },
  {
    "path": "code/ardu_pi_serial.py",
    "content": "import serial\n\nser = serial.Serial('/dev/ttyAMA0', 9600)\n\nwhile True:\n    command = raw_input(\"Enter command: l - toggle LED, r - read A0 \")\n    if command == 'l' :\n        ser.write('l')\n    elif command == 'r' :\n        ser.write('r')\n        print(ser.readline())"
  },
  {
    "path": "code/ardu_pwm.py",
    "content": "import pyfirmata\n\nboard = pyfirmata.Arduino('/dev/ttyACM0')\nled_pin = board.get_pin('d:10:p')\n\nwhile True:\n    duty_s = raw_input(\"Enter Brightness (0 to 100):\")\n    duty = int(duty_s)\n    led_pin.write(duty / 100.0)"
  },
  {
    "path": "code/ardu_servo.py",
    "content": "import pyfirmata\n\nboard = pyfirmata.Arduino('/dev/ttyACM0')\nservo_pin = board.get_pin('d:11:s')\n\nwhile True:\n    angle_s = raw_input(\"Enter Angle (0 to 180):\")\n    angle = int(angle_s)\n    servo_pin.write(angle)"
  },
  {
    "path": "code/ardu_switch.py",
    "content": "import pyfirmata\nimport time\nimport sys\n\nboard = pyfirmata.Arduino('/dev/ttyACM0')\nswitch_pin = board.get_pin('d:4:i')\nit = pyfirmata.util.Iterator(board)\nit.start()\nswitch_pin.enable_reporting()\n\nwhile True:\n    input_state = switch_pin.read()\n    if input_state == False:\n        print('Button Pressed')\n        time.sleep(0.2)\n\n"
  },
  {
    "path": "code/bottle_test.py",
    "content": "from bottle import route, run, template\nfrom datetime import datetime\n\n@route('/')\ndef index(name='time'):\n    dt = datetime.now()\n    time = \"{:%Y-%m-%d %H:%M:%S}\".format(dt)\n    return template('<b>Pi thinks the date/time is: {{t}}</b>', t=time)\n\nrun(host='192.168.1.16', port=80)"
  },
  {
    "path": "code/buzzer.py",
    "content": "import RPi.GPIO as GPIO\nimport time\n\nbuzzer_pin = 18\nGPIO.setmode(GPIO.BCM)\nGPIO.setup(18, GPIO.OUT)\n\ndef buzz(pitch, duration):\n\tperiod = 1.0 / pitch\n\tdelay = period / 2\n\tcycles = int(duration * pitch)\n\tfor i in range(cycles):\n\t\tGPIO.output(buzzer_pin, True)\n\t\ttime.sleep(delay)\n\t\tGPIO.output(buzzer_pin, False)\n\t\ttime.sleep(delay)\n\t\t\n\nwhile True:\n        pitch_s = raw_input(\"Enter Pitch (200 to 2000): \")\n        pitch = float(pitch_s)\n        duration_s = raw_input(\"Enter Duration (seconds): \")\n        duration = float(duration_s)\n        buzz(pitch, duration)"
  },
  {
    "path": "code/charlieplexing.py",
    "content": "import RPi.GPIO as GPIO\n\npins = [18, 23, 24]\n\npin_led_states = [\n  [1, 0, -1], # A\n  [0, 1, -1], # B\n  [-1, 1, 0], # C\n  [-1, 0, 1], # D\n  [1, -1, 0], # E\n  [0, -1, 1]  # F\n]\n\nGPIO.setmode(GPIO.BCM)\n\ndef set_pin(pin_index, pin_state):\n    if pin_state == -1:\n        GPIO.setup(pins[pin_index], GPIO.IN)\n    else:\n        GPIO.setup(pins[pin_index], GPIO.OUT)\n        GPIO.output(pins[pin_index], pin_state)\n\ndef light_led(led_number):\n    for pin_index, pin_state in enumerate(pin_led_states[led_number]):\n        set_pin(pin_index, pin_state)\n\nset_pin(0, -1)\nset_pin(1, -1)\nset_pin(2, -1)\n\t\t\nwhile True:\n    x = int(raw_input(\"Pin (0 to 5):\"))\n    light_led(x)\n"
  },
  {
    "path": "code/gps_test.py",
    "content": "from gps import *\nsession = gps()\nsession.stream(WATCH_ENABLE|WATCH_NEWSTYLE)\n\nwhile True:\n    report = session.next()\n    if report.keys()[0] == 'epx' :\n        lat = float(report['lat'])\n        lon = float(report['lon'])\n        print(\"lat=%f\\tlon=%f\\ttime=%s\" % (lat, lon, report['time']))\n        time.sleep(0.5)"
  },
  {
    "path": "code/gui_sensor_reading.py",
    "content": "from Tkinter import *\nimport RPi.GPIO as GPIO\nimport time\n\ntrigger_pin = 18\necho_pin = 23\n\nGPIO.setmode(GPIO.BCM)\nGPIO.setup(trigger_pin, GPIO.OUT)\nGPIO.setup(echo_pin, GPIO.IN)\n\ndef send_trigger_pulse():\n    GPIO.output(trigger_pin, True)\n    time.sleep(0.0001)\n    GPIO.output(trigger_pin, False)\n\ndef wait_for_echo(value, timeout):\n    count = timeout\n    while GPIO.input(echo_pin) != value and count > 0:\n        count = count - 1\n\ndef get_distance():\n    send_trigger_pulse()\n    wait_for_echo(True, 10000)\n    start = time.time()\n    wait_for_echo(False, 10000)\n    finish = time.time()\n    pulse_len = finish - start\n    distance_cm = pulse_len / 0.000058\n    distance_in = distance_cm / 2.5\n    return (distance_cm, distance_in)\n\nclass App:\n\t\n    def __init__(self, master):\n        self.master = master\n        frame = Frame(master)\n        frame.pack()\n        label = Label(frame, text='Distance (inches)', font=(\"Helvetica\", 32))\n        label.grid(row=0)\n        self.reading_label = Label(frame, text='12.34', font=(\"Helvetica\", 110))\n        self.reading_label.grid(row=1)\n        self.update_reading()\n\n    def update_reading(self):\n        cm, inch = get_distance()\n        reading_str = \"{:.2f}\".format(inch)\n        self.reading_label.configure(text=reading_str)\n        self.master.after(500, self.update_reading)\n\n\nroot = Tk()\nroot.wm_title('Range Finder')\napp = App(root)\nroot.geometry(\"400x300+0+0\")\nroot.mainloop()\n\n"
  },
  {
    "path": "code/gui_slider.py",
    "content": "from Tkinter import *\nimport RPi.GPIO as GPIO\nimport time\n\nGPIO.setmode(GPIO.BCM)\nGPIO.setup(18, GPIO.OUT)\npwm = GPIO.PWM(18, 500)\npwm.start(100)\n\nclass App:\n\t\n    def __init__(self, master):\n        frame = Frame(master)\n        frame.pack()\n        scale = Scale(frame, from_=0, to=100, \n              orient=HORIZONTAL, command=self.update)\n        scale.grid(row=0)\n\n\n    def update(self, duty):\n        pwm.ChangeDutyCycle(float(duty))\n\nroot = Tk()\nroot.wm_title('PWM Power Control')\napp = App(root)\nroot.geometry(\"200x50+0+0\")\nroot.mainloop()\n\n"
  },
  {
    "path": "code/gui_sliderRGB.py",
    "content": "from Tkinter import *\nimport RPi.GPIO as GPIO\nimport time\n\nGPIO.setmode(GPIO.BCM)\nGPIO.setup(18, GPIO.OUT)\nGPIO.setup(23, GPIO.OUT)\nGPIO.setup(24, GPIO.OUT)\n\npwmRed = GPIO.PWM(18, 500)\npwmRed.start(100)\n\npwmGreen = GPIO.PWM(23, 500)\npwmGreen.start(100)\n\npwmBlue = GPIO.PWM(24, 500)\npwmBlue.start(100)\n\nclass App:\n\t\n    def __init__(self, master):\n        frame = Frame(master)\n        frame.pack()\n        Label(frame, text='Red').grid(row=0, column=0)\n        Label(frame, text='Green').grid(row=1, column=0)\n        Label(frame, text='Blue').grid(row=2, column=0)\n        scaleRed = Scale(frame, from_=0, to=100,\n              orient=HORIZONTAL, command=self.updateRed)\n        scaleRed.grid(row=0, column=1)\n        scaleGreen = Scale(frame, from_=0, to=100,\n              orient=HORIZONTAL, command=self.updateGreen)\n        scaleGreen.grid(row=1, column=1)\n        scaleBlue = Scale(frame, from_=0, to=100,\n              orient=HORIZONTAL, command=self.updateBlue)\n        scaleBlue.grid(row=2, column=1)\n\n\n    def updateRed(self, duty):\n        pwmRed.ChangeDutyCycle(float(duty))\n\n    def updateGreen(self, duty):\n        pwmGreen.ChangeDutyCycle(float(duty))\n\t\n    def updateBlue(self, duty):\n        pwmBlue.ChangeDutyCycle(float(duty))\n\nroot = Tk()\nroot.wm_title('RGB LED Control')\napp = App(root)\nroot.geometry(\"200x150+0+0\")\nroot.mainloop()"
  },
  {
    "path": "code/gui_switch.py",
    "content": "from Tkinter import *\nimport RPi.GPIO as GPIO\nimport time\n\nGPIO.setmode(GPIO.BCM)\nGPIO.setup(18, GPIO.OUT)\n\nclass App:\n\t\n    def __init__(self, master):\n        frame = Frame(master)\n        frame.pack()\n        self.check_var = BooleanVar()\n        check = Checkbutton(frame, text='Pin 18', \n                 command=self.update,\n                 variable=self.check_var, onvalue=True, offvalue=False)\n        check.grid(row=1)\n\n    def update(self):\n        GPIO.output(18, self.check_var.get())\n\nroot = Tk()\nroot.wm_title('On / Off Switch')\napp = App(root)\nroot.geometry(\"200x50+0+0\")\nroot.mainloop()\n"
  },
  {
    "path": "code/interrupts.py",
    "content": "import RPi.GPIO as GPIO\nimport time\n\nGPIO.setmode(GPIO.BCM)\n\ndef my_callback(channel):\n    print('You pressed the button')\n\nGPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)\nGPIO.add_event_detect(18, GPIO.FALLING, callback=my_callback) \n\ni = 0\nwhile True:\n    i = i + 1\n    print(i)\n    time.sleep(1)\n"
  },
  {
    "path": "code/keypad.py",
    "content": "import RPi.GPIO as GPIO\nimport time\n\nGPIO.setmode(GPIO.BCM)\n\nrows = [17, 25, 24, 23]\ncols = [27, 18, 22]\nkeys = [\n    ['1', '2', '3'],\n    ['4', '5', '6'],\n    ['7', '8', '9'],\n    ['*', '0', '#']]\n\nfor row_pin in rows:\n    GPIO.setup(row_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)\n\nfor col_pin in cols:\n    GPIO.setup(col_pin, GPIO.OUT)\n\ndef get_key():\n    key = 0\n    for col_num, col_pin in enumerate(cols):\n        GPIO.output(col_pin, 1)\n        for row_num, row_pin in enumerate(rows):\n            if GPIO.input(row_pin):\n                key = keys[row_num][col_num]\n        GPIO.output(col_pin, 0)\n    return key\n\nwhile True:\n    key = get_key()\n    if key :\n        print(key)\n    time.sleep(0.3)\n"
  },
  {
    "path": "code/keys_pygame.py",
    "content": "import pygame\nimport sys\nfrom pygame.locals import *\n\npygame.init()\nscreen = pygame.display.set_mode((640, 480))\npygame.mouse.set_visible(0)\n\nwhile True:\n    for event in pygame.event.get():\n        if event.type == QUIT:\n            sys.exit()\n        if event.type == KEYDOWN:\n            print(\"Code: \" + str(event.key) + \" Char: \" + chr(event.key))"
  },
  {
    "path": "code/keys_sys.py",
    "content": "import sys, tty, termios\n        \ndef read_ch():\n    fd = sys.stdin.fileno()\n    old_settings = termios.tcgetattr(fd)\n    try:\n        tty.setraw(sys.stdin.fileno())\n        ch = sys.stdin.read(1)\n    finally:\n        termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)\n    return ch\n\nwhile True:\n    ch = read_ch()\n    if ch == 'x':\n        break\n    print(\"key is: \" + ch)\n"
  },
  {
    "path": "code/led_blink.py",
    "content": "import RPi.GPIO as GPIO\nimport time\n\nGPIO.setmode(GPIO.BCM)\nGPIO.setup(18, GPIO.OUT)\n\nwhile (True):\n\tGPIO.output(18, True)\n\ttime.sleep(0.5)\n\tGPIO.output(18, False)\n\ttime.sleep(0.5)\n"
  },
  {
    "path": "code/led_brightness.py",
    "content": "import RPi.GPIO as GPIO\n\nled_pin = 18\nGPIO.setmode(GPIO.BCM)\nGPIO.setup(led_pin, GPIO.OUT)\n\npwm_led = GPIO.PWM(led_pin, 500)\npwm_led.start(100)\n\nwhile True:\n        duty_s = raw_input(\"Enter Brightness (0 to 100):\")\n        duty = int(duty_s)\n        pwm_led.ChangeDutyCycle(duty)\n\n"
  },
  {
    "path": "code/motor_control.py",
    "content": "import RPi.GPIO as GPIO\nimport time\n\nenable_pin = 18\nin1_pin = 23\nin2_pin =24\n\nGPIO.setmode(GPIO.BCM)\nGPIO.setup(enable_pin, GPIO.OUT)\nGPIO.setup(in1_pin, GPIO.OUT)\nGPIO.setup(in2_pin, GPIO.OUT)\n\npwm = GPIO.PWM(enable_pin, 500)\npwm.start(0)\n\ndef clockwise():\n    GPIO.output(in1_pin, True)    \n    GPIO.output(in2_pin, False)\n \ndef counter_clockwise():\n    GPIO.output(in1_pin, False)\n    GPIO.output(in2_pin, True)\n \nwhile True:\n    cmd = raw_input(\"Command, f/r 0..9, E.g. f5 :\")\n    direction = cmd[0]\n    if direction == \"f\":\n        clockwise()\n    else: \n        counter_clockwise()\n    speed = int(cmd[1]) * 10\n    pwm.ChangeDutyCycle(speed)\n\n"
  },
  {
    "path": "code/mouse_pygame.py",
    "content": "import pygame\nimport sys\nfrom pygame.locals import *\n\npygame.init()\nscreen = pygame.display.set_mode((640, 480))\npygame.mouse.set_visible(0)\n\nwhile True:\n    for event in pygame.event.get():\n        if event.type == QUIT:\n            sys.exit()\n        if event.type == MOUSEMOTION:\n            print(\"Mouse: (%d, %d)\" % event.pos)"
  },
  {
    "path": "code/pi_lite_message.py",
    "content": "import serial\n\nser = serial.Serial('/dev/ttyAMA0', 9600)\n\nwhile True:\n    message = raw_input(\"Enter message: \")\n    ser.write(message)\n"
  },
  {
    "path": "code/pi_lite_rain.py",
    "content": "import serial\nimport random\n\nser = serial.Serial('/dev/ttyAMA0', 9600)\n\nwhile True:\n    col = random.randint(1, 14)\n    row = random.randint(1, 9)\n    ser.write(\"$$$P%d,%d,TOGGLE\\r\" % (col, row))\n\n"
  },
  {
    "path": "code/pir.py",
    "content": "import RPi.GPIO as GPIO\nimport time\nGPIO.setmode(GPIO.BCM)\nGPIO.setup(18, GPIO.IN)\n\nwhile True:\n    input_state = GPIO.input(18)\n    if input_state == True:\n        print('Motion Detected')\n        time.sleep(1)\n"
  },
  {
    "path": "code/pot_step.py",
    "content": "import RPi.GPIO as GPIO\nimport time\n\nGPIO.setmode(GPIO.BCM)\n\na_pin = 18\nb_pin = 23\n\ndef discharge():\n    GPIO.setup(a_pin, GPIO.IN)\n    GPIO.setup(b_pin, GPIO.OUT)\n    GPIO.output(b_pin, False)\n    time.sleep(0.005)\n\ndef charge_time():\n    GPIO.setup(b_pin, GPIO.IN)\n    GPIO.setup(a_pin, GPIO.OUT)\n    count = 0\n    GPIO.output(a_pin, True)\n    while not GPIO.input(b_pin):\n        count = count + 1\n    return count\n\ndef analog_read():\n    discharge()\n    return charge_time()\n\nwhile True:\n    print(analog_read())\n    time.sleep(1)\n"
  },
  {
    "path": "code/ranger.py",
    "content": "import RPi.GPIO as GPIO\nimport time\n\ntrigger_pin = 18\necho_pin = 23\n\nGPIO.setmode(GPIO.BCM)\nGPIO.setup(trigger_pin, GPIO.OUT)\nGPIO.setup(echo_pin, GPIO.IN)\n\ndef send_trigger_pulse():\n    GPIO.output(trigger_pin, True)\n    time.sleep(0.0001)\n    GPIO.output(trigger_pin, False)\n\ndef wait_for_echo(value, timeout):\n    count = timeout\n    while GPIO.input(echo_pin) != value and count > 0:\n        count = count - 1\n\ndef get_distance():\n    send_trigger_pulse()\n    wait_for_echo(True, 10000)\n    start = time.time()\n    wait_for_echo(False, 10000)\n    finish = time.time()\n    pulse_len = finish - start\n    distance_cm = pulse_len / 0.000058\n    distance_in = distance_cm / 2.5\n    return (distance_cm, distance_in)\n    \n\nwhile True:\n    print(\"cm=%f\\tinches=%f\" % get_distance())\n    time.sleep(1)"
  },
  {
    "path": "code/rotary_encoder.py",
    "content": "import RPi.GPIO as GPIO\nimport time\n\nGPIO.setmode(GPIO.BCM)\n\ninput_A = 18\ninput_B = 23\n\nGPIO.setup(input_A, GPIO.IN, pull_up_down=GPIO.PUD_UP)\nGPIO.setup(input_B, GPIO.IN, pull_up_down=GPIO.PUD_UP)\n\n\nold_a = True\nold_b = True\n\ndef get_encoder_turn():\n    # return -1, 0, or +1\n    global old_a, old_b\n    result = 0\n    new_a = GPIO.input(input_A)\n    new_b = GPIO.input(input_B)\n    if new_a != old_a or new_b != old_b :\n        if old_a == 0 and new_a == 1 :\n            result = (old_b * 2 - 1)\n        elif old_b == 0 and new_b == 1 :\n            result = -(old_a * 2 - 1)\n    old_a, old_b = new_a, new_b\n    time.sleep(0.001)\n    return result\n\nx = 0\n\nwhile True:\n    change = get_encoder_turn()\n    if change != 0 :\n\t    x = x + change\n\t    print(x)\n"
  },
  {
    "path": "code/rotary_encoder_test.py",
    "content": "import RPi.GPIO as GPIO\nimport time\n\nGPIO.setmode(GPIO.BCM)\n\ninput_A = 18\ninput_B = 23\n\nGPIO.setup(input_A, GPIO.IN, pull_up_down=GPIO.PUD_UP)\nGPIO.setup(input_B, GPIO.IN, pull_up_down=GPIO.PUD_UP)\n\na = True\nb = True\n\nwhile True:\n    new_a = GPIO.input(input_A)\n    new_b = GPIO.input(input_B)\n    if new_a != a or new_b != b :\n        print('a=' + str(a) + ' b=' + str(b))\n        a, b = new_a, new_b"
  },
  {
    "path": "code/rover.py",
    "content": "from raspirobotboard import *\nimport pygame\nfrom pygame.locals import *\n\nrr = RaspiRobot()\n\npygame.init()\nscreen = pygame.display.set_mode((640, 480))\nfont = pygame.font.SysFont(\"arial\", 64)\n\npygame.display.set_caption('RaspiRobot')\npygame.mouse.set_visible(0)\n\ndef update_distance():\n    dist = rr.get_range_inch()\n    if dist > 0 and dist < 10:\n        rr.stop()\n        rr.set_led1(False)\n        rr.set_led2(False)\n    if dist == 0:\n        return\n    message = 'Distance: ' + str(dist) + ' in'\n    text_surface = font.render(message, True, (127, 127, 127))\n    screen.blit(text_surface, (100, 100))\n    \n    w = screen.get_width() - 20\n    proximity = ((100 - dist) / 100.0) * w\n    if proximity < 0:\n        proximity = 0\n    pygame.draw.rect(screen, (0, 255, 0), Rect((10, 10),(w, 50)))    \n    pygame.draw.rect(screen, (255, 0, 0), Rect((10, 10),(proximity, 50)))\n    pygame.display.update()\n\n\nwhile True:\n    for event in pygame.event.get():\n        if event.type == KEYDOWN:\n            if event.key == K_UP:\n                rr.forward()\n                rr.set_led1(True)\n                rr.set_led2(True)\n            elif event.key == K_DOWN:\n                rr.set_led1(True)\n                rr.set_led2(True)\n                rr.reverse()\n            elif event.key == K_RIGHT:\n                rr.set_led1(False)\n                rr.set_led2(True)\n                rr.right()\n            elif event.key == K_LEFT:\n                rr.set_led1(True)\n                rr.set_led2(False)\n                rr.left()\n            elif event.key == K_SPACE:\n                rr.stop()\n                rr.set_led1(False)\n                rr.set_led2(False)\n    screen.fill((255, 255, 255))\n    update_distance()\n"
  },
  {
    "path": "code/servo.py",
    "content": "from Tkinter import *\nimport RPi.GPIO as GPIO\nimport time\n\nGPIO.setmode(GPIO.BCM)\nGPIO.setup(18, GPIO.OUT)\npwm = GPIO.PWM(18, 100)\npwm.start(5)\n\nclass App:\n\t\n    def __init__(self, master):\n        frame = Frame(master)\n        frame.pack()\n        scale = Scale(frame, from_=0, to=180, \n              orient=HORIZONTAL, command=self.update)\n        scale.grid(row=0)\n\n\n    def update(self, angle):\n        duty = float(angle) / 10.0 + 2.5\n        pwm.ChangeDutyCycle(duty)\n\nroot = Tk()\nroot.wm_title('Servo Control')\napp = App(root)\nroot.geometry(\"200x50+0+0\")\nroot.mainloop()\n"
  },
  {
    "path": "code/servo_module.py",
    "content": "from Tkinter import *\nfrom Adafruit_PWM_Servo_Driver import PWM\nimport time\n\npwm = PWM(0x40)\npwm.setPWMFreq(50)  \n\nclass App:\n\t\n    def __init__(self, master):\n        frame = Frame(master)\n        frame.pack()\n        scale = Scale(frame, from_=0, to=180, \n              orient=HORIZONTAL, command=self.update)\n        scale.grid(row=0)\n\n\n    def update(self, angle):\n        pulse_len = int(float(angle) * 500.0 / 180.0) + 110\n        pwm.setPWM(0, 0, pulse_len)\n        pwm.setPWM(1, 0, pulse_len)\n\nroot = Tk()\nroot.wm_title('Servo Control')\napp = App(root)\nroot.geometry(\"200x50+0+0\")\nroot.mainloop()\n"
  },
  {
    "path": "code/speed.py",
    "content": "import time\n\ndef factorial(n):\n  if n == 0:\n    return 1\n  else:\n    return n * factorial(n-1)\n\nbefore_time = time.clock()\nfor i in range(1, 10000):\n  factorial(200)\nafter_time = time.clock()\n\nprint(after_time - before_time)"
  },
  {
    "path": "code/stepper.py",
    "content": "import RPi.GPIO as GPIO\nimport time\n \nGPIO.setmode(GPIO.BCM)\n \ncoil_A_1_pin = 18\ncoil_A_2_pin = 23\ncoil_B_1_pin = 24\ncoil_B_2_pin = 17\n \nGPIO.setup(coil_A_1_pin, GPIO.OUT)\nGPIO.setup(coil_A_2_pin, GPIO.OUT)\nGPIO.setup(coil_B_1_pin, GPIO.OUT)\nGPIO.setup(coil_B_2_pin, GPIO.OUT)\n\nforward_seq = ['1010', '0110', '0101', '1001']\nreverse_seq = list(forward_seq) # to copy the list\nreverse_seq.reverse()\n \ndef forward(delay, steps):  \n  for i in range(steps):\n    for step in forward_seq:\n      set_step(step)\n      time.sleep(delay)\n \ndef backwards(delay, steps):  \n  for i in range(steps):\n    for step in reverse_seq:\n      set_step(step)\n      time.sleep(delay)\n \n  \ndef set_step(step):\n  GPIO.output(coil_A_1_pin, step[0] == '1')\n  GPIO.output(coil_A_2_pin, step[1] == '1')\n  GPIO.output(coil_B_1_pin, step[2] == '1')\n  GPIO.output(coil_B_2_pin, step[3] == '1')\n \nwhile True:\n  set_step('0000')\n  delay = raw_input(\"Delay between steps (milliseconds)?\")\n  steps = raw_input(\"How many steps forward? \")\n  forward(int(delay) / 1000.0, int(steps))\n  set_step('0000')\n  steps = raw_input(\"How many steps backwards? \")\n  backwards(int(delay) / 1000.0, int(steps))\n"
  },
  {
    "path": "code/stepper_rrb.py",
    "content": "import RPi.GPIO as GPIO\nimport time\n \nGPIO.setmode(GPIO.BCM)\n \ncoil_A_1_pin = 17\ncoil_A_2_pin = 4\ncoil_B_1_pin = 10\ncoil_B_2_pin = 25\n \nGPIO.setup(coil_A_1_pin, GPIO.OUT)\nGPIO.setup(coil_A_2_pin, GPIO.OUT)\nGPIO.setup(coil_B_1_pin, GPIO.OUT)\nGPIO.setup(coil_B_2_pin, GPIO.OUT)\n\nforward_seq = ['1011', '1111', '1110', '1010']\nreverse_seq = list(forward_seq) # to copy the list\nreverse_seq.reverse()\n \ndef forward(delay, steps):  \n  for i in range(steps):\n    for step in forward_seq:\n      set_step(step)\n      time.sleep(delay)\n \ndef backwards(delay, steps):  \n  for i in range(steps):\n    for step in reverse_seq:\n      set_step(step)\n      time.sleep(delay)\n \n  \ndef set_step(step):\n  GPIO.output(coil_A_1_pin, step[0] == '1')\n  GPIO.output(coil_A_2_pin, step[1] == '1')\n  GPIO.output(coil_B_1_pin, step[2] == '1')\n  GPIO.output(coil_B_2_pin, step[3] == '1')\n \nwhile True:\n  set_step('0000')\n  delay = raw_input(\"Delay between steps (milliseconds)?\")\n  steps = raw_input(\"How many steps forward? \")\n  forward(int(delay) / 1000.0, int(steps))\n  set_step('0000')\n  steps = raw_input(\"How many steps backwards? \")\n  backwards(int(delay) / 1000.0, int(steps))\n"
  },
  {
    "path": "code/switch.py",
    "content": "import RPi.GPIO as GPIO\nimport time\n\nGPIO.setmode(GPIO.BCM)\n\nGPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)\n\nwhile True:\n    input_state = GPIO.input(18)\n    if input_state == False:\n        print('Button Pressed')\n        time.sleep(0.2)"
  },
  {
    "path": "code/switch_3_pos.py",
    "content": "import RPi.GPIO as GPIO\nimport time\n\nGPIO.setmode(GPIO.BCM)\n\ntop_input = 18\nbottom_input = 23\n\nGPIO.setup(top_input, GPIO.IN, pull_up_down=GPIO.PUD_UP)\nGPIO.setup(bottom_input, GPIO.IN, pull_up_down=GPIO.PUD_UP)\n\nswitch_position = \"unknown\"\n\nwhile True:\n    top_state = GPIO.input(top_input)\n    bottom_state = GPIO.input(bottom_input)\n    new_switch_position = \"unknown\"\n    if top_state == False:\n        new_switch_position = \"up\"\n    elif bottom_state == False:\n        new_switch_position = \"down\"\n    else:\n        new_switch_position = \"center\"\n    if new_switch_position != switch_position:\n        switch_position = new_switch_position\n        print(switch_position)"
  },
  {
    "path": "code/switch_on_off.py",
    "content": "import RPi.GPIO as GPIO\nimport time\n\nGPIO.setmode(GPIO.BCM)\n\nswitch_pin = 18\nled_pin = 23\n\nGPIO.setup(switch_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)\nGPIO.setup(led_pin, GPIO.OUT)\n\nled_state = False\nold_input_state = True # pulled-up\n\nwhile True:\n    new_input_state = GPIO.input(switch_pin)\n    if new_input_state == False and old_input_state == True:\n        led_state = not led_state\n    old_input_state = new_input_state\n    GPIO.output(led_pin, led_state)"
  },
  {
    "path": "code/switch_on_off_no_bounce.py",
    "content": "import RPi.GPIO as GPIO\nimport time\n\nGPIO.setmode(GPIO.BCM)\n\nswitch_pin = 18\nled_pin = 23\n\nGPIO.setup(switch_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)\nGPIO.setup(led_pin, GPIO.OUT)\n\nled_state = False\nold_input_state = True # pulled-up\n\nwhile True:\n    new_input_state = GPIO.input(switch_pin)\n    if new_input_state == False and old_input_state == True:\n        led_state = not led_state\n        time.sleep(0.2)\n    old_input_state = new_input_state\n    GPIO.output(led_pin, led_state)"
  },
  {
    "path": "code/temp_DS18B20.py",
    "content": "import os, glob, time\n \nos.system('modprobe w1-gpio')\nos.system('modprobe w1-therm')\n \nbase_dir = '/sys/bus/w1/devices/'\ndevice_folder = glob.glob(base_dir + '28*')[0]\ndevice_file = device_folder + '/w1_slave'\n \ndef read_temp_raw():\n    f = open(device_file, 'r')\n    lines = f.readlines()\n    f.close()\n    return lines\n \ndef read_temp():\n    lines = read_temp_raw()\n    while lines[0].strip()[-3:] != 'YES':\n        time.sleep(0.2)\n        lines = read_temp_raw()\n    equals_pos = lines[1].find('t=')\n    if equals_pos != -1:\n        temp_string = lines[1][equals_pos+2:]\n        temp_c = float(temp_string) / 1000.0\n        temp_f = temp_c * 9.0 / 5.0 + 32.0\n        return temp_c, temp_f\n\t\nwhile True:\n\tprint(\"temp C=%f\\ttemp F=%f\" % read_temp())\t\n\ttime.sleep(1)"
  },
  {
    "path": "code/temp_log.py",
    "content": "import os, glob, time, datetime\n\nlog_period = 10 # seconds\n\nlogging_folder = glob.glob('/media/*')[0]\ndt = datetime.datetime.now()\nfile_name = \"temp_log_{:%Y_%m_%d}.csv\".format(dt)\nlogging_file = logging_folder + '/' + file_name\n\nos.system('modprobe w1-gpio')\nos.system('modprobe w1-therm')\n \nbase_dir = '/sys/bus/w1/devices/'\ndevice_folder = glob.glob(base_dir + '28*')[0]\ndevice_file = device_folder + '/w1_slave'\n \ndef read_temp_raw():\n    f = open(device_file, 'r')\n    lines = f.readlines()\n    f.close()\n    return lines\n \ndef read_temp():\n    lines = read_temp_raw()\n    while lines[0].strip()[-3:] != 'YES':\n        time.sleep(0.2)\n        lines = read_temp_raw()\n    equals_pos = lines[1].find('t=')\n    if equals_pos != -1:\n        temp_string = lines[1][equals_pos+2:]\n        temp_c = float(temp_string) / 1000.0\n        temp_f = temp_c * 9.0 / 5.0 + 32.0\n        return temp_c, temp_f\n\ndef log_temp():\n    temp_c, temp_f = read_temp()\n    dt = datetime.datetime.now()\n    f = open(logging_file, 'a')\n    f.write('\\n\"{:%H:%M:%S}\",'.format(dt))\n    f.write(str(temp_c))\n    f.close()\n\t\nprint(\"Logging to: \" + logging_file)\nwhile True:\n    log_temp()\n    time.sleep(log_period)"
  },
  {
    "path": "code/tilt.py",
    "content": "import spidev, time\n\nspi = spidev.SpiDev()\nspi.open(0,0)\n\ndef analog_read(channel):\n    r = spi.xfer2([1, (8 + channel) << 4, 0])\n    adc_out = ((r[1]&3) << 8) + r[2]\n    return adc_out\n \nwhile True:\n    x = analog_read(0)\n    y = analog_read(1)\n    z = analog_read(2)\n    if x < 450:\n        print(\"Left\")\n    elif x > 550:\n        print(\"Right\")\n    elif y < 450:\n        print(\"Back\")\n    elif y > 550:\n        print(\"Forward\")\n    time.sleep(0.2)"
  },
  {
    "path": "code/web_control.py",
    "content": "from bottle import route, run\nimport RPi.GPIO as GPIO\n\nhost = '192.168.1.8'\n\nGPIO.setmode(GPIO.BCM)\nled_pins = [18, 23, 24]\nled_states = [0, 0, 0]\nswitch_pin = 25\n\nGPIO.setup(led_pins[0], GPIO.OUT)\nGPIO.setup(led_pins[1], GPIO.OUT)\nGPIO.setup(led_pins[2], GPIO.OUT)\nGPIO.setup(switch_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)\n\ndef switch_status():\n    state = GPIO.input(switch_pin)\n    if state:\n        return 'Up'\n    else:\n        return 'Down'\n\ndef html_for_led(led):\n    l = str(led)\n    result = \" <input type='button' onClick='changed(\" + l + \")' value='LED \" + l + \"'/>\"\n    return result\n\ndef update_leds():\n    for i, value in enumerate(led_states):\n        GPIO.output(led_pins[i], value)\n\n@route('/')\n@route('/<led>')\ndef index(led=\"n\"):\n    print(led)\n    if led != \"n\":\n        led_num = int(led)\n        led_states[led_num] = not led_states[led_num]\n        update_leds()\n    response = \"<script>\"\n    response += \"function changed(led)\"\n    response += \"{\"\n    response += \"  window.location.href='/' + led\"\n    response += \"}\"\n    response += \"</script>\"\n    \n    response += '<h1>GPIO Control</h1>'\n    response += '<h2>Button=' + switch_status() + '</h2>'\n    response += '<h2>LEDs</h2>'\n    response += html_for_led(0) \n    response += html_for_led(1) \n    response += html_for_led(2) \n    return response\n\nrun(host=host, port=80)"
  },
  {
    "path": "code/web_control_test.py",
    "content": "import RPi.GPIO as GPIO\nimport time\n\nGPIO.setmode(GPIO.BCM)\n\nled_pin_1 = 18\nled_pin_2 = 23\nled_pin_3 = 24\nswitch_pin = 25\n\nGPIO.setup(led_pin_1, GPIO.OUT)\nGPIO.setup(led_pin_2, GPIO.OUT)\nGPIO.setup(led_pin_3, GPIO.OUT)\nGPIO.setup(switch_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)\n\t\nGPIO.output(led_pin_1, 1)\ntime.sleep(1)\nGPIO.output(led_pin_2, 1)\ntime.sleep(1)\nGPIO.output(led_pin_3, 1)\ntime.sleep(1)\nGPIO.output(led_pin_1, 0)\ntime.sleep(1)\nGPIO.output(led_pin_2, 0)\ntime.sleep(1)\nGPIO.output(led_pin_3, 0)\ntime.sleep(1)\n\nwhile True:\n    print(GPIO.input(switch_pin))\n    time.sleep(1)"
  }
]