Esempio n. 1
0
    def __init__(self,btnGap=200,):
        self.btnGap = btnGap

        i2c = I2C(scl=Pin(4),sda=Pin(5))
        
        self.d = ssd1306.SSD1306_I2C(128, 64, i2c)
        self.p = Pressure(i2c)
        
        self.pwm = PWM(Pin(13))
        self.pwm.duty(0)
        self.pwm.freq(90) # pwm duty 19 - 134
        self.button = Pin(12, Pin.IN,Pin.PULL_UP)

        self.led = Pin(16,Pin.OUT)
        self.led.off() # this turn on board led off

        self.adc = ADC(0)
        self.pwr = Pin(14, Pin.OUT,)
        self.pwr.off()

        self.t1 = 0 
        self.t2 = 0
        self.title = 'Liquid Monitor'

        self.pump = False
        self.speed = 0
        self.cond = 0
        self.pumpON = False
        self.initSpeed = 300
        self.btnExit = False
        self.lastCond = 0
        self.pressure=0
        self.temp=0
Esempio n. 2
0
 def __init__(self, refPath, dataPath, dbFilename):
     GPIO.cleanup()
     GPIO.setmode(GPIO.BCM)
     GPIO.setup(self.AUTO_START_GPIO_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
     self.__i2c = I2C(2)
     self.__analog = Analog(sel.__i2c.getLock(), 0x49)
     self.default = Default()
     self.database = Database(dataPath, dbFilename)
     self.waterlevel = Waterlevel(debug, self.database)
     self.light = Light(self.database)
     self.curtain = Curtain(self.database)
     self.pressure = Pressure(self.database, self.default, self.__analog)
     self.temperature = Temperature("28-0417716a37ff", self.database)
     self.redox = Redox(debug, self.database, self.default, self.__analog)
     self.ph = PH(debug, self.database, self.default, self.__analog,
                  self.temperature)
     self.robot = Robot(debug, self.database)
     self.pump = Pump(debug, self.database, self.default, self.robot,
                      self.redox, self.ph, self.temperature)
     self.panel = Panel(debug, self.database, self.default, self.pump,
                        self.redox, self.ph, self.__i2c)
     self.statistic = Statistic(debug, self.pump, self.robot, self.redox,
                                self.ph, self.temperature, self.pressure,
                                self.waterlevel)
     self.refPath = refPath
     self.__autoSaveTick = 0
     self.__today = date.today().day - 1
     debug.TRACE(debug.DEBUG, "Initialisation done (Verbosity level: %s)\n",
                 debug)
Esempio n. 3
0
    def generate(self):
        self.states = []

        print "\n[trace] - Generate states - Generate quantity combinations:"
        # Generate all quantities for each state.
        states_q = itertools.product(Inflow.get_quantities(),
                                     Volume.get_quantities(),
                                     Outflow.get_quantities(),
                                     Height.get_quantities(),
                                     Pressure.get_quantities())

        # Create objects for each state.
        for state_q in states_q:
            self.states.append(
                BonusState(Inflow(state_q[0], None), Volume(state_q[1], None),
                           Outflow(state_q[2], None), Height(state_q[3], None),
                           Pressure(state_q[4], None)))

        pprint.pprint(self.states)
        print "[trace] - Generate states - " +\
            str(len(self.states)) + " current states"

        print "\n[trace] - Generate states - remove constraints:"
        self.remove_inconsistencies()
        pprint.pprint(self.states)
        print "[trace] - Generate states - " +\
            str(len(self.states)) + " current states"

        print "\n[trace] - Generate states - Calculate derivitives:"
        self.calc_derives()
        pprint.pprint(self.states)
        print "[trace] - Generate states - " +\
            str(len(self.states)) + " current states"

        print "\n[trace] - Generate states - Unpack the inflow derivitives"
        self.unpack_inflow()

        print "\n[trace] - Generate states - Set state ids"
        # At this point all valid states are created and should receive an id
        for i, state in enumerate(self.states):
            state.set_id(i)

        pprint.pprint(self.states)
        print "[trace] - Generate states - " +\
            str(len(self.states)) + " current states"

        print "\n[trace] - Create paths - Start"
        self.create_paths()
        pprint.pprint(self.paths)
        print "[trace] - Generate states - " +\
            str(len(self.paths)) + " current paths"
        print "[trace] - Create paths - End\n"

        return self.states, self.paths
Esempio n. 4
0
class WaterColumn:
    state = states.NoWhere()
    measure_location = ""
    pin_valve = -1
    pin_pump = -1
    pressureSensor = Pressure()
    rws = government.RWS()
    
    counter = 0;
    
    previous_level = 0
    previous_desired = 0
    
    
    def __init__(self, location, channel, pin_valve, pin_pump ):
        self.channel = channel
        self.measure_location = location
        self.pin_pump = pin_pump
        self.pin_valve = pin_valve
        self.zero = False
        self.empty = False
        self.lock = asyncio.Lock()
        
    def getWaterLevel(self):
        async with self.lock: 
            if (self.zero):
                return 0, True
            if (self.empty):
                return constants.NAP_COLUMN_LEVEL, True
            return self.rws.getWaterLevel(self.measure_location)
    
    def setLevelToZero(self):
        async with self.lock:
            #only set when empty is false
            self.zero = not self.empty
    
    def setLevelToEmpty(self):
        async with self.lock:
            #only set when zero  is false
            self.empty = not self.zero
        
    def setToNormal(self):
        async with self.lock:
            self.zero = False
            self.empty = False
            
    def runWorlds(self, screen):
        while True:
            #NAP start  + NAP level equals column height 
            level_column = constants.NAP_COLUMN_LEVEL + self.pressureSensor.getColumnLevel(self.channel)
                
            level_desired, ok = self.getWaterLevel() 
            
            if (ok):
                self.previous_desired = level_desired
            else:
                #print("error")
                
                level_desired = self.previous_desired
            
            if (ok):
                self.state = self.state.execute(self.measure_location, level_column, level_desired,  self.pin_valve, self.pin_pump, screen)
            else:
                self.state = states.Error()
            
            #check if an hardware error is occuring
            if (self.previous_level == level_column and level_desired > level_column):
                self.counter += 1
                if (self.counter > constants.TEN_S_EQUAL_ERROR_COUNT): #no change in water level after x iterations, something is wrong -> Error
                    self.state = states.Error()
                    
            else:
                self.counter = 0
                self.previous_level = level_column
            #print ("Level Desired Column {0:2.2f}".format(level_desired))
            screen.writeToScreen(self.channel, self.measure_location, self.state.getName(), level_column , level_desired)
            time.sleep(constants.COLUMN_WAIT) 
Esempio n. 5
0
class Controller:
    def __init__(
        self,
        btnGap=200,
    ):
        self.btnGap = btnGap

        i2c = I2C(scl=Pin(5), sda=Pin(4))

        self.d = ssd1306.SSD1306_I2C(128, 64, i2c)
        self.p = Pressure(i2c)

        self.pwm = PWM(Pin(13))
        self.pwm.duty(0)
        self.pwm.freq(90)  # pwm duty 19 - 134
        self.button = Pin(12, Pin.IN, Pin.PULL_UP)

        self.led = Pin(2, Pin.OUT)
        self.led.on()  # this turn on board led off

        self.adc = ADC(0)
        self.pwr = Pin(
            14,
            Pin.OUT,
        )
        self.pwr.off()

        self.t1 = 0
        self.t2 = 0
        self.title = 'Liquid Monitor'

        self.pump = False
        self.speed = 0
        self.cond = 0
        self.pumpON = False
        self.initSpeed = 300
        self.btnExit = False
        self.lastCond = 0
        self.pressure = 0
        self.temp = 0

    def ledON(self):
        self.led.off()

    def ledOFF(self):
        self.led.on()

    def setPump(self, value):
        self.pwm.duty(int(value))

    def measure(self, wait=0, N=3):
        "measure method"
        res = []
        for i in range(N):
            res.append(self.singleM(wait))
            utime.sleep_ms(50)
        self.cond = sum(res) // N
        # measure temperatuer and pressurre
        self.pressure, self.temp = self.p.read()

    def singleM(self, wait=0):
        self.pwr.on()
        utime.sleep_ms(wait)
        cond = self.adc.read()
        self.pwr.off()
        return cond

    def update(self):
        "determine if need to turn on pump"
        if self.pump:
            if self.cond >= 20:
                self.lastCond = self.cond
                self.speed -= 30
                if self.speed <= 200:
                    self.speed = 0
                self.setPump(self.speed)
            else:
                self.speed += 10
                if self.speed <= 200:
                    self.speed = 200
                self.speed = min(1024, self.speed)
                self.setPump(self.speed)
        else:
            self.setPump(0)
            self.speed = 0

    def show(self):
        self.d.fill(0)
        self.d.text(self.title, 0, 2)
        self.d.text('Cond.  :{:>6d}'.format(self.cond), 0, 20)
        self.d.text('LastC. :{:>6d}'.format(self.lastCond), 0, 31)
        self.d.text('Pump   :{:>6}'.format(self.speed if self.pump else "OFF"),
                    0, 42)
        self.d.text('PSI:{:>4.1f} T: {:.1f}'.format(self.pressure, self.temp),
                    0, 53)
        self.d.show()

    def text(self, header="", msg=""):
        self.d.fill(0)

        self.d.text(header, 0, 2)
        for i in range(len(msg) // 16 + 1):
            self.d.text(msg[i * 16:(i + 1) * 16], 0, i * 10 + 16)
        self.d.show()

    def monitorButton(self):
        self.t1 = utime.ticks_ms()
        while True:
            self.t2 = utime.ticks_ms()
            if self.button.value() == 0:
                self.pump = not self.pump
                break
            if (self.t2 - self.t1 >= self.btnGap) or (
                (self.t2 - self.t1) <= 0):
                break
        while (self.button.value() == 0):
            self.ledON()
            utime.sleep_ms(50)
            self.ledOFF()
            utime.sleep_ms(50)
            if (utime.ticks_ms() - self.t1) > 3000:
                self.title = "System Exited."
                self.show()
                self.btnExit = True
                raise Exception('exit')
Esempio n. 6
0
class Manager:
    AUTO_START_GPIO_PIN = 16
    ONCE_BY_HOUR_TICK = 360  # 1h

    def __init__(self, refPath, dataPath, dbFilename):
        GPIO.cleanup()
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(self.AUTO_START_GPIO_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
        self.__i2c = I2C(2)
        self.__analog = Analog(sel.__i2c.getLock(), 0x49)
        self.default = Default()
        self.database = Database(dataPath, dbFilename)
        self.waterlevel = Waterlevel(debug, self.database)
        self.light = Light(self.database)
        self.curtain = Curtain(self.database)
        self.pressure = Pressure(self.database, self.default, self.__analog)
        self.temperature = Temperature("28-0417716a37ff", self.database)
        self.redox = Redox(debug, self.database, self.default, self.__analog)
        self.ph = PH(debug, self.database, self.default, self.__analog,
                     self.temperature)
        self.robot = Robot(debug, self.database)
        self.pump = Pump(debug, self.database, self.default, self.robot,
                         self.redox, self.ph, self.temperature)
        self.panel = Panel(debug, self.database, self.default, self.pump,
                           self.redox, self.ph, self.__i2c)
        self.statistic = Statistic(debug, self.pump, self.robot, self.redox,
                                   self.ph, self.temperature, self.pressure,
                                   self.waterlevel)
        self.refPath = refPath
        self.__autoSaveTick = 0
        self.__today = date.today().day - 1
        debug.TRACE(debug.DEBUG, "Initialisation done (Verbosity level: %s)\n",
                    debug)

    def __del__(self):
        GPIO.cleanup()

    def __onceByHour(self):
        if self.__autoSaveTick == self.ONCE_BY_HOUR_TICK:
            self.database.backup()
            self.__autoSaveTick = 0
            # All seems to be OK, we can remove the previous version
            backup = os.path.join(self.refPath, "PoolSurvey_bak")
            if os.path.exists(backup):
                os.system("rm -frd %s" % backup)
        self.__autoSaveTick += 1

    def __onceByDay(self):
        if self.__today != date.today().day:
            self.__today = date.today().day
            self.pressure.onceByDay()
            self.pump.onceByDay()
            self.statistic.onceByDay()

    def isAutoStart(self):
        return GPIO.input(self.AUTO_START_GPIO_PIN) == GPIO.LOW

    def start(self):
        debug.TRACE(debug.DEBUG, "Manager is started\n")
        self.__running = True
        while self.__running:
            debug.TAG(debug.DETAIL, "%ds Tick" % REFRESH_TICK)
            self.temperature.update()
            self.__onceByDay()
            self.pump.update()
            if self.pump.guardPeriodElapsed():
                self.robot.update()
                self.ph.update()
                self.redox.update()
                self.waterlevel.update()
                self.pressure.update()
                self.panel.update()
            self.statistic.update()
            self.__onceByHour()
            time.sleep(REFRESH_TICK)
        debug.TRACE(debug.DEBUG, "Manager is stopped\n")
        self.pump.switchOff()
        self.statistic.save()

    def stop(self):
        self.__running = False
Esempio n. 7
0
"""Main module that runs continously to monitor
assorted sensors"""

import time
import json
import graphyte
from pressure import Pressure
from vacuum import Vacuum
from dust import Dust
from temperature import Temperature
from relative_humidity import RelativeHumidity

T = Temperature()
P = Pressure()
V = Vacuum()
D = Dust()
RH = RelativeHumidity()

with open('sensorConfig.json') as json_file:
    FILE_DATA = json.load(json_file)

graphyte.init(FILE_DATA["ip address"]
              )  # initializes Grafana to send data to this ip address

RUN = True

while RUN:

    VACUUM_DATA = V.vacuum()
    PRESSURE_DATA = P.pressure()
    DUST_DATA = D.dust()
Esempio n. 8
0
comms = Comms()
wifi = WiFiManager()
comms.add_manager(0, wifi)

manager = DataManager(csv_file=csv_file)
acc = Accelerometer(
    py, config.manager_mqtt_user + "/feeds/" + config.manager_mqtt_name +
    ".acceleration")
manager.add_sensor(acc)
light = Light(
    py, config.manager_mqtt_user + "/feeds/" + config.manager_mqtt_name +
    ".light-1", config.manager_mqtt_user + "/feeds/" +
    config.manager_mqtt_name + ".light-2")
manager.add_sensor(light)
press = Pressure(
    py, config.manager_mqtt_user + "/feeds/" + config.manager_mqtt_name +
    ".pressure")
manager.add_sensor(press)
temphum = TempHum(
    py, config.manager_mqtt_user + "/feeds/" + config.manager_mqtt_name +
    ".temperature", config.manager_mqtt_user + "/feeds/" +
    config.manager_mqtt_name + ".humidity")
manager.add_sensor(temphum)
batt = Battery(
    py, config.manager_mqtt_user + "/feeds/" + config.manager_mqtt_name +
    ".voltage")
manager.add_sensor(batt)

try:
    if not comms.connect():
        comms.disconnect()