Advertisement
Guest User

Untitled

a guest
Jan 7th, 2019
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.34 KB | None | 0 0
  1. from influxdb import InfluxDBClient
  2. import json
  3. import time
  4. import Adafruit_ADS1x15
  5. import RPi.GPIO as GPIO
  6. import random
  7. import datetime
  8. import wiringpi
  9. import math
  10.  
  11.  
  12. from luma.core.interface.serial import i2c, spi
  13. from luma.core.render import canvas
  14. from luma.oled.device import sh1106
  15.  
  16.     #ustawienia wyswietlacza OLED
  17. serial=spi(device=0, port=0)
  18. device=sh1106(serial, rotate=2)
  19.  
  20.     #ustawienia bazy danych
  21. client = InfluxDBClient(host='104.248.129.33', port=8186)
  22. # client = InfluxDBClient(host='localhost', port=8086, username='myuser', password='mypass', ssl=False, verify_ssl=False)
  23. # client.create_database('grafana')
  24. client.switch_database('grafana')
  25.  
  26.  
  27.     #ustawienia PWM
  28. wiringpi.wiringPiSetupGpio()
  29. wiringpi.pinMode(18, wiringpi.GPIO.PWM_OUTPUT)
  30. wiringpi.pwmSetMode(wiringpi.GPIO.PWM_MODE_MS)
  31.  
  32. wiringpi.pwmSetClock(192)
  33. wiringpi.pwmSetRange(2000)
  34. delay_period = 0.01
  35.  
  36.  
  37.  
  38.     # ustawienia ADC
  39. adc = Adafruit_ADS1x15.ADS1015()
  40. GAIN = 1
  41.  
  42. adc.start_adc_comparator(0,  # Channel number
  43.                          20000, 5000,  # High threshold value, low threshold value
  44.                          active_low=True, traditional=True, latching=False,
  45.                          num_readings=1, gain=GAIN)
  46.    
  47.    
  48.    
  49.  
  50.    
  51.    
  52.     #pomiar odleglosci kuli
  53. def get_adc_value():
  54.    
  55.     adc_value = adc.get_last_result()
  56.    
  57.     return adc_value
  58.    
  59.    
  60.  
  61.     #sterowanie serwem
  62. def servo(serwo_value):
  63.     if serwo_value > 208:
  64.         serwo_value = 208
  65.     if serwo_value < 98:
  66.         serwo_value = 98
  67.            
  68.     wiringpi.pwmWrite(18, serwo_value)
  69.    
  70.    
  71. def scal_value(scaling_value):
  72.    
  73.     belka_min=14.1
  74.     belka_max=-14.1
  75.     serw_min=98
  76.     serw_max=208
  77.    
  78.     serw_val = (scaling_value-belka_min)*(serw_max-serw_min)/(belka_max-belka_min)+serw_min
  79.     pid_serw = int(round(serw_val))
  80.     print('pid_value {0}'.format(pid_serw))
  81.     return pid_serw
  82.    
  83.    
  84.     #regulator PID
  85. class PID:
  86.     """
  87.     Discrete PID control
  88.     """
  89.        
  90.     def __init__(my, P=2.0, I=0.0, D=1.0, derivator=0, integrator=0, integrator_max=10, integrator_min=-10): #300, -300
  91.            
  92.         my.Kp = P
  93.         my.Ki = I
  94.         my.Kd = D
  95.         my.derivator = derivator
  96.         my.integrator = integrator
  97.         my.integrator_max = integrator_max
  98.         my.integrator_min = integrator_min
  99.            
  100.         my.set_point = 0.0
  101.         my.error = 0.0
  102.        
  103.     def update(my, current_value)
  104.        
  105.         my.error = my.set_point - current_value
  106.            
  107.         my.P_value = my.Kp * my.error
  108.         my.D_value = my.Kd * (my.error - my.derivator)
  109.         my.derivator = my.error
  110.            
  111.         my.integrator = my.integrator + my.error
  112.            
  113.         if my.integrator > my.integrator_max:
  114.             my.integrator = my.integrator_max
  115.         elif my.integrator < my.integrator_min:
  116.             my.integrator = my.integrator_min
  117.                
  118.         my.I_value = my.integrator * my.Ki
  119.            
  120.         pid_value = my.P_value + my.I_value + my.D_value
  121.         print('my.error {0}  '.format(my.error) + 'my.P_value {0}  '.format(my.P_value) + 'my.i_value {0}  '.format(my.I_value) + 'my.D_value {0}  '.format(my.D_value) + 'my.PID {0}'.format(pid_value))
  122.        
  123.         return pid_value
  124.        
  125.     def setPoint(my, set_point):
  126.        
  127.         my.set_point = set_point
  128.         my.integrator = 0
  129.         my.derivator = 0
  130.            
  131.    
  132.    
  133.    
  134.     #InfluxDB send JSON
  135. def influx():
  136.    
  137.  
  138.     json_body = [
  139.         {
  140.             "measurement": "odleglosc",
  141.             "time": datetime.datetime.now(),
  142.             "fields": {
  143.                 "value": adc_distance
  144.             }
  145.  
  146.         },
  147.         {
  148.             "measurement": "wartosc_zadama",
  149.             "time": datetime.datetime.now(),
  150.             "fields": {
  151.                 "value": distance
  152.             }
  153.         },
  154.         {
  155.             "measurement": "P",
  156.             "time": datetime.datetime.now(),
  157.             "fields": {
  158.                 "value": p_value
  159.             }
  160.         },
  161.         {
  162.             "measurement": "I",
  163.             "time": datetime.datetime.now(),
  164.             "fields": {
  165.                 "value": i_value
  166.             }
  167.         },
  168.         {
  169.             "measurement": "D",
  170.             "time": datetime.datetime.now(),
  171.             "fields": {
  172.                 "value": d_value
  173.             }
  174.         },
  175.         {
  176.             "measurement": "PID",
  177.             "time": datetime.datetime.now(),
  178.             "fields": {
  179.                 "value": pid_value
  180.             }
  181.         }]
  182.  
  183.     client.write_points(json_body)     
  184.    
  185.  
  186. def oled_display():
  187.    
  188.     with canvas(device) as draw:
  189.    
  190.         draw.text((0,0), '  UKLAD KULA-BELKA', fill="white")
  191.         draw.text((0,10), 'Wartosci', fill="white")
  192.         draw.text((0,18), 'zadane:', fill="white")
  193.         draw.text((0,28), 'Odl: {0}'.format(distance), fill="white")
  194.         draw.text((0,36), 'P : {0}'.format(p_value), fill="white")
  195.         draw.text((0,44), 'I : {0}'.format(i_value), fill="white")
  196.         draw.text((0,52), 'D : {0}'.format(d_value), fill="white")
  197.  
  198.        
  199.         draw.text((64,10), 'Wartosci', fill="white")
  200.         draw.text((64,18), 'odczytane:', fill="white")
  201.         draw.text((64,28), 'Odl: {0}'.format(int(round(adc_distance))), fill="white")
  202.         draw.text((64,36), 'PID: {0}'.format(pid_value), fill="white")
  203.                
  204.    
  205.        
  206.     #petla glowna
  207.    
  208. a=79.2731944
  209. b=-0.002241179049
  210. distance=25  #750.0
  211. adc_value = get_adc_value()
  212. p_value=3.0                     # 1.0
  213. i_value=0.0                     # 0.11
  214. d_value=0.0                     # 2.5
  215. p = PID(p_value,i_value,d_value)    #nastawy PID
  216. p.setPoint(distance)                #zadana odleglosc od czujnika
  217.    
  218.            
  219. #for x in xrange (50):
  220. while True:
  221.     adc_value = get_adc_value()
  222.     adc_distance = a*math.exp(b*adc_value)
  223.     pid_value = p.update(adc_distance) #adc_distance
  224.     #pid_serwo = int(round(pid_value,0))
  225.     serw_value=scal_value(pid_value)
  226.     servo(serw_value)
  227.     oled_display()
  228.     influx()
  229.     print('Nastawy: ' + 'P: {0}'.format(p_value) + ' I: {0}'.format(i_value) + ' D: {0}'.format(d_value) + '   Wartosc zadana: {0}'.format(distance) + '   Wartosc zmierzona: {0}'.format(round(adc_distance,2)))
  230.     time.sleep(0.17)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement