From 38358a096dfdf2315f71ed6e26a697d143d635ca Mon Sep 17 00:00:00 2001 From: Damien George Date: Thu, 28 Apr 2016 12:36:45 +0100 Subject: esp8266: Move onewire.py, neopixel.py drivers from tests/ to scripts/. --- esp8266/scripts/neopixel.py | 64 ++++++++++++++++++++ esp8266/scripts/onewire.py | 143 ++++++++++++++++++++++++++++++++++++++++++++ esp8266/tests/neopixel.py | 64 -------------------- esp8266/tests/onewire.py | 143 -------------------------------------------- 4 files changed, 207 insertions(+), 207 deletions(-) create mode 100644 esp8266/scripts/neopixel.py create mode 100644 esp8266/scripts/onewire.py delete mode 100644 esp8266/tests/neopixel.py delete mode 100644 esp8266/tests/onewire.py diff --git a/esp8266/scripts/neopixel.py b/esp8266/scripts/neopixel.py new file mode 100644 index 000000000..7717bb496 --- /dev/null +++ b/esp8266/scripts/neopixel.py @@ -0,0 +1,64 @@ +import time +import machine +from esp import neopixel_write + +class NeoPixel: + def __init__(self, pin, n): + self.pin = pin + self.n = n + self.buf = bytearray(n * 3) + + def __setitem__(self, index, val): + r, g, b = val + self.buf[index * 3] = g + self.buf[index * 3 + 1] = r + self.buf[index * 3 + 2] = b + + def __getitem__(self, index): + i = index * 3 + return self.buf[i], self.buf[i + 1], self.buf[i + 2] + + def write(self): + neopixel_write(self.pin, self.buf, True) + +def test(): + # put a neopixel strip on GPIO4 + p = machine.Pin(4, machine.Pin.OUT) + np = NeoPixel(p, 8) + n = np.n + + # cycle + for i in range(4 * n): + for j in range(n): + np[j] = (0, 0, 0) + np[i % n] = (255, 255, 255) + np.write() + time.sleep_ms(25) + + # bounce + for i in range(4 * n): + for j in range(n): + np[j] = (0, 0, 128) + if (i // n) % 2 == 0: + np[i % n] = (0, 0, 0) + else: + np[n - 1 - (i % n)] = (0, 0, 0) + np.write() + time.sleep_ms(60) + + # fade in/out + for i in range(0, 4 * 256, 8): + for j in range(n): + if (i // 256) % 2 == 0: + val = i & 0xff + else: + val = 255 - (i & 0xff) + np[j] = (val, 0, 0) + np.write() + + # clear + for i in range(n): + np[i] = (0, 0, 0) + np.write() + +test() diff --git a/esp8266/scripts/onewire.py b/esp8266/scripts/onewire.py new file mode 100644 index 000000000..95d16c668 --- /dev/null +++ b/esp8266/scripts/onewire.py @@ -0,0 +1,143 @@ +import _onewire as _ow + +class OneWire: + CMD_SEARCHROM = const(0xf0) + CMD_READROM = const(0x33) + CMD_MATCHROM = const(0x55) + CMD_SKIPROM = const(0xcc) + + def __init__(self, pin): + self.pin = pin + self.pin.init(pin.OPEN_DRAIN, pin.PULL_NONE) + + def reset(self): + return _ow.reset(self.pin) + + def read_bit(self): + return _ow.readbit(self.pin) + + def read_byte(self): + return _ow.readbyte(self.pin) + + def read_bytes(self, count): + buf = bytearray(count) + for i in range(count): + buf[i] = _ow.readbyte(self.pin) + return buf + + def write_bit(self, value): + return _ow.writebit(self.pin, value) + + def write_byte(self, value): + return _ow.writebyte(self.pin, value) + + def write_bytes(self, buf): + for b in buf: + _ow.writebyte(self.pin, b) + + def select_rom(self, rom): + self.reset() + self.write_byte(CMD_MATCHROM) + self.write_bytes(rom) + + def scan(self): + devices = [] + diff = 65 + rom = False + for i in range(0xff): + rom, diff = self._search_rom(rom, diff) + if rom: + devices += [rom] + if diff == 0: + break + return devices + + def _search_rom(self, l_rom, diff): + if not self.reset(): + return None, 0 + self.write_byte(CMD_SEARCHROM) + if not l_rom: + l_rom = bytearray(8) + rom = bytearray(8) + next_diff = 0 + i = 64 + for byte in range(8): + r_b = 0 + for bit in range(8): + b = self.read_bit() + if self.read_bit(): + if b: # there are no devices or there is an error on the bus + return None, 0 + else: + if not b: # collision, two devices with different bit meaning + if diff > i or ((l_rom[byte] & (1 << bit)) and diff != i): + b = 1 + next_diff = i + self.write_bit(b) + if b: + r_b |= 1 << bit + i -= 1 + rom[byte] = r_b + return rom, next_diff + + def crc8(self, data): + return _ow.crc8(data) + +class DS18B20: + THERM_CMD_CONVERTTEMP = const(0x44) + THERM_CMD_RSCRATCHPAD = const(0xbe) + + def __init__(self, onewire): + self.ow = onewire + self.roms = [] + + def scan(self): + self.roms = [] + for rom in self.ow.scan(): + if rom[0] == 0x28: + self.roms += [rom] + return self.roms + + def start_measure(self): + if not self.ow.reset(): + return False + self.ow.write_byte(CMD_SKIPROM) + self.ow.write_byte(THERM_CMD_CONVERTTEMP) + return True + + def get_temp(self, rom): + if not self.ow.reset(): + return None + + self.ow.select_rom(rom) + self.ow.write_byte(THERM_CMD_RSCRATCHPAD) + + buf = self.ow.read_bytes(9) + if self.ow.crc8(buf): + return None + + return self._convert_temp(buf) + + def _convert_temp(self, data): + temp_lsb = data[0] + temp_msb = data[1] + return (temp_msb << 8 | temp_lsb) / 16 + +# connect 1-wire temp sensors to GPIO12 for this test +def test(): + import time + import machine + dat = machine.Pin(12) + ow = OneWire(dat) + + ds = DS18B20(ow) + roms = ow.scan() + print('found devices:', roms) + + for i in range(4): + print('temperatures:', end=' ') + ds.start_measure() + time.sleep_ms(750) + for rom in roms: + print(ds.get_temp(rom), end=' ') + print() diff --git a/esp8266/tests/neopixel.py b/esp8266/tests/neopixel.py deleted file mode 100644 index 7717bb496..000000000 --- a/esp8266/tests/neopixel.py +++ /dev/null @@ -1,64 +0,0 @@ -import time -import machine -from esp import neopixel_write - -class NeoPixel: - def __init__(self, pin, n): - self.pin = pin - self.n = n - self.buf = bytearray(n * 3) - - def __setitem__(self, index, val): - r, g, b = val - self.buf[index * 3] = g - self.buf[index * 3 + 1] = r - self.buf[index * 3 + 2] = b - - def __getitem__(self, index): - i = index * 3 - return self.buf[i], self.buf[i + 1], self.buf[i + 2] - - def write(self): - neopixel_write(self.pin, self.buf, True) - -def test(): - # put a neopixel strip on GPIO4 - p = machine.Pin(4, machine.Pin.OUT) - np = NeoPixel(p, 8) - n = np.n - - # cycle - for i in range(4 * n): - for j in range(n): - np[j] = (0, 0, 0) - np[i % n] = (255, 255, 255) - np.write() - time.sleep_ms(25) - - # bounce - for i in range(4 * n): - for j in range(n): - np[j] = (0, 0, 128) - if (i // n) % 2 == 0: - np[i % n] = (0, 0, 0) - else: - np[n - 1 - (i % n)] = (0, 0, 0) - np.write() - time.sleep_ms(60) - - # fade in/out - for i in range(0, 4 * 256, 8): - for j in range(n): - if (i // 256) % 2 == 0: - val = i & 0xff - else: - val = 255 - (i & 0xff) - np[j] = (val, 0, 0) - np.write() - - # clear - for i in range(n): - np[i] = (0, 0, 0) - np.write() - -test() diff --git a/esp8266/tests/onewire.py b/esp8266/tests/onewire.py deleted file mode 100644 index 95d16c668..000000000 --- a/esp8266/tests/onewire.py +++ /dev/null @@ -1,143 +0,0 @@ -import _onewire as _ow - -class OneWire: - CMD_SEARCHROM = const(0xf0) - CMD_READROM = const(0x33) - CMD_MATCHROM = const(0x55) - CMD_SKIPROM = const(0xcc) - - def __init__(self, pin): - self.pin = pin - self.pin.init(pin.OPEN_DRAIN, pin.PULL_NONE) - - def reset(self): - return _ow.reset(self.pin) - - def read_bit(self): - return _ow.readbit(self.pin) - - def read_byte(self): - return _ow.readbyte(self.pin) - - def read_bytes(self, count): - buf = bytearray(count) - for i in range(count): - buf[i] = _ow.readbyte(self.pin) - return buf - - def write_bit(self, value): - return _ow.writebit(self.pin, value) - - def write_byte(self, value): - return _ow.writebyte(self.pin, value) - - def write_bytes(self, buf): - for b in buf: - _ow.writebyte(self.pin, b) - - def select_rom(self, rom): - self.reset() - self.write_byte(CMD_MATCHROM) - self.write_bytes(rom) - - def scan(self): - devices = [] - diff = 65 - rom = False - for i in range(0xff): - rom, diff = self._search_rom(rom, diff) - if rom: - devices += [rom] - if diff == 0: - break - return devices - - def _search_rom(self, l_rom, diff): - if not self.reset(): - return None, 0 - self.write_byte(CMD_SEARCHROM) - if not l_rom: - l_rom = bytearray(8) - rom = bytearray(8) - next_diff = 0 - i = 64 - for byte in range(8): - r_b = 0 - for bit in range(8): - b = self.read_bit() - if self.read_bit(): - if b: # there are no devices or there is an error on the bus - return None, 0 - else: - if not b: # collision, two devices with different bit meaning - if diff > i or ((l_rom[byte] & (1 << bit)) and diff != i): - b = 1 - next_diff = i - self.write_bit(b) - if b: - r_b |= 1 << bit - i -= 1 - rom[byte] = r_b - return rom, next_diff - - def crc8(self, data): - return _ow.crc8(data) - -class DS18B20: - THERM_CMD_CONVERTTEMP = const(0x44) - THERM_CMD_RSCRATCHPAD = const(0xbe) - - def __init__(self, onewire): - self.ow = onewire - self.roms = [] - - def scan(self): - self.roms = [] - for rom in self.ow.scan(): - if rom[0] == 0x28: - self.roms += [rom] - return self.roms - - def start_measure(self): - if not self.ow.reset(): - return False - self.ow.write_byte(CMD_SKIPROM) - self.ow.write_byte(THERM_CMD_CONVERTTEMP) - return True - - def get_temp(self, rom): - if not self.ow.reset(): - return None - - self.ow.select_rom(rom) - self.ow.write_byte(THERM_CMD_RSCRATCHPAD) - - buf = self.ow.read_bytes(9) - if self.ow.crc8(buf): - return None - - return self._convert_temp(buf) - - def _convert_temp(self, data): - temp_lsb = data[0] - temp_msb = data[1] - return (temp_msb << 8 | temp_lsb) / 16 - -# connect 1-wire temp sensors to GPIO12 for this test -def test(): - import time - import machine - dat = machine.Pin(12) - ow = OneWire(dat) - - ds = DS18B20(ow) - roms = ow.scan() - print('found devices:', roms) - - for i in range(4): - print('temperatures:', end=' ') - ds.start_measure() - time.sleep_ms(750) - for rom in roms: - print(ds.get_temp(rom), end=' ') - print() -- cgit v1.2.3