homecontrol-bh1750: initial commit
This commit is contained in:
		
						commit
						09ef8e2f1a
					
				
					 7 changed files with 187 additions and 0 deletions
				
			
		
							
								
								
									
										2
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,2 @@
 | 
			
		|||
Pipfile.lock
 | 
			
		||||
.idea/*
 | 
			
		||||
							
								
								
									
										14
									
								
								Pipfile
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								Pipfile
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,14 @@
 | 
			
		|||
[[source]]
 | 
			
		||||
name = "pypi"
 | 
			
		||||
url = "https://pypi.org/simple"
 | 
			
		||||
verify_ssl = true
 | 
			
		||||
 | 
			
		||||
[dev-packages]
 | 
			
		||||
 | 
			
		||||
[packages]
 | 
			
		||||
pyserial = ">=3.3,<4.0"
 | 
			
		||||
docopt = ">=0.6.2,<0.7"
 | 
			
		||||
adafruit-ampy = ">=1.0.5,<1.1"
 | 
			
		||||
 | 
			
		||||
[requires]
 | 
			
		||||
python_version = "3.7"
 | 
			
		||||
							
								
								
									
										62
									
								
								bh1750/__init__.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								bh1750/__init__.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,62 @@
 | 
			
		|||
"""
 | 
			
		||||
Micropython BH1750 ambient light sensor driver.
 | 
			
		||||
from https://github.com/PinkInk/upylib
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
from utime import sleep_ms
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class BH1750():
 | 
			
		||||
    """Micropython BH1750 ambient light sensor driver."""
 | 
			
		||||
 | 
			
		||||
    PWR_OFF = 0x00
 | 
			
		||||
    PWR_ON = 0x01
 | 
			
		||||
    RESET = 0x07
 | 
			
		||||
 | 
			
		||||
    # modes
 | 
			
		||||
    CONT_LOWRES = 0x13
 | 
			
		||||
    CONT_HIRES_1 = 0x10
 | 
			
		||||
    CONT_HIRES_2 = 0x11
 | 
			
		||||
    ONCE_HIRES_1 = 0x20
 | 
			
		||||
    ONCE_HIRES_2 = 0x21
 | 
			
		||||
    ONCE_LOWRES = 0x23
 | 
			
		||||
 | 
			
		||||
    # default addr=0x23 if addr pin floating or pulled to ground
 | 
			
		||||
    # addr=0x5c if addr pin pulled high
 | 
			
		||||
    def __init__(self, bus, addr=0x23):
 | 
			
		||||
        self.bus = bus
 | 
			
		||||
        self.addr = addr
 | 
			
		||||
        self.off()
 | 
			
		||||
        self.reset()
 | 
			
		||||
 | 
			
		||||
    def off(self):
 | 
			
		||||
        """Turn sensor off."""
 | 
			
		||||
        self.set_mode(self.PWR_OFF)
 | 
			
		||||
 | 
			
		||||
    def on(self):
 | 
			
		||||
        """Turn sensor on."""
 | 
			
		||||
        self.set_mode(self.PWR_ON)
 | 
			
		||||
 | 
			
		||||
    def reset(self):
 | 
			
		||||
        """Reset sensor, turn on first if required."""
 | 
			
		||||
        self.on()
 | 
			
		||||
        self.set_mode(self.RESET)
 | 
			
		||||
 | 
			
		||||
    def set_mode(self, mode):
 | 
			
		||||
        """Set sensor mode."""
 | 
			
		||||
        self.mode = mode
 | 
			
		||||
        self.bus.writeto(self.addr, bytes([self.mode]))
 | 
			
		||||
 | 
			
		||||
    def luminance(self, mode):
 | 
			
		||||
        """Sample luminance (in lux), using specified sensor mode."""
 | 
			
		||||
        # continuous modes
 | 
			
		||||
        if mode & 0x10 and mode != self.mode:
 | 
			
		||||
            self.set_mode(mode)
 | 
			
		||||
        # one shot modes
 | 
			
		||||
        if mode & 0x20:
 | 
			
		||||
            self.set_mode(mode)
 | 
			
		||||
        # earlier measurements return previous reading
 | 
			
		||||
        sleep_ms(24 if mode in (0x13, 0x23) else 180)
 | 
			
		||||
        data = self.bus.readfrom(self.addr, 2)
 | 
			
		||||
        factor = 2.0 if mode in (0x11, 0x21) else 1.0
 | 
			
		||||
        return (data[0]<<8 | data[1]) / (1.2 * factor)
 | 
			
		||||
							
								
								
									
										1
									
								
								boot.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								boot.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
# not doing anything
 | 
			
		||||
							
								
								
									
										58
									
								
								main.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								main.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,58 @@
 | 
			
		|||
import machine
 | 
			
		||||
import utime as time
 | 
			
		||||
import urequests as requests
 | 
			
		||||
import uuid
 | 
			
		||||
import ujson
 | 
			
		||||
import wifi
 | 
			
		||||
import bh1750
 | 
			
		||||
 | 
			
		||||
CONFIG = "config.json"
 | 
			
		||||
ADDRESS="http://192.168.11.21:5000"
 | 
			
		||||
TIMEOUT_UPDATE = 5
 | 
			
		||||
 | 
			
		||||
class SensorBH1750:
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
        self.config = {}
 | 
			
		||||
        try:
 | 
			
		||||
            config_file = open(CONFIG, "r")
 | 
			
		||||
            self.config = ujson.load(config_file)
 | 
			
		||||
        except Exception as ex:
 | 
			
		||||
            print("Exception\n\ttype: %s\n\targs: %s" % (type(ex).__name__, ex.args))
 | 
			
		||||
 | 
			
		||||
        update_config = False
 | 
			
		||||
        if not self.config.get("id"):
 | 
			
		||||
            update_config = True
 | 
			
		||||
            self.config["id"] = uuid.uuid4().hex
 | 
			
		||||
        if update_config:
 | 
			
		||||
            with open(CONFIG, "w") as config_file:
 | 
			
		||||
                ujson.dump(self.config, config_file)
 | 
			
		||||
        self.id_s = self.config["id"]
 | 
			
		||||
 | 
			
		||||
        self.i2c = machine.I2C(scl=machine.Pin(5), sda=machine.Pin(4))
 | 
			
		||||
        self.s = bh1750.BH1750(self.i2c)
 | 
			
		||||
        self.s.on()
 | 
			
		||||
 | 
			
		||||
    def update(self):
 | 
			
		||||
        mode=bh1750.BH1750.ONCE_HIRES_1
 | 
			
		||||
        l = float(self.s.luminance(mode))
 | 
			
		||||
        print("luminance: %f" % l)
 | 
			
		||||
        self.send_update(self.id_s, "luminance", l)
 | 
			
		||||
 | 
			
		||||
    def send_update(self, id_s, type_s, value):
 | 
			
		||||
        url = "%s/sensors/update" % ADDRESS
 | 
			
		||||
        data = {"id": id_s, "type": type_s, "value": value}
 | 
			
		||||
        try:
 | 
			
		||||
            r = requests.post(url, json=data)
 | 
			
		||||
            # remember to close
 | 
			
		||||
            r.close()
 | 
			
		||||
        except Exception as ex:
 | 
			
		||||
            print("Exception\n\tdata: %s\n\ttype: %s\n\targs: %s" % (data, type(ex).__name__, ex.args))
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
    w = wifi.wifi()
 | 
			
		||||
    w.connect()
 | 
			
		||||
    sensor = SensorBH1750()
 | 
			
		||||
 | 
			
		||||
    while True:
 | 
			
		||||
        sensor.update()
 | 
			
		||||
        time.sleep(TIMEOUT_UPDATE)
 | 
			
		||||
							
								
								
									
										28
									
								
								uuid.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								uuid.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,28 @@
 | 
			
		|||
import uos
 | 
			
		||||
import ubinascii
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class UUID:
 | 
			
		||||
    def __init__(self, bytes):
 | 
			
		||||
        if len(bytes) != 16:
 | 
			
		||||
            raise ValueError('bytes arg must be 16 bytes long')
 | 
			
		||||
        self._bytes = bytes
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def hex(self):
 | 
			
		||||
        return ubinascii.hexlify(self._bytes).decode()
 | 
			
		||||
 | 
			
		||||
    def __str__(self):
 | 
			
		||||
        h = self.hex
 | 
			
		||||
        return '-'.join((h[0:8], h[8:12], h[12:16], h[16:20], h[20:32]))
 | 
			
		||||
 | 
			
		||||
    def __repr__(self):
 | 
			
		||||
        return "<UUID: %s>" % str(self)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def uuid4():
 | 
			
		||||
    """Generates a random UUID compliant to RFC 4122 pg.14"""
 | 
			
		||||
    random = bytearray(uos.urandom(16))
 | 
			
		||||
    random[6] = (random[6] & 0x0F) | 0x40
 | 
			
		||||
    random[8] = (random[8] & 0x3F) | 0x80
 | 
			
		||||
    return UUID(bytes=random)
 | 
			
		||||
							
								
								
									
										22
									
								
								wifi.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								wifi.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,22 @@
 | 
			
		|||
import network
 | 
			
		||||
from credentials import *
 | 
			
		||||
# NET_SSID="xxx"
 | 
			
		||||
# NET_PASS="yyy"
 | 
			
		||||
 | 
			
		||||
class wifi:
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
        self.if_ap = network.WLAN(network.AP_IF)
 | 
			
		||||
        self.if_sta = network.WLAN(network.STA_IF)
 | 
			
		||||
 | 
			
		||||
    def status(self):
 | 
			
		||||
        return self.if_sta.isconnected()
 | 
			
		||||
 | 
			
		||||
    def connect(self):
 | 
			
		||||
        self.if_ap.active(False)
 | 
			
		||||
        self.if_sta.active(True)
 | 
			
		||||
        if not self.if_sta.isconnected():
 | 
			
		||||
            print("connect: reconnecting...")
 | 
			
		||||
            self.if_sta.connect(NET_SSID, NET_PASS)
 | 
			
		||||
            while not self.if_sta.isconnected():
 | 
			
		||||
                pass
 | 
			
		||||
        print("network config: ", self.if_sta.ifconfig())
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue