Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import time
- import datetime
- import pigpio
- import Adafruit_GPIO.SPI as SPI
- import Adafruit_MCP3008
- import Adafruit_DHT
- import sqlite3
- import os
- import shutil
- import picamera
- import PIL
- from PIL
- import Image, ImageFont, ImageDraw
- import matplotlib
- matplotlib.use('Agg')
- import matplotlib.pyplot as plt
- import matplotlib.dates as mdates
- from matplotlib
- import style
- style.use('fivethirtyeight')
- pi = pigpio.pi()
- # Software SPI configuration:
- CLK = 18
- MISO = 23
- MOSI = 24
- CS = 25
- mcp = Adafruit_MCP3008.MCP3008(clk = CLK, cs = CS, miso = MISO, mosi = MOSI)
- # Sensor configuration
- SOIL_PIN = 13
- DHT = Adafruit_DHT.DHT11
- DHT_PIN = 12
- def getSoilMoisture():
- pi.set_PWM_dutycycle(SOIL_PIN, 255)
- time.sleep(0.1)
- soil_value = mcp.read_adc(0)
- time.sleep(0.1)
- pi.set_PWM_dutycycle(SOIL_PIN, 0)
- return soil_value
- def getTempAndHumidity():
- humidity, temperature = Adafruit_DHT.read_retry(DHT, DHT_PIN)
- return humidity, temperature
- def printSensorValues():
- soil_value = getSoilMoisture()
- humidity, temperature = getTempAndHumidity()
- print("Soil Moisture Level: " + str(soil_value))
- print("Light Level: " + str(mcp.read_adc(1)))
- print("Temperature: " + str(temperature) + "C")
- print("Humidity: " + str(humidity) + "%")
- # printSensorValues()
- def logSensorValues():
- conn = sqlite3.connect('plant.db')
- c = conn.cursor()
- reading_time = time.time()
- soil_value = getSoilMoisture()
- humidity, temperature = getTempAndHumidity()
- light = mcp.read_adc(1)
- lastwater = checkWater(soil_value)
- c.execute('INSERT INTO data VALUES (?, ?, ?, ?, ?, ?)',
- (reading_time, soil_value, light, temperature, humidity, lastwater))
- conn.commit()
- print("Data written to database")
- def capture_image():
- cam = picamera.PiCamera(resolution = (3280, 2464))
- filename = '/home/pi/internet-of-seeds/image-' + time.strftime('%Y-%m-%d-%H-%M') + '.jpg'
- cam.awb_mode = "off"
- cam.awb_gains = (1.55, 1.2)
- cam.capture(filename, quality = 100)
- print("Photo taken")
- graph_data()
- base = Image.new("RGBA", (4080, 2524), "#1f1e1f")
- img = Image.open(filename).convert("RGBA")
- base.paste(img, (825, 0), img)
- lightgraph = Image.open('/home/pi/internet-of-seeds/light.png').convert("RGBA")
- base.paste(lightgraph, (5, 5), lightgraph)
- lightgraph = Image.open('/home/pi/internet-of-seeds/soil.png').convert("RGBA")
- base.paste(lightgraph, (5, 625), lightgraph)
- lightgraph = Image.open('/home/pi/internet-of-seeds/temperature.png').convert("RGBA")
- base.paste(lightgraph, (5, 1245), lightgraph)
- lightgraph = Image.open('/home/pi/internet-of-seeds/humidity.png').convert("RGBA")
- base.paste(lightgraph, (5, 1865), lightgraph)
- font = ImageFont.truetype('/home/pi/Roboto-Regular.ttf', 36)
- draw = ImageDraw.Draw(base)
- draw.text((10, 2474), datetime.datetime.now().strftime('%H:%M, %a. %d %b %Y'), (255, 255, 255), font = font)
- conn = sqlite3.connect('plant.db')
- c = conn.cursor()
- c.execute('SELECT lastwater FROM data ORDER BY time DESC LIMIT 1;')
- for row in c.fetchall():
- y = row[0]
- draw.text((820, 2474), "Last watered on " + datetime.datetime.utcfromtimestamp(y).strftime('%H:%M, %a. %d %b %Y'), (255, 255, 255), font = font)
- base = base.resize((1920, 1080), Image.ANTIALIAS).convert("RGB")
- base.save(filename)
- shutil.copy2(filename, '/home/pi/internet-of-seeds/latest.jpg')
- shutil.copy2(filename, '/var/www/html/latest.jpg')
- return filename
- def graph_data():
- yesterday = str(datetime.date.today() - datetime.timedelta(1))
- conn = sqlite3.connect('plant.db')
- c = conn.cursor()
- c.execute('SELECT time, light FROM data WHERE time >= ' + yesterday)
- times = []
- values = []
- for row in c.fetchall():
- times.append(datetime.datetime.fromtimestamp(row[0]))
- values.append(row[1])
- fig, ax = plt.subplots(figsize = (8, 6), dpi = 100)
- ax.plot_date(times, values, '-', linewidth = 3)
- fig.autofmt_xdate()
- ax.set_title('Light Level: ' + str(values[-1]), horizontalalignment = 'right')
- ax.set_xlim([datetime.datetime.now() - datetime.timedelta(days = 1), datetime.datetime.now()])
- ax.set_ylim([0, 1023])
- fig.savefig('/home/pi/internet-of-seeds/light.png')
- c.execute('SELECT time, soil FROM data WHERE time >= ' + yesterday)
- times = []
- values = []
- for row in c.fetchall():
- times.append(datetime.datetime.fromtimestamp(row[0]))
- values.append(row[1])
- fig, ax = plt.subplots(figsize = (8, 6), dpi = 100)
- ax.plot_date(times, values, '-', linewidth = 3)
- fig.autofmt_xdate()
- ax.set_title('Soil Moisture: ' + str(values[-1]), horizontalalignment = 'right')
- ax.set_xlim([datetime.datetime.now() - datetime.timedelta(days = 1), datetime.datetime.now()])
- ax.set_ylim([300, 1023])
- fig.savefig('/home/pi/internet-of-seeds/soil.png')
- c.execute('SELECT time, temp FROM data WHERE time >= ' + yesterday)
- times = []
- values = []
- for row in c.fetchall():
- times.append(datetime.datetime.fromtimestamp(row[0]))
- values.append(row[1])
- fig, ax = plt.subplots(figsize = (8, 6), dpi = 100)
- ax.plot_date(times, values, '-', linewidth = 3)
- fig.autofmt_xdate()
- ax.set_title('Temperature: ' + str(values[-1]), horizontalalignment = 'right')
- ax.set_xlim([datetime.datetime.now() - datetime.timedelta(days = 1), datetime.datetime.now()])
- ax.set_ylim([0, 40])
- fig.savefig('/home/pi/internet-of-seeds/temperature.png')
- c.execute('SELECT time, humidity FROM data WHERE time >= ' + yesterday)
- times = []
- values = []
- for row in c.fetchall():
- times.append(datetime.datetime.fromtimestamp(row[0]))
- values.append(row[1])
- fig, ax = plt.subplots(figsize = (8, 6), dpi = 100)
- ax.plot_date(times, values, '-', linewidth = 3)
- fig.autofmt_xdate()
- ax.set_title('Humidity: ' + str(values[-1]), horizontalalignment = 'right')
- ax.set_xlim([datetime.datetime.now() - datetime.timedelta(days = 1), datetime.datetime.now()])
- ax.set_ylim([0, 100])
- fig.savefig('/home/pi/internet-of-seeds/humidity.png')
- print("Graphs Drawn")
- def checkLighting():
- now = datetime.datetime.now()
- if now.hour >= 20 or now.hour <= 6:
- pi.set_PWM_dutycycle(6, 0)
- else :
- pi.set_PWM_dutycycle(6, 255)
- def checkWater(x):
- yesterday = datetime.datetime.now() - datetime.timedelta(days = 1)
- now = datetime.datetime.now()
- conn = sqlite3.connect('plant.db')
- c = conn.cursor()
- c.execute('SELECT lastwater FROM data ORDER BY time DESC LIMIT 1;')
- for row in c.fetchall():
- y = row[0]
- print(y)
- print(x)
- if not(int(now.hour) >= 20 or int(now.hour) <= 6) and(x >= 600) and(y * 1.0 <= (time.time() - datetime.timedelta(days = 1).total_seconds())):
- print("true")
- pi.set_PWM_dutycycle(26, 255)
- time.sleep(5)
- pi.set_PWM_dutycycle(26, 0)
- return time.time()
- else :
- print("false")
- return y
- checkLighting()
- logSensorValues()
- capture_image()
Advertisement
Add Comment
Please, Sign In to add comment