Files
pycom-documentation/content/tutorials/hardware/i2c.md
gijsio 9a0602f9e5 Restructure, rev1
* Products
    -> updated with new products
    -> added accessories
* Getting started
   -> re-structured getting started guide
   -> removed some of the advanced stuff
* Tutorials / Examples
   -> added categories
   -> added new basic tutorials Sleep, GPIO and Pring
   -> added WiFi ap / sta tutorial
   -> added wifi Scan MAC tutorial
* Firmware API
   -> added pysense pytrack pygate categories here
* Datasheets
   -> added CE FCC and RoHS documents
   -> added pysense2 and pytrack 2 templates
* Update firmware
   -> new section, added all methods of updating the firmware
* License
   -> put license in its own section

general remarks:
-> updated the layout / theme
   no more red code text
   codeblocks actually work now
-> general layout updates, removed the old html structures (mostly)
2020-07-09 12:57:44 +02:00

2.4 KiB

title, aliases
title aliases
I2C
tutorials/all/i2c.html
tutorials/all/i2c.md
chapter/tutorials/all/i2c

The following example receives data from a light sensor using I2C. Sensor used is the BH1750FVI Digital Light Sensor.


import time
from machine import I2C
import bh1750fvi

i2c = I2C(0, I2C.MASTER, baudrate=100000)
light_sensor = bh1750fvi.BH1750FVI(i2c, addr=i2c.scan()[0])

while(True):
        data = light_sensor.read()
        print(data)
    time.sleep(1)

Drivers for the BH1750FVI

Place this sample code into a file named bh1750fvi.py. This can then be imported as a library.


# Simple driver for the BH1750FVI digital light sensor

class BH1750FVI:
    MEASUREMENT_TIME = const(120)

    def __init__(self, i2c, addr=0x23, period=150):
        self.i2c = i2c
        self.period = period
        self.addr = addr
        self.time = 0
        self.value = 0
        self.i2c.writeto(addr, bytes([0x10])) # start continuos 1 Lux readings every 120ms

    def read(self):
        self.time += self.period
        if self.time >= MEASUREMENT_TIME:
            self.time = 0
            data = self.i2c.readfrom(self.addr, 2)
            self.value = (((data[0] << 8) + data[1]) * 1200) // 1000
        return self.value

Light sensor and LoRa

This is the same code, with added LoRa connectivity, sending the lux value from the light sensor to another LoRa enabled device.


import socket
import time
import pycom
import struct
from network import LoRa
from machine import I2C
import bh1750fvi

LORA_PKG_FORMAT = "!BH"
LORA_CONFIRM_FORMAT = "!BB"

DEVICE_ID = 1

pycom.heartbeat(False)

lora = LoRa(mode=LoRa.LORA, tx_iq=True, region=LoRa.EU868)
lora_sock = socket.socket(socket.AF_LORA, socket.SOCK_RAW)
lora_sock.setblocking(False)

i2c = I2C(0, I2C.MASTER, baudrate=100000)
light_sensor = bh1750fvi.BH1750FVI(i2c, addr=i2c.scan()[0])

while(True):
    msg = struct.pack(LORA_PKG_FORMAT, DEVICE_ID, light_sensor.read())
    lora_sock.send(msg)

    pycom.rgbled(0x150000)

    wait = 5
    while (wait > 0):
        wait = wait - 0.1
        time.sleep(0.1)
        recv_data = lora_sock.recv(64)

        if (len (recv_data) >= 2):
            status, device_id = struct.unpack(LORA_CONFIRM_FORMAT, recv_data)

            if (device_id == DEVICE_ID and status == 200):
                pycom.rgbled(0x001500)
                wait = 0

    time.sleep(1)