├── .github
├── FUNDING.yml
└── ISSUE_TEMPLATE
│ ├── FUNDING.yml
│ ├── bug_report.md
│ └── feature_request.md
├── .gitignore
├── CODE_OF_CONDUCT.md
├── LICENSE
├── README.md
├── img
├── RGBWDemo.gif
├── RGBWLayout.jpg
└── thumbnail.png
├── index.html
├── rgb.json
├── rgbw.py
├── rgbw.wsgi
├── script.js
├── static
├── css
│ ├── bootstrap.min.css
│ ├── classic.min.css
│ ├── nouislider.min.css
│ ├── obitron.css
│ └── sourcecodepro.css
└── js
│ ├── jquery.min.js
│ ├── nouislider.min.js
│ ├── pickr.min.js
│ └── wNumb.js
├── style.css
├── utils
├── activate_this.py
├── apache-led.conf
└── pigpio.zip
└── white.json
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
4 | patreon: nazmus
5 | open_collective: # Replace with a single Open Collective username
6 | ko_fi: nazmus
7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9 | liberapay: # Replace with a single Liberapay username
10 | issuehunt: # Replace with a single IssueHunt username
11 | otechie: # Replace with a single Otechie username
12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
13 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
4 | patreon: nazmus
5 | open_collective: # Replace with a single Open Collective username
6 | ko_fi: nazmus
7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9 | liberapay: # Replace with a single Liberapay username
10 | issuehunt: # Replace with a single IssueHunt username
11 | otechie: # Replace with a single Otechie username
12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
13 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Create a report to help us improve
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Describe the bug**
11 | A clear and concise description of what the bug is.
12 |
13 | **To Reproduce**
14 | Steps to reproduce the behavior:
15 | 1. Go to '...'
16 | 2. Click on '....'
17 | 3. Scroll down to '....'
18 | 4. See error
19 |
20 | **Expected behavior**
21 | A clear and concise description of what you expected to happen.
22 |
23 | **Screenshots**
24 | If applicable, add screenshots to help explain your problem.
25 |
26 | **Desktop (please complete the following information):**
27 | - OS: [e.g. iOS]
28 | - Browser [e.g. chrome, safari]
29 | - Version [e.g. 22]
30 |
31 | **Smartphone (please complete the following information):**
32 | - Device: [e.g. iPhone6]
33 | - OS: [e.g. iOS8.1]
34 | - Browser [e.g. stock browser, safari]
35 | - Version [e.g. 22]
36 |
37 | **Additional context**
38 | Add any other context about the problem here.
39 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature request
3 | about: Suggest an idea for this project
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Is your feature request related to a problem? Please describe.**
11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12 |
13 | **Describe the solution you'd like**
14 | A clear and concise description of what you want to happen.
15 |
16 | **Describe alternatives you've considered**
17 | A clear and concise description of any alternative solutions or features you've considered.
18 |
19 | **Additional context**
20 | Add any other context or screenshots about the feature request here.
21 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea
2 | .idea/*
3 | led/*
4 | PIGPIO/*
5 | PIGPIO
6 | __pycache__/
7 | venv/
8 | venv/*
--------------------------------------------------------------------------------
/CODE_OF_CONDUCT.md:
--------------------------------------------------------------------------------
1 | # Contributor Covenant Code of Conduct
2 |
3 | ## Our Pledge
4 |
5 | In the interest of fostering an open and welcoming environment, we as
6 | contributors and maintainers pledge to making participation in our project and
7 | our community a harassment-free experience for everyone, regardless of age, body
8 | size, disability, ethnicity, sex characteristics, gender identity and expression,
9 | level of experience, education, socio-economic status, nationality, personal
10 | appearance, race, religion, or sexual identity and orientation.
11 |
12 | ## Our Standards
13 |
14 | Examples of behavior that contributes to creating a positive environment
15 | include:
16 |
17 | * Using welcoming and inclusive language
18 | * Being respectful of differing viewpoints and experiences
19 | * Gracefully accepting constructive criticism
20 | * Focusing on what is best for the community
21 | * Showing empathy towards other community members
22 |
23 | Examples of unacceptable behavior by participants include:
24 |
25 | * The use of sexualized language or imagery and unwelcome sexual attention or
26 | advances
27 | * Trolling, insulting/derogatory comments, and personal or political attacks
28 | * Public or private harassment
29 | * Publishing others' private information, such as a physical or electronic
30 | address, without explicit permission
31 | * Other conduct which could reasonably be considered inappropriate in a
32 | professional setting
33 |
34 | ## Our Responsibilities
35 |
36 | Project maintainers are responsible for clarifying the standards of acceptable
37 | behavior and are expected to take appropriate and fair corrective action in
38 | response to any instances of unacceptable behavior.
39 |
40 | Project maintainers have the right and responsibility to remove, edit, or
41 | reject comments, commits, code, wiki edits, issues, and other contributions
42 | that are not aligned to this Code of Conduct, or to ban temporarily or
43 | permanently any contributor for other behaviors that they deem inappropriate,
44 | threatening, offensive, or harmful.
45 |
46 | ## Scope
47 |
48 | This Code of Conduct applies both within project spaces and in public spaces
49 | when an individual is representing the project or its community. Examples of
50 | representing a project or community include using an official project e-mail
51 | address, posting via an official social media account, or acting as an appointed
52 | representative at an online or offline event. Representation of a project may be
53 | further defined and clarified by project maintainers.
54 |
55 | ## Enforcement
56 |
57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be
58 | reported by contacting the project team at nazmus.nasir@gmail.com. All
59 | complaints will be reviewed and investigated and will result in a response that
60 | is deemed necessary and appropriate to the circumstances. The project team is
61 | obligated to maintain confidentiality with regard to the reporter of an incident.
62 | Further details of specific enforcement policies may be posted separately.
63 |
64 | Project maintainers who do not follow or enforce the Code of Conduct in good
65 | faith may face temporary or permanent repercussions as determined by other
66 | members of the project's leadership.
67 |
68 | ## Attribution
69 |
70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
72 |
73 | [homepage]: https://www.contributor-covenant.org
74 |
75 | For answers to common questions about this code of conduct, see
76 | https://www.contributor-covenant.org/faq
77 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2019 Nazmus Nasir
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Raspberry Pi - Control RGBW LED Strip from your browser
2 |
3 | Controlling RGBW LED Strip lights from your browser with a Raspberry Pi Zero.
4 |
5 | More info at https://www.easyprogramming.net/raspberrypi/rgbw_led_strip.php
6 |
7 | ## Demo
8 |
9 | Check out the demo on YouTube by clicking on the following gif:
10 |
11 |
12 |
13 |
14 | ## Getting Started
15 |
16 | This project contains the tutorial files for EasyProgramming.net.
17 |
18 | If you've followed my other tutorials, browser control should be something that is familiar to you. The requirements below should also be very familiar:
19 |
20 | ### Hardware
21 |
22 | In order to complete this project, you will need some of these hardware:
23 |
24 | * [ ] Raspberry Pi - can use Zero, Zero W, 2, 3, 4
25 | * [ ] *(Optional)* Wireless dongle - If you are using the basic Pi 0 v1.3. This is not necessary for the other versions of the Pi.
26 | * [ ] RGBW LED Strip - These normally have 5 connections, One for each color and an additional for Ground.
27 | * [ ] Pi Power Supply - need 5V to your Pi
28 | * [ ] LED Strip Power Supply - 12V power adapter passing 1-2 Amps of current will be sufficient. This should also work with a 24V LED Strip.
29 | * [ ] Logic Level MOSFET Transistor - I use MOSFETS for this project. They can be any logic-level transistor (most of them start with IRL - the L is for 'logic').
30 | It just needs to be able to turn on with 5v or less of power. The models I've tested with are IRLU024 and IRL2203.
31 | * [ ] Wiring - You need 5 wires to connect the LEDs and Ground. You can find adapters or you can use individual wires.
32 | * [ ] *(Optional)* Aluminum Extrusion - although not necessary, an aluminum extrusion will help dissipate heat as well as make your installation more sturdy.
33 | * [ ] *(Optional)* Pi Case - Something to house your Pi and Relay. You can make your own or if you want, you can just leave it as is but be careful of shorts
34 | and electric shocks!
35 | * [ ] *(Optional)* Soldering Iron - if you are comfortable, it is best to solder the lights and connections in place so they don't disconnect easily.
36 | * [ ] Tools - a wire cutter/stripper would be most helpful to you.
37 |
38 | ### Prerequisites
39 | The prerequisites for this tutorial is the same as the last because everything in this tutorial is the end product of what we've learned so far about
40 | the Raspberry Pi and some things we learned with JavaScript and jQuery. If you get stuck anywhere, take a look at these tutorials:
41 |
42 | 1. [Headless Raspberry Pi](https://www.easyprogramming.net/raspberrypi/headless_raspbery_pi.php)
43 | 2. Previously we needed RPi.GPIO library, for this, we need pigpiod - More info at http://abyz.me.uk/rpi/pigpio/pigpiod.html
44 | 3. [Run Apache on your Pi](https://www.easyprogramming.net/raspberrypi/pi_apache_web_server.php)
45 | 4. [Running a Flask App on your Pi](https://www.easyprogramming.net/raspberrypi/pi_flask_app_server.php)
46 | 5. [Run Flask behind Apache](https://www.easyprogramming.net/raspberrypi/pi_flask_apache.php)
47 | 6. [Simple AJAX with jQuery/JavaScript](https://www.easyprogramming.net/jQuery/get_data_ajax_method.php)
48 |
49 | ### Installation
50 |
51 | #### Hardware
52 |
53 | For this project, you need 4 MOSFETs, one for each color. The MOSFETs then need to be connected to the following GPIO Pins:
54 |
55 | | Color | GPIO Pin |
56 | |-------|:---------:|
57 | | Red | 24 |
58 | | Green | 25 |
59 | | Blue | 20 |
60 | | White | 18 |
61 | | Yellow | Power |
62 | | Black | GND |
63 |
64 | **Note**: I'm using n N-Channel MOSFET so mine are all common ground, if you use a P-Channel MOSFET, switch to common power. If you're not sure what you have, consult the datasheet
65 | for your transistor.
66 |
67 | In my schematic, I'm using a Yellow wire to represent the 12v power coming from our adapter and it connects to the RGBW's power.
68 |
69 | The mosfets used must be logic level so they can be turned on with the 5 volts of electricity that the Pi can provide. They should also be able to handle whatever
70 | voltage and current you pass through to the lights. The lights I use are 12v 5050 SMD LEDs. This project should also work with 24v LEDs.
71 |
72 | The ground connects to the Raspberry Pi and a ground line goes from our Pi to each of the "Source" pins of the MOSFETs.
73 | As stated in the above note, my LED Strip shares common ground because I'm using an N-channel MOSFET. If you have a P-Channel mosfet, make sure they share common VCC.
74 | In my case, I connected them all to the different ground pins on the Pi or split one out into all 4.
75 |
76 | The "Drain" pins on our MOSFETS are then connected to each of the colors on the RGBW LED. When the power is turned on for a mosfet, the drain and source pins get
77 | connected and power is providedto that color and that's controlled by the "Gate" pin on the MOSFET. This pin is connected to each of the above defined
78 | GPIO pins on our Pi. When we send an 'on' signal from the Pi to the Gate Pin, the Drain and Source gets connected. And the faster you do it
79 | (Pulse With Modulation) the brighter/more vibrant a color is (up to 255 times a second).
80 |
81 | If you switch the pins, edit `rgbw.py` to reflect the new Pins.
82 |
83 |
84 |
85 |
86 | #### Software
87 | Follow the tutorial here to learn how to run a Flask app behind Apache: https://www.easyprogramming.net/raspberrypi/pi_flask_apache.php
88 |
89 | As stated in the above tutorial and in the [Prerequisites](#prerequisites), here's a very quick checklist for this project:
90 |
91 | * [ ] Apache
92 | * [ ] venv (virtual environment)
93 | * [ ] `activate-this.py` inside your venv - you can fi nd this in the `utils/` directory
94 | * [ ] Mod-WSGI [More info below](#apache-and-wsgi---web-server)
95 | * [ ] `pigpiod`
96 |
97 | As stated in the last point above, we need to install `pigpiod`:
98 |
99 | ```bash
100 | wget abyz.me.uk/rpi/pigpio/pigpio.zip
101 | unzip pigpio.zip
102 | cd PIGPIO
103 | make
104 | sudo make install
105 | ```
106 |
107 | I will also include a version of the zip in this repo as a backup.
108 |
109 | After you install `pigpiod`, run it with:
110 |
111 | ```bash
112 | sudo pigpiod
113 | ```
114 |
115 | Technically, you can run this outside of `venv` and it'll still work, because it's running globally and our virtual environment will have access to the daemon. But we still
116 | need the library in our venv, so while activated inside your virtual environment, install `pigpio` with:
117 |
118 | ```bash
119 | pip install pigpio
120 | ```
121 |
122 | Now when we run our `pigpio` commands, we won't get an error.
123 |
124 | ### The Stack
125 |
126 | #### JavaScript - Script.js - Frontend
127 |
128 | The `script.js` has jQuery that calls the Flask app using simple AJAX calls. They assume that the path for the flask app is `/api/lr` -
129 | if you use another path, change this in the JavaScript to avoid getting 404s on your AJAX calls. You can also modify the API endpoints in `rgbw.py`.
130 |
131 |
132 | ##### Configurable options
133 |
134 | This config object in `script.js` allows you to configure the URL for your Pi. The default is an ip address but if you can access your Pi via a hostname or domain name,
135 | just change the url properly to reflect the address:
136 | ```javascript
137 | let config = {
138 | url: 'http://{{ip_addr}'
139 | };
140 | ```
141 |
142 | ##### Cache Busting
143 |
144 | I use a basic cache busting system in the JavaScript by looking at the current time for the request and appending it to the AJAX request looking for `status.txt` because
145 | I've noticed that browsers love to store this in memory, especially mobile browsers. This ensures that we don't have to worry about caching.
146 |
147 | #### External Dependencies
148 |
149 | I'm using a bunch of libraries to help with various things such as AJAX calls, the brightness slider, color picker, etc. Here is a list of all external dependencies:
150 |
151 | * jQuery v3.3.1 - https://github.com/jquery/jquery
152 | * Pickr 1.4.5 - https://github.com/Simonwep/pickr
153 | * Including its css: classic.min.css
154 | * noUiSlider 14.0.3 - https://github.com/leongersen/noUiSlider
155 | * Including its CSS
156 | * wNumb.js (dependency of noUiSlider) - https://github.com/rudza/meteor-wnumb/blob/master/wNumb.js
157 | * Bootstrap v4.3.1 - https://github.com/twbs/bootstrap
158 | * CSS only
159 | * Fonts
160 | * obitron.css
161 | * sourcecodepro.css
162 |
163 | Note: All of these dependencies have been localized and included in the `static/*` directories. This allows you to use this app without needing to connect to the internet.
164 | A simple LAN connection with an internal IP will do.
165 |
166 | #### Apache and WSGI - Web Server
167 |
168 | The `rgbw.wsgi` file should be placed in the same directory as `rgbw.py` which contains your Flask controllers. Make sure the paths for `activate_this.py` and `rgbw.py` match
169 | your installation. If you rename the flask controller, you have edit the `wsgi` file to reflect the changes.
170 |
171 | Take the `utils/apache-led.conf` configuration file and place it in the appropriate Apache/sites-available directory and enable it with with:
172 |
173 | ```bash
174 | sudo a2ensite apache-led.conf
175 | ```
176 |
177 | Feel free to use your own configuration and name it anything you want! This should be used as a template.
178 |
179 | Once that's done, restart Apache with:
180 |
181 | ```bash
182 | sudo service apache2 restart
183 | ```
184 |
185 | If you get a WSGI error, your Pi may not have Mod-WSGI installed. Run the following and restart apache:
186 |
187 | ```bash
188 | sudo apt install libapache2-mod-wsgi-py3 -y
189 | ```
190 |
191 | **Note** the apache configuration enables `CORS` from all origins. If you don't want to enable CORS and want to handle these requests another way,
192 | remove this line in `apache-led.conf`:
193 |
194 | ```
195 | Header set Access-Control-Allow-Origin "*"
196 | ```
197 |
198 | IF you have this enable, you must enable `mod_headers` on your Pi with the following command for this to work:
199 |
200 | ```bash
201 | sudo a2enmod headers
202 | ```
203 |
204 | As long as you don't open your Pi to the outside world, you should be fine. You can also specify which origins are allowed to make requests.
205 |
206 |
207 | If everything is set up correctly, the AJAX call will happen with the following url: `http://{{ip_addr}}/api/kitchen?status=on`
208 |
209 | Only a status of `on` or `off` are accepted. Anything else will return a simple error message. Open up the JavaScript console for more info.
210 |
211 | Once everything is done, your app should look something like this:
212 |
213 |
214 |
215 |
216 |
217 | ### API endpoints
218 |
219 | #### `/api/lr`
220 |
221 | This endpoint is defined in the apache configuration. If you don't want this to be the end point, change the following in the config:
222 |
223 | ```apache
224 | WSGIScriptAlias /api/lr
225 | ```
226 |
227 | I used "lr" for Living Room because that's where these lights are. All endpoints are using simple GET requests, they can be changed in `rgbw.py` if you prefer POST.
228 |
229 | #### `/api/lr?red=255&green=255&blue=255`
230 |
231 | You can pass in 4 different query string parameters of red, green, and bluewith values of 0 to 255. A value of 0 means off (or no power)
232 | and 255 means on (or full power). Different combinations will cause different colors and brightnesses. The Frontend should allow you to send these
233 | using a color picker.
234 |
235 | These parameters are optional. If they are not sent, they will automatically be given a value of 0. For example, the following request:
236 |
237 | ```
238 | /api/lr?red=255&blue=150
239 | ```
240 |
241 | Will return this:
242 |
243 | ```json
244 | {
245 | "blue": 150,
246 | "green": 0,
247 | "red": "255",
248 | }
249 | ```
250 |
251 | Sending no values will turn the lights off.
252 |
253 | #### `/api/lr/white?white=255`
254 |
255 | The white lights were separated for simplicity. Since the frontend color picker only produces Red, Green, and Blue color codes, the white was left out. For simplicity,
256 | The white LED is controlled by a separate slider above the RGB one. You can control the brightness from 0% to 100%. 0% is off and 100% is technically a value of 255.
257 |
258 | #### `/api/lr/getStatus?colors={rgb/white}`
259 |
260 | The states of the lights are held in two different JSON files. `rgb.json` which houses the Red, Green, and blue Color statuses. And `white.json` which houses the
261 | frequency/brightness of the White LED. You can pass in the query parameter `colors` and either `rgb` or `white` as a value to get the different states as follow:
262 |
263 | For RGB:
264 | ```
265 | /api/lr/getStatus?colors=rgb
266 | ```
267 |
268 | For White:
269 | ```
270 | /api/lr/getStatus?colors=white
271 | ```
272 |
273 | This data is used when the page is refreshed or loaded for the first time, then you know what color your lights are on.
274 |
275 | **Note**: `rgbw.py` needs to state the full path to the JSON files. It is currently set to `/var/www/html/rgbw/*.json` - if you need to host this elsewhere, change this.
276 | The user Pi needs to be able to write to these files as well.
277 |
278 | I include these files in the repo because if they don't exist, the app throws a 500 Internal Server Error. By default, all values are 0.
279 |
280 | ### Crontab
281 | When the Pi first boots, `pigpiod` is not automatically started. To ensure that it starts properly, I'd recommend entering this into your crontab. First edit crontab with this:
282 |
283 | ```bash
284 | crontab -e
285 | ```
286 |
287 | Then enter this in the file and save:
288 |
289 | ```
290 | @reboot sudo pigpiod
291 | ```
292 |
293 | If you don't do this, the next time your Pi reboots, `pigpiod` won't be running and your lights won't work until you turn it on.
294 |
295 | ## Troubleshooting
296 |
297 | #### Permissions
298 | If you are getting a permissions issue, the repo may have been copied as root instead of pi. Run the following to change ownership:
299 |
300 | ```
301 | sudo chown pi:pi *
302 | ```
303 |
304 | #### `activate_this.py` unavailable
305 |
306 | If for some reason you can't download `activate_this.py`, you can find a copy of it in the `utils/` directory. Run this to copy it over:
307 |
308 | ```
309 | sudo cp utils/activate_this.py venv/bin/
310 | ```
311 |
312 |
313 | ## Authors
314 | * **Nazmus Nasir** - [Nazm.us](https://nazm.us) - Owner of EasyProgramming.net
315 |
316 | ## License
317 |
318 | This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details
319 |
320 | # Questions ?
321 | Have questions? You can reach me through several different channels. You can ask a question in the [issues forum](/../../issues),
322 | on [EasyProgramming.net](https://www.easyprogramming.net), or on the video comments on YouTube.
323 |
324 |
325 | # Contribute
326 | I will accept Pull requests fixing bugs or adding new features after I've vetted them. Feel free to create pull requests!
--------------------------------------------------------------------------------
/img/RGBWDemo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/naztronaut/RaspberryPi-RGBW-Control/48ae365a61dd5bf202d7ac786ed85907a7c29b4b/img/RGBWDemo.gif
--------------------------------------------------------------------------------
/img/RGBWLayout.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/naztronaut/RaspberryPi-RGBW-Control/48ae365a61dd5bf202d7ac786ed85907a7c29b4b/img/RGBWLayout.jpg
--------------------------------------------------------------------------------
/img/thumbnail.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/naztronaut/RaspberryPi-RGBW-Control/48ae365a61dd5bf202d7ac786ed85907a7c29b4b/img/thumbnail.png
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Easy Programming - RGBW Lights
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
23 |