{"id":28412550,"url":"https://github.com/elssner/ft-controller-i2c","last_synced_at":"2026-05-14T20:07:11.568Z","repository":{"id":294031760,"uuid":"985763778","full_name":"elssner/ft-Controller-I2C","owner":"elssner","description":"ROBO Pro Coding Blöcke für fischertechnik TXT 4.0 und RX Controller zur Programmierung beliebiger I²C Devices: LCD, OLED Displays, Tastaturen, Sensoren, Motoren, Joystick, GPIO, RTC, EEPROM, Relais, ...","archived":false,"fork":false,"pushed_at":"2025-09-15T19:51:46.000Z","size":62544,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-15T21:05:53.152Z","etag":null,"topics":["circuitpython","fischertechnik","fischertechnik-computing","i2c","i2c-bus","python3"],"latest_commit_sha":null,"homepage":"https://elssner.github.io/ft-Controller-I2C/","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/elssner.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-05-18T13:32:34.000Z","updated_at":"2025-09-15T19:51:50.000Z","dependencies_parsed_at":"2025-06-24T13:44:18.935Z","dependency_job_id":"c4a120fd-d278-4cdf-815f-a8f50ae2f503","html_url":"https://github.com/elssner/ft-Controller-I2C","commit_stats":null,"previous_names":["elssner/ft-controller-i2c"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/elssner/ft-Controller-I2C","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elssner%2Fft-Controller-I2C","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elssner%2Fft-Controller-I2C/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elssner%2Fft-Controller-I2C/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elssner%2Fft-Controller-I2C/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/elssner","download_url":"https://codeload.github.com/elssner/ft-Controller-I2C/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elssner%2Fft-Controller-I2C/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279005645,"owners_count":26083940,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-10T02:00:06.843Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["circuitpython","fischertechnik","fischertechnik-computing","i2c","i2c-bus","python3"],"created_at":"2025-06-02T23:00:39.469Z","updated_at":"2025-10-11T00:08:27.776Z","avatar_url":"https://github.com/elssner.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"\n\u003e [I²C Module](https://elssner.github.io/ft-Controller-I2C/#tabelle-1) |\n[I²C Hardware, Software](https://elssner.github.io/ft-Controller-I2C/#ic) |\n[I²C Quellcodedateien, Blöcke](https://elssner.github.io/ft-Controller-I2C/#beschreibung-der-quellcodedateien-alphabetisch-geordnet)\\\n[I²C Programmierbeispiele im Überblick](https://elssner.github.io/ft-Controller-I2C/examples)\n\n\n### ROBO Pro Coding Blöcke für fischertechnik TXT 4.0 und RX Controller zur Programmierung eigener I²C Module.\n\nDas Beispiel Projekt mit Blöcken für TXT 4.0 Controller ist im [fischertechnik GitLab](https://git.fischertechnik-cloud.com/i2c/ft_Controller_I2C) veröffentlicht. \u003cins\u003eEs kann für RX Controller konvertiert werden.\u003c/ins\u003e\nAlle I²C-Module und Programmierbeispiele auf dieser Seite wurden mit dem TXT 4.0 Controller und auch mit dem RX Controller getestet.\n\nMit der [App ROBO Pro Coding](https://www.fischertechnik.de/de-de/apps-und-software#apps) kann das Projekt ohne Anmeldung von fischertechnik GitLab geladen werden. \nDazu bleibt das Zugriffstoken leer und auf der nächsten Seite im Suchfeld kann `i2c` eingegeben werden. Der Name ist `i2c / ft_Controller_I2C`. Das Projekt kann dann lokal als .ft-Datei gespeichert werden.\n\n#### Im Projekt enthaltene Quellcodedateien (Blöcke) für I²C Module importieren.\n\nFür eigene Projekte können aus der lokal gespeicherten .ft-Datei die Quellcodedateien importiert werden.\nDie Datei [i2cCode](#i2ccodepy) muss immer zuerst importiert werden. Die Datei [advanced](#advancedpy) enthält keinen I²C spezifischen Code, aber Blöcke für nützliche Python Funktionen.\\\nDer Import muss mehrmals erfolgen, weil die Dateien voneinander abhängig sind. Reihenfolge: \n1. [i2cCode](#i2ccodepy) und optional [advanced](#advancedpy)\n2. Quellcodedateien mit \u003ccode\u003eI²C-Adresse\u003c/code\u003e\n3. Erweiterungen (für einfache Nutzung des I²C Moduls nicht erforderlich)\n4. Beispiele\n\n\n###### Tabelle 1:\n* Quellcodedatei mit Link zur Beschreibung der Blöcke (auf dieser Seite unten).\n* I²C Module mit Link zur Hersteller Webseite mit Bild und Dokumentation.\n* (36) Quellcodedateien im GitLab Projekt [ft_Controller_I2C](https://git.fischertechnik-cloud.com/i2c/ft_Controller_I2C) \n  * (1) i2cCode\n  * (22) mit \u003ccode\u003eI²C-Adresse\u003c/code\u003e: sind einem bestimmten I²C Modul zugeordnet.\n  * (3) **Erweiterung**: zusätzliche Blöcke zum entsprechenden I²C Modul.\n  * (10) [Beispiel](examples): Programmierbeispiel kann mehrere I²C Module betreffen.\\\n  Jedes Beispiel hat eine eigene GitHub Seite → [I²C Programmierbeispiele im Überblick](examples#tabelle-1).\n\nQuellcodedatei|I²C-Adresse|I²C Module\n---|---|---\n[i2cCode](#i2ccodepy)||Python I²C für [RX](https://github.com/fischertechnik/RX-Controller-I2C) und [TXT 4.0](https://github.com/fischertechnik/TXT40-Controller-I2C)\n[advanced](#advancedpy)|**Erweiterung**|Blöcke für fehlende / zusätzliche Funktionen\n[dipswitch](#dipswitchpy)|\u003ccode\u003e0x03\u003c/code\u003e|[6-DIP Switch](https://wiki.seeedstudio.com/Grove-6-Position_DIP_Switch), [5-Way Switch](https://wiki.seeedstudio.com/Grove-5-Way_Switch)\n[keyboard](#keyboardpy)|\u003ccode\u003e0x5F\u003c/code\u003e|[M5Stack Card Keyboard](https://docs.m5stack.com/en/unit/cardkb_1.1)\n[lcd16x2](#lcd16x2py)|\u003ccode\u003e0x3E\u003c/code\u003e|[Grove - LCD Display 16x2 Zeichen](https://wiki.seeedstudio.com/Grove-16x2_LCD_Series)\nlcd16x2_keyboard_rtc|[Beispiel](lcd16x2_keyboard_rtc)|Grove LCD: Tastatur schreiben, Uhr, DIP Schalter\n[oled](#oledpy)|\u003ccode\u003e0x3C 0x3D\u003c/code\u003e|OLED Displays [128x128](https://wiki.seeedstudio.com/Grove-OLED-Display-1.12-SH1107_V3.0), [Y\u0026B 128x64](https://wiki.seeedstudio.com/Grove-OLED-Yellow\u0026Blue-Display-0.96-SSD1315_V1.0), [128x64](https://wiki.seeedstudio.com/Grove-OLED_Display_0.96inch/)\n[oled_geometrie](#oled_geometriepy)|**Erweiterung**|Blöcke für Linien und Kreise\noled_text_analoguhr|[Beispiel](oled_text_analoguhr)|OLED Analoguhr, Text Zeichensatz aus EEPROM\n[qwiicbutton](#qwiicbuttonpy)|\u003ccode\u003e0x6F 0x6E\u003c/code\u003e|[SparkFun Qwiic Button](https://www.sparkfun.com/products/16842) mit farbiger LED\nqwiicbutton_int|[Beispiel](qwiicbutton_int)|2 I²C Buttons mit LED, /INT Ereignis, Optokoppler\n[qwiicbutton_queue](#qwiicbutton_queuepy)|**Erweiterung**|Blöcke für Button Queue\n[qwiiceeprom](#qwiiceeprompy)|\u003ccode\u003e0x50\u003c/code\u003e|[SparkFun Qwiic EEPROM - 512Kbit](https://www.sparkfun.com/products/18355)\n[qwiicgpio](#qwiicgpiopy)|\u003ccode\u003e0x27\u003c/code\u003e|[SparkFun Qwiic GPIO](https://www.sparkfun.com/products/17047)\n[qwiicjoystick](#qwiicjoystickpy)|\u003ccode\u003e0x20\u003c/code\u003e|[SparkFun Qwiic Joystick](https://www.sparkfun.com/products/15168)\n[qwiickeypad](#qwiickeypadpy)|\u003ccode\u003e0x4B\u003c/code\u003e|[SparkFun Qwiic Keypad 12 Tasten](https://www.sparkfun.com/products/15290)\n[qwiiclcd](#qwiiclcdpy)|\u003ccode\u003e0x72\u003c/code\u003e|Qwiic LCD Displays [20x4](https://www.sparkfun.com/products/16398), [16x2](https://www.sparkfun.com/products/16396), [16x2](https://www.sparkfun.com/products/16397)\nqwiiclcd_keypad_rtc|[Beispiel](qwiiclcd_keypad_rtc)|LCD: Uhr stellen mit Keypad, GPIO→ASCII, Joystick\n[qwiicmotor](#qwiicmotorpy)|\u003ccode\u003e0x5D 0x5E\u003c/code\u003e|[SparkFun Qwiic Motor Driver](https://www.sparkfun.com/products/15451)\nqwiicmotor_joystick|[Beispiel](qwiicmotor_joystick)|4 Motoren (I²C Motor Driver) mit Joystick steuern\n[qwiicmux](#qwiicmuxpy)|\u003ccode\u003e0x70\u003c/code\u003e|[SparkFun Qwiic Mux 8 Channel](https://www.sparkfun.com/products/16784)\nqwiicmux_rx|[Beispiel](qwiicmux_rx)|RX Controller mit I²C Multiplexer, 10 I²C Module\n[qwiicopenlog](#qwiicopenlogpy)|\u003ccode\u003e0x2A\u003c/code\u003e|[SparkFun Qwiic OpenLog](https://www.sparkfun.com/products/15164) (Speicherkarte)\nqwiicopenlog_rtc|[Beispiel](qwiicopenlog_rtc)|Dateien lesen, protokollieren auf Speicherkarte\n[qwiicrelay](#qwiicrelaypy)|\u003ccode\u003e0x18\u003c/code\u003e|[SparkFun Qwiic Single Relay](https://www.sparkfun.com/products/15093)\n[rtc](#rtcpy)|\u003ccode\u003e0x51\u003c/code\u003e|[Grove - RTC (Real Time Clock)](https://wiki.seeedstudio.com/Grove_High_Precision_RTC)\n[s_co2](#s_co2py)|\u003ccode\u003e0x62\u003c/code\u003e|[Calliope CO2 Sensor - SCD40](https://calliope.cc/calliope-mini/erweiterungen/calliope-co2-sensor)\ns_qwiic_distance|[Beispiel](s_qwiic_distance)|4 Abstands- und Nähesensoren, Qwiic LCD 20x4\n[s_qwiicinfrared](#s_qwiicinfraredpy)|\u003ccode\u003e0x60\u003c/code\u003e|[Proximity Sensor VCNL4040](https://www.sparkfun.com/products/15177)\n[s_qwiiclaser](#s_qwiiclaserpy)|\u003ccode\u003e0x29\u003c/code\u003e|Laser Distance Sensoren [VL53L1X](https://www.sparkfun.com/products/14722), [VL53L4CD](https://www.sparkfun.com/products/18993)\n[s_qwiictemp](#s_qwiictemppy)|\u003ccode\u003e0x3C\u003c/code\u003e|[Temperature Sensor - STTS22H](https://www.sparkfun.com/products/21273)\ns_qwiictemp_lcd|[Beispiel](s_qwiictemp_lcd)|2 Temperatursensoren, Qwiic LCD Display\n[s_qwiictmp102](#s_qwiictmp102py)|\u003ccode\u003e0x48\u003c/code\u003e|[Temperature Sensor - TMP102](https://www.sparkfun.com/products/16304)\n[s_qwiicultrasonic](#s_qwiicultrasonicpy)|\u003ccode\u003e0x09\u003c/code\u003e|[Ultrasonic Distance Sensor HC-SR04](https://www.sparkfun.com/products/17777)\n[voice](#voicepy)|\u003ccode\u003e0x64\u003c/code\u003e|[DFRobot Gravity Voice Recognition Sensor](https://www.dfrobot.com/product-2665.html)\n[wattmeter](#wattmeterpy)|\u003ccode\u003e0x45\u003c/code\u003e|[DFRobot Gravity Digital Wattmeter](https://www.dfrobot.com/product-1827.html)\nwattmeter_co2_relay|[Beispiel](wattmeter_co2_relay)|Strom messen von CO₂ Sensor und I²C Relais\n\n\n### I²C\n\n\u003e I²C: Inter-Integrated Circuit → [de.wikipedia.org/wiki/I²C](https://de.wikipedia.org/wiki/I%C2%B2C)\n\n###### I²C Hardware\n\n* \u003cins\u003eDer I²C-Bus hat **3,3 Volt** Logik. Höhere Spannungen zerstören den **Controller** sofort!\u003c/ins\u003e\n* An einen I²C-Bus mit 4 Leitungen können mehrere I²C Module gleichzeitig angeschlossen werden: [Qwiic daisy chain](https://www.sparkfun.com/qwiic) oder [Grove - I2C Hub](https://wiki.seeedstudio.com/Grove-I2C_Hub/).\n* [Anschlussbelegung](https://github.com/fischertechnik/TXT40-Controller-I2C) 6-pin: `1:+3,3V` `2:GND` `5:SCL` `6:SDA` (3 und 4 nichts anschließen).\n* Die Anzahl gleichzeitig angeschlossener Module ist aus elektrischen Gründen begrenzt.\n* Qwiic Module haben immer 3,3V Logik und sind hervorragend geeignet.\n* Grove Module mit 3,3V/5V verabschieden sich zuerst, wenn mehrere am I²C-Bus sind.\n* M5Stack und andere Module mit 5V und müssen getestet werden.\n* RX Controller verträgt am I²C-Bus nur 2-3 I²C-Adressen gleichzeitig, TXT 4.0 viel mehr.\n* Mit [I²C Multiplexer](#qwiicmuxpy) können auch [am RX mindestens 10 I²C Module](qwiicmux_rx) betrieben werden.\n\n[6-pin Pfosten Stecker](https://www.conrad.de/de/p/fci-75867-131lf-pfosten-steckverbinder-rastermass-2-54-mm-polzahl-gesamt-6-anzahl-reihen-2-1-st-1401777.html) | [Qwiic Adapter](https://www.sparkfun.com/sparkfun-qwiic-adapter.html) | [Qwiic Cable - Grove Adapter](https://www.sparkfun.com/qwiic-cable-grove-adapter-100mm.html) | [Qwiic Cable Kit](https://www.sparkfun.com/sparkfun-qwiic-cable-kit.html)\n\n###### I²C Module mit Hardware Interrupt\n\nI²C Module, die eine Eingabe machen, müssen normalerweise in einer dauerhaft Schleife ständig über den I²C-Bus abgefragt werden, ob sich der Zustand geändert hat. \nSensoren, Buttons, Keypad, GPIO und RTC haben einen zusätzlichen (Löt-) Interrupt-Pin /INT, der außerhalb vom I²C-Bus extra verdrahtet werden kann.\n\nDie I²C Module haben 3,3V Logik, die fischertechnik Controller aber 9V Logik. Um die /INT Leitungen an einen Controller Input anzuschließen, wird ein Optokoppler empfohlen.\\\nDer Optokoppler hat am Ausgang einen Fototransistor. Die Controller können am Input einen Fototransistor digital hell/dunkel abfragen.\n\nSomit kann beim **TXT 4.0 Controller** ![](ereignis_fototransistor.png) ausgelöst werden. Im Ereignis-Code → [buttons_event](qwiicbutton_int#buttons_event) wird über den I²C-Bus das auslösende Modul gesucht und dessen /INT zurück gesetzt. → [buttons_interrupt](qwiicbutton_int#buttons_interrupt)\\\nWeil der **RX Controller** keine Ereignisse unterstützt, kann der Fototransistor hell/dunkel in einer Schleife abgefragt werden, was den I²C-Bus ebenfalls entlastet. → [buttons_polling](qwiicbutton_int#buttons_polling)\n\nDie /INT Pins aller I²C Module können miteinander verbunden und als Minus an die LED im Optokoppler angeschlossen werden. Der + vom Optokoppler ist über einen Widerstand 220 Ohm mit +3,3V zu verbinden.\nEin 3V3 Löt-Pin ist an vielen I²C Modulen neben dem /INT vorhanden.\\\n**Die LED vom Optokoppler \u003cins\u003enicht\u003c/ins\u003e an 9V anschließen!**\n\n\n###### I²C Software\n\n* Die I²C Module müssen verschiedene 7-Bit I²C-Adressen haben.\n* I²C kennt nur 2 Funktionen:\\\n**an eine I²C-Adresse Bytes senden** oder **von einer I²C-Adresse Bytes empfangen**\n* Es gibt noch eine Kombination aus beiden und i2c_scan soll alle Module am Bus finden.\n* Die Anzahl über den I²C-Bus übertragener Bytes ist **nicht** auf 32 Byte begrenzt.\n\n\u003e [RX Controller nutzt CircuitPython](https://github.com/fischertechnik/RX-Controller-I2C), [TXT 4.0 Controller nutzt Python3](https://github.com/fischertechnik/TXT40-Controller-I2C). Beide unterstützen I²C, aber völlig verschieden.\n\u003e Die I²C Blöcke hier sind **plattformunabhängig** programmiert. Die Python Implementation wird erkannt und dann der entsprechende Code ausgeführt.\n\n#### i2cCode.py\n\nBlock **i2c_write_buffer** (i2c_addr, write_buffer)\n\n* Sendet alle Bytes aus der Liste *write_buffer* an die *i2c_addr*.\n* *i2c_addr*: 7 Bit (0x00..0x7F bzw. 0..127)\n* *write_buffer*: Liste darf nur 8-Bit Elemente (0x00..0xFF bzw. 0..255) enthalten.\n* Parameter *write_buffer* kann mit `Datenstrukturen`**erzeuge Liste** übergeben werden.\n\nBlock **i2c_read_buffer** (i2c_addr, length) : Liste der Bytes\n\n* Empfängt Bytes von der *i2c_addr*, *length* ist die Anzahl der Bytes.\n* Die zurück gegebene Liste kann mit `Datenstrukturen`**in der Liste** gelesen werden.\n\nBlock **i2c_write_read_buffer** (i2c_addr, write_buffer, read_length) : Liste der Bytes\n\n* Sendet und empfängt Bytes, ohne dazwischen den I²C-Bus frei zu geben.\n* Erlaubt I²C Register adressieren und lesen mit nur einer Funktion.\n\n\u003ca name=\"i2c_scan\"\u003e\u003c/a\u003e\nBlock **i2c_scan** () : Liste der 7-Bit I²C-Adressen\n\n* Versucht alle möglichen I²C-Adressen in einer Schleife zu erreichen.\n* Wenn read oder write erfolgreich ist, wird die gültige I²C Adresse in einer Liste gesammelt.\n* Die zurück gegebene Liste kann mit `Text` **gib aus** in der Konsole angezeigt werden.\n* Es können Fehler auftreten, die Aus- und Einschalten des Controllers erfordern.\n* Test i2c_scan TXT 4.0 Controller mit echter Hardware ([10 I²C Module gleichzeitig](examples#foto)):\\\n['0x3', '0x20', '0x27', '0x3c', '0x4b', '0x50', '0x51', '0x5d', '0x5e', '0x72']\n\nBlock **is_rx** () : Boolean\n\n* Gibt True zurück, wenn `sys.implementation.name == 'circuitpython'`.\n* Davon abhängig werden für I²C verschiedene Importe gemacht:\n* True: circuitpython `from adafruit_bus_device.i2c_device import I2CDevice`\n* False: Python3 `from smbus2 import SMBus, i2c_msg`\n\n\n### Beschreibung der Quellcodedateien (alphabetisch geordnet)\nInhaltsverzeichnis: [Tabelle 1](#tabelle-1)\n\n#### advanced.py\n\n\u003e Allgemeine Blöcke, die Python-Funktionen bereit stellen (ohne I²C Bezug).\n\nBlock **comment** (text) : Kommentar Block ohne Funktion.\\\nBlock **Int** (x) : Integer *int(x)*\\\nBlock **Ord** (char) : Integer Zeichencode *ord(char)*\\\nBlock **Chr** (asc) : String 1 Zeichen *chr(asc)*\\\nBlock **print_bin** (zahl, length) : BIN String z.B. '00001010'; Binärzahl mit fester Länge\\\nBlock **list_string** (string_data) : Liste der Zeichencodes *[ord(c) for c in string_data]*\\\nBlock **encode_string** (string_data) : Liste der Zeichencodes *string_data.encode('utf-8')*\\\nBlock **decode_string** (data_bytes) : String *data_bytes.decode('utf-8', 'replace')*\\\nBlock **decode_latin** (data_bytes) : String *''.join(chr(b) for b in data_bytes)*\\\nBlock **list_hex** (data_bytes) : HEX String *[hex(b) for b in data_bytes]*\\\nBlock **advanced_sign** (i, exp) : Wandelt uint in int mit Vorzeichen um. *exp*: Anzahl der Bits z.B. 16.\\\n\nBlock **advanced_map** (value, from_low, from_high to_low, to_high)\n* map Funktion mit Kommazahlen (float).\n* Funktion ft_math.map rechnet nur mit Integer.\n\nBlock **advanced_system_time** () : Liste mit 9 Elementen\n* TXT 4.0: RTC Systemuhr (year, mon, mday, hour, min, sec, wday, yday, isdst)\\\nUhr wird bei Internetverbindung gestellt, Zeitzone Germany am Controller einstellen.\n* RX: Zeitstempel umgerechnet in (0, 0, 0, hour, min, sec, 0, 0, 0) seit dem Einschalten.\n\nBlock **advanced_voltmeter** (input_pin, extended_range)\n\u003e TXT 4.0 Controller kann an den Input-Pins I1 bis I8 Spannung messen.\n\n* *input_pin*: 1..8 Input Pin Nummer.\n* *extended_range* Messbereich: False=0..6,3V; True=0..10V.\n* TXT 4.0: gibt Spannung in Volt zurück mit 3 Kommastellen.\n* RX: gibt None zurück.\n\n\n#### dipswitch.py\n→ DIP: dual in-line package; Switch: Schalter → [en.wikipedia.org/wiki/DIP_switch](https://en.wikipedia.org/wiki/DIP_switch)\n###### [Grove - 6-Position DIP Switch](https://wiki.seeedstudio.com/Grove-6-Position_DIP_Switch) | [Grove - 5-Way Switch](https://wiki.seeedstudio.com/Grove-5-Way_Switch)\nBlock **switch_read** () : Byte\n* Gibt 1 Byte zurück: 6 Bit (0..63), 1 Bit pro DIP Schalter.\n\n#### keyboard.py\n→ Keyboard: Tastatur →  [de.wikipedia.org/wiki/Tastatur](https://de.wikipedia.org/wiki/Tastatur)\n###### [M5Stack Card Keyboard QWERTY 50-key](https://docs.m5stack.com/en/unit/cardkb_1.1)\nBlock **keyboard_read** () : Byte\n* Gibt 0 zurück wenn keine Taste gedrückt, sonst ASCII-Code der gedrückten Taste.\n\n#### lcd16x2.py\n→ LCD: liquid-crystal display → [de.wikipedia.org/wiki/Flüssigkristallanzeige](https://de.wikipedia.org/wiki/Fl%C3%BCssigkristallanzeige)\n###### [Grove - LCD Display 16x2 Zeichen](https://wiki.seeedstudio.com/Grove-16x2_LCD_Series) | Black on Yellow | Black on Red | White on Blue\n\nBlock **lcd_init** ()\n* Muss einmal beim Start aufgerufen werden.\n\nBlock **lcd_text** (row, col, end, text, right)\n* Schreibt an eine bestimmte Position Text mit fester Länge.\n* *row*: Zeile 0 oder 1; *col*: Spalte 0..15; *end*: Spalte 0..15 (letztes Zeichen)\n* *text*: Text, alle Datentypen werden mit str() konvertiert.\n* *right*: None oder False=linksbündig; True=rechtsbündig\\\nText wird mit Leerzeichen auf die Länge (end-col)+1 aufgefüllt.\n* Parameter außer *text* können weg gelassen werden (None).\\\ndefault: *row*=0; *col*=0; *end*=15; right=False\n\nBlock **lcd_clear** ()\n* Löscht das LCD Display.\n\nBlock **lcd_cursor** (row, col)\n* Set Cursor für lcd_write oder wenn Cursor sichtbar ist oder blinkt.\n* *row*: Zeile 0 oder 1; *col*: Spalte 0..15\n* Parameter optional, default: *row*=0; *col*=0\n\nBlock **lcd_write** (text)\n* Schreibt *text* an aktuelle Cursorposition.\n* Alle Datentypen werden mit str() konvertiert.\n\nBlock **lcd_display** (display_on, cursor_on, blink_on)\n* Alle Parameter Boolean: False oder True\n* Schaltet das Display, Cursor und blinkenden Cursor an und aus.\n\n#### oled.py\n→ OLED: organic light-emitting diode → [de.wikipedia.org/wiki/OLED](https://de.wikipedia.org/wiki/Organische_Leuchtdiode)\n###### [Grove - OLED Display 1.12 (128x128)](https://wiki.seeedstudio.com/Grove-OLED-Display-1.12-SH1107_V3.0) | [OLED Yellow\u0026Blue Display 0.96 (128x64)](https://wiki.seeedstudio.com/Grove-OLED-Yellow\u0026Blue-Display-0.96-SSD1315_V1.0) | [OLED Display 0.96](https://wiki.seeedstudio.com/Grove-OLED_Display_0.96inch)\n\u003e OLED Displays zeigen 128x64 oder 128x128 Pixel an. Alle Pixel werden zuerst in Variablen gespeichert. Dieser Speicher wird 'Matrix' genannt.\n\u003e Um die 'Matrix' auf dem OLED Display anzuzeigen, muss immer der Block **oled_display_matrix** aufgerufen werden.\n\nBlock **oled_init** (select_oled:Boolean) → Parameter optional\n* Muss einmal beim Start aufgerufen werden.\n* *select_oled*: Auswahl Display (I²C-Adresse) None oder False: 0x3C; True: 0x3D.\n* Initialisiert die Matrix: Variablen zum Speichern der Pixel (1024 oder 2048 Byte).\n* Initialisiert das Display mit der angegebenen I²C-Adresse 0x3C oder 0x3D (Lötbrücke).\n\n\u003e Wenn zwei Displays angeschlossen sind, muss der Block **oled_init** zweimal aufgerufen werden, mit False und True.\n\u003e Es gibt nur eine Matrix, die mit dem folgenden Block auf einem bestimmten Display angezeigt werden kann.\n\nBlock **oled_display_matrix** (from_page, to_page, select_oled) → alle Parameter optional\n* Immer aufrufen, um das in die Matrix gezeichnete Bild auf dem Display anzuzeigen.\n* Ohne Parameter wird das komplette Display über den I²C-Bus neu geschrieben.\n* Mit den optionalen Parametern *from_page*, *to_page* ist es möglich, nur einen Teil des Displays zu aktualisieren. Eine 'Page' ist eine Zeile 8 Pixel hoch und 128 Pixel breit (Breite des Displays).\n* Das 128x64 Display hat 8 Zeilen (0-7). Das 128x128 Display hat 16 Zeilen (0-15).\n* Der Parameter *select_oled* bestimmt, an welches OLED Display die Matrix gesendet wird.\n\n\u003e \u003cins\u003eDie folgenden Blöcke ändern nur die Pixel in der Matrix, nicht das Display.\u003c/ins\u003e\n\nBlock **oled_clear_matrix** (from_page, to_page) → alle Parameter optional\n* Löscht die gesamte Matrix (ohne Parameter) oder einzelne Zeilen.\n* *from_page*: 0..7, default: 0\n* *to_page*: 0..7 bzw. 0..15, default 7 bzw. 15\n\nBlock **oled_set_pixel** (x, y, pixel)\n* *pixel*: schaltet ein Pixel (in der Matrix) True:EIN oder False:AUS. \n* Für die Koordinate *x* sind Werte von 0 (links) bis 127 (rechts) möglich.\n* Für die Koordinate *y* sind Werte von 0 (oben) bis 63 bzw. 127 (unten) möglich.\n\nBlock **oled_scroll_matrix**\n* Rückt den Inhalt der Matrix 1 Zeile 'page' nach oben.\n* Zeile 0 entfällt, letzte (neue) Zeile 7 bzw. 15 ist leer.\n\nBlock **oled_text** (row, col, text)\n###### erforderlich: [qwiiceeprom](#qwiiceprompy)\n\u003e Um Text mit Pixeln zu zeichnen, muss der EEPROM angeschlossen und der Zeichensatz programmiert sein. Pro Zeichen werden 8 Byte vom EEPROM in die Matrix kopiert.\n\n* Schreibt Text an eine bestimmte Position in die Matrix.\n* *row*: Zeile 0..7 bzw. 0..15; *col*: Spalte 0..15.\n* *text*: Text, alle Datentypen werden mit str() konvertiert.\n* Parameter optional, default: row=0; col=0.\n\nBlock **oled_paint_eeprom** (eeprom_startadresse, from_page, to_page) → alle Parameter optional\n* *eeprom_startadresse*: 0x0000..0xFFFF; default 0xF800 (Anfang vom Zeichensatz)\n* *from_page*: 0..7, default: 0; *to_page*: 0..7 bzw. 0..15, default 7 bzw. 15\n* Kopiert aus dem EEPROM pro 'Page' 128 Byte in die Matrix.\n* Ohne Parameter wird der gesamte Zeichensatz vom EEPROM in die Matrix kopiert.\n* Im EEPROM können Bilder, die das ganze Display füllen, gespeichert werden.\n\n\n#### oled_geometrie.py\n###### Erweiterung zu: [oled](#oledpy)\nBlock **oled_line** (x0, y0, x1, y1, pixel)\n* Zeichnet eine Linie mit den angegebenen Koordinaten in die Matrix.\n* Parameter wie oben **oled_set_pixel**.\n\nBlock **oled_rectangle** (x0, y0, x1, y1, pixel)\n* Zeichnet ein Rechteck mit den angegebenen Koordinaten in die Matrix.\n\nBlock **oled_circle** (x0, y0, radius, pixel)\n* Zeichnet einen Kreis um den Mittelpunkt *x0*, *y0* in die Matrix.\n\nBlock **oled_minute** (minute, x, y, l0, l1, pixel)\n* zeichnet Uhrzeiger in die Matrix: 60 Positionen (Winkel vom Mittelpunkt)\n* *minute*: 0..59 Winkel der Linie vom Mittelpunkt *x*, *y*\n* *l0*, *l1* Länge des Zeigers (Anfang und Ende vom Mittelpunkt in Pixeln)\n* Parameter *x*, *y*, *pixel* wie oben **oled_set_pixel**\n\nBlock **oled_hour** (hour, x, y, l0, l1, pixel)\n* wie **oled_minute** mit *hour*: 0..23\n\nBlock **oled_clock** (x, y, radius, hour, minute)\n* Zeichnet eine analoge Uhr. *hour* und *minute* geben die Stellung der Uhrzeiger an.\n\n#### qwiicbutton.py\n→ Qwiic Connect System: I²C · 3,3V Logik · ohne Löten → [www.sparkfun.com/qwiic](https://www.sparkfun.com/qwiic)\\\n→ Button: Taste → [de.wikipedia.org/wiki/Taste](https://de.wikipedia.org/wiki/Taste)\n###### [SparkFun Qwiic Button - Green LED](https://www.sparkfun.com/products/16842) | [SparkFun Qwiic Button - Red LED](https://www.sparkfun.com/products/15932) | [SparkFun Qwiic Button Breakout](https://www.sparkfun.com/products/15931)\n\u003e Button mit farbiger LED, Bordcomputer, FIFO, /INT-Pin, mehrere gleichzeitig am I²C-Bus.\n\u003e Unterscheidet PRESSED (drücken) und CLICKED (drücken und loslassen).\\\n\u003e LED Helligkeit und Blink-Takt.\n\u003e [Qwiic_Button_I2C_Register_Map](https://cdn.sparkfun.com/assets/learn_tutorials/1/1/0/8/Qwiic_Button_I2C_Register_Map.pdf)\n\nBlock **button_set_i2c_addr** (new_i2c_addr, i2c_addr)\n\u003e Default i2c_addr ist 0x6F. Diese kann durch Lötbrücken von 0x60 bis 0x6E ODER mit diesem Block auf jede 7-Bit I²C-Adresse geändert werden.\n\u003e \u003cins\u003eWird bei den folgenden Blöcken der Parameter *i2c_addr* weg gelassen (None), gilt Default 0x6F.\u003c/ins\u003e\n\n* *i2c_addr* ist die aktuell gültige, *new_i2c_addr* die neue I²C-Adresse.\n* Änderung bleibt beim Ausschalten erhalten.\n\nBlock **button_is_pressed** (i2c_addr)\n* Gibt True zurück, wenn der Button jetzt gerade gedrückt ist.\n\nBlock **button_has_been_clicked** (clear, i2c_addr)\n* Gibt True zurück, wenn der Button geklickt (gedrückt und losgelassen) war.\n* *clear*: True löscht den Status hasBeenClicked.\n\nBlock **button_onoff** (i2c_addr)\n* Wechselt True/False bei jedem Klick (und löscht den Status hasBeenClicked).\n\nBlock **button_interrupt_config** (when_clicked, when_pressed, i2c_addr)\n* *when_clicked* = True: /INT Pin wird LOW wenn clicked (drücken und loslassen).\n* /INT bleibt aktiv bis Status-Bit hasBeenClicked zurück gesetzt wird.\n* *when_pressed* = True: /INT wird nur solange LOW wie der Button gedrückt ist.\n\n\nBlock **button_led** (brightness, i2c_addr)\n* *brightness*: LED Helligkeit 0..255, 0 ist aus.\n\nBlock **button_led_config** (brightness, cycle_time, off_time, granularity, i2c_addr)\n* Zum Zurücksetzen der (blinkenden) LED einfach ohne Parameter aufrufen.\n* *brightness*, *granularity* : 8 Bit Register.\n* *cycle_time*, *off_time* : 16 Bit Register.\n* Ausprobieren was die LED macht oder [Register_Map](https://cdn.sparkfun.com/assets/learn_tutorials/1/1/0/8/Qwiic_Button_I2C_Register_Map.pdf) lesen.\n\nBlock **button_led_read_register** (i2c_addr)\n* Zeigt Register 25..31 in Konsole an: 6 LED Register und I2C Address.\n\n\n\n#### qwiicbutton_queue.py\n###### Erweiterung zu: [qwiicbutton](#qwiicbuttonpy)\n→ Queue: Warteschlange → [de.wikipedia.org/wiki/Warteschlange_(Datenstruktur)](https://de.wikipedia.org/wiki/Warteschlange_(Datenstruktur))\\\n→ FIFO: First In – First Out → [de.wikipedia.org/wiki/FIFO](https://de.wikipedia.org/wiki/First_In_%E2%80%93_First_Out)\n\n\u003e Diese Quellcodedatei wird nur benötigt, wenn die vergangene Zeit seit dem Drücken des Buttons ausgewertet werden soll.\n\u003e Button speichert bei PRESSED 8 und bei CLICKED 16 Zeitstempel (32 Bit Millisekunden) in QUEUE / FIFO.\n\nBlock **button_clicked_queue_empty** (i2c_addr)\\\nBlock **button_clicked_queue_full** (i2c_addr)\\\nBlock **button_pressed_queue_empty** (i2c_addr)\\\nBlock **button_pressed_queue_full** (i2c_addr)\n* Gibt True zurück, wenn das entsprechende Status Bit gesetzt ist.\n\nBlock **button_print_queue** (i2c_addr)\n* Zeigt Status, neuesten und ältesten Zeitstempel aus der PRESSED_QUEUE und CLICKED_QUEUE in der Konsole an.\n\nBlock **button_pop_clicked_queue** (i2c_addr)\\\nBlock **button_pop_pressed_queue** (i2c_addr)\n* Gibt den ältesten Zeitstempel (32 Bit Millisekunden) zurück und löscht diesen aus der QUEUE.\n\n\n#### qwiiceeprom.py\n→ EEPROM: electrically erasable programmable read-only memory → [de.wikipedia.org/wiki/EEPROM](https://de.wikipedia.org/wiki/Electrically_Erasable_Programmable_Read-Only_Memory)\n###### [SparkFun Qwiic EEPROM Breakout - 512Kbit](https://www.sparkfun.com/products/18355)\nBlock **eeprom_read** (adr16Bit, read_length) : Liste der Bytes\n* *adr16Bit*: 0x0000..0xFFFF\n* *read_length*: Anzahl zu lesender Bytes (**nicht** auf 32 begrenzt).\n* Die zurück gegebene Liste kann mit `Datenstrukturen`**in der Liste** gelesen werden.\n\nBlock **eeprom_test** ()\n* Testet, ob der ASCII Zeichensatz im EEPROM programmiert ist.\n* Speicherbereich der 96 ASCII Zeichen F900-FBFF kann im Code geändert werden.\n* Schreibt 6*128 Byte aus Speicherbereich in Konsole: ['0x3e', '0x51', '0x49', '0x45'].\n\n#### qwiicgpio.py\n→ GPIO: General Purpose Input/Output → [de.wikipedia.org/wiki/GPIO](https://de.wikipedia.org/wiki/GPIO)\n###### [SparkFun Qwiic GPIO](https://www.sparkfun.com/products/17047)\n\n\u003e 3,3 Volt Logik; 16 Klemmen: 8 GPIO-Pins, 4 GND, 3 3V3, 1 /INT\\\n/INT Pin kann bei Zustandsänderung einen [Hardware Interrupt](#ic-module-mit-hardware-interrupt) auslösen.\n\nBlock **gpio_init** (io, inv)\n* Muss einmal beim Start aufgerufen werden.\n* Beide Parameter *io*, *inv*: String mit 8 Binärziffern (0 oder 1).\n* Jede Binärziffer (Bit) ist einem von 8 GPIO-Pins zugeordnet.\n* *io* CONFIGURATION Bit: 0=output Pin; 1=input Pin\n* *inv* INVERSION Bit: 0=original polarity; 1=inverted\n* INVERSION wirkt nur auf input Pins → Pin an GND → logische 1\n* Beispiel:\\\n**gpio_init**('00000011', '00000000'): 6 output und 2 input\\\n**gpio_init**('11111111', '11111111'): alle 8 Pins input inverted\n* ACHTUNG! GPIO INPUT und OUTPUT hat 3,3 Volt Pegel!\n\nBlock **gpio_read** () : Byte\n* Gibt 1 Byte zurück, 1 Bit pro GPIO Pin.\n* An input Pins max. 3,3 Volt Spannung anschließen!\n* Taster schalten Pin an GND; Pull Up Widerstände (10 kOhm) an 3V3 erforderlich.\n\nBlock **gpio_write** (byte)\n* *byte*: Schaltet 8 GPIO Pins, die als 0=output konfiguriert sind.\n* Bit=0: aus (0 Volt); Bit=1: an (3,3 Volt)\n\n#### qwiicjoystick.py\n→ Joystick: Spielhebel → [de.wikipedia.org/wiki/Joystick](https://de.wikipedia.org/wiki/Joystick)\n###### [SparkFun Qwiic Joystick](https://www.sparkfun.com/products/15168)\nBlock **joystick_read** ()\n* \u003cins\u003eMuss am Anfang jeder Schleife aufgerufen werden.\u003c/ins\u003e\n* Liest alle Joystick Register über den I²C-Bus in Variable JOYSTICK_BUFFER.\n\n\u003e \u003cins\u003eDie folgenden Blöcke **get** lesen nur die Variable, nicht den I²C-Bus.\u003c/ins\u003e\n\nBlock **joystick_get_x** () : Byte\\\nBlock **joystick_get_y** () : Byte\n* Gibt 1 Byte zurück mit der Stellung des Joystick in X bzw. Y Richtung.\n* Mittelstellung ist 128, geringe Abweichung durch Hardware Toleranz.\n* Endstellung unten bzw. links = 0; oben bzw. rechts = 255.\n\nBlock **joystick_get_button_position** () : Boolean\n* Gibt True zurück, wenn der Joystick jetzt gerade gedrückt ist.\n\nBlock **joystick_get_button_onoff** () : Boolean\n* Wechselt False / True bei jedem Drücken des Joystick.\n\nBlock **joystick_raupensteuerung** (j_fahren, j_lenken) : [ml, mr]\n* Rechnet Joystick Werte 0..255 um in Motor Speed -512..+512.\n* Gibt Liste/Array mit 2 Motor Speed links / rechts zurück.\n* Nicht eine Richtung pro Motor, sondern intelligent nach Logik Raupensteuerung.\n* Fahren und Lenken mit Ketten, 2 Rädern oder Omniwheels.\n* Joystick links bzw. rechts: Drehen auf der Stelle.\n\n\n#### qwiickeypad.py\n→ Numeric Keypad: Tastatur, Ziffernblock → [en.wikipedia.org/wiki/Keypad](https://en.wikipedia.org/wiki/Keypad)\n###### [SparkFun Qwiic Keypad - 12 Tasten](https://www.sparkfun.com/products/15290)\n\u003e Keypad speichert mehrere gedrückte Tasten, bei langsamer Abfrage geht nichts verloren.\\\n\u003e Mit /INT kann ein [Hardware Interrupt](#ic-module-mit-hardware-interrupt) ausgelöst werden.\n\nBlock **keypad_read** () : Byte\n* Gibt 0 zurück wenn keine Taste gedrückt, sonst ASCII-Code der gedrückten Taste.\n\nTaste|0|1|2|3|4|5|6|7|8|9|*|#\n---|---|---|---|---|---|---|---|---|---|---|---|---\nCode|48|49|50|51|52|53|54|55|56|57|42|35\n\n#### qwiiclcd.py\n→ LCD: liquid-crystal display → [de.wikipedia.org/wiki/Flüssigkristallanzeige](https://de.wikipedia.org/wiki/Fl%C3%BCssigkristallanzeige)\n###### [SparkFun Qwiic 20x4 SerLCD - RGB Backlight](https://www.sparkfun.com/products/16398) | [SparkFun Qwiic 16x2 SerLCD - RGB Backlight](https://www.sparkfun.com/products/16396)\nBlock **qlcd_init** ()\n* Muss für Display 16x2 einmal beim Start aufgerufen werden.\n\nBlock **qlcd20x4_init** ()\n* Muss für Display 20x4 einmal beim Start aufgerufen werden.\n\nBlock **qlcd_text** (row, col, end, text, right)\n* Schreibt an eine bestimmte Position Text mit fester Länge.\n* *row*: Zeile 0..3; *col*: Spalte 0..19; *end*: Spalte 0..19 (letztes Zeichen)\n* *text*: Text, alle Datentypen werden mit str() konvertiert.\n* *right*: None oder False=linksbündig; True=rechtsbündig\\\nText wird mit Leerzeichen auf die Länge (end-col)+1 aufgefüllt.\n* Parameter außer *text* können weg gelassen werden (None).\\\ndefault: *row*=0; *col*=0; *end*=COLS-1; right=False\n\nBlock **qlcd_clear** ()\n* Löscht das LCD Display.\n\nBlock **qlcd_cursor** (row, col)\n* Set Cursor für writeQLCD oder wenn Cursor sichtbar ist oder blinkt.\n* *row*: Zeile 0..3; *col*: Spalte 0..19\n* Parameter optional, default: *row*=0; *col*=0\n\nBlock **qlcd_write** (text)\n* Schreibt *text* an aktuelle Cursorposition.\n* Alle Datentypen werden mit str() konvertiert.\n* Schreibt auf nächster Zeile weiter, max. Länge 32 Zeichen.\n\nBlock **qlcd_display** (display_on, cursor_on, blink_on)\n* Alle Parameter Boolean: False oder True.\n* Schaltet das Display, Cursor und blinkenden Cursor an und aus.\n\n#### qwiicmotor.py\n→ Gleichstrommotor → [de.wikipedia.org/wiki/Gleichstrommotor](https://de.wikipedia.org/wiki/Gleichstrommaschine)\n###### [SparkFun Qwiic Motor Driver](https://www.sparkfun.com/products/15451)\nBlock **motor_init** (i2c_addr)\n* Für jedes Motor-Modul einmal beim Start aufrufen (mit entsprechender *i2c_addr*).\n* Parameter *i2c_addr* kann weg gelassen werden, default: 0x5D.\n* 1 Modul steuert 2 Motoren 9V, mehrere Module können gleichzeitig angeschlossen werden.\n* 10 I²C-Adressen mit Lötbrücken einstellbar: 0x58..0x61.\n\nBlock **motor_power** (on, i2c_addr)\n* Parameter *i2c_addr* kann weg gelassen werden, default: 0x5D.\n* *on* schaltet Motor Power: True=an; False=aus (für 1 Modul = 2 Motoren).\n* Power für H-Bridge soll bei längerem Stillstand aus geschaltet werden, um Energie zu sparen.\n\nBlock **motor_drive_a** (speed, i2c_addr)\\\nBlock **motor_drive_b** (speed, i2c_addr)\n* Parameter *i2c_addr* kann weg gelassen werden, default: 0x5D.\n* *speed* 0..128..255 Motor Drehzahl und Richtung.\n* *speed* ist optional, default=128 (Stillstand).\n* \u003cins\u003e0 ist maximale Geschwindigkeit rückwärts!\u003c/ins\u003e\n* 0 max. rückwärts | ← 128 Stop → | max. vorwärts 255\n\n\u003c!--\nrückwärts|STOP|vorwärts\n---|---|---\nmax 0 ← 127|128|129 → 255 max\n--\u003e\n\n#### qwiicmux.py\n→ MUX: Multiplexer → [de.wikipedia.org/wiki/Multiplexer](https://de.wikipedia.org/wiki/Multiplexer)\n###### [SparkFun Qwiic Mux Breakout - 8 Channel (TCA9548A)](https://www.sparkfun.com/products/16784)\n\u003e I²C Multiplexer: 8 I²C-Busse einzeln oder gemeinsam schaltbar.\n\nBlock **mux** (channel)\n* *channel*: 0..7 schaltet genau einen Kanal ein. Jeder andere Wert schaltet alle aus.\n\nBlock **mux_write** (byte)\n* *byte*: 0..255 für jedes Bit wird der entsprechende Kanal ein geschaltet.\n\nBlock **mux_read**\n* Gibt ein Byte mit den gesetzen Bits der eingeschalteten Kanäle zurück.\n\n\n\n#### qwiicopenlog.py\n→ Logdatei → [de.wikipedia.org/wiki/Logdatei](https://de.wikipedia.org/wiki/Logdatei)\\\n→ SD-Karte: Speicherkarte → [de.wikipedia.org/wiki/SD-Karte](https://de.wikipedia.org/wiki/SD-Karte)\n###### [SparkFun Qwiic OpenLog](https://www.sparkfun.com/products/15164)\n\u003e Lesen und Schreiben von Dateien auf microSD card 64MB .. 32GB, FAT16 oder FAT32.\n\u003e \u003cins\u003eDateinamen sollen im Format 8.3, nur ASCII Zeichen und Großbuchstaben enthalten.\u003c/ins\u003e\n\nBlock **log_init**\n* Muss \u003cins\u003enicht\u003c/ins\u003e beim Start aufgerufen werden.\n* Zeigt den Status binär und bei Fehler eine Meldung in der Konsole an.\n\nBlock **log_status**\n* Gibt das Status Byte zurück. siehe → [Register Map](https://cdn.sparkfun.com/assets/learn_tutorials/8/6/5/newthing.JPG)\n\nBlock **log_dir** (filename, count)\n* Gibt eine Liste mit Dateinamen zurück. *count* ist die maximale Anzahl.\n* *filename* kann Platzhalter wie z.B. \\*.\\* oder \\*.TXT enthalten.\n\nBlock **log_size** (filename)\n* Gibt die Größe der Datei zurück.\n\nBlock **log_read** (filename, size)\n* Gibt ein bytearray mit dem Inhalt der Datei zurück.\n* *filename* im Format 8.3 und Großbuchstaben.\n* *size* ist die maximale Länge. bytearray ist kürzer, wenn die Datei kleiner ist.\n* Blöcke zum Umwandeln Bytes in Text sind in [advanced](#advancedpy).\n\nBlock **log_write** (filename, bu)\n* Schreibt die Bytes aus *bu* in die Datei. Anhängen wenn Datei existiert.\n* *filename* im Format 8.3 und Großbuchstaben.\n* *bu* kann auch eine Liste sein, darf aber nur Bytes (0..255) enthalten.\n* Blöcke zum Umwandeln Text in Bytes sind in [advanced](#advancedpy).\n\nBlock **log_test**\n* Schreibt die Zeichencodes 32 bis 127 in die Datei ASCII.TXT.\n* Aller 16 Byte wird CR (=13) und LF (=10) eingefügt.\n\nBlock **log_remove** (filename)\n* Löscht eine oder mehrere Dateien.\n* Gibt Anzahl der gelöschten Dateien zurück.\n\nBlock **log_sync**\n* Kann vor dem Entfernen der Speicherkarte aufgerufen werden, muss aber nicht.\n\n\n#### qwiicrelay.py\n→ Relais: (englisch Relay) → [de.wikipedia.org/wiki/Relais](https://de.wikipedia.org/wiki/Relais)\n###### [SparkFun Qwiic Single Relay](https://www.sparkfun.com/products/15093)\n\u003e Strom für Relais kommt aus dem 3,3 Volt I²C-Bus!\n\nBlock **relay** (on:Boolean)\n* *on* schaltet Relais: True=an; False=aus.\n* I2C_ADDRESS kann im Code geändert werden, default 0x18.\n\n#### rtc.py\n→ RTC: real-time clock → [de.wikipedia.org/wiki/Echtzeituhr](https://de.wikipedia.org/wiki/Echtzeituhr)\n###### [Grove - High Precision RTC (Real Time Clock)](https://wiki.seeedstudio.com/Grove_High_Precision_RTC)\n\n##### Uhr stellen\n\nBlock **rtc_write** (index, int8)\n* Stellt die Uhr. Ändert ein bestimmtes Register *index*.\n* `0`Seconds, `1`Minutes, `2`Hours, `3`Days, `4`Weekdays, `5`Months, `6`Years\n* *int8*: 0..59 Byte wird in BCD konvertiert und im RTC-Modul gespeichert. \n\nBlock **rtc_set** (key_code) : keyString\n* Stellt die Uhr mit 5 ASCII Zeichen-Codes von Keypad oder Keyboard.\n* Muss 5 mal mit ASCII Code aufgerufen werden, gibt den zusammengesetzten String zurück.\\\n  *1. Zeichen:* `*` neu, *2. Zeichen:* Register `0..6`,\\\n  *3. und 4. Zeichen:* 2 Ziffern dezimal `00..59`, *5. Zeichen:* `#` speichern\n* Wenn 5 Zeichen gültig sind, wird mit **write_rtc** das Register geändert.\n* Beispiel: `*120#`setzt Minute auf 20; `*401#` Montag; `*000#` Sekunde 0.\n\n##### Uhr lesen\n\nBlock **rtc_read** ()\n* \u003cins\u003eMuss am Anfang jeder Schleife aufgerufen werden.\u003c/ins\u003e\n* Liest 7 Byte in Variable RTC_BUFFER.\n* BCD codiert: 4 Bit pro Ziffer, Bit `7654` Zehner, Bit `3210` Einer, Jahr 2-stellig\n\n\u003e \u003cins\u003eDie folgenden Blöcke lesen nur die Variable, nicht den I²C-Bus.\u003c/ins\u003e\n\nBlock **rtc_get** (index) : Byte\n* Liest 1 Byte aus Variable RTC_BUFFER[*index*] zu dezimal konvertiert.\n* `0`Seconds, `1`Minutes, `2`Hours, `3`Days, `4`Weekdays, `5`Months, `6`Years\n\nBlock **rtc_time_string** () : String 8 Zeichen\n* Liest Zeit aus Variable RTC_BUFFER: `HH:mm:ss`.\n\nBlock **rtc_date_string** () : String 10 Zeichen\n* Liest Datum aus Variable RTC_BUFFER: `dd.MM.20yy`.\n\nBlock **rtc_weekday** () : String 2 Zeichen\n* Liest Wochentag aus RTC_BUFFER: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'].\n\nBlock **rtc_iso_string** () : String 12 Zeichen\n* Liest aus Variable RTC_BUFFER: `yyMMddHHmmss`.\n* Aus genau 12 Ziffern kann der benötigte Teilstring ausgeschnitten werden.\n* Format ist sortierbar z.B. für Dateinamen.\n\n##### RTC Control Register\n\nBlock **rtc_read_control**\n* Gibt Liste mit 4 Byte aus den Control Registern 0..3 zurück. → [Registers (Seite 5)](https://files.seeedstudio.com/wiki/Grove-High_Precision_RTC/res/PCF85063TP.pdf#page=5)\n\nBlock **rtc_read_offset**\n* Gibt 7 Bit offset aus Register [2] zurück, umgerechnet in -64..0..+63.\n\nBlock **rtc_write_offset** (offset, mode)\n* *offset*: -64..0..+63 Korrekturwert wird umgerechnet in Bit 0..6 gespeichert.\n* *mode*: True setzt Bit 7.\n* True: Korrektur erfolgt aller 2 Stunden; False: aller 4 Minuten.\n* Gibt das geänderte Byte aus Register [2] zurück, 8 Bit (0..255) nicht konvertiert.\n\n\n\n\n#### s_co2.py\n→ CO₂: Kohlenstoffdioxid → [de.wikipedia.org/wiki/CO2](https://de.wikipedia.org/wiki/Kohlenstoffdioxid)\\\n→ Relative Luftfeuchtigkeit → [de.wikipedia.org/wiki/Luftfeuchtigkeit](https://de.wikipedia.org/wiki/Luftfeuchtigkeit#Relative_Luftfeuchtigkeit)\n###### [Calliope mini CO2 Sensor - SCD40](https://calliope.cc/calliope-mini/erweiterungen/calliope-co2-sensor)\n\u003e Sensor hat keine Pull Up Widerstände, deshalb immer mit anderen Modulen anschließen, die welche haben.\n\u003e Blockiert oft den I²C-Bus, dann Strom aus und einschalten. [Data Sheet](https://sensirion.com/media/documents/E0F04247/631EF271/CD_DS_SCD40_SCD41_Datasheet_D1.pdf#page=8)\n\nBlock **co2_init** (factory_reset)\n* Muss einmal beim Start aufgerufen werden.\n* *factory_reset*: True Reset aller Register.\n* Ruft **co2_start_continuous_measurement** auf.\n\nBlock **co2_start_continuous_measurement**\n* Startet die Messungen (etwa aller 5 Sekunden).\n\nBlock **co2_stop_continuous_measurement**\n* Beendet die Messungen. Immer abschalten wenn nicht benötigt, um Strom zu sparen.\n\nBlock **co2_read_data_ready_status**\n* Gibt True zurück, wenn ein neuer Messwert bereit ist. Etwa aller 5 Sekunden.\n\nBlock **co2_read_measurement**\n* Testet **co2_get_data_ready_status**, wenn True werden die Messwerte in interne Variablen gelesen.\n* Sonst bleiben die internen Variablen unverändert.\n* Muss einmal in jeder Schleife (aller 5s) aufgerufen werden, um die Variablen zu aktualisieren.\n\n\u003e Die folgenden Blöcke **get** lesen nur die Variable, nicht den I²C-Bus.\n\nBlock **co2_get_co2**\\\nBlock **co2_get_temperature**\\\nBlock **co2_get_relative_hunidity**\n* Gibt CO₂ (Kohlenstoffdioxid), Temperatur °C oder relative Luftfeuchtigkeit zurück.\n\n\n\n\n#### s_qwiicinfrared.py\n→ Infrarotstrahlung → [de.wikipedia.org/wiki/Infrarot](https://de.wikipedia.org/wiki/Infrarotstrahlung)\n###### [SparkFun Qwiic Proximity Sensor - 20cm, VCNL4040](https://www.sparkfun.com/products/15177)\n\u003e Nähe Sensor misst keinen genauen Abstand, nur ob ein Objekt näher als 20cm kommt (Seifenspender). Kann Interrupt auslösen.\n\u003e [VCNL4040_Datasheet](https://cdn.sparkfun.com/assets/2/3/8/f/c/VCNL4040_Datasheet.pdf#page=9)\n\nBlock **qinfrared_init**\n* Muss einmal beim Start aufgerufen werden.\n* Initialisiert die Konstanten (Register Nummern) und schaltet Sensor an **qinfrared_power_on**.\n\nBlock **qinfrared_power_on** (on)\n* *on*: True schaltet Sensor an, False schaltet aus.\n* Infrarot LED nimmt Strom vom 3,3V I²C-Bus (50..200mA). Aus schalten wenn nicht benutzt.\n\nBlock **qinfrared_proximity**\n* Gibt Nähe zurück (16 Bit): 0..1 wenn nichts in der Nähe (20 cm), wird größer je näher.\n\n\n#### s_qwiiclaser.py\n→ Laser → [de.wikipedia.org/wiki/Laser](https://de.wikipedia.org/wiki/Laser)\n###### [SparkFun Qwiic Distance Sensor - 4 Meter, VL53L1X](https://www.sparkfun.com/products/14722) | [SparkFun Qwiic Distance Sensor - 1.3 Meter, VL53L4CD](https://www.sparkfun.com/products/18993)\nBlock **qlaser_init**\n* Muss einmal beim Start aufgerufen werden.\n* Initialisiert den Sensor und wartet bis bereit (check_for_data_ready).\n\nBlock **qlaser_distance_cm**\n* Gibt Distance in cm (mit 1 Stelle hinter dem Komma) zurück. Genauigkeit ist mm.\n* Ruft *qlaser_start_ranging*, *qlaser_get_distance*, *qlaser_stop_ranging* nacheinander auf.\n\nBlock **qlaser_start_ranging**\n* Startet die Messungen mit Default Parametern. Kann konfiguriert werden. \n\nBlock **qlaser_stop_ranging**\n* Beendet die Messungen.\n\nBlock **qlaser_get_distance**\n* Gibt Distance in mm zurück (16 Bit int). Ranging muss vorher gestartet werden.\n\n\n#### s_qwiictemp.py\n→ Temperatur → [de.wikipedia.org/wiki/Temperatur](https://de.wikipedia.org/wiki/Temperatur)\\\n→ Grad Celsius → [de.wikipedia.org/wiki/Grad_Celsius](https://de.wikipedia.org/wiki/Grad_Celsius)\n###### [SparkFun Micro Temperature Sensor - STTS22H (Qwiic)](https://www.sparkfun.com/products/21273) | [SparkFun Temperature Sensor - STTS22H (Qwiic)](https://www.sparkfun.com/products/21262)\n\nBlock **temp_one_shot**\n* Macht nur eine Messung und gibt Temperator in °C zurück. Spart Strom.\n* Wartet auf Ergebnis ca. 50ms.\n\nBlock **temp_odr_1hz** (on)\n* *on*: schaltet 1 Hz Output Data Rate True:an oder False:aus\n* True: Macht eine Messung pro Sekunde. False: Keine Messungen.\n\nBlock **temp_read_data**\n* Gibt Temperator in °C zurück, wenn laufende Messung aktiviert ist.\n\nBlock **temp_write_limit** (limit, register_h_l)\n* *limit*: -39,68°C..+122,88°C Temperatur Limit, wann Interrupt ausgelöst wird.\n* None oder Werte außerhalb des Bereichs deaktivieren Interrupt.\n* *register_h_l*: False: speichert *limit* für höchste Temperatur.\n* *register_h_l*: True: speichert *limit* für tiefste Temperatur.\n* *limit* wird intern umgerechnet, gibt tatsächlichen Wert zurück.\n* Gibt -40,32 zurück, wenn deaktiviert (*limit* ungültig oder None)\n\nBlock **temp_read_status**\n* Gibt 1 Byte zurück mit 3 relevanten Bits:\n* Bit 0: STATUS_BUSY (nur für one-shot mode)\n* Bit 1: STATUS_OVER_THH; Bit 2: STATUS_UNDER_THL\n* Erkennen, ob Temperatur über- oder unterschritten ist und zurücksetzen des /INT-Pin.\n\n\n\n#### s_qwiictmp102.py\n\n###### [SparkFun Digital Temperature Sensor Breakout - TMP102 (Qwiic)](https://www.sparkfun.com/products/16304)\n\nBlock **tmp102_read**\n* Gibt Temperatur in °C zurück. Messung erfolgt dauerhaft mit 4 Hz.\n\nWeitere Funktionen können noch programmiert werden z.B. Interrupt.\n\n\n\n#### s_qwiicultrasonic.py\n→ Ultraschall → [de.wikipedia.org/wiki/Ultraschall](https://de.wikipedia.org/wiki/Ultraschall)\n###### [SparkFun Qwiic Ultrasonic Distance Sensor - HC-SR04](https://www.sparkfun.com/products/17777)\n\u003e Der I²C Sensor hat einen eigenen Prozessor für die Ultraschall Messung. Über den I²C-Bus wird nur der aktuelle Wert in mm ausgelesen.\n\u003e Dieses Modul erfasst außerdem einen großen Winkel. So erkennen Modelle auch Hindernisse schräg, oben und unten und fahren nicht dagegen. \n\n\u003e Der [fischertechnik Ultraschallsensor](https://www.fischertechnik.de/de-de/produkte/einzelteile/bausteine/133009) hat auch einen Prozessor. → [Datenblatt](https://fiproductmedia.azureedge.net/media/Certification%20Documents/Technical%20Datasheets/fischertechnik/TDB_133009-ULTRASONIC-DISTANCE-SENSOR.pdf)\n\nBlock **ultrasonic_change_i2c** (old_i2c, new_i2c)\n\u003e Default I²C-Adresse ist 0x00. Damit funktioniert der Sensor. 0x00 gilt aber als reserviert und sollte geändert werden.\n\n* Wenn *old_i2c* weg gelassen wird, gilt 0x00. Wenn *new_i2c* weg gelassen wird, gilt 0x09.\n* Gültige Werte für *new_i2c*: 0x02 .. 0x7F. Empfohlen: 0x09 .. 0x77.\n* Änderung bleibt beim Ausschalten erhalten.\n\nBlock **ultrasonic_read_mm**\n* Gibt Distance in mm zurück (16 Bit int).\n* I²C-Adresse ist 0x09. Kann im Code geändert werden.\\\n(Z.B. auf 0x00, um den Sensor mit der Original Adresse zu benutzen.)\n\n\n\n#### voice.py\n→ Spracherkennung → [de.wikipedia.org/wiki/Spracherkennung](https://de.wikipedia.org/wiki/Spracherkennung)\n###### [DFRobot Gravity: Offline Language Learning Voice Recognition Sensor](https://www.dfrobot.com/product-2665.html)\n\u003e Am Anfang muss man das Wake-up word: \"Hello robot\" sagen, dann geht die blaue LED an.\\\n\u003e Jetzt erkennt der Sensor die Begriffe in **voice_commands** und gibt die ID zurück.\\\n\u003e 121 *Fixed Command Words* → [Tabelle](https://wiki.dfrobot.com/SKU_SEN0539-EN_Gravity_Voice_Recognition_Module_I2C_UART#Command%20Words%2FWake-up%20Words%20%26amp%3B%20ID%20Table) und\n\u003e 17 *Learning Command Words* → [Anleitung](https://wiki.dfrobot.com/SKU_SEN0539-EN_Gravity_Voice_Recognition_Module_I2C_UART#Command%20Words)\\\n\u003e Lernen funktioniert mit Sprache, ohne Programm (I²C nur zur Stromversorgung).\n\nBlock **voice_read_cmdid**\n* Gibt die command_id 1 .. 142 zurück, wenn ein gesprochenes *command* erkannt wurde.\n* Gibt 0 zurück, wenn nichts erkannt wurde.\n\nBlock **voice_waketime** (sekunden)\n* Stellt die Wachzeit, wie lange der Sensor hört, wenn er wach ist. Standard 15 Sekunden.\n* Beginnt nach jedem erkannten *command* neu zu zählen.\n\nBlock **voice_speaker** (on)\n* False schaltet den Lautsprecher aus (MUTE). Standard: Lautsprecher an.\n\nBlock **voice_volume** (volume)\n* Lautstärke, im Beispiel 1..7. (Das ist zu leise.) Standard 0 = laut.\n\nBlock **voice_read_register** (i2c_reg)\n* Liest 1 Byte aus dem I²C-Register *i2c_reg* 2 .. 6.\n* CMDID = 2; PLAY_CMDID = 3; SET_MUTE = 4; SET_VOLUME = 5; WAKE_TIME = 6\n\nBlock **voice_play** (cmdid)\n* Spielt über den Lautsprecher die Antwort auf ein erkanntes *command* ab.\n* Damit können ohne Spracheingabe alle Antworten abgespielt werden: The door is open.\n\nBlock **voice_konsole**\n* Programmierbeispiel: zeigt erkanntes *command* in der Konsole an.\n\n\n#### wattmeter.py\n→ Spannungsmesser, Voltmeter  → [de.wikipedia.org/wiki/Spannungsmessgerät](https://de.wikipedia.org/wiki/Spannungsmessger%C3%A4t)\\\n→ Strommesser, Amperemeter → [de.wikipedia.org/wiki/Strommessgerät](https://de.wikipedia.org/wiki/Strommessger%C3%A4t)\\\n→ Leistungsmesser, Wattmeter → [de.wikipedia.org/wiki/Leistungsmesser](https://de.wikipedia.org/wiki/Leistungsmesser)\n###### [DFRobot Gravity: I2C Digital Wattmeter SKU: SEN0291](https://www.dfrobot.com/product-1827.html)\n\u003e Misst max. 26V, 8A. 4 I²C-Adressen, bis 4 Wattmeter gleichzeitig auslesen.\n\nBlock **wattmeter_init**\n* Muss einmal beim Start aufgerufen werden.\n* Im Code kann calibration_value für genauere Strom Messung angepasst werden.\n* Spannung kann nicht kalibriert werden.\n\nBlock **wattmeter_volt**\n* Gibt Spannung in V zurück, mit 2 Dezimalstellen, immer positiv.\n\nBlock **wattmeter_milliampere**\n* Gibt Strom in mA zurück, integer kann auch negativ sein.\n\nBlock **wattmeter_milliwatt**\n* Gibt Leistung in mW zurück. Ist ungenau und eigentlich überflüssig, Datenblatt lesen.\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felssner%2Fft-controller-i2c","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Felssner%2Fft-controller-i2c","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felssner%2Fft-controller-i2c/lists"}