module:micropython:esp32uartbtwlan:esp32uartbtwlan
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
module:micropython:esp32uartbtwlan:esp32uartbtwlan [2021/12/26 11:53] – [MicroPython: Esp32DisplayKey] omdevelop | module:micropython:esp32uartbtwlan:esp32uartbtwlan [2022/09/13 11:58] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 9: | Line 9: | ||
===== Übersicht ===== | ===== Übersicht ===== | ||
+ | * bisher nur ZWISCHENVERSION! | ||
+ | * erster Versuch, mit einem Uart/ | ||
+ | * und dabei ein LCDisplayI2C und ein Keyboard4x4 anzusteuerung. | ||
+ | * Dabei Multithreading | ||
+ | * KEINE endgültige Entwicklung! | ||
+ | ===== Neuerstellung Grundmodule ===== | ||
+ | * [[|Esp32UartThread]] | ||
+ | * [[|Esp32BtThread]] | ||
+ | * [[|Esp32WlanThread]] | ||
Line 43: | Line 52: | ||
- | ===== Version ===== | ||
- | {{: | ||
===== Beschreibung ===== | ===== Beschreibung ===== | ||
{{: | {{: | ||
- | ==== Ausgabe MicroPython-Terminal: | ||
- | * Ausgabe der KeyCodes (mit Wiederholungen) | ||
- | <code python> | ||
- | >>> | ||
- | >>> | ||
- | 66 | ||
- | 66 | ||
- | 66 | ||
- | 34 | ||
- | 34 | ||
- | 40 | ||
- | 40 | ||
- | 65 | ||
- | 65 | ||
- | 65 | ||
- | 68 | ||
- | 68 | ||
- | 136 | ||
- | 130 | ||
- | 129 | ||
- | 40 | ||
- | *** CheckEsp32DisplayKey: | ||
- | >>> | ||
- | </ | ||
- | ==== Library-Module: | ||
- | <code python> | ||
- | # | ||
- | # | ||
- | # Uart0 / 1 / 2 | ||
- | # | ||
- | ID_UART0 | ||
- | PIN_UART0_TX = 1 # USB | ||
- | PIN_UART0_RX = 3 # USB | ||
- | # | ||
- | ID_UART1 | ||
- | PIN_UART1_RX = 25 # 9 - not usable | ||
- | PIN_UART1_TX = 26 # 10 - not usable | ||
- | # | ||
- | ID_UART2 | ||
- | PIN_UART2_RX = 16 | ||
- | PIN_UART2_TX = 17 | ||
- | # | ||
- | # | ||
- | # | ||
- | # | ||
- | I2CADDRESS_LCDISPLAY_T | ||
- | I2CADDRESS_LCDISPLAY_A | ||
- | # | ||
- | LCDISPLAY_COUNT_ROWS | ||
- | LCDISPLAY_COUNT_COLUMNS = 20 | ||
- | # | ||
- | # | ||
- | # | ||
- | # | ||
- | PIN_KEYBOARD_IN0 = 39 | ||
- | PIN_KEYBOARD_IN1 = 36 | ||
- | PIN_KEYBOARD_IN2 = 34 | ||
- | PIN_KEYBOARD_IN3 = 35 | ||
- | PIN_KEYBOARD_OUT0 = 13 | ||
- | PIN_KEYBOARD_OUT1 = 12 | ||
- | PIN_KEYBOARD_OUT2 = 14 | ||
- | PIN_KEYBOARD_OUT3 = 27 | ||
- | # | ||
- | SIZE_KEYCODEBUFFER = 5 | ||
- | TIME_KEYPRESSED = 0.1 | ||
- | TIME_KEYREPETITION = 0.5 | ||
- | # | ||
- | </ | ||
- | ==== Main-Module: | + | ===== Entwicklung |
- | <code python> | + | |
- | # | + | |
- | import time | + | |
- | import machine | + | |
- | # | + | |
- | import Define as DEF | + | |
- | import Thread as THR | + | |
- | import LCDisplayI2C as LCD | + | |
- | import ThreadDisplay as TDP | + | |
- | import Keyboard4x4 as KBD | + | |
- | # | + | |
- | # | + | |
- | # | + | |
- | # | + | |
- | # | + | |
- | if (' | + | |
- | print(' | + | |
- | # | + | |
- | # Display | + | |
- | I2CDisplay = machine.SoftI2C(scl=machine.Pin(22), | + | |
- | LCDisplay = LCD.CLCDisplayI2C(I2CDisplay, | + | |
- | DEF.LCDISPLAY_COUNT_ROWS, | + | |
- | ThreadDisplay = TDP.CThreadDisplay(I2CDisplay, | + | |
- | # Keyboard | + | |
- | Keyboard = KBD.CKeyboard4x4(DEF.PIN_KEYBOARD_IN0, | + | |
- | DEF.PIN_KEYBOARD_IN2, | + | |
- | DEF.PIN_KEYBOARD_OUT0, | + | |
- | DEF.PIN_KEYBOARD_OUT2, | + | |
- | # Open | + | |
- | ThreadDisplay.Open() | + | |
- | Keyboard.Open() | + | |
- | # | + | |
- | # MainLoop .... | + | |
- | for I in range(0, 10000): | + | |
- | KC = Keyboard.GetKeyCode() | + | |
- | if (0 < KC): | + | |
- | print(KC) | + | |
- | time.sleep(0.001) | + | |
- | # | + | |
- | # Close | + | |
- | Keyboard.Close() | + | |
- | ThreadDisplay.Close() | + | |
- | # | + | |
- | print(' | + | |
- | # | + | |
- | # | + | |
- | </ | + | |
- | |||
- | ==== Library-Module: | ||
- | <code python> | ||
- | # | ||
- | import time | ||
- | from machine import Pin | ||
- | # | ||
- | import Define as DEF | ||
- | import Thread as THR | ||
- | # | ||
- | class CKeyboard4x4(): | ||
- | # | ||
- | # | ||
- | # | ||
- | def __init__(self, | ||
- | | ||
- | | ||
- | # | ||
- | self.CountRepeat = 3 | ||
- | self.KeySleep = 0.001 | ||
- | # | ||
- | self.PinIn = [] | ||
- | self.PinIn.append(Pin(pinin0, | ||
- | self.PinIn.append(Pin(pinin1, | ||
- | self.PinIn.append(Pin(pinin2, | ||
- | self.PinIn.append(Pin(pinin3, | ||
- | # | ||
- | self.PinOut = [] | ||
- | self.PinOut.append(Pin(pinout0, | ||
- | self.PinOut.append(Pin(pinout1, | ||
- | self.PinOut.append(Pin(pinout2, | ||
- | self.PinOut.append(Pin(pinout3, | ||
- | # | ||
- | self.Thread = THR.CThread(self.CBOnStart, | ||
- | # | ||
- | self.KeyCodes = [] | ||
- | return | ||
- | # | ||
- | # | ||
- | # | ||
- | # | ||
- | def CBOnStart(self, | ||
- | return | ||
- | def CBOnBusy(self, | ||
- | while (THR.stBusy == self.Thread.State): | ||
- | KeyCode0 = 0x00 | ||
- | KeyCode1 = 0x00 | ||
- | KeyCode2 = 0x00 | ||
- | KeyCode3 = 0x00 | ||
- | # | ||
- | # Row0 | ||
- | # | ||
- | self.PinOut[0].on() | ||
- | self.PinOut[1].off() | ||
- | self.PinOut[2].off() | ||
- | self.PinOut[3].off() | ||
- | CS0 = 0 | ||
- | CS1 = 0 | ||
- | CS2 = 0 | ||
- | CS3 = 0 | ||
- | for SI in range(0, self.CountRepeat): | ||
- | CS0 += self.PinIn[0].value() | ||
- | CS1 += self.PinIn[1].value() | ||
- | CS2 += self.PinIn[2].value() | ||
- | CS3 += self.PinIn[3].value() | ||
- | time.sleep(self.KeySleep) | ||
- | if (self.CountRepeat <= CS0): | ||
- | KeyCode0 = 0x11 | ||
- | if (self.CountRepeat <= CS1): | ||
- | KeyCode0 = 0x21 | ||
- | if (self.CountRepeat <= CS2): | ||
- | KeyCode0 = 0x41 | ||
- | if (self.CountRepeat <= CS3): | ||
- | KeyCode0 = 0x81 | ||
- | # | ||
- | # Row1 | ||
- | # | ||
- | self.PinOut[0].off() | ||
- | self.PinOut[1].on() | ||
- | self.PinOut[2].off() | ||
- | self.PinOut[3].off() | ||
- | CS0 = 0 | ||
- | CS1 = 0 | ||
- | CS2 = 0 | ||
- | CS3 = 0 | ||
- | for SI in range(0, self.CountRepeat): | ||
- | CS0 += self.PinIn[0].value() | ||
- | CS1 += self.PinIn[1].value() | ||
- | CS2 += self.PinIn[2].value() | ||
- | CS3 += self.PinIn[3].value() | ||
- | time.sleep(self.KeySleep) | ||
- | if (self.CountRepeat <= CS0): | ||
- | KeyCode1 = 0x12 | ||
- | if (self.CountRepeat <= CS1): | ||
- | KeyCode1 = 0x22 | ||
- | if (self.CountRepeat <= CS2): | ||
- | KeyCode1 = 0x42 | ||
- | if (self.CountRepeat <= CS3): | ||
- | KeyCode1 = 0x82 | ||
- | # | ||
- | # Row2 | ||
- | # | ||
- | self.PinOut[0].off() | ||
- | self.PinOut[1].off() | ||
- | self.PinOut[2].on() | ||
- | self.PinOut[3].off() | ||
- | CS0 = 0 | ||
- | CS1 = 0 | ||
- | CS2 = 0 | ||
- | CS3 = 0 | ||
- | for SI in range(0, self.CountRepeat): | ||
- | CS0 += self.PinIn[0].value() | ||
- | CS1 += self.PinIn[1].value() | ||
- | CS2 += self.PinIn[2].value() | ||
- | CS3 += self.PinIn[3].value() | ||
- | time.sleep(self.KeySleep) | ||
- | if (self.CountRepeat <= CS0): | ||
- | KeyCode2 = 0x14 | ||
- | if (self.CountRepeat <= CS1): | ||
- | KeyCode2 = 0x24 | ||
- | if (self.CountRepeat <= CS2): | ||
- | KeyCode2 = 0x44 | ||
- | if (self.CountRepeat <= CS3): | ||
- | KeyCode2 = 0x84 | ||
- | # | ||
- | # Row3 | ||
- | # | ||
- | self.PinOut[0].off() | ||
- | self.PinOut[1].off() | ||
- | self.PinOut[2].off() | ||
- | self.PinOut[3].on() | ||
- | CS0 = 0 | ||
- | CS1 = 0 | ||
- | CS2 = 0 | ||
- | CS3 = 0 | ||
- | for SI in range(0, self.CountRepeat): | ||
- | CS0 += self.PinIn[0].value() | ||
- | CS1 += self.PinIn[1].value() | ||
- | CS2 += self.PinIn[2].value() | ||
- | CS3 += self.PinIn[3].value() | ||
- | time.sleep(self.KeySleep) | ||
- | if (self.CountRepeat <= CS0): | ||
- | KeyCode3 = 0x18 | ||
- | if (self.CountRepeat <= CS1): | ||
- | KeyCode3 = 0x28 | ||
- | if (self.CountRepeat <= CS2): | ||
- | KeyCode3 = 0x48 | ||
- | if (self.CountRepeat <= CS3): | ||
- | KeyCode3 = 0x88 | ||
- | # | ||
- | if (0 < KeyCode0): | ||
- | self.KeyCodes.append(KeyCode0) | ||
- | if (0 < KeyCode1): | ||
- | self.KeyCodes.append(KeyCode1) | ||
- | if (0 < KeyCode2): | ||
- | self.KeyCodes.append(KeyCode2) | ||
- | if (0 < KeyCode3): | ||
- | self.KeyCodes.append(KeyCode3) | ||
- | # | ||
- | while (DEF.SIZE_KEYCODEBUFFER < len(self.KeyCodes)): | ||
- | self.KeyCodes.pop(0) | ||
- | # | ||
- | if (0 < len(self.KeyCodes)): | ||
- | time.sleep(DEF.TIME_KEYREPETITION) | ||
- | else: | ||
- | time.sleep(DEF.TIME_KEYPRESSED) | ||
- | return | ||
- | def CBOnAbort(self, | ||
- | return | ||
- | def CBOnEnd(self, | ||
- | return | ||
- | # | ||
- | # | ||
- | # | ||
- | def Open(self): | ||
- | self.Thread.Start() | ||
- | return | ||
- | def Close(self): | ||
- | self.Thread.Abort() | ||
- | return | ||
- | def GetKeyCode(self): | ||
- | if (0 < len(self.KeyCodes)): | ||
- | KC = self.KeyCodes.pop(0) | ||
- | return KC | ||
- | return 0 | ||
- | # | ||
- | # | ||
- | # Check Library | ||
- | # | ||
- | if ' | ||
- | print(' | ||
- | # | ||
- | Keyboard = CKeyboard4x4(DEF.PIN_KEYBOARD_IN0, | ||
- | DEF.PIN_KEYBOARD_IN2, | ||
- | DEF.PIN_KEYBOARD_OUT0, | ||
- | DEF.PIN_KEYBOARD_OUT2, | ||
- | # Open | ||
- | Keyboard.Open() | ||
- | # MainLoop .... | ||
- | for I in range(0, 10000): | ||
- | KC = Keyboard.GetKeyCode() | ||
- | if (0 < KC): | ||
- | print(KC) | ||
- | time.sleep(0.001) | ||
- | # Close | ||
- | Keyboard.Close() | ||
- | # | ||
- | print(' | ||
- | # | ||
- | # | ||
- | </ | ||
- | |||
- | ==== Library-Module: | ||
- | <code python> | ||
- | # | ||
- | import time | ||
- | # | ||
- | class CLCDisplay: | ||
- | # HD44780 LCD controller command set | ||
- | LCD_CLR = 0x01 # DB0: clear display | ||
- | LCD_HOME = 0x02 # DB1: return to home position | ||
- | # | ||
- | LCD_ENTRY_MODE = 0x04 # DB2: set entry mode | ||
- | LCD_ENTRY_INC = 0x02 # --DB1: increment | ||
- | LCD_ENTRY_SHIFT = 0x01 # --DB0: shift | ||
- | # | ||
- | LCD_ON_CTRL = 0x08 # DB3: turn lcd/cursor on | ||
- | LCD_ON_DISPLAY = 0x04 # --DB2: turn display on | ||
- | LCD_ON_CURSOR = 0x02 # --DB1: turn cursor on | ||
- | LCD_ON_BLINK = 0x01 # --DB0: blinking cursor | ||
- | # | ||
- | LCD_MOVE = 0x10 # DB4: move cursor/ | ||
- | LCD_MOVE_DISP = 0x08 # --DB3: move display (0-> move cursor) | ||
- | LCD_MOVE_RIGHT = 0x04 # --DB2: move right (0-> left) | ||
- | # | ||
- | LCD_FUNCTION = 0x20 # DB5: function set | ||
- | LCD_FUNCTION_8BIT = 0x10 # --DB4: set 8BIT mode (0->4BIT mode) | ||
- | LCD_FUNCTION_2LINES = 0x08 # --DB3: two lines (0->one line) | ||
- | LCD_FUNCTION_10DOTS = 0x04 # --DB2: 5x10 font (0->5x7 font) | ||
- | LCD_FUNCTION_RESET = 0x30 # See " | ||
- | # | ||
- | LCD_CGRAM = 0x40 # DB6: set CG RAM address | ||
- | LCD_DDRAM = 0x80 # DB7: set DD RAM address | ||
- | # | ||
- | LCD_RS_CMD = 0 | ||
- | LCD_RS_DATA = 1 | ||
- | # | ||
- | LCD_RW_WRITE = 0 | ||
- | LCD_RW_READ = 1 | ||
- | # | ||
- | def __init__(self, | ||
- | self.num_lines = num_lines | ||
- | if self.num_lines > 4: | ||
- | self.num_lines = 4 | ||
- | self.num_columns = num_columns | ||
- | if self.num_columns > 40: | ||
- | self.num_columns = 40 | ||
- | self.CursorY = 0 | ||
- | self.CursorX = 0 | ||
- | self.ImpliedNewline = False | ||
- | self.Backlight = True | ||
- | self.DisplayOff() | ||
- | self.BacklightOn() | ||
- | self.Clear() | ||
- | self.hal_write_command(self.LCD_ENTRY_MODE | self.LCD_ENTRY_INC) | ||
- | self.HideCursor() | ||
- | self.DisplayOn() | ||
- | # | ||
- | def Clear(self): | ||
- | self.hal_write_command(self.LCD_CLR) | ||
- | self.hal_write_command(self.LCD_HOME) | ||
- | self.CursorY = 0 | ||
- | self.CursorX = 0 | ||
- | # | ||
- | def ShowCursor(self): | ||
- | self.hal_write_command(self.LCD_ON_CTRL | self.LCD_ON_DISPLAY | | ||
- | | ||
- | # | ||
- | def HideCursor(self): | ||
- | self.hal_write_command(self.LCD_ON_CTRL | self.LCD_ON_DISPLAY) | ||
- | # | ||
- | def BlinkCursorOn(self): | ||
- | self.hal_write_command(self.LCD_ON_CTRL | self.LCD_ON_DISPLAY | | ||
- | | ||
- | # | ||
- | def BlinkCursorOff(self): | ||
- | self.hal_write_command(self.LCD_ON_CTRL | self.LCD_ON_DISPLAY | | ||
- | | ||
- | # | ||
- | def DisplayOn(self): | ||
- | self.hal_write_command(self.LCD_ON_CTRL | self.LCD_ON_DISPLAY) | ||
- | # | ||
- | def DisplayOff(self): | ||
- | self.hal_write_command(self.LCD_ON_CTRL) | ||
- | # | ||
- | def BacklightOn(self): | ||
- | self.backlight = True | ||
- | self.hal_backlight_on() | ||
- | # | ||
- | def BacklightOff(self): | ||
- | self.backlight = False | ||
- | self.hal_backlight_off() | ||
- | # | ||
- | def MoveTo(self, | ||
- | self.CursorY = cursory | ||
- | self.CursorX = cursorx | ||
- | Address = cursorx & 0x3f | ||
- | if cursory & 1: | ||
- | Address += 0x40 # Lines 1 & 3 add 0x40 | ||
- | if cursory & 2: # Lines 2 & 3 add number of columns | ||
- | Address += self.num_columns | ||
- | self.hal_write_command(self.LCD_DDRAM | Address) | ||
- | # | ||
- | def PutCharacter(self, | ||
- | if character == ' | ||
- | if self.implied_newline: | ||
- | self.implied_newline = False | ||
- | else: | ||
- | self.CursorX = self.num_columns | ||
- | else: | ||
- | self.hal_write_data(ord(character)) | ||
- | self.CursorX += 1 | ||
- | if self.CursorX >= self.num_columns: | ||
- | self.CursorX = 0 | ||
- | self.CursorY += 1 | ||
- | self.implied_newline = (character != ' | ||
- | if self.CursorY >= self.num_lines: | ||
- | self.CursorY = 0 | ||
- | self.MoveTo(self.CursorY, | ||
- | # | ||
- | def PutText(self, | ||
- | for C in text: | ||
- | self.PutCharacter(C) | ||
- | # | ||
- | def custom_char(self, | ||
- | location &= 0x7 | ||
- | self.hal_write_command(self.LCD_CGRAM | (location << 3)) | ||
- | self.hal_sleep_us(40) | ||
- | for i in range(8): | ||
- | self.hal_write_data(charmap[i]) | ||
- | self.hal_sleep_us(40) | ||
- | self.MoveTo(self.cursor_y, | ||
- | # | ||
- | def hal_backlight_on(self): | ||
- | pass | ||
- | # | ||
- | def hal_backlight_off(self): | ||
- | pass | ||
- | # | ||
- | def hal_write_command(self, | ||
- | raise NotImplementedError | ||
- | # | ||
- | def hal_write_data(self, | ||
- | raise NotImplementedError | ||
- | # | ||
- | def hal_sleep_us(self, | ||
- | time.sleep_us(usecs) | ||
- | # | ||
- | # | ||
- | </ | ||
- | |||
- | |||
- | ==== Library-Module: | ||
- | <code python> | ||
- | # | ||
- | """ | ||
- | # | ||
- | from LCDisplay import CLCDisplay | ||
- | from time import sleep_ms | ||
- | # | ||
- | # The PCF8574 has a jumper selectable address: 0x20 - 0x27 | ||
- | DEFAULT_I2C_ADDR = 0x27 | ||
- | # | ||
- | MASK_RS = 0x01 | ||
- | MASK_RW = 0x02 | ||
- | MASK_E = 0x04 | ||
- | SHIFT_BACKLIGHT = 3 | ||
- | SHIFT_DATA = 4 | ||
- | # | ||
- | class CLCDisplayI2C(CLCDisplay): | ||
- | # | ||
- | def __init__(self, | ||
- | self.I2C = i2c | ||
- | self.I2CAddress = i2caddress | ||
- | self.I2C.writeto(self.I2CAddress, | ||
- | sleep_ms(20) | ||
- | # Send reset 3 times | ||
- | self.hal_write_init_nibble(self.LCD_FUNCTION_RESET) | ||
- | sleep_ms(5) | ||
- | self.hal_write_init_nibble(self.LCD_FUNCTION_RESET) | ||
- | sleep_ms(1) | ||
- | self.hal_write_init_nibble(self.LCD_FUNCTION_RESET) | ||
- | sleep_ms(1) | ||
- | # Put LCD into 4 bit mode | ||
- | self.hal_write_init_nibble(self.LCD_FUNCTION) | ||
- | sleep_ms(1) | ||
- | CLCDisplay.__init__(self, | ||
- | cmd = self.LCD_FUNCTION | ||
- | if countrows > 1: | ||
- | cmd |= self.LCD_FUNCTION_2LINES | ||
- | self.hal_write_command(cmd) | ||
- | # | ||
- | def hal_write_init_nibble(self, | ||
- | byte = ((nibble >> 4) & 0x0f) << SHIFT_DATA | ||
- | self.I2C.writeto(self.I2CAddress, | ||
- | self.I2C.writeto(self.I2CAddress, | ||
- | # | ||
- | def hal_backlight_on(self): | ||
- | self.I2C.writeto(self.I2CAddress, | ||
- | # | ||
- | def hal_backlight_off(self): | ||
- | self.I2C.writeto(self.I2CAddress, | ||
- | # | ||
- | def hal_write_command(self, | ||
- | """ | ||
- | byte = ((self.Backlight << SHIFT_BACKLIGHT) | (((cmd >> 4) & 0x0f) << SHIFT_DATA)) | ||
- | self.I2C.writeto(self.I2CAddress, | ||
- | self.I2C.writeto(self.I2CAddress, | ||
- | byte = ((self.Backlight << SHIFT_BACKLIGHT) | ((cmd & 0x0f) << SHIFT_DATA)) | ||
- | self.I2C.writeto(self.I2CAddress, | ||
- | self.I2C.writeto(self.I2CAddress, | ||
- | if cmd <= 3: # The home and clear commands require a worst case delay of 4.1 msec | ||
- | sleep_ms(5) | ||
- | # | ||
- | def hal_write_data(self, | ||
- | byte = (MASK_RS | (self.Backlight << SHIFT_BACKLIGHT) | (((data >> 4) & 0x0f) << SHIFT_DATA)) | ||
- | self.I2C.writeto(self.I2CAddress, | ||
- | self.I2C.writeto(self.I2CAddress, | ||
- | byte = (MASK_RS | (self.Backlight << SHIFT_BACKLIGHT) | ((data & 0x0f) << SHIFT_DATA)) | ||
- | self.I2C.writeto(self.I2CAddress, | ||
- | self.I2C.writeto(self.I2CAddress, | ||
- | # | ||
- | # | ||
- | </ | ||
- | |||
- | ==== Library-Module: | ||
- | <code python> | ||
- | import time | ||
- | import _thread as THR | ||
- | # | ||
- | # States - EStateThread : | ||
- | stIdle = 0 | ||
- | stBusy = 1 | ||
- | stEnd = 2 | ||
- | # | ||
- | class CThread(): | ||
- | # | ||
- | def __init__(self, | ||
- | self.State = stIdle | ||
- | self.Thread = None | ||
- | self.OnStart = onstart | ||
- | self.OnBusy = onbusy | ||
- | self.OnAbort = onabort | ||
- | self.OnEnd = onend | ||
- | return | ||
- | # | ||
- | def Start(self): | ||
- | self.State = stBusy | ||
- | if (None != self.OnStart): | ||
- | self.OnStart(self) | ||
- | self.ThreadID = THR.start_new_thread(self.CBOnExecute, | ||
- | return | ||
- | # | ||
- | def Abort(self): | ||
- | self.State = stEnd | ||
- | if (None != self.OnAbort): | ||
- | self.OnAbort(self) | ||
- | return | ||
- | # | ||
- | def CBOnExecute(self, | ||
- | if (None != self.OnBusy): | ||
- | self.OnBusy(self) | ||
- | if (None != self.OnEnd): | ||
- | self.OnEnd(self) | ||
- | return | ||
- | # | ||
- | # | ||
- | # | ||
- | # Check Library | ||
- | # | ||
- | def OnStart(thread): | ||
- | return | ||
- | def OnBusy(thread): | ||
- | while (stBusy == thread.State): | ||
- | print(' | ||
- | time.sleep(0.5) | ||
- | return | ||
- | def OnAbort(thread): | ||
- | return | ||
- | def OnEnd(thread): | ||
- | return | ||
- | # | ||
- | if (' | ||
- | print(' | ||
- | # | ||
- | Thread = CThread(OnStart, | ||
- | Thread.Start() | ||
- | time.sleep(5.0) | ||
- | Thread.Abort() | ||
- | # | ||
- | print(' | ||
- | # | ||
- | </ | ||
- | |||
- | ==== Library-Module: | ||
- | <code python> | ||
- | # | ||
- | import machine | ||
- | import time | ||
- | # | ||
- | import Define as DEF | ||
- | import Thread as THR | ||
- | import LCDisplayI2C as LCD | ||
- | # | ||
- | class CCommandDisplay(): | ||
- | def __init__(self, | ||
- | self.LCDisplay = lcdisplay | ||
- | return | ||
- | # | ||
- | def Execute(self): | ||
- | return | ||
- | # | ||
- | class CClear(CCommandDisplay): | ||
- | def __init__(self, | ||
- | super(CClear, | ||
- | return | ||
- | def Execute(self): | ||
- | self.LCDisplay.Clear() | ||
- | return | ||
- | # | ||
- | class CWrite(CCommandDisplay): | ||
- | def __init__(self, | ||
- | super(CWrite, | ||
- | self.Row = row | ||
- | self.Col = col | ||
- | self.Text = text | ||
- | return | ||
- | def Execute(self): | ||
- | self.LCDisplay.MoveTo(self.Row, | ||
- | self.LCDisplay.PutText(self.Text) | ||
- | return | ||
- | # | ||
- | class CThreadDisplay(THR.CThread): | ||
- | # | ||
- | def __init__(self, | ||
- | super(CThreadDisplay, | ||
- | self.I2CDisplay = i2cdisplay | ||
- | self.LCDisplay = lcdisplay | ||
- | self.CommandList = [] | ||
- | return | ||
- | # | ||
- | def OnStart(self, | ||
- | return | ||
- | def OnBusy(self, | ||
- | while (THR.stBusy == thread.State): | ||
- | self.Clear() | ||
- | Col = 0 | ||
- | while (Col <= 19): | ||
- | self.Write(0, | ||
- | self.Write(1, | ||
- | self.Write(2, | ||
- | self.Write(3, | ||
- | while (0 < len(self.CommandList)): | ||
- | Command = self.CommandList.pop(0) | ||
- | Command.Execute() | ||
- | time.sleep(0.5) | ||
- | Col += 1 | ||
- | if (THR.stBusy != thread.State): | ||
- | break | ||
- | return | ||
- | def OnAbort(self, | ||
- | return | ||
- | def OnEnd(self, thread): | ||
- | return | ||
- | # | ||
- | def Open(self): | ||
- | self.Start() | ||
- | return | ||
- | def Close(self): | ||
- | self.Abort() | ||
- | return | ||
- | # | ||
- | def Clear(self): | ||
- | self.CommandList.append(CClear(self.LCDisplay)) | ||
- | return | ||
- | def Write(self, row, col, text): | ||
- | self.CommandList.append(CWrite(self.LCDisplay, | ||
- | return | ||
- | # | ||
- | # | ||
- | # | ||
- | if (' | ||
- | print(' | ||
- | # | ||
- | I2CDisplay = machine.SoftI2C(scl=machine.Pin(22), | ||
- | LCDisplay = LCD.CLCDisplayI2C(I2CDisplay, | ||
- | DEF.LCDISPLAY_COUNT_ROWS, | ||
- | TD = CThreadDisplay(I2CDisplay, | ||
- | TD.Open() | ||
- | # | ||
- | time.sleep(10.0) | ||
- | # | ||
- | TD.Close() | ||
- | # | ||
- | print(' | ||
- | # | ||
- | # | ||
- | </ | ||
- | |||
- | |||
- | ===== Entwicklung ===== | ||
+ | ==== 211225 : ==== | ||
+ | * {{: | ||
- | ==== 211225 : " | + | ==== 211225 : ==== |
- | * {{: | + | |
- | ==== 211224 : Versuch zur Thread-Entkopplung ==== | + | |
- | * Multithreading mit LCDisplay in MicroPython zeigt jetzt (hoffentlich) keine Mucken mehr.... | + | ==== 211225 |
- | * zweiter Thread zur Tastatur-Überwachung (ohne Blockade) | + | * {{: |
- | * Trick: die CommandExecutionTime-Blockaden des Displays in einen Thread auszulagern ! | + | |
- | * Klasse CDisplay mit eigenem Thread self.Thread und CCommandList(Row, | + | |
- | * Commands: | + | |
- | * Clear() | + | |
- | * Write(R, C, T) | + | |
- | | + | |
- | ==== 211223 | + | |
- | * ganz grosses Problem mit MultiThreading: | + | |
- | * Keyboard4x4 mit eigenem Key-Erkennungs-Thread | + | |
- | * Display mit eigenem Periodic-Display-Thread | + | |
- | * laufen nicht unabhängig voneinander !!! Ganz grosser MIST!!!! | + | |
- | * {{: | + | |
----- | ----- |
module/micropython/esp32uartbtwlan/esp32uartbtwlan.1640515983.txt.gz · Last modified: 2021/12/26 12:53 (external edit)