Adafruit Kegomatic. Created by Becky Stern. Last updated on :00:52 AM UTC

Similar documents
Adafruit VL53L0X Time of Flight Micro-LIDAR Distance Sensor Breakout

Adafruit Pi Cobbler Kit

Adafruit AMG8833 8x8 Thermal Camera Sensor

Adafruit MPRLS Ported Pressure Sensor Breakout

Adafruit Color Sensors

Adafruit CCS811 Air Quality Sensor

Adafruit MCP9808 Precision I2C Temperature Sensor Guide

Adafruit GPS Hat in Windows IoT Core

Feather Weather Lamp. Created by Ruiz Brothers. Last updated on :54:26 PM UTC

Adafruit Si7021 Temperature + Humidity Sensor

NeoPixie Dust Bag with Circuit Playground Express

Adafruit DRV2605 Haptic Controller Breakout

FLORA and GEMMA ICSP. Created by Becky Stern. Last updated on :42:16 PM UTC

Naughty or Nice Machine

Bike Wheel POV Display

Joy Featherwing. Created by Dean Miller. Last updated on :03:07 PM UTC

Adafruit MMA8451 Accelerometer Breakout

Audio Prank Gift Box. Created by Becky Stern. Last updated on :46:15 PM UTC

Adafruit GPIO Expander Bonnet for Raspberry Pi Created by Kattni Rembor. Last updated on :12:47 PM UTC

Adafruit 8x16 LED Matrix FeatherWing

NeoPixel Ring Bangle Bracelet

FLORA TV-B-Gone. Created by Becky Stern. Last updated on :32:57 PM UTC

Adafruit APDS9960 breakout

Adafruit Prototyping Pi Plate. Created by Ladyada

Interior Purse Light. Created by Becky Stern. Last updated on :41:08 PM UTC

FLORA and GEMMA ICSP. Created by Becky Stern. Last updated on :30:55 PM EST

Adafruit I2C FRAM Breakout

NeoPixel Basketball Hoop

Adafruit AM2320 Sensor

Bunny Ears with MakeCode

PyPortal NeoPixel Color Picker Created by Kattni Rembor. Last updated on :42:41 PM UTC

Adafruit Mini TFT with Joystick Featherwing

Morning Star POV Double Staffs

Solar Boost Bag. Created by Becky Stern. Last updated on :44:55 PM UTC

TSL2561 Luminosity Sensor

Adafruit TPL5111 Reset Enable Timer Breakout

Adafruit Capacitive Touch Sensor Breakouts

Chirping Plush Owl Toy

Adafruit Si5351 Clock Generator Breakout

Adafruit MMA8451 Accelerometer Breakout

Adafruit PCF8523 Real Time Clock

Adafruit MMA8451 Accelerometer Breakout

Adafruit IO Basics: Servo

Wind Blowing Emoji Prop

Interactive Gift Box. Created by codingpro. Last updated on :47:40 AM UTC

MCP Bit DAC Tutorial

Adafruit TPL5110 Power Timer Breakout

Adafruit IO Basics: ESP Arduino

Mini Mac Pi. Created by Ruiz Brothers. Last updated on :43:27 PM UTC

Neon LED Signs. Created by John Park. Last updated on :11:09 PM UTC

Using IFTTT with Adafruit IO to Make an IoT Door Detector

TRON Bag. Created by Becky Stern

Using Zapier with Adafruit IO

Raspberry Pi Selfie Bot

Tent Lantern. Created by Timothy Reese. Last updated on :17:25 AM UTC

7 Portable Multitouch Raspberry Pi Tablet

Adafruit 8x16 LED Matrix FeatherWing

Luminous LED Flowers. Created by Becky Stern. Last updated on :47:44 PM UTC

Adafruit Mini TFT " 160x80

Circuit Playground Digital Input

Alohamora Bottle. Created by Erin St Blaine. Last updated on :58:53 PM UTC

7" Portable HDMI Monitor

Adafruit 1.27" and 1.5" Color OLED Breakout Board

Android GBoard Morse Code Control with Circuit Playground Express

Adafruit LED Sequins. Created by Becky Stern. Last updated on :02:00 AM UTC

Con Badge with Circuit Playground Express

i2c/spi LCD Backpack Created by lady ada Last updated on :11:04 PM UTC

'Sup Brows. Created by Kate Hartman. Last updated on :52:04 PM UTC

Sewable NeoPixels. Created by Becky Stern. Last updated on :50:14 PM EDT

Arduino Lesson 6. Digital Inputs

Sino:bit with Arduino

Bandolier of Light. Created by Becky Stern. Last updated on :16:17 PM EST

Data Logging with Feather and CircuitPython

Adafruit HUZZAH32 - ESP32 Feather

Magical Mistletoe. Created by Leslie Birch. Last updated on :45:29 PM UTC

Adafruit IO Basics: Digital Output

AdaBox 005. Created by Tyler Cooper. Last updated on :08:13 PM UTC

Infinity Mirror Valentine's Candy Box

Datalogging Hat with FLORA BLE

3D Printed Camera LED Ring

Portable Apple Watch Charger

Crawling Animatronic Hand

Adafruit WINC1500 WiFi Shield for Arduino

Adafruit SGP30 TVOC/eCO2 Gas Sensor

FeatherWing Proto, Doubler and Tripler

Adafruit IO Basics: Analog Input

Coffee Detonator: The TNT Plunger Grinder

Large Pi-based Thermometer and Clock

Adafruit ATWINC1500 WiFi Breakout

Simple LED Unicorn Horn

Flora Brake Light Backpack

GPS Dog Collar. Created by Becky Stern. Last updated on :30:40 PM UTC

Toy Car Speed Timer. Created by Kirby Griese. Last updated on :13:49 PM UTC

Secret Hollow Book Intrusion Detector

Adafruit IO Basics: Digital Input

MCP Bit DAC Tutorial

Mystical LED Halloween Hood

FeatherWing Proto and Doubler

GPS Logging Dog Harness

NeoMatrix 8x8 Word Clock

Transcription:

Adafruit Kegomatic Created by Becky Stern Last updated on 2017-08-29 03:00:52 AM UTC

Guide Contents Guide Contents Overview Bill of Materials Prototype Circuit Install Flow Meter Raspberry Pi Code 2 3 5 8 10 13 Adafruit Industries https://learn.adafruit.com/adafruit-keg-bot Page 2 of 18

Overview The Adafruit Kegomatic is a team project by everyone at Adafruit! We wanted to see how we could augment a kegerator with cool hardware from the Adafruit store and make it active online. Our first experiment was to hook up a liquid flow meter and have the keg tweet every time someone drinks from it! Follow @AdafruitKegBot (http://adafru.it/cjq)for updates. For now the keg has birch beer, but we'll be getting a beer beer kegerator soon and will mod that one up as well! Adafruit Industries https://learn.adafruit.com/adafruit-keg-bot Page 3 of 18

Adafruit Industries https://learn.adafruit.com/adafruit-keg-bot Page 4 of 18

Bill of Materials Adafruit hardware: Raspberry Pi (http://adafru.it/998) Liquid flow meter (http://adafru.it/828) (plastic not brass, which could make the tasty beverage taste funny) HDMI monitor (http://adafru.it/1033) Mini wifi module (http://adafru.it/814) Mini wireless keyboard (http://adafru.it/922) Other hardware: Kegco kegerator (http://adafru.it/cjs) or modded fridge keg of birch beer (better for testing than alcoholic beer!) 2x liquid lines (one to mod and a backup) small CO2 tank with regulator and air hose teflon tape 2x barb -> threaded connector that matches interior diameter of the liquid line and threads on the flow meter (A customer (http://adafru.it/yfz) has reported success with this barb fitting from US Plastics (http://adafru.it/yga) and unions (http://adafru.it/ygb) from Home Depot) 2x hose clamps Adafruit Industries https://learn.adafruit.com/adafruit-keg-bot Page 5 of 18

Adafruit Industries https://learn.adafruit.com/adafruit-keg-bot Page 6 of 18

Thanks to Snoegoer Co. in Minnesota for making and donating this sweet tap, we'll be putting it on our next kegerator! Adafruit Industries https://learn.adafruit.com/adafruit-keg-bot Page 7 of 18

Prototype Circuit You can hook the sensor up to an Arduino using our sample code (http://adafru.it/cjv), or read on for the Raspberry Pi setup. Test the flow meter by blowing into it (there's an arrow on the meter to show you the correct flow direction). Adafruit Industries https://learn.adafruit.com/adafruit-keg-bot Page 8 of 18

When it's working to your satisfaction, flush it with soapy water to clean it before installing in your kegbot. Adafruit Industries https://learn.adafruit.com/adafruit-keg-bot Page 9 of 18

Install Flow Meter It helps to have two liquid tubes, in case you break one but still want to access your beer. Cut the liquid line with a pair of sharp scissors. Insert the barbed connectors into the cut ends of the tubes and secure with hose clamps. Adafruit Industries https://learn.adafruit.com/adafruit-keg-bot Page 10 of 18

Thread the flow meter into the connectors (don't forget the teflon tape)-- now the liquid will go through the flow meter! Cut off the flow meter's connector, strip the three wires inside, and solder on a long extension for each wire, enough to go from your keg tube, outside the keg, to the output display. We made ours about four feet long. To connect each wire, tin the stripped ends, then position the two wire ends together and remelt the solder. Slide on pieces of heat shrink tubing to insulate the solder joints. Adafruit Industries https://learn.adafruit.com/adafruit-keg-bot Page 11 of 18

Run the extension wires out the back of the fridge so they can be hooked up to the RasPi/Arduino/system of your choice. Adafruit Industries https://learn.adafruit.com/adafruit-keg-bot Page 12 of 18

Raspberry Pi Code Adafruit Industries https://learn.adafruit.com/adafruit-keg-bot Page 13 of 18

The code for this project is on GitHub. https://github.com/adafruit/kegomatic (http://adafru.it/e84) Adafruit Industries https://learn.adafruit.com/adafruit-keg-bot Page 14 of 18

After you've set up your pi, log in or ssh in, and get ready to set up some stuff. First, we'll download the kegbot code: git clone https://github.com/adafruit/kegomatic.git We'll need to install Python's setup tools in order to make it easier to install the pre-requisites for our Twitter code. sudo -i wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py -O - python Next, we will install a whole bunch of pre-requisites. Execute these one line at a time and look for errors. If you don't see any, you're good to go. sudo easy_install twitter sudo easy_install simplejson sudo easy_install httplib2 sudo easy_install python-oauth2 And that's it for setup... now the code should work... let's take a look at what it does! #!/usr/bin/python import os import time import math import pygame, sys from pygame.locals import * import RPi.GPIO as GPIO from twitter import * The above lines are all the imports we need... we need the twitter API for twittering, the GPIO library so we can use the GPIO pins, pygame so we can make this a fun windowed application, math so we can do some math stuff, time so we can do accurate timing, and os so we can run things at the os level. Next, we'll need to initialize the twitter account: t = Twitter( auth=oauth(oauth_token, OAUTH_SECRET, CONSUMER_KEY, CONSUMER_SECRET) ) First, go set up a Twitter app here (http://adafru.it/ejm). You will need to be logged in to Twitter from whatever account you would like to do the kegomatic tweeting. Then, come back to the code, and replace OAUTH_TOKEN, OAUTH_SECRET, CONSUMER_KEY, and CONSUMER_SECRET with the actual values from your twitter account app page. After that, we will need to initialize the GPIO pins... boardrevision = GPIO.RPI_REVISION GPIO.setmode(GPIO.BCM) # use real GPIO numbering GPIO.setup(22,GPIO.IN, pull_up_down=gpio.pud_up) The next several lines are there to set up pygame, the windowed context, and various global variables we will need throughout the program... # set up pygame pygame.init() # set up the window Adafruit Industries https://learn.adafruit.com/adafruit-keg-bot Page 15 of 18

VIEW_WIDTH = 0 VIEW_HEIGHT = 0 pygame.display.set_caption('kegbot') # set up the flow meter pouring = False lastpinstate = False pinstate = 0 lastpinchange = int(time.time() * 1000) pourstart = 0 pinchange = lastpinchange pindelta = 0 hertz = 0 flow = 0 literspoured = 0 pintspoured = 0 tweet = '' # set up the colors BLACK = (0,0,0) WHITE = (255,255,255) windowsurface = pygame.display.set_mode((view_width,view_height), FULLSCREEN, 32) FONTSIZE = 48 LINEHEIGHT = 52 basicfont = pygame.font.sysfont(none, FONTSIZE) Next comes the renderthings() function, which draws all of our updated data to the screen... def renderthings(lastpinchange, pinchange, pindelta, hertz, flow, pintspoured, pouring, pourstart, tweet, windowsurface, basicfont): # Clear the screen windowsurface.fill(black) # Draw LastPinChange text = basicfont.render('last Pin Change: '+time.strftime('%h:%m:%s', time.localtime(lastpinchange/1000)), True, WHITE, BLACK) textrect = text.get_rect() windowsurface.blit(text, (40,1*LINEHEIGHT)) # Draw PinChange text = basicfont.render('pin Change: '+time.strftime('%h:%m:%s', time.localtime(pinchange/1000)), True, WHITE, BLACK) textrect = text.get_rect() windowsurface.blit(text, (40,2*LINEHEIGHT)) # Draw PinDelta text = basicfont.render('pin Delta: '+str(pindelta) + ' ms', True, WHITE, BLACK) textrect = text.get_rect() windowsurface.blit(text, (40,3*LINEHEIGHT)) # Draw hertz text = basicfont.render('hertz: '+str(hertz) + 'Hz', True, WHITE, BLACK) textrect = text.get_rect() windowsurface.blit(text, (40,4*LINEHEIGHT)) # Draw instantaneous speed text = basicfont.render('flow: '+str(flow) + ' L/sec', True, WHITE, BLACK) textrect = text.get_rect() windowsurface.blit(text, (40,5*LINEHEIGHT)) # Draw Liters Poured text = basicfont.render('pints Poured: '+str(pintspoured) + ' pints', True, WHITE, BLACK) textrect = text.get_rect() Adafruit Industries https://learn.adafruit.com/adafruit-keg-bot Page 16 of 18

windowsurface.blit(text, (40,6*LINEHEIGHT)) # Draw Pouring text = basicfont.render('pouring: '+str(pouring), True, WHITE, BLACK) textrect = text.get_rect() windowsurface.blit(text, (40,7*LINEHEIGHT)) # Draw Pour Start text = basicfont.render('last Pour Started At: '+time.strftime('%h:%m:%s', time.localtime(pourstart/1000)), True, WHITE, BLACK) textrect = text.get_rect() windowsurface.blit(text, (40,8*LINEHEIGHT)) # Draw Tweet text = basicfont.render('tweet: '+str(tweet), True, WHITE, BLACK) textrect = text.get_rect() windowsurface.blit(text, (40,9*LINEHEIGHT)) # Display everything pygame.display.flip() Now we begin the main loop, which will loop forever (until we quit the program). The first thing we need to do at the beginning of the loop every time is to figure out how much time has passed since the last time we ran the loop. To do that, we get need to get the current time. We also need to know if the pin is set high or low right now, so we can start counting the time between pulses of the flow meter. # main loop while True: currenttime = int(time.time() * 1000) if GPIO.input(22): pinstate = True else: pinstate = False We also have a small amount of keyboard handling code, so that the user can press the escape key to exit the program. # Handle keyboard events for event in pygame.event.get(): if event.type == QUIT or (event.type == KEYUP and event.key == K_ESCAPE): pygame.quit() sys.exit() Now, this next if statement is a doozie, so bear with me... If the pin state is high and is not the same as it was last time through the loop (so that the pin staying high doesn't result in a steady stream of clicks as the loop runs over and over) then we enter pouring mode. While in pouring mode, we figure out how much time has passed between this click and the last click of the flow meter, and use that to calculate the flow. Once we have the number of milliseconds between the last click and now, we can figure out the hertz of the meter, divide that by the rate expected of the flow meter to get 1 liter per second of flow, and convert the result from liters to pints. This (very small) number represents the amount of beer that has been poured during this time through the loop. # If we have changed pin states low to high... if(pinstate!= lastpinstate and pinstate == True): if(pouring == False): pourstart = currenttime pouring = True # get the current time pinchange = currenttime Adafruit Industries https://learn.adafruit.com/adafruit-keg-bot Page 17 of 18

pindelta = pinchange - lastpinchange if (pindelta < 1000): # calculate the instantaneous speed hertz = 1000.0000 / pindelta flow = hertz / (60 * 7.5) # L/s literspoured += flow * (pindelta / 1000.0000) pintspoured = literspoured * 2.11338 This next if statement is a little shorter... it says that if we are pouring, and we notice that our sensor has been idle for more than 3 seconds, then we can assume that we are no longer pouring, and it's time to calculate how big the pour was and tweet it. After we do that, we should reset the amount poured so the next guy can begin his pour. if (pouring == True and pinstate == lastpinstate and (currenttime - lastpinchange) > 3000): # set pouring back to false, tweet the current amt poured, and reset everything pouring = False if (pintspoured > 0.1): pourtime = int((currenttime - pourstart)/1000) - 3 tweet = 'Someone just poured ' + str(round(pintspoured,2)) + ' pints of root beer in ' + str(pourtime) + ' seconds' t.statuses.update(status=tweet) literspoured = 0 pintspoured = 0 Finally, we must draw everything to the screen, and update the time variables so that we can accurately measure time the next time we go through the loop. renderthings(lastpinchange, pinchange, pindelta, hertz, flow, pintspoured, pouring, pourstart, tweet, windowsurface, basicfont) lastpinchange = pinchange lastpinstate = pinstate To run this code, run the following: sudo python kegbot.py That should bring up a window with the bot statistics, and then you can start pouring and tweeting! Adafruit Industries Last Updated: 2017-08-29 03:00:51 AM UTC Page 18 of 18