title: No module named 'Adafruit_GPIO'
body: <p>I am doing the project in this video (<a href="https://www.youtube.com/watch?v=9sb_zuHGmY4" rel="nofollow noreferrer">https://www.youtube.com/watch?v=9sb_zuHGmY4</a>) with the OLED screen.</p>
  <p>The step by step guide I followed (<a href="https://www.the-diy-life.com/diy-raspberry-pi-4-desktop-case-with-oled-stats-display/" rel="nofollow noreferrer">https://www.the-diy-life.com/diy-raspberry-pi-4-desktop-case-with-oled-stats-display/</a>)
  and I get this error:</p>
  <pre class="lang-py prettyprint-override"><code>Traceback (most recent call last):
    File &quot;stats.py&quot;, line 23, in &lt;module&gt;
      import Adafruit_GPIO.SPI as SPI
  ModuleNotFoundError: No module named 'Adafruit_GPIO'
  </code></pre>
  <p>Code:</p>
  <pre><code># Author: Tony DiCola &amp; James DeVito
  #
  # Permission is hereby granted, free of charge, to any person obtaining a copy
  # of this software and associated documentation files (the &quot;Software&quot;), to deal
  # in the Software without restriction, including without limitation the rights
  # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  # copies of the Software, and to permit persons to whom the Software is
  # furnished to do so, subject to the following conditions:
  #
  # The above copyright notice and this permission notice shall be included in
  # all copies or substantial portions of the Software.
  #
  # THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  # THE SOFTWARE.
  import time
  
  import Adafruit_GPIO.SPI as SPI
  import Adafruit_SSD1306
  
  from PIL import Image
  from PIL import ImageDraw
  from PIL import ImageFont
  
  import subprocess
  
  # Raspberry Pi pin configuration:
  RST = None     # on the PiOLED this pin isnt used
  # Note the following are only used with SPI:
  DC = 23
  SPI_PORT = 0
  SPI_DEVICE = 0
  
  # Beaglebone Black pin configuration:
  # RST = 'P9_12'
  # Note the following are only used with SPI:
  # DC = 'P9_15'
  # SPI_PORT = 1
  # SPI_DEVICE = 0
  
  # 128x32 display with hardware I2C:
  disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST)
  
  # 128x64 display with hardware I2C:
  # disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST)
  
  # Note you can change the I2C address by passing an i2c_address parameter like:
  # disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST, i2c_address=0x3C)
  
  # Alternatively you can specify an explicit I2C bus number, for example
  # with the 128x32 display you would use:
  # disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST, i2c_bus=2)
  
  # 128x32 display with hardware SPI:
  # disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST, dc=DC, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE, max_speed_hz=8000000))
  
  # 128x64 display with hardware SPI:
  # disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST, dc=DC, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE, max_speed_hz=8000000))
  
  # Alternatively you can specify a software SPI implementation by providing
  # digital GPIO pin numbers for all the required display pins.  For example
  # on a Raspberry Pi with the 128x32 display you might use:
  # disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST, dc=DC, sclk=18, din=25, cs=22)
  
  # Initialize library.
  disp.begin()
  
  # Clear display.
  disp.clear()
  disp.display()
  
  # Create blank image for drawing.
  # Make sure to create image with mode '1' for 1-bit color.
  width = disp.width
  height = disp.height
  image = Image.new('1', (width, height))
  
  # Get drawing object to draw on image.
  draw = ImageDraw.Draw(image)
  
  # Draw a black filled box to clear the image.
  draw.rectangle((0,0,width,height), outline=0, fill=0)
  
  # Draw some shapes.
  # First define some constants to allow easy resizing of shapes.
  padding = -2
  top = padding
  bottom = height-padding
  # Move left to right keeping track of the current x position for drawing shapes.
  x = 0
  
  
  # Load default font.
  font = ImageFont.load_default()
  
  # Alternatively load a TTF font.  Make sure the .ttf font file is in the same directory as the python script!
  # Some other nice fonts to try: http://www.dafont.com/bitmap.php
  # font = ImageFont.truetype('Minecraftia.ttf', 8)
  
  while True:
  
      # Draw a black filled box to clear the image.
      draw.rectangle((0,0,width,height), outline=0, fill=0)
  
      # Shell scripts for system monitoring from here : https://unix.stackexchange.com/questions/119126/command-to-display-memory-usage-disk-usage-and-cpu-load
      cmd = &quot;hostname -I | cut -d\' \' -f1&quot;
      IP = subprocess.check_output(cmd, shell = True )
      cmd = &quot;top -bn1 | grep load | awk '{printf \&quot;CPU Load: %.2f\&quot;, $(NF-2)}'&quot;
      CPU = subprocess.check_output(cmd, shell = True )
      cmd = &quot;free -m | awk 'NR==2{printf \&quot;Mem: %s/%sMB %.2f%%\&quot;, $3,$2,$3*100/$2 }'&quot;
      MemUsage = subprocess.check_output(cmd, shell = True )
      cmd = &quot;df -h | awk '$NF==\&quot;/\&quot;{printf \&quot;Disk: %d/%dGB %s\&quot;, $3,$2,$5}'&quot;
      Disk = subprocess.check_output(cmd, shell = True )
  
      # Write two lines of text.
  
      draw.text((x, top),       &quot;IP: &quot; + str(IP),  font=font, fill=255)
      draw.text((x, top+8),     str(CPU), font=font, fill=255)
      draw.text((x, top+16),    str(MemUsage),  font=font, fill=255)
      draw.text((x, top+25),    str(Disk),  font=font, fill=255)
  
      # Display image.
      disp.image(image)
      disp.display()
      time.sleep(.1)
  </code></pre>