Jul-14-2018, 07:46 PM
Hi All,
I have writen (read stole, modified from others, etc.) this program.
Now that it works reasonably well i was thinking that it may be simplified, restructured or modularized.
Specifically lines 84 to 99, 101 to 116, 156 to 175 which are sort of repetitions.
I did some trying but i stumble over the number of variables that is required to do the jobs.
If you spot something else that look like beginners rubbish to you i would gladly receive your
scoldings in exchange for improvements
In essence: would you please review my program and comment.
Regards and thanks in advance,
Steffen
I have writen (read stole, modified from others, etc.) this program.
Now that it works reasonably well i was thinking that it may be simplified, restructured or modularized.
Specifically lines 84 to 99, 101 to 116, 156 to 175 which are sort of repetitions.
#!/usr/bin/env python #==================================================================================== # # Version 2.4; 14/07/2018 # This program read temps and water level sensors and stores the # results in a CSV file on HD. Its to be used in a electrically(solar) driven boat. # Some results on two 2004 lcd's. # All print() statements are for diagnostic purposes. # SB stands for starbord, BB for port side of a boat # #==================================================================================== # Import required libs. import sys import time import csv import os import spidev import RPi.GPIO as GPIO import I2C_LCD_driver_twoLCD # I2C_LCD_driver.py modified to accept an address as parameter # so i can use two lcd's. # Set variables and GPIO pins. mylcd1 = I2C_LCD_driver_twoLCD.lcd(0x26) mylcd2 = I2C_LCD_driver_twoLCD.lcd(0x27) spi = spidev.SpiDev() spi.open(0,0) GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(22,GPIO.IN, pull_up_down = GPIO.PUD_DOWN) GPIO.setup(27,GPIO.OUT) GPIO.setup(23,GPIO.OUT) GPIO.setup(24,GPIO.OUT) GPIO.setup(25,GPIO.OUT) # Function to read MCP3008 with sensorid as channel nbr. def read_MCP(sensorid): adc = spi.xfer2([1,(8+sensorid)<<4,0],20000) adcread = ((adc[1]&3) << 8) + adc[2] return adcread # Function to read the ds18b20 sensor. def read_ds18b20(sensorid): device = "/sys/bus/w1/devices/"+ sensorid +"/w1_slave" try: with open (device) as tfile: text = tfile.read() except FileNotFoundError: GPIO.output(25,True) # Turn on GPIO25 with FileNotFound LED to indicate ID not present. notemp = 9999 return notemp sensor_data =text.split(" ")[20] # Extract and format the temp. from rcvd data. temp_raw = float(sensor_data[2:]) temp = temp_raw / 1000 return digitemp GPIO.output(25,False) # Reset FileNotFound LED while True: datum = (time.strftime('%d/%m/%Y')) tijd = (time.strftime('%H:%M:%S')) while True: datum = (time.strftime('%d/%m/%Y')) tijd = (time.strftime('%H:%M:%S')) # Checks for main switch on or off time.sleep(1) if GPIO.input(22): # Key is ON. GPIO.output(27,True) # Turn on LED indicator. break else: # Key is OFF. GPIO.output(27,False) # Turn off LED indicator. # print ('Schakelaar is UIT') # Check water level with key off. # Check watersensor SB, channel 0 van MCP. level = read_MCP(0) level_SB = round(level,1) # print (level_SB ,'SB') # Turns on SB pump by comparing read value to fixed variable. if (level_SB) > 590: GPIO.output(23,GPIO.HIGH) # Pump relay SB ON. mylcd1.lcd_display_string('SB pomp actief',4) # Display text on SB lcd line 4. pompSB = ('SB pomp ON') # define variable pompSB. # print (pompSB) else: GPIO.output(23,GPIO.LOW) # pump relay SB OFF. pompSB = ('SB pomp OFF') # print (pompSB) mylcd1.lcd_display_string(' ',4) # Clear line 4 of SB lcd # Check watersensor SB, channel 1 van MCP. level = read_MCP(1) level_BB = round(level,1) # print (level_BB ,'BB') # Turns on SB pump by comparing read value to fixed variable. if (level) > 450: GPIO.output(24,GPIO.HIGH) # Pump relay BB ON. mylcd2.lcd_display_string('BB pomp actief',4) # Display text on BB lcd line 4. pompBB = ('BB pomp ON') # print (pompBB) else: GPIO.output(24,GPIO.LOW) # Pump relay BB OFF. pompBB = ('BB pomp OFF') # print (pompBB) mylcd2.lcd_display_string(' ',4) # Clear line 4 of BB lcd. # Write pump status to file. pompstat = [datum,tijd,pompSB,pompBB] csvfile = "/home/pi/programs/testdata.csv" with open (csvfile,'a') as output: writer = csv.writer(output, delimiter = ',' ,lineterminator = '\n') writer.writerow(pompstat) # Execute the ds18b20 function for defined ID's. temp1 = float(read_ds18b20('28-000009adc801')) #Motor 1# temp2 = float(read_ds18b20('28-000009adc801')) #Motor 2 temp3 = float(read_ds18b20('28-000009adc801')) #Buiten temperatuur # xxxadc801 is temporary the only sensor. # Read MCP3008 ch0 to ch7. lijst = [] for offset in range(0,8): adcread = read_MCP(offset) # print (adcread) lijst.append(adcread) data = [datum,tijd,temp1,temp2,temp3,round(lijst[0],1),round(lijst[1],1), round((((lijst[2]*3.3/1024)-0.52)/0.08),1), round((((lijst[3]*3.3/1024)-0.52)/0.08),1),round(((lijst[4]*330/1024)-50),1)] #========================================================= # # 'temp1' is temparatuur motor SB. # 'temp2' is temperatuur motor BB # 'temp3' is not used # 'lijst[0]' is watersensor SB. # 'lijst[1]' is watersensor BB. # 'lijst[2]' is accustroom SB. # 'lijst[3]' is accustroom BB. # 'lijst[4]' is buiten temperatuur met TMP36. # #========================================================= # Turns on SB pump by comparing read value to fixed variable. if (lijst[0]) > 510: GPIO.output(23,GPIO.HIGH) # Pump relay SB ON. mylcd1.lcd_display_string('SB pomp actief',4) pompSB = ('SB pomp ON') # print (pompSB) mylcd1.lcd_display_string('SB pomp actief',4) else: GPIO.output(23,GPIO.LOW) # Pump relay SB OFF. mylcd1.lcd_display_string(' ',4) # Clear line 4 of SB lcd. # Turns on BB pump by comparing read value to fixed variable. if (lijst[1]) > 510: GPIO.output(24,GPIO.HIGH) # Pump relay BB ON. mylcd2.lcd_display_string('BB pomp actief',4) pompBB = ('BB pomp ON') # print (pompBB) else: GPIO.output(24,GPIO.LOW) # Pum relay BB OFF. pompBB = ('BB pomp OFF') mylcd2.lcd_display_string(' ',4) # Clear line 4 of BB lcd. # Clear both lcd's lines 1 to 3. mylcd1.lcd_display_string(' ',1) mylcd2.lcd_display_string(' ',1) mylcd1.lcd_display_string(' ',2) mylcd2.lcd_display_string(' ',2) mylcd1.lcd_display_string(' ',3) mylcd2.lcd_display_string(' ',3) #blinks temp if > limit if int(temp1) > 25: for i in range(1,5): mylcd1.lcd_display_string('BB motor='+str(temp1)+chr(223)+'C',1) time.sleep(1) mylcd1.lcd_clear() time.sleep(1) mylcd2.lcd_display_string('BB motor='+str(temp1)+chr(223)+'C',1) mylcd1.lcd_display_string('SB motor='+str(temp2)+chr(223)+'C',1) mylcd1.lcd_display_string('Outside='+str(round((lijst[4]*330/1024)-50,1))+chr(223)+'C',3) # print (data) # Write output naar csv file # csvfile = "/home/pi/programs/testdata.csv" csvfile = "/media/pi/Seagate Portable/testdata.csv" with open (csvfile,'a') as output: writer = csv.writer(output, delimiter = ',' ,lineterminator = '\n') writer.writerow(data) # time.sleep(2)Can i rewrite those sections as a single function that i can reuse.
I did some trying but i stumble over the number of variables that is required to do the jobs.
If you spot something else that look like beginners rubbish to you i would gladly receive your
scoldings in exchange for improvements

In essence: would you please review my program and comment.
Regards and thanks in advance,
Steffen