Advertisement
Guest User

Untitled

a guest
Jan 7th, 2019
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.97 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.     adc_dist_value = a*math.exp(b*adc_value)
  57.     #print('Channel 0: {0}'.format(adc_dist_value))
  58.     return adc_value
  59.    
  60.    
  61.  
  62.     #sterowanie serwem
  63. def servo(serwo_value):
  64.     if serwo_value > 208:
  65.         serwo_value = 208
  66.     if serwo_value < 98:
  67.         serwo_value = 98
  68.    
  69.     wiringpi.pwmWrite(18, serwo_value)
  70.     #print('Serwo value: {0}'.format(serwo_value))
  71.    
  72.  
  73.     #regulator PID
  74. class PID:
  75.     """
  76.     Discrete PID control
  77.     """
  78.        
  79.     def __init__(my, P=2.0, I=0.0, D=1.0, derivator=0, integrator=0, integrator_max=300, integrator_min=-300):
  80.            
  81.         my.Kp = P
  82.         my.Ki = I
  83.         my.Kd = D
  84.         my.derivator = derivator
  85.         my.integrator = integrator
  86.         my.integrator_max = integrator_max
  87.         my.integrator_min = integrator_min
  88.            
  89.         my.set_point = 0.0
  90.         my.error = 0.0
  91.        
  92.     def update(my, current_value)
  93.        
  94.         my.error = my.set_point - current_value
  95.            
  96.         my.P_value = my.Kp * my.error
  97.         my.D_value = my.Kd * (my.error - my.derivator)
  98.         my.derivator = my.error
  99.            
  100.         my.integrator = my.integrator + my.error
  101.            
  102.         if my.integrator > my.integrator_max:
  103.             my.integrator = my.integrator_max
  104.         elif my.integrator < my.integrator_min:
  105.             my.integrator = my.integrator_min
  106.                
  107.         my.I_value = my.integrator * my.Ki
  108.            
  109.         pid_value = my.P_value + my.I_value + my.D_value
  110.        
  111.        
  112.         return pid_value
  113.        
  114.     def setPoint(my, set_point):
  115.        
  116.         my.set_point = set_point
  117.         my.integrator = 0
  118.         my.derivator = 0
  119.            
  120.    
  121.    
  122.    
  123.     #InfluxDB send JSON
  124. def influx():
  125.    
  126.  
  127.     json_body = [
  128.         {
  129.             "measurement": "odleglosc",
  130.             "time": datetime.datetime.now(),
  131.             "fields": {
  132.                 "value": adc_distance
  133.             }
  134.  
  135.         },
  136.         {
  137.             "measurement": "wartosc_zadama",
  138.             "time": datetime.datetime.now(),
  139.             "fields": {
  140.                 "value": oled_distance
  141.             }
  142.         },
  143.         {
  144.             "measurement": "P",
  145.             "time": datetime.datetime.now(),
  146.             "fields": {
  147.                 "value": p_value
  148.             }
  149.         },
  150.         {
  151.             "measurement": "I",
  152.             "time": datetime.datetime.now(),
  153.             "fields": {
  154.                 "value": i_value
  155.             }
  156.         },
  157.         {
  158.             "measurement": "D",
  159.             "time": datetime.datetime.now(),
  160.             "fields": {
  161.                 "value": d_value
  162.             }
  163.         },
  164.         {
  165.             "measurement": "PID",
  166.             "time": datetime.datetime.now(),
  167.             "fields": {
  168.                 "value": pid_value
  169.             }
  170.         }]
  171.  
  172.     client.write_points(json_body)     
  173.    
  174.  
  175. def oled_display():
  176.    
  177.     with canvas(device) as draw:
  178.    
  179.         draw.text((0,0), '  UKLAD KULA-BELKA', fill="white")
  180.         draw.text((0,10), 'Wartosci', fill="white")
  181.         draw.text((0,18), 'zadane:', fill="white")
  182.         draw.text((0,28), 'Odl: {0}'.format(oled_distance), fill="white")
  183.         draw.text((0,36), 'P : {0}'.format(p_value), fill="white")
  184.         draw.text((0,44), 'I : {0}'.format(i_value), fill="white")
  185.         draw.text((0,52), 'D : {0}'.format(d_value), fill="white")
  186.  
  187.        
  188.         draw.text((64,10), 'Wartosci', fill="white")
  189.         draw.text((64,18), 'odczytane:', fill="white")
  190.         draw.text((64,28), 'Odl: {0}'.format(int(round(adc_distance))), fill="white")
  191.         draw.text((64,36), 'PID: {0}'.format(pid_value), fill="white")
  192.                
  193.    
  194.        
  195.     #petla glowna
  196.    
  197. a=79.2731944
  198. b=-0.002241179049
  199. distance=600                        # 600
  200. oled_distance=int(round(a*math.exp(b*distance),2))+8
  201. p_value=1.0                         # 1.0
  202. i_value=0.0                         # 0.11
  203. d_value=0.0                         # 2.5
  204. p = PID(p_value,i_value,d_value)    #nastawy PID
  205. p.setPoint(distance)                #zadana odleglosc od czujnika
  206.    
  207.            
  208. while True:
  209.     adc_value = get_adc_value()
  210.     adc_distance = a*math.exp(b*adc_value)
  211.     pid_value = p.update(adc_value) #adc_distance
  212.     pid_serwo = int(round(pid_value,0))
  213.     servo(pid_serwo)
  214.     oled_display()
  215.     influx()
  216.     print('Nastawy: ' + 'P: {0}'.format(p_value) + ' I: {0}'.format(i_value) + ' D: {0}'.format(d_value) + '   Wartosc zadana: {0}'.format(oled_distance) + '   Wartosc zmierzona: {0}'.format(round(adc_distance,2)))
  217.     time.sleep(0.17)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement