发新帖

RGB氛围灯

[复制链接]
5064 4
本帖最后由 tanxw 于 2020-1-15 20:17 编辑

准备工作
1. ESP8266 (客户端)
2. WS2812 (穿越机上的彩灯也可以)
3. 安装GoLang (服务端需要编译)
4. 在PC端添加环境变量变量名:GOPROXY变量值:https://goproxy.io
5. ArduinoIDE or Visual Code + PIO
6.为ArduinoIDE orVisual Code PIO 的库管理中添加ArduinoJson Adafruit_NeoPixel
8. 保存GoLang代码为app.go 用CMD进入所在目录执行
       go build app.go 得到执行文件,双击运行

注意事项:
GoLang安装后手动拉取依赖包:
go get "github.com/cenkalti/dominantcolor"
go get "github.com/kbinani/screenshot"


ESP8266
通过库管理器安装:ArduinoJson, Adafruit_NeoPixel

原理:GoLang应用程序作为TCP服务端运行在PC端,Esp8266 作为客户端连接。
服务端监听到连接,开启一个协程。并循环获截取屏幕,获取屏幕主色调。通过TCP发送给Esp8266,Esp8266在收到数据的时候。解析出RGB并通过ws2812进行显示。
建议放在屏幕后面,效果美滋滋。 理论上,可以支持多个ESP8266客户端连接。多的话足以点亮整房子与你的电脑当前画面主色调同步。RGB!
大家有条件可以试试 加油 奥力给!

对了,如果真有条件的话。可以把为getScreenshotColor方法加同步锁,或者把RGB值放到全局


为何在这里发帖,各位老哥看到的话能否把diy r9m接收机的原理图发份给我。tanxwai@gmail.com 在下金币实在不够。
GoLang端代码



  1. package main

  2. import (
  3.        "encoding/json"
  4.        "image/color"
  5.        "log"
  6.        "net"
  7.        "os"
  8.        "time"

  9.        "github.com/cenkalti/dominantcolor"
  10.        "github.com/kbinani/screenshot"
  11. )

  12. func main() {
  13.        listener,err := net.Listen("tcp", "192.168.31.48:8099") // 这里可以改为本机ip
  14.        if err != nil {
  15.               log.Fatal(err)
  16.        }
  17.        defer listener.Close()
  18.        for{
  19.               conn, err := listener.Accept()
  20.               iferr != nil {
  21.                      log.Fatal(err)
  22.               }
  23.               log.Println("onConnect:",conn.RemoteAddr().String())
  24.               go handleConnect(conn)
  25.        }
  26. }

  27. // handleConnect 客户端连接处理器
  28. func handleConnect(conn net.Conn) {
  29.        defer conn.Close()
  30.        for {
  31.               data,_ := json.Marshal(getScreenshotColor())
  32.               log.Println("sendData:", string(data)+"\n")
  33.               _,err := conn.Write([]byte(string(data) + "\n"))
  34.               iferr != nil {
  35.                      log.Println("wan:",err.Error())
  36.                      return
  37.               }
  38.               time.Sleep(time.Millisecond* 200)
  39.        }
  40. }

  41. // getScreenshotColor 获取屏幕颜色
  42. func getScreenshotColor() color.RGBA {
  43.        bounds := screenshot.GetDisplayBounds(0)
  44.        img, err  := screenshot.CaptureRect(bounds)
  45.        checkError(err)
  46.        return dominantcolor.Find(img)
  47. }

  48. func checkError(err error) {
  49.        if err != nil {
  50.               log.Fatalln(err)
  51.               os.Exit(1)
  52.        }
  53. }



复制代码



ESP8266端代码


  1. #include <Arduino.h>
  2. #include <ESP8266WiFi.h>
  3. #include <ArduinoJson.h>
  4. #include <Adafruit_NeoPixel.h>

  5. const char *ssid = "wifi"; // 你家的WiFi名
  6. const char *password = "xiaog123"; // 你家的WiFi密码
  7. WiFiClient client;

  8. const uint16_t PixelCount = 12; // thisexample assumes 4 pixels, making it smaller will cause a failure
  9. const uint8_t PixelPin = D4;    // make sure to set this to the correctpin, ignored for Esp8266

  10. StaticJsonDocument<200> doc;

  11. Adafruit_NeoPixel pixels =Adafruit_NeoPixel(PixelCount, PixelPin, NEO_GRB + NEO_KHZ800);

  12. void tryConnect()
  13. {
  14. while (!client.connect("192.168.31.48", 8099)) // 这里改为电脑的IP地址,
  15.   {
  16.    Serial.println("connection failed");
  17.    delay(500);
  18.   }
  19. }

  20. void setup()
  21. {

  22. pixels.begin();
  23. Serial.begin(115200);
  24. delay(10);
  25. Serial.println();
  26. Serial.println();
  27. Serial.print("Connecting to ");
  28. Serial.println(ssid);

  29. WiFi.begin(ssid, password);
  30. while (WiFi.status() != WL_CONNECTED)
  31.   {
  32.    delay(500);
  33.    Serial.print(".");
  34.   }
  35. Serial.println("");
  36. Serial.print("Connected, IP address: ");
  37. Serial.println(WiFi.localIP());
  38. }

  39. void loop()
  40. {
  41.   if(!client.connected())
  42.   {
  43.    tryConnect();
  44.    Serial.println("connect !");
  45.   }

  46.   if(client.available())
  47.   {
  48.    String line = client.readStringUntil('\n');
  49.    Serial.printf("onMessage:{%s}\n", line.c_str());
  50.    deserializeJson(doc, line);
  51.    auto r = doc["R"].as<int>();
  52.    auto g = doc["G"].as<int>();
  53.    auto b = doc["B"].as<int>();
  54.    Serial.printf("R:{%d}, B:{%d}, G:{%d}\n", r, b, g);
  55.    doc.clear();
  56.    for (size_t i = 0; i < PixelCount; i++)
  57.     {
  58.      pixels.setPixelColor(i, pixels.Color(r, g, b));
  59.     }
  60.    pixels.show();
  61.   }
  62. delay(200);
  63. }
复制代码


举报 使用道具

回复

精彩评论9

寂静天空house  新手上路  发表于 2020-4-1 16:04:48 | 显示全部楼层
水贴赚积分,感谢楼主

举报 使用道具

回复 支持 反对
寂静天空house  新手上路  发表于 2020-4-1 16:05:17 | 显示全部楼层
同求原理图,谢谢

举报 使用道具

回复 支持 反对
xiancai  注册会员  发表于 2020-4-12 15:01:53 | 显示全部楼层
水贴赚积分,感谢楼主

举报 使用道具

回复 支持 反对
jamiy  注册会员  发表于 2020-4-12 20:52:46 | 显示全部楼层

水贴赚积分,感谢楼主

举报 使用道具

回复 支持 反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

更多

客服中心

400-800-8888 周一至周日8:30-20:30 仅收市话费
快速回复 返回顶部 返回列表