Off-grid Solar PV Panel project
Jump to navigation
Jump to search
Arduino IDE Installation and Configuration on a Raspberry Pi
Arduino LED Blink Program
- Program lights up Arduino UNO on-board LED connected to pin 13 for 1 second.
/*
Blink
Turns an LED on for one second, then off for one second, repeatedly.
*/
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(13, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level) = 1 = 5V supply
delay(1000); // wait for 1 second
digitalWrite(13, LOW); // turn the LED off by making the voltage LOW = 0 = 0V supply
delay(1000); // wait for 1 second
}
Arduino UNO - Safety
- Wear eye protection.
- Always get a teacher to inspect your circuit before powering up.
- Wear cotton shirts and pants and closed shoes.
- Even low voltages can cause burns because wires can heat up if shorted.
Arduino UNO - Building a LED Blink Circuit on a Breadboard
- Build an external LED Blink Circuit for the Arduino UNO.
Arduino UNO - Building a Mini-Solar PV Circuit
- Demonstration on how to build a small PV circuit that charges a battery on an Arduino UNO.
- The circuit incorporates a Voltage Divider circuit.
- Click on Image below to download and watch video.
Raspberry Pi - Python Introductory Lesson
- Install software to help program in Python
- Explore some simple python coding and learn about indentation to delineate code blocks
Raspberry Pi and Arduino Serial Communication
- Write code for the Arduino UNO to send data to the Raspberry pi using Serial communication.
- Write code in Python on the Raspberry Pi to receive data from the Arduino UNO using Serial communication.
- Raspberry Pi requires the installation of:
- sudo apt install python3-pip - pip to install python packages
- python3 -m pip install pyserial - pySerial Library
Python code for Raspberry Pi to receive serial communication from the Arduino UNO
import serial
if __name__ == '__main__':
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
ser.reset_input_buffer()
while True:
if ser.in_waiting > 0:
line = ser.readline().decode('utf-8').rstrip()
print(line)
Arduino UNO - Reading the Voltage of the Small Solar PV Panel
- Learn how to read voltage readings from a small Solar PV panel connected to an Arduino UNO using a voltage divider circuit and analog pin A2.
Python - code to read data from solar panel each minute
Python - collecting data from the arduino
#!/usr/bin/env python3
import serial
if __name__ == '__main__':
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
ser.reset_input_buffer()
while True:
if ser.in_waiting > 0:
line = ser.readline().decode('utf-8').rstrip()
print(line)
Python - adding a datestamp
#!/usr/bin/env python3
import serial
import datetime
if __name__ == '__main__':
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
ser.reset_input_buffer()
while True:
if ser.in_waiting > 0:
line = ser.readline().decode('utf-8').rstrip()
print(line)
now = datetime.datetime.now()
date_stamp = now.strftime("%Y-%b-%d %H:%M:%S")
print(f'This python program was run at this time {date_stamp}')
data = str(line) + "," + date_stamp + "\n"
print(f'The data is = {data}')
Python - saving data to a file
#!/usr/bin/env python3
import serial
import datetime
if __name__ == '__main__':
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
ser.reset_input_buffer()
while True:
if ser.in_waiting > 0:
line = ser.readline().decode('utf-8').rstrip()
print(line)
now = datetime.datetime.now()
date_stamp = now.strftime("%Y-%b-%d %H:%M:%S")
print(f'This python program was run at this time {date_stamp}')
data = str(line) + "," + date_stamp + "\n"
print(f'The data is = {data}')
f = open('/home/pi/solar_project/solar_data.txt','a')
f.write(data)
f.close()
Python - with graphing in Plotly
#!/usr/bin/env python3
import serial
import datetime
import plotly
import plotly.graph_objects as go
import pandas
if __name__ == '__main__':
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
ser.reset_input_buffer()
while True:
if ser.in_waiting > 0:
line = ser.readline().decode('utf-8').rstrip()
print(line)
now = datetime.datetime.now()
date_stamp = now.strftime("%Y-%b-%d %H:%M:%S")
print(f'This python program was run at this time {date_stamp}')
data = str(line) + "," + date_stamp + "\n"
print(f'The data is = {data}')
f = open('/home/pi/solar_project/solar_data.txt','a')
f.write(data)
f.close()
# import and plot data text file
df = pandas.read_csv('/home/pi/solar_project/solar_data.txt')
fig = go.Figure(data = go.Scatter(mode='markers',
x=df.date_time,
y=df.solar_value,
marker=dict(
color="LightSkyBlue",
size=20)
)
)
fig.update_layout(title="Solar Panel Test",
xaxis_title = 'Time',
yaxis_title = 'Solar Panel Voltage',
font=dict(
size=20,
color="RebeccaPurple"
)
)
plotly.offline.plot(fig,
filename="/home/pi/solar_project/solar_panel_graph.html",
auto_open=False)
print("Solar Panel data plotted")
Python - Reading Solar PV Voltage using Python
- Learn how to:
- Read solar PV voltage analog values in Python
- Convert the solar PV values into voltage
- Format the voltage values to three decimal points.
import serial
if __name__ == '__main__':
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
ser.reset_input_buffer()
while True:
if ser.in_waiting > 0:
line = ser.readline().decode('utf-8').rstrip()
try:
voltage = int(line)
except:
voltage = 0
voltage_corrected = voltage * (5.0 / 1023.0) * 2
# https://thepythonguru.com/python-string-formatting/
# {0} - first formatted term. If there were more terms they would be shown as {1}, {2}, etc.
# .3 - three decimal points
# f - floating point numbers = decimal numbers
# .format() - variables to format
voltage_string = '{0:.3f}'.format(voltage_corrected)
Python - Adding a Time Stamp
Python - Saving Data in a Text File
import serial
# from datefime module import datetime class
from datetime import datetime
if __name__ == '__main__':
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
ser.reset_input_buffer()
while True:
if ser.in_waiting > 0:
line = ser.readline().decode('utf-8').rstrip()
try:
voltage = int(line)
except:
voltage = 0
voltage_corrected = voltage * (5.0 / 1023.0) * 2
voltage_string = '{0:.3f}'.format(voltage_corrected)
now = datetime.now()
# The strftime method is used to create formatted Strings
time_stamp = now.strftime("%Y-%b-%d %H:%M:%S")
print(f'Current time is {time_stamp} and corrected voltage {voltage_string}')
if now.strftime("%S") == "00":
# save the data in a file every minute
data = time_stamp + "," + voltage_string + "\n"
f = open('/home/pi/Arduino/small_solar_arduino_data.txt','a')
f.write(data)
f.close()
print("Data saved")
Python - Graphing Data from Text File using Plotly
Python - Final code
- The final code displayed below accepts
- two data values from the Arduino (voltage and fanOn)
- add a datetime stamp
- Dweets the data to the cloud
- saves the data in a file namedsolar_arduino_data.txt
- and plots the data using Plotly and saves the plot in a file names arduino_solar.html
#!/usr/bin/env python3
import serial
import requests
import datetime
import plotly
import plotly.graph_objects as go
import pandas
import time
if __name__ == '__main__':
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
ser.reset_input_buffer()
#cycle = 0
#good_data = 0
for i in range(5):
voltage_string = ''
now = datetime.datetime.now()
date_stamp = now.strftime("%Y-%b-%d %H:%M:%S")
if ser.in_waiting > 0:
line = ser.readline().decode('utf-8').rstrip()
print(f"separated using commas {line.split(',')}")
mylist = line.split(',')
try:
voltage = int(mylist[0])
print(voltage)
fanOn = int(mylist[1])
except:
voltage = 0
fanOn = 0
voltage_correct = voltage * (5.0 / 1023.0) * 2
print('The solar panel voltage = {0:.3f}'.format(voltage_correct))
print(f'Fan status is {fanOn}')
#print(f'The cycle is {cycle}')
print(f'datestamp is {date_stamp}')
voltage_string = '{0:.3f}'.format(voltage_correct)
fanOn_string = str(fanOn)
#cycle = cycle + 1
time.sleep(1)
print("Preparing dweet")
dweet_dict = {}
dweet_dict.update({"solar_voltage": voltage_string})
dweet_dict.update({"fanOn": fanOn_string})
dweet_dict.update({"date_stamp": date_stamp})
url = "https://dweet.io/dweet/for/bundoora-*****************?"
#x = requests.post(url, json=dweet_dict)
#print(x.text)
data = ""
data = date_stamp + "," + voltage_string + "," + fanOn_string + '\n'
f = open('/home/pi/Arduino/solar_arduino_data.txt','a')
f.write(data)
f.close()
df = pandas.read_csv('/home/pi/Arduino/solar_arduino_data.txt')
fig = go.Figure(data = go.Scatter(mode='markers',
x=df.Date,
y=df.Volt,
marker=dict(
color="LightSkyBlue",
size=20)
)
)
fig.update_layout(title="Arduino Solar Voltage",
xaxis_title = 'Time',
yaxis_title = 'Voltage',
font=dict(
size=20,
color="RebeccaPurple"
)
)
plotly.offline.plot(fig,
filename="/home/pi/Arduino/arduino_solar.html",
auto_open=False)
print("Voltage plotted")