ESP8266, WS2812 и Jinx!

Управление дисплеем из адресных светодиодов WS2812

aidar_i
Полковник
Сообщения: 3122
Зарегистрирован: 24.12.2016{, 16:55}
Репутация: 675
Откуда: Уфа
Имя: Айдар
Контактная информация:

ESP8266, WS2812 и Jinx!

#21

Сообщение aidar_i » 31.08.2019{, 20:13}

Отлично!

Mining
Сержант
Сообщения: 148
Зарегистрирован: 31.10.2016{, 15:01}
Репутация: 4
Имя: Алексей

ESP8266, WS2812 и Jinx!

#22

Сообщение Mining » 02.09.2019{, 04:56}

ESP01 связь по ArtNet WIFI.
Ws2812b 1800 pixel (60x30).
Экран 2х1м.

Аватара пользователя
Ivan_Kornege
Лейтенант
Сообщения: 342
Зарегистрирован: 29.04.2017{, 08:24}
Репутация: 27
Откуда: гАндурас
Имя: Ivan

ESP8266, WS2812 и Jinx!

#23

Сообщение Ivan_Kornege » 02.09.2019{, 07:57}

Mining писал(а):
02.09.2019{, 04:56}
ESP01 связь по ArtNet WIFI.
Ws2812b 1800 pixel
афигеть 1800 диодов управляет одной ESP?

Mining
Сержант
Сообщения: 148
Зарегистрирован: 31.10.2016{, 15:01}
Репутация: 4
Имя: Алексей

ESP8266, WS2812 и Jinx!

#24

Сообщение Mining » 02.09.2019{, 11:29}

Автор ответил что одну ESP01 использует.
Hello!
Using one ESP01?
yusuf120581
Yes

aidar_i
Полковник
Сообщения: 3122
Зарегистрирован: 24.12.2016{, 16:55}
Репутация: 675
Откуда: Уфа
Имя: Айдар
Контактная информация:

ESP8266, WS2812 и Jinx!

#25

Сообщение aidar_i » 02.09.2019{, 20:30}

Он скорее использовал 3 вывода есп по 4 юниверса на каждую ногу. 3х4х170=2040 пикселей.
Я не смог вывести на одну ногу 4 юниверса, только по одному. И чтобы подключить 1800 пикселей нужно мне 11 выводов есп по 1 юниверсу на каждом пине!
Не нашел готовое решение.

Mining
Сержант
Сообщения: 148
Зарегистрирован: 31.10.2016{, 15:01}
Репутация: 4
Имя: Алексей

ESP8266, WS2812 и Jinx!

#26

Сообщение Mining » 03.09.2019{, 04:42}

aidar_i, здесь возможно ответ https://github.com/rstephan/ArtnetWifi/ ... -343058001

aidar_i
Полковник
Сообщения: 3122
Зарегистрирован: 24.12.2016{, 16:55}
Репутация: 675
Откуда: Уфа
Имя: Айдар
Контактная информация:

ESP8266, WS2812 и Jinx!

#27

Сообщение aidar_i » 03.09.2019{, 06:33}

Mining, сможете проверить этот код?
4 юниверса на одну ногу D1 Wemos или Nodemcu (с изменённой библиотекой )

Код: Выделить всё

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

#define WSout1 D1  
#define WSout2 D1  
#define WSout3 D1
#define WSout4 D1
#define WSout5 D1

#define WSbit1 (1<<WSout1)
#define WSbit2 (1<<WSout2)
#define WSbit3 (1<<WSout3)
#define WSbit4 (1<<WSout4)
#define WSbit5 (1<<WSout5)

// ARTNET CODES
#define ARTNET_DATA 0x50
#define ARTNET_POLL 0x20
#define ARTNET_POLL_REPLY 0x21
#define ARTNET_PORT 6454
#define ARTNET_HEADER 17

WiFiUDP udp;

//universe 0
uint8_t uniData1[510];
uint8_t universe1 = 0;
uint16_t uniSize1;

//universe 1
uint8_t uniData2[510];
uint8_t universe2 = 1;
uint16_t uniSize2;

//universe 3
uint8_t uniData3[510];
uint8_t universe3 = 2;
uint16_t uniSize3;

//universe 4
uint8_t uniData4[510];
uint8_t universe4 = 3;
uint16_t uniSize4;

//universe 5
uint8_t uniData5[510];
uint8_t universe5 = 4;
uint16_t uniSize5;

uint8_t hData[ARTNET_HEADER + 1];
uint8_t net = 0;
uint8_t subnet = 0;

const char* ssid     = "----";
const char* password = "----";

IPAddress local_ip(172, 20, 10, 10);
IPAddress gateway_ip(172, 20, 10, 1);
IPAddress subnet_ip(255, 255, 255, 240);


void setup() {

  Serial.begin(115200);
  delay(10);
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);
  WiFi.config(local_ip, gateway_ip, subnet_ip);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  udp.begin(ARTNET_PORT); // Open ArtNet port

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());


  pinMode(WSout1, OUTPUT);
  pinMode(WSout2, OUTPUT);
  pinMode(WSout3, OUTPUT);
  pinMode(WSout4, OUTPUT);
  pinMode(WSout5, OUTPUT);
}


void sendWS1() {
  uint32_t writeBits;
  uint8_t  bitMask, time;
  os_intr_lock();
  for (uint16_t t = 0; t < uniSize1; t++) { // outer loop counting bytes
    bitMask = 0x80;
    while (bitMask) {
      // time=0ns : start by setting bit on
      time = 4;
      while (time--) {
        WRITE_PERI_REG( 0x60000304, WSbit1 );  // do ON bits // T=0
      }
      if ( uniData1[t] & bitMask ) {
        writeBits = 0;  // if this is a '1' keep the on time on for longer, so dont write an off bit
      }
      else {
        writeBits = WSbit1;  // else it must be a zero, so write the off bit !
      }
      time = 4;
      while (time--) {
        WRITE_PERI_REG( 0x60000308, writeBits );  // do OFF bits // T='0' time 350ns
      }
      time = 6;
      while (time--) {
        WRITE_PERI_REG( 0x60000308, WSbit1 );  // switch all bits off  T='1' time 700ns
      }
      // end of bite write time=1250ns
      bitMask >>= 1;
    }
  }
  os_intr_unlock();
}


void sendWS2() {
  uint32_t writeBits;
  uint8_t  bitMask, time;
  os_intr_lock();
  for (uint16_t t = 0; t < uniSize2; t++) { // outer loop counting bytes
    bitMask = 0x80;
    while (bitMask) {
      // time=0ns : start by setting bit on
      time = 4;
      while (time--) {
        WRITE_PERI_REG( 0x60000304, WSbit2 );  // do ON bits // T=0
      }
      if ( uniData2[t] & bitMask ) {
        writeBits = 0;  // if this is a '1' keep the on time on for longer, so dont write an off bit
      }
      else {
        writeBits = WSbit2;  // else it must be a zero, so write the off bit !
      }
      time = 4;
      while (time--) {
        WRITE_PERI_REG( 0x60000308, writeBits );  // do OFF bits // T='0' time 350ns
      }
      time = 6;
      while (time--) {
        WRITE_PERI_REG( 0x60000308, WSbit2 );  // switch all bits off  T='1' time 700ns
      }
      // end of bite write time=1250ns
      bitMask >>= 1;
    }
  }
  os_intr_unlock();
}


void sendWS3() {
  uint32_t writeBits;
  uint8_t  bitMask, time;
  os_intr_lock();
  for (uint16_t t = 0; t < uniSize3; t++) { // outer loop counting bytes
    bitMask = 0x80;
    while (bitMask) {
      // time=0ns : start by setting bit on
      time = 4;
      while (time--) {
        WRITE_PERI_REG( 0x60000304, WSbit3 );  // do ON bits // T=0
      }
      if ( uniData3[t] & bitMask ) {
        writeBits = 0;  // if this is a '1' keep the on time on for longer, so dont write an off bit
      }
      else {
        writeBits = WSbit3;  // else it must be a zero, so write the off bit !
      }
      time = 4;
      while (time--) {
        WRITE_PERI_REG( 0x60000308, writeBits );  // do OFF bits // T='0' time 350ns
      }
      time = 6;
      while (time--) {
        WRITE_PERI_REG( 0x60000308, WSbit3 );  // switch all bits off  T='1' time 700ns
      }
      // end of bite write time=1250ns
      bitMask >>= 1;
    }
  }
  os_intr_unlock();
}


void sendWS4() {
  uint32_t writeBits;
  uint8_t  bitMask, time;
  os_intr_lock();
  for (uint16_t t = 0; t < uniSize4; t++) { // outer loop counting bytes
    bitMask = 0x80;
    while (bitMask) {
      // time=0ns : start by setting bit on
      time = 4;
      while (time--) {
        WRITE_PERI_REG( 0x60000304, WSbit4 );  // do ON bits // T=0
      }
      if ( uniData4[t] & bitMask ) {
        writeBits = 0;  // if this is a '1' keep the on time on for longer, so dont write an off bit
      }
      else {
        writeBits = WSbit4;  // else it must be a zero, so write the off bit !
      }
      time = 4;
      while (time--) {
        WRITE_PERI_REG( 0x60000308, writeBits );  // do OFF bits // T='0' time 350ns
      }
      time = 6;
      while (time--) {
        WRITE_PERI_REG( 0x60000308, WSbit4 );  // switch all bits off  T='1' time 700ns
      }
      // end of bite write time=1250ns
      bitMask >>= 1;
    }
  }
  os_intr_unlock();
}

void sendWS5() {
  uint32_t writeBits;
  uint8_t  bitMask, time;
  os_intr_lock();
  for (uint16_t t = 0; t < uniSize5; t++) { // outer loop counting bytes
    bitMask = 0x80;
    while (bitMask) {
      // time=0ns : start by setting bit on
      time = 4;
      while (time--) {
        WRITE_PERI_REG( 0x60000304, WSbit5 );  // do ON bits // T=0
      }
      if ( uniData5[t] & bitMask ) {
        writeBits = 0;  // if this is a '1' keep the on time on for longer, so dont write an off bit
      }
      else {
        writeBits = WSbit5;  // else it must be a zero, so write the off bit !
      }
      time = 4;
      while (time--) {
        WRITE_PERI_REG( 0x60000308, writeBits );  // do OFF bits // T='0' time 350ns
      }
      time = 6;
      while (time--) {
        WRITE_PERI_REG( 0x60000308, WSbit5 );  // switch all bits off  T='1' time 700ns
      }
      // end of bite write time=1250ns
      bitMask >>= 1;
    }
  }
  os_intr_unlock();
}


void loop() {
  if (udp.parsePacket()) {
    udp.read(hData, ARTNET_HEADER + 1);
    if ( hData[0] == 'A' && hData[1] == 'r' && hData[2] == 't' && hData[3] == '-' && hData[4] == 'N' && hData[5] == 'e' && hData[6] == 't') {
      if ( hData[8] == 0x00 && hData[9] == ARTNET_DATA && hData[15] == net ) {

        if ( hData[14] == (subnet << 4) + universe1 ) { // UNIVERSE One
          if (!uniSize1) {
            uniSize1 = (hData[16] << 8) + (hData[17]);
          }
          udp.read(uniData1, uniSize1);
        }

        if ( hData[14] == (subnet << 4) + universe2 ) { // UNIVERSE two
          if (!uniSize2) {
            uniSize2 = (hData[16] << 8) + (hData[17]);
          }
          udp.read(uniData2, uniSize2);
        }

        if ( hData[14] == (subnet << 4) + universe3 ) { // UNIVERSE drei
          if (!uniSize3) {
            uniSize3 = (hData[16] << 8) + (hData[17]);
          }
          udp.read(uniData3, uniSize3);
        }
        if ( hData[14] == (subnet << 4) + universe4 ) { // UNIVERSE vier
          if (!uniSize4) {
            uniSize4 = (hData[16] << 8) + (hData[17]);
          }
          udp.read(uniData4, uniSize4);
     /*   }
          if ( hData[14] == (subnet << 4) + universe5 ) { // UNIVERSE fünf
          if (!uniSize5) {
            uniSize5 = (hData[16] << 8) + (hData[17]);
          }
          udp.read(uniData5, uniSize5); */
          
          sendWS1();
          sendWS2();
          sendWS3();
          sendWS4();
          //sendWS5();
        }

      } // if Artnet Data

}}}

Аватара пользователя
Ivan_Kornege
Лейтенант
Сообщения: 342
Зарегистрирован: 29.04.2017{, 08:24}
Репутация: 27
Откуда: гАндурас
Имя: Ivan

ESP8266, WS2812 и Jinx!

#28

Сообщение Ivan_Kornege » 03.09.2019{, 06:38}

aidar_i писал(а):
02.09.2019{, 20:30}
Я не смог вывести на одну ногу 4 юниверса
может чего то не догоняю, но на сайте ардуино есть тема ArtNet to WS2812 Pixel LED driver : Using Wemos D1 (arduino-esp8266) где чувак пишет:
I have expanded this to output 16 universes across 4 output pins, enough to drive 2720 WS2812 RGB Pixel LEDs
(Я расширил это, чтобы вывести 16 юниверсов через 4 выходных контакта, этого достаточно для управления 2720 пиксельными светодиодами WS2812 RGB.)
Или это не то?

Mining
Сержант
Сообщения: 148
Зарегистрирован: 31.10.2016{, 15:01}
Репутация: 4
Имя: Алексей

ESP8266, WS2812 и Jinx!

#29

Сообщение Mining » 03.09.2019{, 09:33}

aidar_i писал(а):
03.09.2019{, 06:33}
Mining, сможете проверить этот код?
у меня только одна лента 300 диодов.

aidar_i
Полковник
Сообщения: 3122
Зарегистрирован: 24.12.2016{, 16:55}
Репутация: 675
Откуда: Уфа
Имя: Айдар
Контактная информация:

ESP8266, WS2812 и Jinx!

#30

Сообщение aidar_i » 03.09.2019{, 12:07}

Пусть 300, должен вывести полностью экран. 170+130, уже будут задействованы 2 юниверса , если даже так заработает, можно считать рабочим скетчем.
Настройте экран как будто 170х4=680, Длину поставьте как у Вашего экрана, высоту побольше чтобы было 680 светодиодов.

Отправлено спустя 9 минут 41 секунду:
Ivan_Kornege писал(а):
03.09.2019{, 06:38}
но на сайте ардуино есть тема
Скетч оттуда.
Когда я пробовал не заработал, сейчас не помню на каком контроллере я его пробовал. Может NODEMCU был, выводами которого была путаница.
Попробуйте разобраться с кодами приведенными там, у меня туго сейчас временем.

EgorKa
Сержант
Сообщения: 217
Зарегистрирован: 09.03.2019{, 17:49}
Репутация: 21
Имя: Egor

ESP8266, WS2812 и Jinx!

#31

Сообщение EgorKa » 03.09.2019{, 20:13}

aidar_i, сделал рекпликацию Вашей матрицы 30*10 диодов и запустил
aidar_i писал(а):
30.06.2019{, 23:23}
ArtNet_1_univers.flp
половина матрицы 30*5 работает.
aidar_i писал(а):
03.09.2019{, 06:33}
сможете проверить этот код?
сегодня смог бы проверить Ваш код, но не понимаю как настроить Jinx! для матрицы 30*10 .
aidar_i писал(а):
03.09.2019{, 12:17}
Длину поставьте как у Вашего экрана,
где поставить?

aidar_i
Полковник
Сообщения: 3122
Зарегистрирован: 24.12.2016{, 16:55}
Репутация: 675
Откуда: Уфа
Имя: Айдар
Контактная информация:

ESP8266, WS2812 и Jinx!

#32

Сообщение aidar_i » 03.09.2019{, 23:32}

EgorKa писал(а):
03.09.2019{, 20:13}
aidar_i, сделал рекпликацию Вашей матрицы 30*10 диодов и запустил
aidar_i писал(а): ↑01.07.2019{, 01:23}
ArtNet_1_univers.flp
Примеры все я проверял, работают. Этот пример для двух ЕСП. Скриншоты настроек выложены.

Отправлено спустя 1 минуту 50 секунд:
EgorKa писал(а):
03.09.2019{, 20:13}
не понимаю как настроить Jinx! для матрицы 30*10
по горизонтали 30, по вертикали 22 в настройках матрицы в джинкс .

Mining
Сержант
Сообщения: 148
Зарегистрирован: 31.10.2016{, 15:01}
Репутация: 4
Имя: Алексей

ESP8266, WS2812 и Jinx!

#33

Сообщение Mining » 04.09.2019{, 04:39}

aidar_i писал(а):
03.09.2019{, 06:33}
Mining, сможете проверить этот код?
4 юниверса на одну ногу D1 Wemos или Nodemcu (с изменённой библиотекой )
Почему то загорается белым в верхней строке первый справа диод , текст урезанный бежит только по верхним 5-и строкам, диод остается светить постоянно.

EgorKa
Сержант
Сообщения: 217
Зарегистрирован: 09.03.2019{, 17:49}
Репутация: 21
Имя: Egor

ESP8266, WS2812 и Jinx!

#34

Сообщение EgorKa » 04.09.2019{, 19:04}

aidar_i, протестировал выложенный Вами скетч, получил следующие результаты:
universe 0 -не работает. Засвечивает 30-й диод на матрице
universe 1 -не работает. Засвечивает 30-й диод на матрице
universe 2 -не работает. Засвечивает 30-й диод на матрице
universe 3 -работает с дефектом, засвечивает 30-й диод на матрице

Нашел первоисточник от автора скетча, на форуме кто пытался повторить работу скетча, получили такой же результат.

EgorKa
Сержант
Сообщения: 217
Зарегистрирован: 09.03.2019{, 17:49}
Репутация: 21
Имя: Egor

ESP8266, WS2812 и Jinx!

#35

Сообщение EgorKa » 04.09.2019{, 19:09}

Немного погуглил нашелся вот такой проект

Автор активно отвечает. Есть библиотеки и примеры на https://github.com/hpwit/artnet/blob/ma ... Artnet.ino

tobotobo
Рядовой
Сообщения: 12
Зарегистрирован: 26.12.2020{, 04:31}
Репутация: 0
Имя: Владимир

ESP8266, WS2812 и Jinx!

#36

Сообщение tobotobo » 26.12.2020{, 04:46}

Друзья, подскажите пожалуйста в чем может быть проблема, плата NodeMcu V3 V2 Lua, sd модуль видит отлично, файл out читает и выводит на матрицу.
Проблема в следующем.на матрице 8х8 зеркалит изображение по вертикали. а матрица 9 на 17, 9 - х , 17 -y .(153 шт.светодиода) получается каша. То есть впечатление будто светодиоды сдвинуты со своих мест на несколько позиций.
Да, забыл упомянуть , что матрица это вертикальная змейка с началом в правом нижнем углу. Судя по всему это и причина(?) Но можно же (https://github.com/macetech/FastLED-XY-Map-Generator) прописать свои параметры матрицы?
Подскажите пожалуйста где и как это сделать?
и еще, количество диодов 153, а какое число необходимо ставить в скетче? ведь в библиотеках в начале матриц диодам присваивают номер ,,0,, значит последний, в моём случае, должен быть 152. А я везде в скетче ставил 153.
Это может быть причиной неправильного отображения эффектов?
Прошу не ругать меня. Я пытаюсь разобраться.

aidar_i
Полковник
Сообщения: 3122
Зарегистрирован: 24.12.2016{, 16:55}
Репутация: 675
Откуда: Уфа
Имя: Айдар
Контактная информация:

ESP8266, WS2812 и Jinx!

#37

Сообщение aidar_i » 26.12.2020{, 08:24}

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

tobotobo
Рядовой
Сообщения: 12
Зарегистрирован: 26.12.2020{, 04:31}
Репутация: 0
Имя: Владимир

ESP8266, WS2812 и Jinx!

#38

Сообщение tobotobo » 26.12.2020{, 13:22}

В джинкс я ставлю те настройки, с которыми эта матрица корректно работает в режиме онлайн.
Или для записи out. файла надо их как то изменять?
Дело в том ещё, что я обратил внимания на один момент. Похоже для записи файла out. вообще не важно какие настройки стоят в джинксе. Пробовал перебирать разные и записывать на карту- результат с разными настройками один((((

aidar_i
Полковник
Сообщения: 3122
Зарегистрирован: 24.12.2016{, 16:55}
Репутация: 675
Откуда: Уфа
Имя: Айдар
Контактная информация:

ESP8266, WS2812 и Jinx!

#39

Сообщение aidar_i » 26.12.2020{, 14:49}

Просто выложите скриншоты своих настроек

tobotobo
Рядовой
Сообщения: 12
Зарегистрирован: 26.12.2020{, 04:31}
Репутация: 0
Имя: Владимир

ESP8266, WS2812 и Jinx!

#40

Сообщение tobotobo » 26.12.2020{, 15:11}

ИзображениеВот такие настройки, но повторю - их меняю а на матрице ничего не меняется

Отправлено спустя 1 час 20 минут 3 секунды:
на всякий случай уточню - 8х8 геометрия корректна, но зеркально по вертикали.
тот же скетч, но с размерами 9х17 абсолютный хаос. проверял на вертикальной линии, которая двигается справа налево, вместо линии рандомные пиксели по всей матрице.
Вложения
IMG_20201226_190222.jpg
IMG_20201226_190214.jpg
IMG_20201226_190157.jpg
IMG_20201226_190151.jpg
IMG_20201226_190124.jpg

Ответить

Вернуться в «ESP8266»