Помогите организовать контроллер ARGB-контроллер для системы из нескольких вентиляторов

Bliznevd
Offline
Зарегистрирован: 03.09.2021

Доброго времени суток!

Есть 6 вентиляторов с ARGB-подсветкой фирмы Cooler Master (3 по 120мм и 3 по 140мм). Подключил их через хаб CoolerMaster Masterfan ARGB and PWM hub. Хаб питается от БП компьютера через Sata-коннектор. Выход с хаба можно подключить к материнской плате к разъему ARGB 3пин (5v), но софт материнской платы весьма скуден - очень мало режимов. Видел на ютубе видео "Гирлянда за 5 минут, без программирования и SMS (ESP8266 + WS2812b)", по аналогии, думаю, можно сделать так же для моих вентиляторов. Вот только проблема, в видео ардуинка питается через БП. Хочу понять, как организовать питание ардуинки с разъема USB на материнской плате (9 пин). Как я понял сильной нагрузки на плату не будет, т.к. сам хаб питается от БП системного блока. Может есть какое-то готовое решение или ткните ссылкой куда посмотреть, я первый раз сталкиваюсь с ардуино. И как залитая прошивка на ардуинку из видео выше будет дружить с ARGB вентиляторами...

Помогите новичку, пожалуйста.

sadman41
Offline
Зарегистрирован: 19.10.2016

Если паяльником не владеете, то питание можно наколхозить из выкидного USB коннектора (на заднюю планку такие выводятся) и короткого usb-кабеля.
А вот как на диоды выводить без инструмента - большой вопрос.

DIVGENY
Offline
Зарегистрирован: 23.08.2016

тебе лучше не подключать такие устройства к материнке. подключай к молексу или сата-конектору. в магазине покупаешь короткий переходник, обрезаешь провода и делаешь свой переходник для питания. а вообще я противник RGB светомузык. компьютер это инструмент а не дискотека..

rkit
Offline
Зарегистрирован: 23.11.2016

Никак не будет дружить. И не лезь, если ты ноль. Только материнку спалишь.

Bliznevd
Offline
Зарегистрирован: 03.09.2021

Допустим запитаю от молекс/сата БП в системном блоке. Есть шанс через ардуино управлять вариантами подсветки, как в видео выше?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ну, если управляющую программу напишешь, то сможешь управлять чем угодно, хоть шлюзом Брацкой ГЭС. А если в программировании ноль, то не судьба в этот рас.

Bliznevd
Offline
Зарегистрирован: 03.09.2021

В первом посте писал название видео, я про ту прошивку имел ввиду. 
Ладно, я вас понял, никто не сталкивался с такой же задачей как у меня :)

rkit
Offline
Зарегистрирован: 23.11.2016

Для слепых повторю:

rkit пишет:

Никак не будет дружить. И не лезь, если ты ноль. Только материнку спалишь.

Bliznevd
Offline
Зарегистрирован: 03.09.2021

Как я её спалю, если они физически в неё не вставлены? Кто из нас слепой?

rkit
Offline
Зарегистрирован: 23.11.2016

Для слепых и тупых: замечание про материнку относится к подключению дуни к хедеру на материнке. Первая фраза относится к вопросу. Прочитай еще раз и подумай.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Bliznevd пишет:

 как в видео выше?

Каком видео? Вы что-то талдычите про какое-то видео, какую-то прошивку, но ни одной ссылки нет. Нам надо брать хрустальный шар и гадать что там за видео и что там за прошивка?

Bliznevd
Offline
Зарегистрирован: 03.09.2021

Я не стал размещать ссылку, думал у вас тут запрещено)

https://youtu.be/db1mpguOwfI

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Не запрещено, просто мы по ссылкам не ходим.

lilik
Offline
Зарегистрирован: 19.10.2017

ТС из вашего первого поста следует, что светодиоды вентиляторов уже к ардуино подключены, скетч написан и вопрос - как питать Арду от ПК?

Bliznevd
Offline
Зарегистрирован: 03.09.2021

С питанием разобрались, можно от молекс-сата БП компьютера запитать. Вопрос к каким пинам ардуинки цеплять 3 пин, которые идут от хаба с вентиляторами (3пин argb)…

lilik
Offline
Зарегистрирован: 19.10.2017

Bliznevd пишет:

С питанием разобрались, можно от молекс-сата БП компьютера запитать. Вопрос к каким пинам ардуинки цеплять 3 пин, которые идут от хаба с вентиляторами (3пин argb)…

Ну если с остальным разобрались цепляйте на любой. В чём загвоздка?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Bliznevd пишет:

Вопрос к каким пинам ардуинки цеплять 3 пин, которые идут от хаба с вентиляторами (3пин argb)…

Если у Вас такие вопросы, то я присоединяюсь к мнению rkit. Бросайте это дело и отойдите подальше от аппаратуры.

lilik
Offline
Зарегистрирован: 19.10.2017

Bliznevd пишет:

 Есть шанс через ардуино управлять вариантами подсветки, как в видео выше?

Поищи схемы и описание под своё изделие. В данном варианте пишут, что стоят адресные (как в видео) светодиоды на вентиляторе. Поиграйся с одним, а впрочем если нет понимания лучше не рисковать, хотя там всего 5 Вольт. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016
#define LED_DT 2 // пин, куда подключен DIN ленты (номера пинов ESP8266 совпадает с Arduino)
Bliznevd
Offline
Зарегистрирован: 03.09.2021

Ещё такой вопрос, при проверке скетча в программе вылезает ошибка Call of overloaded ‘abs(unit32_t)’ is ambiguous.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Bliznevd пишет:

Ещё такой вопрос, при проверке скетча в программе вылезает ошибка Call of overloaded ‘abs(unit32_t)’ is ambiguous.

 

1. А где, собственно, сам вопрос?

2. Как скетч, так и сообщение об ошибке нужно выкладывать текстом, а не картинкой.

Bliznevd
Offline
Зарегистрирован: 03.09.2021

1. Что я делаю не так, по инструкции в видео делаю тоже самое.

2.

/*
  Скетч разработан 30.11.2018 Wirekraken
*/
#include <ESP8266WebServer.h>
#include <WebSocketsServer.h>
#include <FS.h>
#include <FastLED.h>

const char* ssid = "OmegaMash"; // имя вашей сети
const char* password = "Magadan777"; // пароль вашей сети

IPAddress Ip(192,168,1,10); // IP-адрес для ESP
IPAddress Gateway(192,168,1,1); // IP-адрес шлюза (роутера)
IPAddress Subnet(255,255,255,0); // маска подсети, диапазон IP-адресов в локальной сети
 
#define LED_COUNT 60 // число пикселей в ленте
#define LED_DT 2    // пин, куда подключен DIN ленты (номера пинов ESP8266 совпадает с Arduino)  

uint8_t bright = 25; // яркость (0 - 255)
uint8_t ledMode = 0; // эффект (0 - 29)

uint8_t flag = 1; // флаг отмены эффекта

CRGBArray<LED_COUNT> leds;

uint8_t delayValue = 20; // задержка
uint8_t stepValue = 10; // шаг по пикселям
uint8_t hueValue = 0; // тон цвета

// инициализация websocket на 81 порту
WebSocketsServer webSocket(81);
ESP8266WebServer server(80);

void setup(){
  Serial.begin(9600); 
  LEDS.setBrightness(bright);

  LEDS.addLeds<WS2811, LED_DT, GRB>(leds, LED_COUNT);  // настройки для вашей ленты (ленты на WS2811, WS2812, WS2812B)
  updateColor(0,0,0);
  LEDS.show(); 

  WiFi.config(Ip, Gateway, Subnet);
  WiFi.begin(ssid, password);
  Serial.println("");

  while (WiFi.status() != WL_CONNECTED){ 
    delay(500);
    Serial.print(".");
  }
  
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  server.onNotFound([](){
    if(!handleFileRead(server.uri()))
      server.send(404, "text/plain", "FileNotFound");
  });
  
  server.begin();

  SPIFFS.begin();
  
  webSocket.begin();
  webSocket.onEvent(webSocketEvent);
}

void loop(){
  //обработка входящих запросов HTTP или WebSockets
  webSocket.loop();
  server.handleClient();

  ledEffect(ledMode);

}

//функция обработки входящих сообщений
void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length){
  
   if(type == WStype_CONNECTED){
      IPAddress ip = webSocket.remoteIP(num);

      String message = String("Connected");
      webSocket.broadcastTXT(message);   // отправляем последнее значение всем клиентам при подключении    
    }
    
    if(type == WStype_TEXT){
        String data;
        for(int x = 0; x < length; x++){
          if(!isdigit(payload[x])) continue;
          data += (char) payload[x];
          
        }
        
        if(payload[0] == 'B'){
          flag = 0;
          Serial.print("Bright: ");
          bright = data.toInt();
          Serial.println(data);
          LEDS.setBrightness(bright);

        }  
        else if(payload[0] == 'F'){
          flag = 0;
          Serial.print("Function: ");
          ledMode = data.toInt();
          Serial.println(data);
          ledEffect(ledMode);

        }
        else if(payload[0] == '#'){
  
          if(!flag){
              Serial.print("flag : ");
              Serial.println(flag);
              ledMode = flag;
              ledEffect(ledMode);
              flag = 1;

          }
          else{
           //преобразуем в 24 битное цветовое число
           uint32_t rgb = (uint32_t) strtol((const char *) &payload[1], NULL, 16);
          
           //преобразуем 24 бит по 8 бит на канал 
           uint8_t r = abs(0 + (rgb >> 16) & 0xFF);
           uint8_t g = abs(0 + (rgb >>  8) & 0xFF);
           uint8_t b = abs(0 + (rgb >>  0) & 0xFF);
           
           Serial.print("ColorPicker: ");
           Serial.print(r);
           Serial.print(g);
           Serial.println(b);
           
           for(int x = 0; x < LED_COUNT; x++){
             leds[x].setRGB(r,g,b);
           }
           LEDS.show();
            
          }
       }
   } 
}

// функция эффектов
void ledEffect(int ledMode){ 
    switch(ledMode){
      case 0: updateColor(0,0,0); break;
      case 1: rainbow_fade(); delayValue = 20; break;       
      case 2: rainbow_loop(); delayValue = 20; break;
      case 3: new_rainbow_loop(); delayValue = 5; break;
      case 4: random_march(); delayValue = 40; break;  
      case 5: rgb_propeller(); delayValue = 25; break;
      case 6: rotatingRedBlue(); delayValue = 40; hueValue = 0; break;
      case 7: Fire(55, 120, delayValue); delayValue = 15; break; 
      case 8: blueFire(55, 250, delayValue); delayValue = 15; break;  
      case 9: random_burst(); delayValue = 20; break;
      case 10: flicker(); delayValue = 20; break;
      case 11: random_color_pop(); delayValue = 35; break;                                      
      case 12: Sparkle(255, 255, 255, delayValue); delayValue = 0; break;                   
      case 13: color_bounce(); delayValue = 20; hueValue = 0; break;
      case 14: color_bounceFADE(); delayValue = 40; hueValue = 0; break;
      case 15: red_blue_bounce(); delayValue = 40; hueValue = 0; break;
      case 16: rainbow_vertical(); delayValue = 50; stepValue = 15; break;
      case 17: matrix(); delayValue = 50; hueValue = 95; break; 
  
      // тяжелые эффекты
      case 18: rwb_march(); delayValue = 80; break;                         
      case 19: flame(); break;
      case 20: theaterChase(255, 0, 0, delayValue); delayValue = 50; break;
      case 21: Strobe(255, 255, 255, 10, delayValue, 1000); delayValue = 100; break;
      case 22: policeBlinker(); delayValue = 25; break;
      case 23: kitt(); delayValue = 100; break;
      case 24: rule30(); delayValue = 100; break;
      case 25: fade_vertical(); delayValue = 60; hueValue = 180; break;
      case 26: fadeToCenter(); break;
      case 27: runnerChameleon(); break;
      case 28: blende(); break;
      case 29: blende_2();

    }
}
  
// функция получения типа файла
String getContentType(String filename){
    if(server.hasArg("download")) return "application/octet-stream";
    else if(filename.endsWith(".htm")) return "text/html";
    else if(filename.endsWith(".html")) return "text/html";
    else if(filename.endsWith(".css")) return "text/css";
    else if(filename.endsWith(".js")) return "application/javascript";
    else if(filename.endsWith(".png")) return "image/png";
    else if(filename.endsWith(".gif")) return "image/gif";
    else if(filename.endsWith(".jpg")) return "image/jpeg";
    else if(filename.endsWith(".ico")) return "image/x-icon";
    else if(filename.endsWith(".xml")) return "text/xml";
    else if(filename.endsWith(".pdf")) return "application/x-pdf";
    else if(filename.endsWith(".zip")) return "application/x-zip";
    else if(filename.endsWith(".gz")) return "application/x-gzip";
    return "text/plain";

}

// функция поиска файла в файловой системе
bool handleFileRead(String path){
  #ifdef DEBUG
    Serial.println("handleFileRead: " + path);
  #endif
  if(path.endsWith("/")) path += "index.html";
  if(SPIFFS.exists(path)){
    File file = SPIFFS.open(path, "r");
    size_t sent = server.streamFile(file, getContentType(path));
    file.close();
    return true;
  }
  return false;
  
}

 

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Скетч писал какой-то школьник безграмотный. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Или кот. Зачем ему там abs() - загадка.

Bliznevd
Offline
Зарегистрирован: 03.09.2021

А могла эта ошибка возникнуть из-за версии программы? Сейчас у меня стоит последняя версия, а сам скетч 2018 года.

sadman41
Offline
Зарегистрирован: 19.10.2016

А если и да - как это облегчает жизнь с таким исходником?

Bliznevd
Offline
Зарегистрирован: 03.09.2021

Попробовать найти старую версию, зашить через неё, пользоваться. Если нет - попытаться связаться тогда с автором.

b707
Offline
Зарегистрирован: 26.05.2017

Bliznevd пишет:

Попробовать найти старую версию, зашить через неё, пользоваться. Если нет - попытаться связаться тогда с автором.

может проще этот поправить? - абс тут зачем?

Bliznevd
Offline
Зарегистрирован: 03.09.2021

Если бы я понимал в этом коде хоть что-то. Да, мы в технаре проходили Visual Basic, но учили нас банальщине а ля вызов диалоговых окон с кнопками "OK" и "Cancel". А язык в ардуинке мне мало знаком.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Bliznevd пишет:

попытаться связаться тогда с автором.

С этого надо было начинать.