From 25bb2014c57a9f193b434747ac1b112a0154ddf6 Mon Sep 17 00:00:00 2001 From: Jiacheng Huang <chonpcaacpnohc@gmail.com> Date: Thu, 12 Oct 2023 04:14:23 +0000 Subject: [PATCH] Upload New File --- ESP-32/Controller.py | 707 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 707 insertions(+) create mode 100644 ESP-32/Controller.py diff --git a/ESP-32/Controller.py b/ESP-32/Controller.py new file mode 100644 index 0000000..a52e5df --- /dev/null +++ b/ESP-32/Controller.py @@ -0,0 +1,707 @@ +# This file is executed on every boot (including wake-boot from deepsleep) +#import esp +#esp.osdebug(None) +#import webrepl +#webrepl.start() +import network +import utime as time + +#ssid = "This man belongs to charming Emi" +#password = "cjh961018" + +ssid = "Pilab494" +password = "Pilab494" + +#ssid = 'pilab-494' +#password = 'pilab-494' + +station = network.WLAN(network.STA_IF) + +station.active(True) + +time.sleep(5) + +station.connect(ssid, password) + +print(station.isconnected()) + + +while station.isconnected() == False: + + print('connecting now') + + time.sleep(1) + +print('connected') + + + +import urequests as requests + +databese_web = 'http://101.34.0.108:2000/' + + +def get_previes_experiment(): + + create_url = databese_web + 'get_previous_experiment' + + res = requests.post(create_url) + + data = ['Connection Lost',] + + if res.status_code == 200: + + data = dict(res.json())['msg'] + + return data + + +def creat_new_process(create_time): + + create_url = databese_web + 'creat_new_process' + + payload = { "time": create_time } + + res = requests.post(create_url, json=payload) + + work = 0 + + if res.status_code == 200: + + if res.json()['msg']: + + work = 1 + + return work + + +def update_database(create_time, index, x, y): + + create_url = databese_web + 'update_database' + + payload = { "time": create_time, 'index': index, 'x': x, 'y': y } + + res = requests.post(create_url, json=payload) + + work = 0 + + if res.status_code == 200: + + if res.json()['msg']: + + work = 1 + + return work + + +def update_index(create_time, index, data): + + create_url = databese_web + 'update_index' + + payload = { "time": create_time, 'index': index, 'data': data} + + res = requests.post(create_url, json=payload) + + work = 0 + + if res.status_code == 200: + + if res.json()['msg']: + + work = 1 + + return work + + +def lookup_database(create_time, index, cur): + + create_url = databese_web + 'lookup_database' + + payload = { "time": create_time, 'index': index, 'cur': cur} + + res = requests.post(create_url, json=payload) + + if res.status_code == 200: + + return res.json()['x'], res.json()['y'] + + else: + + return [], [] + +def lookup_index(create_time, index): + + create_url = databese_web + 'lookup_index' + + payload = { "time": create_time, 'index': index} + + res = requests.post(create_url, json=payload) + + if res.status_code == 200: + + return res.json()['data'] + + else: + + return [] + +def lookup_cab(create_time): + + create_url = databese_web + 'lookup_cab' + + payload = { "time": create_time} + + res = requests.post(create_url, json=payload) + + if res.status_code == 200: + + return res.json()['data'] + + else: + + return [] + + +def lookup_work(): + + create_url = databese_web + 'lookup_work' + + res = requests.post(create_url) + + if res.status_code == 200: + + return res.json()['data'] + + else: + + return [] + + +def F(create_time, control_data, sensor_data): + + create_url = databese_web + 'F' + + payload = { "time": create_time, "control_data": str(control_data), "sensor_data": str(sensor_data)} + + res = requests.post(create_url, json=payload) + + if res.status_code == 200: + + return res.json()['send_control_data'] + + else: + + return [] + + + + + +from machine import Pin, ADC, PWM +import onewire +import ds18x20 + +pumps = [15,13,4,5,18,19,22] # pump1, pump2, pump3, pump4, pump5, pump6, pump7 +sensors = [34,32] # pH, Temp +heat = [2] # heat +air = [21] # Air + +pumps_pin = [] +sensors_pin = [] +heat_pin = [] +air_pin = [] + + +for i in pumps: + pumps_pin.append(Pin(i,Pin.OUT)) + pumps_pin[-1].off() + +for i in sensors: + sensors_pin.append(Pin(i)) + +ph = ADC(sensors_pin[0],atten = ADC.ATTN_11DB) + + + +ow = onewire.OneWire(sensors_pin[1]) + +ds = ds18x20.DS18X20(ow) + +roms = ds.scan() + +ds.convert_temp() + +time.sleep(1) + +feedback = ds.read_temp(roms[0]) + +print(feedback) + + +for i in heat: + heat_pin.append(Pin(i,Pin.OUT)) + heat_pin[-1].off() + +for i in air: + air_pin.append(PWM(Pin(i))) + air_pin[-1].freq(10) + air_pin[-1].duty(0) + +class PID: + + def __init__(self, P=0.2, I=0.0, D=0.0): + + self.Kp = P + + self.Ki = I + + self.Kd = D + + self.sample_time = 0.00 + + self.current_time = time.time() + + self.last_time = self.current_time + + self.clear() + + def clear(self): + + self.SetPoint = 0.0 + + self.PTerm = 0.0 + + self.ITerm = 0.0 + + self.DTerm = 0.0 + + self.last_error = 0.0 + + self.int_error = 0.0 + + self.windup_guard = 20.0 + + self.output = 0.0 + + def update(self, feedback_value): + + error = self.SetPoint - feedback_value + + self.current_time = time.time() + + delta_time = self.current_time - self.last_time + + delta_error = error - self.last_error + + if (delta_time >= self.sample_time): + + self.PTerm = self.Kp * error # 比例 + + self.ITerm += error * delta_time # 积分 + + if (self.ITerm < -self.windup_guard): + + self.ITerm = -self.windup_guard + + elif (self.ITerm > self.windup_guard): + + self.ITerm = self.windup_guard + + self.DTerm = 0.0 + + if delta_time > 0: + + self.DTerm = delta_error / delta_time + + self.last_time = self.current_time + + self.last_error = error + + self.output = self.PTerm + (self.Ki * self.ITerm) + (self.Kd * self.DTerm) + + def setKp(self, proportional_gain): + + self.Kp = proportional_gain + + def setKi(self, integral_gain): + + self.Ki = integral_gain + + def setKd(self, derivative_gain): + + self.Kd = derivative_gain + + def setWindup(self, windup): + + self.windup_guard = windup + + def setSampleTime(self, sample_time): + + self.sample_time = sample_time + + + +import uasyncio + +async def blink(led, period_ms): + + led.on() + + await uasyncio.sleep_ms(int(5*1000*period_ms/100)) + + led.off() + +async def temp_read(): + + await uasyncio.sleep_ms(4_000) + + ds.convert_temp() + +async def air(led,period_ms): + + led.duty(int(period_ms/100*1000)) + + +async def main(control_data): + + uasyncio.create_task(blink(pumps_pin[0], control_data[0])) + + uasyncio.create_task(blink(pumps_pin[1], control_data[1])) + + uasyncio.create_task(blink(pumps_pin[2], control_data[2])) + + uasyncio.create_task(blink(pumps_pin[3], control_data[3])) + + uasyncio.create_task(blink(pumps_pin[4], control_data[4])) + + uasyncio.create_task(blink(pumps_pin[5], control_data[5])) + + uasyncio.create_task(blink(pumps_pin[6], control_data[6])) + + uasyncio.create_task(blink(heat_pin[0], control_data[7])) + + uasyncio.create_task(air(air_pin[0], control_data[8])) + + uasyncio.create_task(temp_read()) + + await uasyncio.sleep_ms(5_000) + + + + +# ssid = "Pilab494" + +# password = "Pilab494" + +# station = network.WLAN(network.STA_IF) + +# station.active(True) + +# time.sleep(5) + +# station.connect(ssid, password) + +# print(station.isconnected()) + +# while station.isconnected() == False: + +# print('connecting now') + +# time.sleep(1) + +# print('connected') + + +start_time = time.time() +cab = False + + +ph_average = [] + +while True: + +# try: + + create_time = lookup_work() + + print(create_time) + + now_time = time.time() + + + if not(cab): + + time.sleep(1) + + cab_now = lookup_cab(create_time) + + print(cab_now) + + if cab_now == [1,3,5,5,5,5,5,5,5]: + + cab = True + + data = lookup_database(create_time, 'Calibration-pH', -1) + + vx, py = data[1], data[0] + + k_list = [] + + b_list = [] + + k_list.append((py[0]-py[1])/(vx[0]-vx[1])) + + k_list.append((py[1]-py[2])/(vx[1]-vx[2])) + + k_list.append((py[0]-py[2])/(vx[0]-vx[2])) + + b_list.append(py[0]-vx[0]*k_list[0]) + + b_list.append(py[1]-vx[1]*k_list[1]) + + b_list.append(py[0]-vx[0]*k_list[2]) + + phk = sum(k_list)/len(k_list) + + phb = sum(b_list)/len(b_list) + + pid1 = PID(0.8,0.6,0.005) + + pid1.SetPoint = 37.0 + + pid1.setSampleTime(0.01) + + + pid2 = PID(0.01,0.001,0.00003) + + pid2.SetPoint = 7.0 + + pid2.setSampleTime(0.01) + + control_data = [0, 0, 0, 0, 0, 0, 0, 0, 0] # pump + heat + air + + sensor_data = [0, 0] + + + else: + + # Pump + + for i in range(2,9): + + if cab_now[i] == 0: + + continue + + elif cab_now[i] == 1: + + pumps_pin[i-2].on() + + elif cab_now[i] == 2: + + pumps_pin[i-2].off() + + elif cab_now[i] == 3: + + pumps_pin[i-2].on() + + time.sleep(60) + + pumps_pin[i-2].off() + + update_index(create_time, 'c_Pump' + str(i-1), 4) + + elif cab_now[i] == 4: + + continue + + elif cab_now[i] == 5: + + continue + + # pH + + if not(cab_now[0]): + + if cab_now[1] == 0: + + continue + + elif cab_now[1] == 1: + + start_ph_time = time.time() + + while True: + + now_ph_time = time.time() + + if now_ph_time - start_ph_time < 60: + + ph_data = ph.read() + + update_database(create_time, 'd_pH', ph_data, ph_data) + + time.sleep(0.1) + + else: + + break + + + elif cab_now[1] == 2: + + continue + + elif cab_now[1] == 3: + + continue + + else: + + work = int(lookup_index(create_time, 'p_Work')) + + print(work) + + if work == 1: + + try: + + feedback1 = ds.read_temp(roms[0]) + + pid1.update(feedback1) + + operation1 = pid1.output/10*100 + + print(feedback1) + + + + control_data[7] = min(max(operation1,0),100) + + sensor_data[1] = feedback1 + + + print(control_data[7]) + + + + feedback2 = ph.read() + + if len(ph_average) < 5: + + ph_average.append(feedback2) + + else: + + ph_average = ph_average[1::] + + ph_average.append(feedback2) + + print(ph_average) + + feedback2 = sum(ph_average)/len(ph_average) + + + + trans_feedback2 = feedback2*phk + phb + + print(trans_feedback2) + + + pid2.update(trans_feedback2) + + operation2 = pid2.output/10*100 + + + control_data[0] = min(max(operation2,0),100) + + sensor_data[0] = trans_feedback2 + + + print(control_data[0]) + + + a = time.time() + + uasyncio.run(main(control_data)) + + b = time.time() + + print(b-a) + + + send_control_data = F(create_time, control_data, sensor_data) + + + control_data[1] = send_control_data[1] + + control_data[2] = send_control_data[2] + + control_data[3] = send_control_data[3] + + control_data[4] = send_control_data[4] + + control_data[5] = send_control_data[5] + + control_data[6] = send_control_data[6] + + control_data[7] = send_control_data[7] + + pid1.SetPoint = send_control_data[9] + + pid2.SetPoint = send_control_data[8] + + control_data[8] = send_control_data[10] + + + + + except: + + +# a = time.time() +# +# uasyncio.run(main(control_data)) +# +# b = time.time() +# +# print('nimabi') +# +# print(b-a) + + +# send_control_data = F(create_time, control_data, sensor_data) + + + control_data[1] = send_control_data[1] + + control_data[2] = send_control_data[2] + + control_data[3] = send_control_data[3] + + control_data[4] = send_control_data[4] + + control_data[5] = send_control_data[5] + + control_data[6] = send_control_data[6] + + control_data[7] = send_control_data[7] + + pid1.SetPoint = send_control_data[9] + + pid2.SetPoint = send_control_data[8] + + control_data[8] = send_control_data[10] + + + else: + + time.sleep(5) + + print('Rest') + + +# except: +# +# print('Fuck') + -- GitLab