This Readme provides information on how to set up a raspberry pi board without peripherals. The instructions here are based on my experience while setting up a raspberry pi 3B+ for an Adeept RaspTank Robot, based the first part of these instructions can be used for setting up a raspberry pi board for other purposes.
-
Download
balenaEtchertool for ubuntu: balenaEtcher -
Download a compatible Raspberry Pi OS image for your board: Raspberry Pi OS Downloads. The
Liteversions do not come with an embedded GUI and have less software included (364MBvs2.7GB). We will use theLiteversion:Raspberry Pi OS Lite. We use2023-05-03-raspios-bullseye-armhf-lite.img.xzin this tutorial. -
Connect a microSD card to your PC and use
balenaEtcherto flash the downloaded OS image to the card. This is pretty straight forward, no need for a long tutorial. -
Leave the microSD card connected to your PC for now.
-
After flashing, you should see two partitions in the microSD card:
rootfsandbootfs.
-
On Linux:
sudo snap install rpi-imager. Download and run for windows. -
Use
rpi-imagerto setup ssh username (e.g., pi), pass, and hostname (e.g.,pi-homeauto). -
Flash the OS on SD card. After flashing insert sd card in pi and power up the pi.
-
Raspberry Pi OS will use this information at boot time to automatically configure WiFi access for you Pi.
- Unmount and remove the microSD card from your PC, insert it into your Pi board and power up the board.
- A green led flashing means the Pi has completed booting.
- This IMO is the quickest solution to obtain your Pi's IP address but you could use
nmaptoo. See next section. - Install and run
arp-scan
sudo apt install arp-scan
sudo arp-scan --localnet
- Install
nmapandnet-tools.
sudo apt install nmap net-tools
- Run
ifconfig | grep netmaskin the terminal to obtain your subnet mask IP. - Example
ifconfigresults: the outputinet 130.125.11.148 netmask 255.255.255.0means the subnet mask IP is130.125.11.0and subnet mask/24. That is the first 24 bits (8x3) are masked. - For
netmask 255.255.0.0, the subnet mask will be/16. - Run
nmapwith your subnet mask to scan your subnet and obtain your Pi's IP address.
nmap -sP 130.125.11.0/24
- Locate your Pi in the list (mine found the Pi but the name was absent)
- Run the command
ssh pi@pi-IP-addressorssh pi@pi-homeauto. For example:
ssh pi@130.125.11.172
Are you sure you want to continue connecting (yes/no)?: enteryes.pi@130.125.11.172's password:: the default Pi password israspberry.- You should now have a remote connection to your Pi.
- In the ssh terminal of your Pi, enter the following commands:
sudo apt update && sudo apt install git -y
- I'm a fan of
vscodeand use it as my mainIDE. You can configurevscodeto access folders and files remotely on your Pi. Doing this you can easily write scripts and test on your Pi board remotely. - See this tutorial for setting up remote development using SSH in vscode.
- For development on your Raspberry Pi, the official documentation is a gold mine. Have fun.
- We will use
vscodeIDE as our primary IDE. Since we have a headless setup, we will need to access our Pi files remotely. Use vscode ssh to connect to the Pi.
- RPI 3B+ has 40 GPIO pinsTo identify the GPIO pins, run the
pinoutcommand inside your Pi's terminal. - All sensors work on 3.3V logic; so no sensors should be used that work on 5V. No more than 3.3V should be supplied to a GPIO pin.
- Checkout T-cobbler breakout board to connect sensors using a breadboard.
- Create a folder:
homeautoand a python script:piauto.pyin that directory.
mkdir homeauto
touch piauto.py
- Open this folder in vscode SSH.
- In your Python script, import the
RPI.GPIOmodule used to control GPIO pins.
import RPi.GPIO as GPIO
- Pin scheme declaration: this defines how the GPIO pins are numbered. There are two modes:
BCMmode which refers to the pins by theBroadcom SoC Channelnumber; in simple language the pin numbering is exactly as shown in the output of thepinoutcommand (GPIOxx). Thee second mode:BOARDmode means the pin numbering follows the numbering on the plug -i.e., the numbers printed on the board, e.g,. P1 etc. We will use theBCMmode.
GPIO.setmode(GPIO.BCM)
- Pin mode declaration: This is similar to Arduino pin modes, where each GPIO pin can be either input or output. If you want to control an LED for ex, set the pin mode to
OUTPUT. If the pin is to be used as an input pin (e.g., temperature sensor) set it as anINPUTpin. We will use pinGPIO14(see pinout diagram) as an output pin to control our LED. NB: there is nothing special about GPIO pin 14, you can pick any other GPIO pin. I chose pin 14 b/c it is next to a ground pin (GND) which I will need.
GPIO.setup(14,GPIO.IN)
- GPIO states: you can make the state of a GPIO output pin high (3.3V) or low (0V). Use
GPIO.output(pin,GPIO.HIGH)orGPIO.output(pin,GPIO.LOW)to set it high or low respectively. - To read the status of a GPIO pin, use
digitalRead(pin). You can use software pull-up or pull-down functions to ensure a well-defined state on a pin. - To add delays use
time.sleep(delay-in-seconds), e.g.,time.sleep(0.5). You can use PCM to dim LEDs. - For analog input, you will need an
analog to digital converter(ADC). Some examples of ADC chips: MCP3008, ADS1x15
- TODO: create button to turn on/off led.
- Add some news or updates to the interface, e.g., weather forcast details and outdoor weather details
- We will use Flask, a web framework developed in Python.
- Setup python virtual environment in the
homeautofolder and install Flask. The virtual env allows to isolate the projects dependencies from other system-wide conflicting Python dependencies.
sudo apt update && sudo apt upgrade
sudo apt install python3-pip python3-venv
python3 -m venv home-auto-env
source home-auto-env/bin/activate
pip install flask
- Setup the Flask app folder:
web-control-panel. Create subdirectories:staticandtemplates, and the main application file:app.py. - See code in ??.
- Run the Flask app with:
flask --app app run -h pi-IP-address - The default port for Flask applications is
5000. To see the web interface, open the web browser on a PC connected on the same network as your Pi and type:pi-ip-address:5000. For example, my Pi's IP is192.168.1.123, so I enter:192.168.1.123:5000in the browser window. You should see the hello message printed in your browser.
- Create a Flask route:
turn_on_led.
@app.route('/turn-on-led', methods=['POST'])
def turn_on_led():
GPIO.output(ledPin, GPIO.HIGH)
return render_template('home.html')
- Create a simple web page containing a form with a button. This page will be the home page, i.e., for route
/. The submit method of the form should call the routeturn_on_led. - See ??
- Remember we are working in our virtual environment so
RPi.GPIOis not yet install. To install it do:
pip install RPi.GPIO
- Run you Flask app:
flask --app app run -h rpi-IP-address - The LED should turn on/blink when the button is clicked.
- Use the same idea to create a button and route to turn off the LED.
@app.route('/turn-off-led', methods=['POST'])
def turn_led_off():
GPIO.output(ledPin, GPIO.LOW)
return render_template('home.html')
-
TODO: use dht11 sensor to read indoor temperature and humidity.
-
TODO: add graph for daily temp and humidity variations
-
Install
Adafruit-DHTpackage. It gets readings from the DHT11 sensors for RPi.
pip install Adafruit-DHT
- Install
pytapoand test library.
pip install pytapo
pip install -U pytest
- Initiate library. To obtain the Tapo camera's IP address, perform the
nmapscan done previously and search for the device with name:C200_xxxx.
from pytapo import Tapo
user = "petersonyuhala" # user you set in Advanced Settings -> Camera Account
password = "" # password you set in Advanced Settings -> Camera Account
host = "" # ip of the camera, example: 192.168.1.52
tapo = Tapo(host, user, password)
print(tapo.getBasicInfo())
- Install
PyP100python package.
pip install PyP100
- Get Tapo bulb IP address using via an
nmapscan. NB: You may need to scan multiple times to see the bulb name (e.g.,L530) in the scan report. Example scan report:
Nmap scan report for C200_0C8F53 (192.168.1.131)
Host is up (0.013s latency).
Nmap scan report for L530 (192.168.1.154)
Host is up (0.011s latency).
- Connect to it and control with the code below.
from PyP100 import PyL530
user = "email@gmail.com"
password = "Password123"
bulb_ip = "192.168.X.X"
l530 = PyL530.L530(bulb_ip, user, password)
l530.handshake() #Creates the cookies required for further methods
l530.login() #Sends credentials to the plug and creates AES Key and IV for further methods
p100.turnOn() #Turns the connected plug on
p100.turnOff() #Turns the connected plug off
p100.toggleState() #Toggles the state of the connected plug
p100.turnOnWithDelay(10) #Turns the connected plug on after 10 seconds
p100.turnOffWithDelay(10) #Turns the connected plug off after 10 seconds
p100.getDeviceInfo() #Returns dict with all the device info of the connected plug
p100.getDeviceName() #Returns the name of the connected plug set in the app
#All the bulbs have the same basic functions as the plugs and additionally allow for the following functions.
l530.setBrightness(50) #Sets the brightness of the connected bulb to 50% brightness
l530.setColorTemp(2700) #Sets the color temperature of the connected bulb to 2700 Kelvin (Warm White)
l530.setColor(30, 80) #Sets the color of the connected bulb to Hue: 30°, Saturation: 80% (Orange)
- See: https://pypi.org/project/PyP100/ for more information.
- Clone my repository
simple python IR libraryand copy theDDIR.pyfile to your project folder.
