示例#1
0
class Alarm:

    gas_threshold = 1000
    smoke_threshold = 2000
    temperature_threshold = 55

    def __init__(self):
        self.fire_detected = False
        self.buzzer = Buzzer()
        self.adc = MCP3008()

    async def connect_azure(self):
        conn_str = "HostName=Smartfire.azure-devices.net;DeviceId=smartfire-1;SharedAccessKey=sFQIzn79jON2ZBpL3iiBHScmIBXMXf57bA5PFM69ie8="
        self.device_client = IoTHubDeviceClient.create_from_connection_string(
            conn_str)
        await self.device_client.connect()

    async def start(self):
        await self.connect_azure()
        await self.start_alarm()

    async def start_alarm(self):
        while True:
            humidity, temperature = self.get_dht11_data()
            mq3_data = self.get_mq3_data()
            mq9_data = self.get_mq9_data()
            await self.save_measurements(temperature, humidity, mq3_data,
                                         mq9_data)
            sleep(4)

            if ((mq3_data > Alarm.gas_threshold
                 or mq9_data > Alarm.smoke_threshold
                 or temperature > Alarm.temperature_threshold)
                    and not self.fire_detected):
                self.fire_detected = True
                self.buzzer.start()

            else:
                self.fire_detected = False
                self.buzzer.stop()

    async def save_measurements(self, temperature, humidity, mq3_data,
                                mq9_data):
        print("saving saving measurements")

        gas_percentage = self.convert_percentage(mq3_data, 350, 1000)
        co_percentage = self.convert_percentage(mq3_data, 990, 5000)

        data = {
            'device_id': 1,
            'event': "measurement",
            'temperature': float(temperature),
            'gas_percentage': gas_percentage,
            'co_percentage': co_percentage,
            'is_fire': 1 if self.fire_detected else 0,
            'humidity': float(humidity)
        }

        json_body = json.dumps(data)
        await self.device_client.send_message(json_body)

        twin = await self.device_client.get_twin()
        self.handle_twin(twin)

        await self.device_client.disconnect()

    def handle_twin(self, twin):
        if (not self.fire_detected):
            if ('desired' in twin):
                desired = twin['desired']
                if ('is_fire' in desired):
                    if desired['is_fire'] == 1:
                        self.buzzer.start()
                    elif desired['is_fire'] == 0:
                        self.buzzer.stop()

    def convert_percentage(self, number, min, max):
        percentage = round(((number - min) / (max - min)) * 100, 2)
        if percentage > 100:
            percentage = 100
        elif percentage < 0:
            percentage = 0
        return float(percentage)

    def get_dht11_data(self):
        return Adafruit_DHT.read_retry(11, 4)

    def get_mq3_data(self):
        return self.adc.read(0)

    def get_mq9_data(self):
        return self.adc.read(1)