Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации:
9824
Управление RGB подсветкой из браузера
В праздники появилось свободное время и я решил сделать потолочную подсветку, управляемую из браузера
Сама потолочная подсветка, которая будет модернизироваться
Схема подключения RGB Led подсветки к Wi-Fi модулю
Wemos
Резисторы на затворах 1500-200 оМ
Транзисторы MOSFET IRLU8259 или IRLR2905
Код для модуля ESP8266. Что бы посмотреть нажмите на +
PHP код:
#include <ESP8266WiFi.h> #include <DNSServer.h> #include <ESP8266WebServer.h> // веб страница String webpage = "" "<!DOCTYPE html><html><head><title>RGB control</title><meta name='mobile-web-app-capable' content='yes' />" "<meta name='viewport' content='width=device-width' /></head><body style='margin: 0px; padding: 0px;'>" "<canvas id='colorspace'></canvas></body>" "<script type='text/javascript'>" "(function () {" " var canvas = document.getElementById('colorspace');" " var ctx = canvas.getContext('2d');" " function drawCanvas() {" " var colours = ctx.createLinearGradient(0, 0, window.innerWidth, 0);" " for(var i=0; i <= 360; i+=10) {" " colours.addColorStop(i/360, 'hsl(' + i + ', 100%, 50%)');" " }" " ctx.fillStyle = colours;" " ctx.fillRect(0, 0, window.innerWidth, window.innerHeight);" " var luminance = ctx.createLinearGradient(0, 0, 0, ctx.canvas.height);" " luminance.addColorStop(0, '#ffffff');" " luminance.addColorStop(0.05, '#ffffff');" " luminance.addColorStop(0.5, 'rgba(0,0,0,0)');" " luminance.addColorStop(0.95, '#000000');" " luminance.addColorStop(1, '#000000');" " ctx.fillStyle = luminance;" " ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height);" " }" " var eventLocked = false;" " function handleEvent(clientX, clientY) {" " if(eventLocked) {" " return;" " }" " function colourCorrect(v) {" " return Math.round(1023-(v*v)/64);" " }" " var data = ctx.getImageData(clientX, clientY, 1, 1).data;" " var params = [" " 'r=' + colourCorrect(data[0])," " 'g=' + colourCorrect(data[1])," " 'b=' + colourCorrect(data[2])" " ].join('&');" " var req = new XMLHttpRequest();" " req.open('POST', '?' + params, true);" " req.send();" " eventLocked = true;" " req.onreadystatechange = function() {" " if(req.readyState == 4) {" " eventLocked = false;" " }" " }" " }" " canvas.addEventListener('click', function(event) {" " handleEvent(event.clientX, event.clientY, true);" " }, false);" " canvas.addEventListener('touchmove', function(event){" " handleEvent(event.touches[0].clientX, event.touches[0].clientY);" "}, false);" " function resizeCanvas() {" " canvas.width = window.innerWidth;" " canvas.height = window.innerHeight;" " drawCanvas();" " }" " window.addEventListener('resize', resizeCanvas, false);" " resizeCanvas();" " drawCanvas();" " document.ontouchmove = function(e) {e.preventDefault()};" " })();" "</script></html>" ; ////////////////////////////////////////////////////////////////////////////////////////////////// #define red_pin 5 #define green_pin 2 #define blue_pin 4 const char * ssid = "RGB-control" ; // точка доступа АР const byte DNS_PORT = 53 ; IPAddress apIP ( 192 , 168 , 1 , 1 ); //IP адрес АР DNSServer dnsServer ; // ESP8266WebServer webServer ( 80 ); //ПОРТ АР // получем с веб страницы выбраный цвет void handleRoot () { String red = webServer . arg ( 0 ); String green = webServer . arg ( 1 ); String blue = webServer . arg ( 2 ); // конвертируем и ШИМ-мим значения на RGB пинах analogWrite ( red_pin , red . toInt ()); analogWrite ( green_pin , green . toInt ()); analogWrite ( blue_pin , blue . toInt ()); webServer . send ( 200 , "text/html" , webpage ); } ////////////////////////////////////////////////////////////////////////////////////////////////// void setup () { pinMode ( red_pin , OUTPUT ); // R pinMode ( green_pin , OUTPUT ); // G pinMode ( blue_pin , OUTPUT ); // B analogWrite ( red_pin , 512 ); analogWrite ( green_pin , 512 ); analogWrite ( blue_pin , 512 ); delay ( 1000 ); //Запускаем WiFi AP и сервер WiFi . mode ( WIFI_AP ); WiFi . softAPConfig ( apIP , apIP , IPAddress ( 255 , 255 , 255 , 0 )); WiFi . softAP ( ssid ); dnsServer . start ( DNS_PORT , "rgb-control" , apIP ); webServer . on ( "/" , handleRoot ); //веб страница webServer . begin (); //запуск сервера } ////////////////////////////////////////////////////////////////////////////////////////////////// void loop () { dnsServer . processNextRequest (); webServer . handleClient (); }
[свернуть]
Веб страница в браузере моего смартфона выглядит так:
Видео тестирования подсветки на макетке