From f6262ba21288edcf2e858bbe53e0f60dcd7f6ebe Mon Sep 17 00:00:00 2001 From: Drew Bednar Date: Sat, 7 Aug 2021 13:51:25 -0400 Subject: [PATCH] savin some code --- basics/ESP32-Pinout2.jpeg | Bin 0 -> 52834 bytes bluetooth/zs_040/README.md | 9 +++++ bluetooth/zs_040/bluetooth_serial_echo.py | 23 ++++++++++++ ir_encoder/main.py | 42 ++++++++++++++++++++++ 4 files changed, 74 insertions(+) create mode 100644 basics/ESP32-Pinout2.jpeg create mode 100644 bluetooth/zs_040/README.md create mode 100644 bluetooth/zs_040/bluetooth_serial_echo.py create mode 100644 ir_encoder/main.py diff --git a/basics/ESP32-Pinout2.jpeg b/basics/ESP32-Pinout2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..b4ec3c98e76ee58fb94dae0e285d9efcc87cf17d GIT binary patch literal 52834 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 literal 0 HcmV?d00001 diff --git a/bluetooth/zs_040/README.md b/bluetooth/zs_040/README.md new file mode 100644 index 0000000..2dde71f --- /dev/null +++ b/bluetooth/zs_040/README.md @@ -0,0 +1,9 @@ +# Blue tooth with the ZS-040 module + + + +## Resources +- https://protosupplies.com/product/hc-05-zs-040-bluetooth-module/ +- https://docs.micropython.org/en/latest/esp32/quickref.html#uart-serial-bus +- https://learn.adafruit.com/introducing-the-adafruit-bluefruit-le-uart-friend/command-mode-1 +- https://learn.sparkfun.com/tutorials/serial-communication/rules-of-serial \ No newline at end of file diff --git a/bluetooth/zs_040/bluetooth_serial_echo.py b/bluetooth/zs_040/bluetooth_serial_echo.py new file mode 100644 index 0000000..39add02 --- /dev/null +++ b/bluetooth/zs_040/bluetooth_serial_echo.py @@ -0,0 +1,23 @@ +""" +This modul implements a simple serial connection to the ZS-040 and will echo out to the console +any messages it receives. This board is a Bluetooth SPP (Serial Port Protocol) module. + +When powered on the device will broadcast as BT-05 by default. Default passwords are usually 1234 or 0000. +""" +from machine import Pin, UART +from utime import sleep_ms + +BT_STATE_PIN = Pin(5, Pin.IN) +uart = UART(2, baudrate=38400, tx=17, rx=16, bits=8, stop=1, parity=None) + + +while True: + if BT_STATE_PIN.value(): + if uart.any(): + data = uart.read(1) + print(data.decode('utf8')) + else: + print("No data. Sleeping") + else: + print("No Bluetooth device paired.") + sleep_ms(500) \ No newline at end of file diff --git a/ir_encoder/main.py b/ir_encoder/main.py new file mode 100644 index 0000000..1d6f826 --- /dev/null +++ b/ir_encoder/main.py @@ -0,0 +1,42 @@ +from machine import Pin +import utime + +MOTOR_LEFT_DIR = True # False if Reverse +MOTOR_RIGHT_DIR = True # False if Reverse +ENCODER_LEFT_COUNT = 0 +ENCODER_RIGHT_COUNT = 0 + +ENCODER_LEFT_PIN = Pin(4, Pin.IN) +ENCODER_RIGHT_PIN = Pin(5, Pin.IN) + + +def handle_encoder_left(pin): + global ENCODER_LEFT_COUNT + if MOTOR_LEFT_DIR: + ENCODER_LEFT_COUNT += 1 + else: + ENCODER_LEFT_COUNT -= 1 + + +def handle_encoder_right(pin): + global ENCODER_RIGHT_COUNT + if MOTOR_RIGHT_DIR: + ENCODER_RIGHT_COUNT += 1 + else: + ENCODER_RIGHT_COUNT -= 1 + + +def main(): + global MOTOR_LEFT_DIR + ENCODER_LEFT_PIN.irq(trigger=Pin.IRQ_RISING, handler=handle_encoder_left) + ENCODER_RIGHT_PIN.irq(trigger=Pin.IRQ_RISING, handler=handle_encoder_right) + + while True: + print("LEFT: {} , RIGHT: {}".format(ENCODER_LEFT_COUNT, ENCODER_RIGHT_COUNT)) + utime.sleep(3) + print("LEFT: {} , RIGHT: {}".format(ENCODER_LEFT_COUNT, ENCODER_RIGHT_COUNT)) + utime.sleep(3) + print("LEFT: {} , RIGHT: {}".format(ENCODER_LEFT_COUNT, ENCODER_RIGHT_COUNT)) + utime.sleep(3) + print("SWITCH DIR") + MOTOR_LEFT_DIR = not MOTOR_LEFT_DIR \ No newline at end of file