Advertisement
evenjc

Addendum til RPI<->Arduino [Python]

Mar 21st, 2019
260
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.06 KB | None | 0 0
  1. #!/user/bin/env python
  2.  
  3. import serial
  4. import time
  5. import datetime
  6.  
  7. #holder for active serial ports
  8. serialPorts = []
  9.  
  10. #trur æ kan slet
  11. serialConnections = []
  12.  
  13. #populated by the Ardunios by either "TIL" or "PUST"
  14. #this decices the name of the logfile for this arduino.
  15. typeOfSensorNode = []
  16.  
  17. #holder for generated files
  18. filenames = []
  19.  
  20. #trur æ kan slett
  21. files = []
  22.  
  23. # messages[0] = 'hello' is used for probing each active com-port and checking for an answer 'hello'
  24. # messages[1] = 'give me' is used to ask the Arduino's for sensor data
  25. messages = ['1', '2']
  26.  
  27. #time between each sensor log
  28. timeBetweenDataTransfers = 10
  29.  
  30. #number of connected devices
  31. numberOfArduinoDevices = 2
  32.  
  33. # Serial Connection settings
  34. # Do not change
  35. baudrate = 9600
  36. parity = serial.PARITY_NONE
  37. stopbits = serial.STOPBITS_ONE
  38. bytesize = serial.EIGHTBITS
  39. timeout = 1
  40.  
  41. # Routine checking what type of sensorNode we found
  42. # This routine populates typeOfSensoNodes
  43. # It is also detrimental to ensure established connection
  44. def checkDeviceConnectivity():
  45.     establishedConnections = 0
  46.     for portNumber in range(0, numberOfArduinoDevices):
  47.         print ('Writing to Arduino at ' + serialPorts[portNumber].port.__str__())        
  48.         serialPorts[portNumber].write(messages[1])
  49.         #print(serialConnections[portNumber])
  50.         recievedData = serialPorts[portNumber].readline()
  51.                
  52.        
  53.        
  54.         print("First package from Arduino is: " + recievedData)
  55.         if (recievedData == "TIL" or recievedData == "PUST"):
  56.             print ('We found a sensor node')
  57.             typeOfSensorNode.append(recievedData)
  58.             establishedConnections += 1
  59.        
  60.    
  61.     if (establishedConnections == numberOfArduinoDevices):
  62.         return True
  63.     else:
  64.         return False
  65.  
  66. # Routine that probes the first 100 possible Arduino-COMs
  67. # This routine populates serialPorts
  68. def establishSerialConnections():
  69.     counter = 0
  70.     while (counter < 100):
  71.         try:
  72.             ser = serial.Serial(
  73.                 port= "/dev/ttyACM" + counter.__str__(),
  74.                 baudrate = baudrate,
  75.                 parity = parity,
  76.                 stopbits = stopbits,
  77.                 bytesize = bytesize,
  78.                 timeout = 1
  79.             )
  80.             serialPorts.append(ser)
  81.             ser.close()
  82.             ser.open()
  83.             print ("Found open device at /dev/ttyACM" + counter.__str__())
  84.            
  85.         except IOError:
  86.             print ("No Arduino at this port")
  87.        
  88.         counter += 1
  89.  
  90. # Routine generating filenames, using typeOfSensorNode
  91. def generateFileNames():
  92.     for device in range(0, numberOfArduinoDevices):
  93.         filenames.append(typeOfSensorNode[device].__str__()+'_Arduino_nr_'+device.__str__()+'_'+datetime.datetime.now().__str__()+'.csv')
  94.         print ("Created file: " + filenames[device].__str__())
  95.  
  96. # Routine creating actual measurement files and fills in first two rows
  97. def createMeasurementFiles():
  98.     generateFileNames()
  99.     for device in range(0, numberOfArduinoDevices):
  100.         files.append(open(filenames[device], "w+"))
  101.         files[device].write('Date;Time;Temperature;Relative Humidity;CO2;Formaldehyde Start;Control;High bit;Low bit;Reserved;Reserved;High bit;Low bit;Checksum;PM1.0;PM2.5;PM4.0;PM10;NCPM0.5;NCPM1.0;NCPM2.5;NCPM4.0;NCPM10.0;Typical Particle Size')
  102.         files[device].write("\r\n")
  103.         files[device].close()
  104.  
  105. # Function for writing to the sensor nodes.
  106. # Consider taking in what file to write to.
  107. def writeToFile(string):
  108.     for device in range(0, numberOfArduinoDevices):
  109.         files[device] = open(filenames[device], "a")
  110.         print ('Opened ' + files[device].__str__())
  111.         files[device].write('heia \n')
  112.         files[device].close()
  113.        
  114. # Function for reading from the nodes
  115. # All write functionality here, should at a later point be written in writeToFile-routine
  116. def readFromArduino():
  117.     for device in range(0, numberOfArduinoDevices):
  118.         print ('Reading from Arduino at ' + serialPorts[device].port.__str__())
  119.         recievedData = serialPorts[device].readline()
  120.         print (recievedData)
  121.         files[device] = open(filenames[device], "a")
  122.         files[device].write(datetime.datetime.now().date().__str__())
  123.         files[device].write(";")
  124.         files[device].write(datetime.datetime.now().time().__str__())
  125.         files[device].write(recievedData)
  126.         files[device].write("\r\n")
  127.         files[device].close()
  128.    
  129. def writeToArduino(message):
  130.     for device in range(0, numberOfArduinoDevices):
  131.         serialPorts[device].write(message)
  132.        
  133.        
  134. establishSerialConnections()
  135. connection_established = checkDeviceConnectivity()
  136. createMeasurementFiles()
  137. print (len(serialPorts).__str__() + " Arduino devices found")
  138. if True:
  139.     while True:
  140.         writeToArduino(messages[0])
  141.         readFromArduino()
  142.         print ("Waiting " + timeBetweenDataTransfers.__str__() + " seconds")
  143.         time.sleep(timeBetweenDataTransfers)
  144. else:
  145.     print ('Failed finding enough Arduino Devices, shutting down')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement