Ashutosh
Published © GPL3+

Impact Recorder for Vehicles

Functions as a black box by recording various parameters during driving.

BeginnerFull instructions provided2 hours1,405
Impact Recorder for Vehicles

Things used in this project

Story

Read more

Schematics

Impact Recorder Functionality

Code

Code snippet #1

Plain text
#!/usr/bin/python3                                                            // shebang linefrom sense_hat import SenseHat
from datetime import datetime
from csv import writer
import RPi.GPIO as GPIO
from time import sleepsense = SenseHat()
import csvtimestamp = datetime.now()
delay = 5                                                                           // delay is defined to store data in data.csv file
red = (255,0,0)
green = (0,255,0)
yellow = (255,255,0)#GPIO.setmode(GPIO.BCM)
#GPIO.setup(17,GPIO.OUT)def get_sense_impact():
             sense_impact = []
         
             acc = sense.get_accelerometer_raw()
             sense_impact.append(acc["x"])
             sense_impact.append(acc["y"])
             sense_impact.append(acc["z"])             gyro = sense.get_gyroscope_raw()
             sense_impact.append(gyro["x"])
             sense_impact.append(gyro["y"])
             sense_impact.append(gyro["z"])             return sense_impactdef impact():                                                                              // function to detect impact
    
         
         
         #GPIO.setmode(GPIO.BCM)
         #GPIO.setup(4,GPIO.OUT)
         acceleration = sense.get_accelerometer_raw()
         x = acceleration['x']
         y = acceleration['y']
         z = acceleration['z']
         x=abs(x)
         y=abs(y)
         z=abs(z)         gyro = sense.get_gyroscope_raw()
         gyrox = gyro["x"]
         gyroy = gyro["y"]
         gyroz = gyro["z"]         gyrox = round(gyrox,2)
         gyroy = round(gyroy,2)
         gyroz = round(gyroz,2)         impact = get_sense_impact()         if x > 1.5  or y > 1.5 or z > 1.5:                                          // the values are set after iteration on actual road can be changed accordingly for different types and driving skills 
                      with open('impact.csv', 'w', newline='') as f:
                            data_writer = writer(f)
                            data_writer.writerow(['acc x','acc y','acc z','gyro x','gyro y','gyro z'])
                            #GPIO.output(4,GPIO.HIGH)
                            sense.clear()
             
                            sense.show_letter("!" , red)
            
                            data_writer.writerow(impact)
            
            
                  elif gyrox > 1.5 or gyroy > 1.5 or gyroz > 1.5:                    // the values are set looking into the speed at which turns are initiated 
                        with open('impact.csv', 'w', newline='') as f:
                             data_writer = writer(f)
                             data_writer.writerow(['acc x','acc y','acc z','gyro x','gyro y','gyro z'])
                             #GPIO.output(4,GPIO.HIGH)
                             sense.clear()
                  
                             sense.show_letter("!" , green)
                  
                             data_writer.writerow(impact)         else:
                # GPIO.output(4,GPIO.LOW)
                sense.clear()def get_sense_data():                                                        // function to record and store values from sensor
    sense_data = []    
    
    sense_data.append(sense.get_temperature())
    sense_data.append(sense.get_pressure())
    sense_data.append(sense.get_humidity())    orientation = sense.get_orientation()
    sense_data.append(orientation["yaw"])
    sense_data.append(orientation["pitch"])
    sense_data.append(orientation["roll"])    acc = sense.get_accelerometer_raw()
    sense_data.append(acc["x"])
    sense_data.append(acc["y"])
    sense_data.append(acc["z"])
    
    mag = sense.get_compass_raw()
    sense_data.append(mag["x"])
    sense_data.append(mag["y"])
    sense_data.append(mag["z"])    gyro = sense.get_gyroscope_raw()
    sense_data.append(gyro["x"])
    sense_data.append(gyro["y"])
    sense_data.append(gyro["z"])
        sense_data.append(datetime.now())    return sense_datawith open('data.csv', 'w', newline='') as f:
    
    data_writer = writer(f)    data_writer.writerow(['temp','pres','hum','yaw','pitch','roll','acc x','acc y','acc z','mag x','mag y','mag z','gyro x','gyro y','gyro z','datetime'])    while True:
         
         print(get_sense_data())
         for event in sense.stick.get_events():
         # Check if the joystick was pressed
          if event.action == "pressed":
      
             # Check which direction
            if event.direction == "up":
               # sense.show_letter("U")      # Up arrow
                acceleration = sense.get_accelerometer_raw()
                x = acceleration['x']
                y = acceleration['y']
                z = acceleration['z']
                x=round(x, 0)
                y=round(y, 0)
                z=round(z, 0)
	
	 # Update the rotation of the display depending on which way up the
                if x  == -1: sense.set_rotation(90)
                elif y == 1: sense.set_rotation(270)
                elif y == -1: sense.set_rotation(180)
                else: sense.set_rotation(0)
                sense.clear()
                t = sense.get_temperature()
                t = round(t,1)
                message = "T: " + str(t)
               
                sense.show_message(message,text_colour = red,scroll_speed=0.09)
               
            elif event.direction == "down":
                acceleration = sense.get_accelerometer_raw()
                x = acceleration['x']
                y = acceleration['y']
                z = acceleration['z']
                x=round(x, 0)
                y=round(y, 0)
                z=round(z, 0)
	
	# Update the rotation of the display depending on which way up the
                if x  == -1: sense.set_rotation(90)
                elif y == 1: sense.set_rotation(270)
                elif y == -1: sense.set_rotation(180)
                else: sense.set_rotation(0)
                # sense.show_letter("D")      # Down arrow
                sense.clear()
                h = sense.get_humidity()
                h = round(h,1)
                message = "H: " + str(h)
               
                sense.show_message(message,text_colour = green,scroll_speed=0.09)
                p = sense.get_pressure()
                p = round(p,1)
                message = "P: " + str(p)
                sense.show_message(message,text_colour = yellow,scroll_speed=0.09)            #   elif event.direction == "left":
               # acceleration = sense.get_accelerometer_raw()
                # x = acceleration['x']
                #y = acceleration['y']
                #z = acceleration['z']
                #x=round(x, 0)
                #y=round(y, 0)
                #z=round(z, 0)
	
	                # Update the rotation of the display depending on which way up the           // Not used and controlled by node-red
                #if x  == -1: sense.set_rotation(90)
                #elif y == 1: sense.set_rotation(270)
                #elif y == -1: sense.set_rotation(180)
                #else: sense.set_rotation(0)
                #sense.show_letter("L")      # Left arrow
               
            # elif event.direction == "right":
              # sense.show_letter("K")      # Right arrow
            # elif event.direction == "middle":
              # sense.clear()         impact()
         data = get_sense_data()
                     
         dt = data[-1] - timestamp
         if dt.seconds > delay:
             
            data_writer.writerow(data)
            timestamp = datetime.now()

Credits

Ashutosh

Ashutosh

3 projects • 11 followers
Interested in Robotics

Comments