diff --git a/PixLeZ_Server/Blink.py b/PixLeZ_Server/Blink.py index 07e2ebf..bd175a6 100644 --- a/PixLeZ_Server/Blink.py +++ b/PixLeZ_Server/Blink.py @@ -12,6 +12,7 @@ from multiprocessing import Process from multiprocessing import Queue +from threading import Thread ''' PixLeZ - Server @@ -34,6 +35,8 @@ def __init__(self): self.value = 0 self.color = Adafruit_WS2801.RGB_to_color(255, 255, 255) self.colorList = [] + for i in range(PIXEL_COUNT): + self.colorList.append('000000') self.time = 0.1 self.timer = 20.0 self.number = 1 @@ -99,8 +102,14 @@ def set_color(self, value): if self.process.is_alive(): self.color = int(value, 16) self.queueColor.put(self.color) + + for i in range(PIXEL_COUNT): + self.colorList[i] = value + self.queueColorList.put(self.colorList) else: self.color = int(value, 16) + for i in range(PIXEL_COUNT): + self.colorList[i] = value # colors = Hex-String list def set_pixels(self, colors): @@ -191,30 +200,40 @@ def road_map(self, *col): def checkQueue(self): # Reading Queues - if not self.queueColor.empty(): - self.color = self.queueColor.get() - if not self.queueColorList.empty(): - self.colorList = self.queueColorList.get() - if not self.queueTime.empty(): - self.time = self.queueTime.get() - if not self.queueNumber.empty(): - self.number = self.queueNumber.get() + while True: + if not self.queueColor.empty(): + self.color = self.queueColor.get() + if not self.queueColorList.empty(): + self.colorList = self.queueColorList.get() + if not self.queueTime.empty(): + self.time = self.queueTime.get() + if not self.queueNumber.empty(): + self.number = self.queueNumber.get() + time.sleep(1) # new process -> communication with queue def run(self, queueColor, queueColorList, queueTime, queueNumber): tmp = 0 + # check Queue -> oefters abfragen! + t = Thread(target=self.checkQueue) + t.setDaemon(True) + t.start() while True: - # check Queue -> oefters abfragen! - self.checkQueue() + + + time.sleep(0.001) + # * ----------- # * Effects # * ----------- # 0) led_on if self.effect == 0: - pixels.set_pixels(self.color) + # pixels.set_pixels(self.color) + for i in range(len(self.colorList)): + pixels.set_pixel(i, int(self.colorList[i], 16)) pixels.show() @@ -226,9 +245,9 @@ def run(self, queueColor, queueColorList, queueTime, queueNumber): for j in reversed(range(i, pixels.count())): pixels.clear() for k in range(i): - pixels.set_pixel(k, self.color) + pixels.set_pixel(k, int(self.colorList[k], 16)) time.sleep(self.time) - pixels.set_pixel(j, self.color) + pixels.set_pixel(j, int(self.colorList[j], 16)) pixels.show() time.sleep(self.time) # 2) Effect - Walking Pixels reverse @@ -239,21 +258,22 @@ def run(self, queueColor, queueColorList, queueTime, queueNumber): for j in range(i, pixels.count()): pixels.clear() for k in range(i): - pixels.set_pixel(k, self.color) + pixels.set_pixel(k, int(self.colorList[k], 16)) time.sleep(self.time) - pixels.set_pixel(j, self.color) + pixels.set_pixel(j, int(self.colorList[j], 16)) pixels.show() time.sleep(self.time) # 3) Effect - Fill number Pixels if self.effect == 3: for i in range(self.number): - pixels.set_pixel(i, self.color) + pixels.set_pixel(i, int(self.colorList[i], 16)) for i in range(self.number, pixels.count()): pixels.set_pixel(i, Adafruit_WS2801.RGB_to_color(0, 0, 0)) pixels.show() # 4) Effect - Get empty Pixels if self.effect == 4: - pixels.set_pixels(self.color) + for i in range(len(self.colorList)): + pixels.set_pixel(i, int(self.colorList[i], 16)) pixels.show() tmpTimer = self.timer / pixels.count() for i in range(pixels.count()): @@ -352,19 +372,19 @@ def run(self, queueColor, queueColorList, queueTime, queueNumber): if self.effect == 11: for i in range(pixels.count() - self.number - 2): pixels.set_pixels(0) - pixels.set_pixel(i, self.color) + pixels.set_pixel(i, int(self.colorList[i], 16)) for j in range(1, self.number + 1): - pixels.set_pixel(i + j, self.color) - pixels.set_pixel(i + self.number + 1, self.color) + pixels.set_pixel(i + j, int(self.colorList[i + j], 16)) + pixels.set_pixel(i + self.number + 1, int(self.colorList[i + self.number + 1], 16)) pixels.show() time.sleep(self.time) time.sleep(self.time) for i in reversed(range(pixels.count() - self.number - 2)): pixels.set_pixels(0) - pixels.set_pixel(i, self.color) + pixels.set_pixel(i, int(self.colorList[i], 16)) for j in range(1, self.number + 1): - pixels.set_pixel(i + j, self.color) - pixels.set_pixel(i + self.number + 1, self.color) + pixels.set_pixel(i + j, int(self.colorList[i + j], 16)) + pixels.set_pixel(i + self.number + 1, int(self.colorList[i + self.number + 1], 16)) pixels.show() time.sleep(self.time) # 12) Effect - Twinkle Pixels @@ -388,19 +408,21 @@ def run(self, queueColor, queueColorList, queueTime, queueNumber): # 14) Effect - Sparkle Pixels if self.effect == 14: pTmp = random.randint(0, pixels.count() - 1) - pixels.set_pixel(pTmp, self.color) + pixels.set_pixel(pTmp, int(self.colorList[pTmp], 16)) pixels.show() time.sleep(self.time) pixels.set_pixel(pTmp, 0) # TODO: wie in 18 erl? # 15) Effect - Snow Sparkle Pixels if self.effect == 15: - pixels.set_pixels(self.color) + for i in range(len(self.colorList)): + pixels.set_pixel(i, int(self.colorList[i], 16)) + pixels.show() pTmp = random.randint(0, pixels.count() - 1) pixels.set_pixel(pTmp, Adafruit_WS2801.RGB_to_color(0, 0, 0)) pixels.show() time.sleep(self.time) - pixels.set_pixel(pTmp, self.color) + pixels.set_pixel(pTmp, int(self.colorList[pTmp], 16)) time.sleep(self.time) # 16) Effect - Running Pixels if self.effect == 16: @@ -420,7 +442,7 @@ def run(self, queueColor, queueColorList, queueTime, queueNumber): for j in range(10): for q in range(3): for i in range(0, pixels.count() - 3, 3): - pixels.set_pixel(i + q, self.color) + pixels.set_pixel(i + q, int(self.colorList[i + q], 16)) pixels.show() time.sleep(self.time) for i in range(0, pixels.count() - 3, 3): @@ -432,14 +454,14 @@ def run(self, queueColor, queueColorList, queueTime, queueNumber): # outside to center for i in range((pixels.count() - self.number) / 2): pixels.set_pixels(0) - pixels.set_pixel(i, self.color) + pixels.set_pixel(i, int(self.colorList[i], 16)) for j in range(1, self.number): - pixels.set_pixel(i + j, self.color) - pixels.set_pixel(i + self.number + 1, self.color) - pixels.set_pixel(pixels.count() - i - 1, self.color) + pixels.set_pixel(i + j, int(self.colorList[i + j], 16)) + pixels.set_pixel(i + self.number + 1, int(self.colorList[i + self.number + 1], 16)) + pixels.set_pixel(pixels.count() - i - 1, int(self.colorList[pixels.count() - i - 1], 16)) for j in range(self.number + 1): - pixels.set_pixel(pixels.count() - i - j - 1, self.color) - pixels.set_pixel(pixels.count() - i - self.number - 1, self.color) + pixels.set_pixel(pixels.count() - i - j - 1, int(self.colorList[pixels.count() - i - j - 1], 16)) + pixels.set_pixel(pixels.count() - i - self.number - 1, int(self.colorList[pixels.count() - i - self.number - 1], 16)) pixels.show() time.sleep(self.time) @@ -447,14 +469,14 @@ def run(self, queueColor, queueColorList, queueTime, queueNumber): # center to outside for i in reversed(range(0, (pixels.count() - self.number) / 2)): pixels.set_pixels(0) - pixels.set_pixel(i, self.color) + pixels.set_pixel(i, int(self.colorList[i], 16)) for j in range(1, self.number + 1): - pixels.set_pixel(i + j, self.color) - pixels.set_pixel(i + self.number + 1, self.color) - pixels.set_pixel(pixels.count() - i - 1, self.color) + pixels.set_pixel(i + j, int(self.colorList[i + j], 16)) + pixels.set_pixel(i + self.number + 1, int(self.colorList[i + self.number + 1], 16)) + pixels.set_pixel(pixels.count() - i - 1, int(self.colorList[pixels.count() - i - 1], 16)) for j in range(self.number + 1): - pixels.set_pixel(pixels.count() - i - j - 1, self.color) - pixels.set_pixel(pixels.count() - i - self.number - 1, self.color) + pixels.set_pixel(pixels.count() - i - j - 1, int(self.colorList[pixels.count() - i - j - 1], 16)) + pixels.set_pixel(pixels.count() - i - self.number - 1, int(self.colorList[pixels.count() - i - self.number - 1], 16)) pixels.show() time.sleep(self.time) @@ -555,7 +577,8 @@ def run(self, queueColor, queueColorList, queueTime, queueNumber): # 0) Mode - On Pixels if self.mode == 0: - pixels.set_pixels(self.color) + for i in range(len(self.colorList)): + pixels.set_pixel(i, int(self.colorList[i], 16)) pixels.show() # 1) Mode - Chill Pixels if self.mode == 1: diff --git a/PixLeZ_Server/Blink_Test_Dummy.py b/PixLeZ_Server/Blink_Test_Dummy.py index d698162..7dcd282 100644 --- a/PixLeZ_Server/Blink_Test_Dummy.py +++ b/PixLeZ_Server/Blink_Test_Dummy.py @@ -11,7 +11,8 @@ from threading import Thread ''' - PixLeZ - Server + PixLeZ - Server Dummy + Used without connecting to the Hardware ''' diff --git a/PixLeZ_Server/Blink_Test.py b/PixLeZ_Server/Blink_old.py similarity index 85% rename from PixLeZ_Server/Blink_Test.py rename to PixLeZ_Server/Blink_old.py index bd175a6..7c8066c 100644 --- a/PixLeZ_Server/Blink_Test.py +++ b/PixLeZ_Server/Blink_old.py @@ -12,10 +12,10 @@ from multiprocessing import Process from multiprocessing import Queue -from threading import Thread ''' PixLeZ - Server + Old Configuration Backup ''' @@ -35,8 +35,6 @@ def __init__(self): self.value = 0 self.color = Adafruit_WS2801.RGB_to_color(255, 255, 255) self.colorList = [] - for i in range(PIXEL_COUNT): - self.colorList.append('000000') self.time = 0.1 self.timer = 20.0 self.number = 1 @@ -102,14 +100,8 @@ def set_color(self, value): if self.process.is_alive(): self.color = int(value, 16) self.queueColor.put(self.color) - - for i in range(PIXEL_COUNT): - self.colorList[i] = value - self.queueColorList.put(self.colorList) else: self.color = int(value, 16) - for i in range(PIXEL_COUNT): - self.colorList[i] = value # colors = Hex-String list def set_pixels(self, colors): @@ -200,40 +192,30 @@ def road_map(self, *col): def checkQueue(self): # Reading Queues - while True: - if not self.queueColor.empty(): - self.color = self.queueColor.get() - if not self.queueColorList.empty(): - self.colorList = self.queueColorList.get() - if not self.queueTime.empty(): - self.time = self.queueTime.get() - if not self.queueNumber.empty(): - self.number = self.queueNumber.get() - time.sleep(1) + if not self.queueColor.empty(): + self.color = self.queueColor.get() + if not self.queueColorList.empty(): + self.colorList = self.queueColorList.get() + if not self.queueTime.empty(): + self.time = self.queueTime.get() + if not self.queueNumber.empty(): + self.number = self.queueNumber.get() # new process -> communication with queue def run(self, queueColor, queueColorList, queueTime, queueNumber): tmp = 0 - # check Queue -> oefters abfragen! - t = Thread(target=self.checkQueue) - t.setDaemon(True) - t.start() while True: - - - time.sleep(0.001) + # check Queue -> oefters abfragen! + self.checkQueue() - # * ----------- # * Effects # * ----------- # 0) led_on if self.effect == 0: - # pixels.set_pixels(self.color) - for i in range(len(self.colorList)): - pixels.set_pixel(i, int(self.colorList[i], 16)) + pixels.set_pixels(self.color) pixels.show() @@ -245,9 +227,9 @@ def run(self, queueColor, queueColorList, queueTime, queueNumber): for j in reversed(range(i, pixels.count())): pixels.clear() for k in range(i): - pixels.set_pixel(k, int(self.colorList[k], 16)) + pixels.set_pixel(k, self.color) time.sleep(self.time) - pixels.set_pixel(j, int(self.colorList[j], 16)) + pixels.set_pixel(j, self.color) pixels.show() time.sleep(self.time) # 2) Effect - Walking Pixels reverse @@ -258,22 +240,21 @@ def run(self, queueColor, queueColorList, queueTime, queueNumber): for j in range(i, pixels.count()): pixels.clear() for k in range(i): - pixels.set_pixel(k, int(self.colorList[k], 16)) + pixels.set_pixel(k, self.color) time.sleep(self.time) - pixels.set_pixel(j, int(self.colorList[j], 16)) + pixels.set_pixel(j, self.color) pixels.show() time.sleep(self.time) # 3) Effect - Fill number Pixels if self.effect == 3: for i in range(self.number): - pixels.set_pixel(i, int(self.colorList[i], 16)) + pixels.set_pixel(i, self.color) for i in range(self.number, pixels.count()): pixels.set_pixel(i, Adafruit_WS2801.RGB_to_color(0, 0, 0)) pixels.show() # 4) Effect - Get empty Pixels if self.effect == 4: - for i in range(len(self.colorList)): - pixels.set_pixel(i, int(self.colorList[i], 16)) + pixels.set_pixels(self.color) pixels.show() tmpTimer = self.timer / pixels.count() for i in range(pixels.count()): @@ -372,19 +353,19 @@ def run(self, queueColor, queueColorList, queueTime, queueNumber): if self.effect == 11: for i in range(pixels.count() - self.number - 2): pixels.set_pixels(0) - pixels.set_pixel(i, int(self.colorList[i], 16)) + pixels.set_pixel(i, self.color) for j in range(1, self.number + 1): - pixels.set_pixel(i + j, int(self.colorList[i + j], 16)) - pixels.set_pixel(i + self.number + 1, int(self.colorList[i + self.number + 1], 16)) + pixels.set_pixel(i + j, self.color) + pixels.set_pixel(i + self.number + 1, self.color) pixels.show() time.sleep(self.time) time.sleep(self.time) for i in reversed(range(pixels.count() - self.number - 2)): pixels.set_pixels(0) - pixels.set_pixel(i, int(self.colorList[i], 16)) + pixels.set_pixel(i, self.color) for j in range(1, self.number + 1): - pixels.set_pixel(i + j, int(self.colorList[i + j], 16)) - pixels.set_pixel(i + self.number + 1, int(self.colorList[i + self.number + 1], 16)) + pixels.set_pixel(i + j, self.color) + pixels.set_pixel(i + self.number + 1, self.color) pixels.show() time.sleep(self.time) # 12) Effect - Twinkle Pixels @@ -408,21 +389,19 @@ def run(self, queueColor, queueColorList, queueTime, queueNumber): # 14) Effect - Sparkle Pixels if self.effect == 14: pTmp = random.randint(0, pixels.count() - 1) - pixels.set_pixel(pTmp, int(self.colorList[pTmp], 16)) + pixels.set_pixel(pTmp, self.color) pixels.show() time.sleep(self.time) pixels.set_pixel(pTmp, 0) # TODO: wie in 18 erl? # 15) Effect - Snow Sparkle Pixels if self.effect == 15: - for i in range(len(self.colorList)): - pixels.set_pixel(i, int(self.colorList[i], 16)) - pixels.show() + pixels.set_pixels(self.color) pTmp = random.randint(0, pixels.count() - 1) pixels.set_pixel(pTmp, Adafruit_WS2801.RGB_to_color(0, 0, 0)) pixels.show() time.sleep(self.time) - pixels.set_pixel(pTmp, int(self.colorList[pTmp], 16)) + pixels.set_pixel(pTmp, self.color) time.sleep(self.time) # 16) Effect - Running Pixels if self.effect == 16: @@ -442,7 +421,7 @@ def run(self, queueColor, queueColorList, queueTime, queueNumber): for j in range(10): for q in range(3): for i in range(0, pixels.count() - 3, 3): - pixels.set_pixel(i + q, int(self.colorList[i + q], 16)) + pixels.set_pixel(i + q, self.color) pixels.show() time.sleep(self.time) for i in range(0, pixels.count() - 3, 3): @@ -454,14 +433,14 @@ def run(self, queueColor, queueColorList, queueTime, queueNumber): # outside to center for i in range((pixels.count() - self.number) / 2): pixels.set_pixels(0) - pixels.set_pixel(i, int(self.colorList[i], 16)) + pixels.set_pixel(i, self.color) for j in range(1, self.number): - pixels.set_pixel(i + j, int(self.colorList[i + j], 16)) - pixels.set_pixel(i + self.number + 1, int(self.colorList[i + self.number + 1], 16)) - pixels.set_pixel(pixels.count() - i - 1, int(self.colorList[pixels.count() - i - 1], 16)) + pixels.set_pixel(i + j, self.color) + pixels.set_pixel(i + self.number + 1, self.color) + pixels.set_pixel(pixels.count() - i - 1, self.color) for j in range(self.number + 1): - pixels.set_pixel(pixels.count() - i - j - 1, int(self.colorList[pixels.count() - i - j - 1], 16)) - pixels.set_pixel(pixels.count() - i - self.number - 1, int(self.colorList[pixels.count() - i - self.number - 1], 16)) + pixels.set_pixel(pixels.count() - i - j - 1, self.color) + pixels.set_pixel(pixels.count() - i - self.number - 1, self.color) pixels.show() time.sleep(self.time) @@ -469,14 +448,14 @@ def run(self, queueColor, queueColorList, queueTime, queueNumber): # center to outside for i in reversed(range(0, (pixels.count() - self.number) / 2)): pixels.set_pixels(0) - pixels.set_pixel(i, int(self.colorList[i], 16)) + pixels.set_pixel(i, self.color) for j in range(1, self.number + 1): - pixels.set_pixel(i + j, int(self.colorList[i + j], 16)) - pixels.set_pixel(i + self.number + 1, int(self.colorList[i + self.number + 1], 16)) - pixels.set_pixel(pixels.count() - i - 1, int(self.colorList[pixels.count() - i - 1], 16)) + pixels.set_pixel(i + j, self.color) + pixels.set_pixel(i + self.number + 1, self.color) + pixels.set_pixel(pixels.count() - i - 1, self.color) for j in range(self.number + 1): - pixels.set_pixel(pixels.count() - i - j - 1, int(self.colorList[pixels.count() - i - j - 1], 16)) - pixels.set_pixel(pixels.count() - i - self.number - 1, int(self.colorList[pixels.count() - i - self.number - 1], 16)) + pixels.set_pixel(pixels.count() - i - j - 1, self.color) + pixels.set_pixel(pixels.count() - i - self.number - 1, self.color) pixels.show() time.sleep(self.time) @@ -577,8 +556,7 @@ def run(self, queueColor, queueColorList, queueTime, queueNumber): # 0) Mode - On Pixels if self.mode == 0: - for i in range(len(self.colorList)): - pixels.set_pixel(i, int(self.colorList[i], 16)) + pixels.set_pixels(self.color) pixels.show() # 1) Mode - Chill Pixels if self.mode == 1: diff --git a/PixLeZ_Server/app.py b/PixLeZ_Server/app.py index 410f9b9..8b55084 100644 --- a/PixLeZ_Server/app.py +++ b/PixLeZ_Server/app.py @@ -6,7 +6,7 @@ import sys import time from multiprocessing import Process -from Blink_Test import Blink +from Blink import Blink ''' PixLeZ - Server @@ -91,8 +91,8 @@ def flask_set_pixels(): # ! doc: https://flask.palletsprojects.com/en/1.1.x/api/?highlight=run#flask.Flask.run if __name__ == '__main__': # Application: - # app.run(debug=True, port=8080, host="0.0.0.0") + app.run(debug=True, port=8080, host="0.0.0.0") # Debug: - app.run(debug=True, port=5500) + # app.run(debug=True, port=5500) diff --git a/PixLeZ_Simulator/Readme.md b/PixLeZ_Simulator/Readme.md index ecf2194..4b76e89 100644 --- a/PixLeZ_Simulator/Readme.md +++ b/PixLeZ_Simulator/Readme.md @@ -1,4 +1,4 @@ -# [PixLeZ - Documentation](https://www.markdownguide.org/basic-syntax/#overview) +# PixLeZ - Documentation [![alt text](https://img.shields.io/github/followers/Excyto?label=Github&style=social)](https://github.com/Excyto) [![alt text](https://img.shields.io/github/v/release/Excyto/PixLeZ?color=g)](https://github.com/Excyto/PixLeZ) @@ -9,7 +9,7 @@ ## PixLeZ-Simulator -The PixLeZ-Simulator is developed for simulating, debuging and testing the Adafruit_WS2801 pixels without using the hardware. It is using the same [API](https://github.com/adafruit/Adafruit_Python_WS2801/blob/master/Adafruit_WS2801/WS2801.py) for manipuulating the pixels, so it is possible to copy and paste the code between the simulator and the hardware without changing too much. Only the call of the converter methods have to be adjust. +The PixLeZ-Simulator is developed for simulating, debuging and testing the Adafruit_WS2801 pixels without using the hardware. It is using the same [API](https://github.com/adafruit/Adafruit_Python_WS2801/blob/master/Adafruit_WS2801/WS2801.py) for manipulating the pixels, so it is possible to copy and paste the code between the simulator and the hardware without changing too much. Only the call of the converter methods have to be adjust. You can run your own code in `PixelSimulatorConfig.py`. There is the method `coding()` for this purpose, which will be executed in a while loop. The possibilities of manipulating the pixels are listed in the section below. diff --git a/Readme.md b/Readme.md index 37fee26..ea176e3 100644 --- a/Readme.md +++ b/Readme.md @@ -12,7 +12,7 @@ ## Introduction PixLeZ is a Software-Bundle for controlling the [WS2801 Pixels](https://github.com/adafruit/Adafruit_Python_WS2801/blob/master/Adafruit_WS2801/WS2801.py) with a Raspberry Pi. -The Bundle contains a Server application, running on the Raspberry Pi and different clients to control the Pixels. +The Bundle contains a server application, running on the Raspberry Pi and different clients for control the server. ## Content @@ -43,12 +43,14 @@ There is a picture of my personal setup. ### Software -For the software part you have to run following commands on your Raspberry Pi to install the `python` libraries. +For the software part you have to install some `python` libraries with the following commands. ```sh sudo apt-get update sudo apt-get install python[Version] sudo apt-get install python-pip -y +sudo pip install RPi.GPIO +sudo pip install Adafruit-GPIO sudo pip install adafruit-ws2801 sudo pip install flask ``` @@ -71,7 +73,7 @@ app.run(debug=True, port=8080, host="0.0.0.0") ### API calls -After installing, the PixLeZ-Server provides the following API. The API is used by the applications described in the next few sections, but can also be used via a webbrowser or a third application. +After installing, the PixLeZ-Server provides the following API. The API is used by the applications described in the next few sections, but can also be used via a webbrowser or an other application. The term `changeable during runtime` is used to describe that the attributes can be changed during the execution of an effect or mode. The change of attributes with `non changeable during runtime` will be changed after selecting a new effect or mode, or after doing an `/stop` and `/start`. Each time you select an effect, the mode attribute will turn to `-1` and backwards. Furthermore after selecting an effect or mode, the program will automatically do an `/stop` and `/start`. @@ -181,7 +183,7 @@ You are not able to select your added effects and modes with the PixLeZ-Applicat ### Example: Use the API -How to start an effect and manipulate it. +How to start an effect and manipulate it. If u use an application do the same steps but without the API calls. 1. Select a color or color theme with `/set/color/` or `/set/pixels` 1. Select your effect with `/select/effect/1` @@ -193,7 +195,8 @@ How to start an effect and manipulate it. > Path: `./PixLeZ_Desktop` -PixLeZ-Desktop is developed for easy controlling the pixels via windows desktop. It is developed in `C#` with Visual Studio. The main use of this programm is to debug and test the application. +PixLeZ-Desktop is developed for easy controlling the pixels via windows desktop. It is developed in `C#` with Visual Studio. The main use of this programm is to debug and test the application. + Use PixLeZ-Application developed with `flutter` instead of PixLeZ_Desktop for a better user experience. ## PixLeZ-Application @@ -213,7 +216,7 @@ You have two options to run the PixLeZ-Application > Path: `./PixLeZ_Simulator` -The PixLeZ-Simulator is developed for simulating, debuging and testing your program without using the hardware. It is using the same [API](https://github.com/adafruit/Adafruit_Python_WS2801/blob/master/Adafruit_WS2801/WS2801.py) for manipulating the pixels, so it is possible to copy and paste the code between the simulator and the hardware without changing too much. +The PixLeZ-Simulator is developed for simulating, debuging and testing your program without using hardware. It is using the same [API](https://github.com/adafruit/Adafruit_Python_WS2801/blob/master/Adafruit_WS2801/WS2801.py) for manipulating the pixels, so it is possible to copy and paste the code between the simulator and the hardware without changing too much. For more Information please check the Simulator `Readme.md` in `./PixLeZ_Simulator/Readme.md`. @@ -221,6 +224,14 @@ For more Information please check the Simulator `Readme.md` in `./PixLeZ_Simulat PixLeZ is created by Tobias Schreiweis in 2020. +It started as a private project with the main focus to improve my python skills with the Raspberry Pi and learning new programing languages like dart with the framework flutter. After some request from other peoples getting the application I decided to publish it on GitHub. + +You are welcome to extend the PixLeZ-Bundle or send me your ideas and I would be glad about adding your code and ideas to this repository. + +If I can be of assistance, please do not hesitate to contact me. + +[![alt text](https://img.shields.io/github/followers/Excyto?label=Github&style=social)](https://github.com/Excyto) + ## Links - [Raspberry Pi Tutorial Setup (ger)](https://tutorials-raspberrypi.de/raspberry-pi-ws2801-rgb-led-streifen-anschliessen-steuern/)