179 lines
5.5 KiB
Python
179 lines
5.5 KiB
Python
import paho.mqtt.client as mqtt
|
|
from picamera import PiCamera
|
|
from datetime import datetime, timedelta
|
|
import os
|
|
from adafruit_motor import stepper
|
|
from adafruit_motorkit import MotorKit
|
|
from time import sleep
|
|
|
|
################################################################################
|
|
kit = MotorKit()
|
|
pump_stepper = kit.stepper1
|
|
pump_stepper.release()
|
|
focus_stepper = kit.stepper2
|
|
focus_stepper.release()
|
|
|
|
################################################################################
|
|
|
|
camera = PiCamera()
|
|
camera.resolution = (3280, 2464)
|
|
camera.iso = 60
|
|
sleep(3)
|
|
camera.shutter_speed = 100
|
|
camera.exposure_mode = 'off'
|
|
g = camera.awb_gains
|
|
camera.awb_mode = 'off'
|
|
camera.awb_gains = g
|
|
nb_frame=200
|
|
|
|
################################################################################
|
|
message = ''
|
|
topic = ''
|
|
count=''
|
|
|
|
################################################################################
|
|
|
|
def on_connect(client, userdata, flags, rc):
|
|
print("Connected! - " + str(rc))
|
|
client.subscribe("actuator/#")
|
|
|
|
def on_subscribe(client, obj, mid, granted_qos):
|
|
print("Subscribed! - "+str(mid)+" "+str(granted_qos))
|
|
|
|
def on_message(client, userdata, msg):
|
|
print(msg.topic+" "+str(msg.qos)+" "+str(msg.payload))
|
|
global message
|
|
global topic
|
|
global count
|
|
message=str(msg.payload.decode())
|
|
topic=msg.topic.split("/")[1]
|
|
count=0
|
|
|
|
def on_log(client, obj, level, string):
|
|
print(string)
|
|
|
|
################################################################################
|
|
client = mqtt.Client()
|
|
client.connect("127.0.0.1",1883,60)
|
|
client.on_connect = on_connect
|
|
client.on_subscribe = on_subscribe
|
|
client.on_message = on_message
|
|
client.on_log = on_log
|
|
client.loop_start()
|
|
|
|
################################################################################
|
|
while True:
|
|
|
|
################################################################################
|
|
if (topic=="pump"):
|
|
|
|
direction=message.split(" ")[0]
|
|
flowrate=message.split(" ")[1]
|
|
volume=message.split(" ")[2]
|
|
nb_step=int(volume)*507
|
|
duration=(int(volume)*60)/float(flowrate)
|
|
delay=(duration/nb_step)-0.005
|
|
client.publish("receiver/pump", "Start");
|
|
|
|
while True:
|
|
count+=1
|
|
print(count,nb_step)
|
|
print("pump_stepper.onestep(direction=+action+, style=stepper.DOUBLE")
|
|
sleep(delay)
|
|
|
|
if topic!="pump":
|
|
pump_stepper.release()
|
|
print("The pump has been interrompted.")
|
|
client.publish("receiver/pump", "Interrompted");
|
|
break
|
|
|
|
if count>nb_step:
|
|
pump_stepper.release()
|
|
print("The pumping is done.")
|
|
topic="wait"
|
|
client.publish("receiver/pump", "Done");
|
|
break
|
|
|
|
################################################################################
|
|
|
|
elif (topic=="focus"):
|
|
|
|
direction=message.split(" ")[0]
|
|
nb_step=int(message.split(" ")[1])
|
|
client.publish("receiver/focus", "Start");
|
|
|
|
while True:
|
|
count+=1
|
|
print(count,nb_step)
|
|
print("stage.onestep(direction=+action+, style=stepper.microstep")
|
|
sleep(0.001)
|
|
|
|
if topic!="focus":
|
|
pump_focus.release()
|
|
print("The stage has been interrompted.")
|
|
client.publish("receiver/focus", "Interrompted");
|
|
break
|
|
|
|
if count>nb_step:
|
|
pump_focus.release()
|
|
print("The focusing is done.")
|
|
topic="wait"
|
|
client.publish("receiver/focus", "Done");
|
|
break
|
|
|
|
################################################################################
|
|
|
|
elif (topic=="image"):
|
|
|
|
delay=int(message.split(" ")[0])
|
|
volume_before=int(message.split(" ")[1])
|
|
nb_frame=int(message.split(" ")[2])
|
|
wait_duration=int(message.split(" ")[3])
|
|
path=str(message.split(" ")[4])
|
|
|
|
#sleep a duration before to start
|
|
sleep(delay)
|
|
|
|
client.publish("receiver/image", "Start");
|
|
|
|
#flushing before to begin
|
|
nb_step=int(volume)*507
|
|
|
|
for i in range(nb_step):
|
|
print("pump_stepper.onestep(direction=+action+, style=stepper.DOUBLE")
|
|
time.sleep(0.01)
|
|
|
|
directory = os.path.join(path, "PlanktonScope")
|
|
os.makedirs(directory, exist_ok=True)
|
|
|
|
|
|
path_date = os.path.join(directory, datetime.now().strftime("%m_%d_%Y"))
|
|
os.makedirs(path_date, exist_ok=True)
|
|
|
|
path_hour = os.path.join(path_date,datetime.now().strftime("%H"))
|
|
os.makedirs(path_hour, exist_ok=True)
|
|
|
|
while True:
|
|
count+=1
|
|
print(count,nb_frame)
|
|
|
|
filename = os.path.join(path_hour,datetime.now().strftime("%M_%S_%f")+".jpg")
|
|
camera.capture(filename)
|
|
print("pump_stepper.onestep(direction=+action+, style=stepper.DOUBLE")
|
|
|
|
if topic!="image":
|
|
pump_focus.release()
|
|
print("The imaging has been interrompted.")
|
|
client.publish("receiver/image", "Interrompted");
|
|
break
|
|
|
|
if count>nb_frame:
|
|
print("The imaging is done.")
|
|
topic="wait"
|
|
client.publish("receiver/image", "Done");
|
|
break
|
|
|
|
else:
|
|
print("Waiting")
|
|
sleep(1)
|