Python Forum
Can my program be simplified?
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Can my program be simplified?
#1
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.

#!/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 improvementsTongue

In essence: would you please review my program and comment.

Regards and thanks in advance,
Steffen
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  How to do it in simplified Python code Jacks 0 1,466 Jul-14-2020, 04:21 PM
Last Post: Jacks
  Is there a simplified way to achieve this Andrewbf 1 1,867 Jun-11-2020, 05:51 AM
Last Post: Yoriz
  Transform simplified dictionary to nested dictionaries bhojendra 1 2,395 Jul-02-2019, 02:05 PM
Last Post: ichabod801

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020