• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Обсуждение ESP8266 и ws2812 в Arduino IDE - это очень просто!

igrushkin

Member
ОК, "практика - критерий истины", как говорили классики марксизма-ленинизма. А то везде написано, что не любят WS2812b 3-вольтовую логику
 

Сергей_Ф

Moderator
Команда форума
а от 3в логики нормально лента работает?
Проблемы могут возникнуть, если питание ленты будет больше 5,5 вольт, а у ЕСП будет 3,1 вольт или меньше. В таком случае у меня начинало глючить. Снижение питания ленты до 4,9 вольт полностью ситуацию выправляло даже при 3,1 на ЕСП.
 

igrushkin

Member
Проблемы могут возникнуть, если питание ленты будет больше 5,5 вольт, а у ЕСП будет 3,1 вольт или меньше. В таком случае у меня начинало глючить. Снижение питания ленты до 4,9 вольт полностью ситуацию выправляло даже при 3,1 на ЕСП.
Очень полезно. Спасибо.
 

Faint

New member
Здравствуйте, я только начинаю работать с есп и 2812. Подскажите, пожалуйста, я запутался.
Взял компьютерный блок питания, сделал как в статье. 5в - 5в, гнд - гнд, информация к D2. Включил, заработала половина. Через несколько попытка заработала целиком. Думаю - здорово, сейчас размотаю свои 5 метров и наслажусь эффектами. А после того как размотал начали моргать первые 10-15 светодиодов. Менял настройки, кол-во светодиодов, яркость - никакого эффекта. Подумал дело в плате, заказал еще. Вот недавно пришла, заливаю скетч, подключаю, запускаю - на мгновенье загораются все светодиоды и все, никакой реакции. Что я сделал не так?
Напряжение мультиметром проверил - всегда 5-5,4В.
Спасибо!
 
Последнее редактирование:

FatMan

New member
Столкнулся с проблемой при попытке подружить NodeMCU и ленту на ws2812.
От внешнего блока питания +5 В - к Vin и Gnd на плате.
Подключаю ленту из 60 пикселей: питающие контакты - к тем же Vin и Gnd, управляющий - к D5 (GPIO14).
Программирую в Arduino IDE. Беру пример standtest из Adafruit_NeoPixel, правлю значение PIN (на 14), запускаю - лента не светится.
Менял подключение на D2 (GPIO4), напряжение питания выставлял от 4.7 до 5.1 В - не помогает.
Управляющий контакт включал через резистор 220 Ом - не помогло.
Тот же пример с соответствующей правкой значения PIN запускаю на 5-вольтовых Arduino UNO, на Digispark - лента светится.
Плату NodeMCU заменял на другую - не помогло. (Плата рабочая: нет проблем с lcd1602, подключенным по i2c, с 7-разрядными led-индикаторами.)
Посоветуйте, pls, как починить ситуацию.

PS.@Faint, поздно, конечно, но у меня похожие эффекты были на длинных лентах, когда мощности питания не хватало. Снижение яркости или уменьшение числа горящих пикселей помогало.
 

igrushkin

Member
@FatMan

Попробуйте подать 5В через диод. Это даст падение напряжения ~0,7В и разница между 3,3В и 4,3В будет достаточной.
Ws2812b на датапине нужно >0,7VCC. Если у вас 5,1В VCC, то 3,3В от ESP8266 не хватает
 

FatMan

New member
Попробуйте подать 5В через диод.
Попробовал - не помогло.

Подключил к D5 каскад из двух BC547, как на таком рисунке. Через 470 Ом подключил светодиоды к D2, D5 и к катоду второго транзистора. Программа из 6 строк:
Код:
digitalWrite(5,HIGH);
digitalWrite(14,HIGH);
delay(2000);
digitalWrite(5,LOW);
digitalWrite(14,LOW);
delay(2000);
Всё работает ожидаемо: все светодиоды синхронно зажигаются и гаснут.

Подключаю выход из каскада к управляющему ленты, запускаю sdandtest - и тишина. Светодиоды тестовые отключал - не помогло.
Напряжение на выходе из каскада ниже 4.2 В не опускалось при выводе HIGH, БП настроен на 5,05 В.
Осциллографа нет, посмотреть, что не так с 800-килогерцовым сигналом, нечем.
С динамической индикацией 6-разрядных часов через 595-е регистры esp8266 справлялась без проблем и без плясок с согласованием уровней. Но там частота, понятно, поскромнее...
В общем, делаю пока макет на Ардуине - с 5-вольтовой платой лента работает без проблем. Но в финале хотелось бы устройство без лишних кнопок получить - Wi-Fi и web-сервер тут помогли бы...
 
Последнее редактирование:

FatMan

New member
Поборол связку NodeMCU+WS2812.
Если опустить промежуточные шаги адаптации к ситуации, то вылечилось обновлением библиотеки Adafruit_NeoPixel.
К слову, вполне устойчиво работает при питании системы от 5 В: на ленту - напрямую, на ESP8266 - через штатный AMS1117-3.3 на плате NodeMCU. D5 (GPIO14) напрямую к ленте подключен.
Спасибо всем за помощь.

PS. Подключил ленту через резистор 330 Ом - работает.
 
Последнее редактирование:
Поборол связку NodeMCU+WS2812.
Если опустить промежуточные шаги адаптации к ситуации, то вылечилось обновлением библиотеки Adafruit_NeoPixel.
К слову, вполне устойчиво работает при питании системы от 5 В: на ленту - напрямую, на ESP8266 - через штатный AMS1117-3.3 на плате NodeMCU. D5 (GPIO14) напрямую к ленте подключен.
Спасибо всем за помощь.

PS. Подключил ленту через резистор 330 Ом - работает.
Привет! Вопрос - а какая версия была? Столкнулся с такой-же какашкой, на ардуине пашет - на еsp12 (wemos d1) никак. На пине осциллом вижу пачки испульсов, а ленте пофиг.
 

Сергей_Ф

Moderator
Команда форума
@Павел Зорин
Для начала попробуйте снизить напряжение питание ленты до 4.9В. Например, через кремниевый диод питание подать. Земли, надеюсь, соединить не забыли у esp8266 и ленты?
И если Ардуино ИДЕ у вас последней версии, то библиотеки тоже надо обновить до свежей. Сначала удалить старые полностью, затем ставить новые. Это касается как Neopixel, так и FastLed. Если просто апгрейдить через диспетчер библиотек - то не обновляется полностью и не работает.
 
Последнее редактирование:

FatMan

New member
а какая версия была?
Номер не скажу, но устанавливалась в конце 2016 года. И у меня не наблюдалось импульсов со старой библиотекой ("светодиодным" тестом).
При наличии импульсов я начал бы с проверки питания и согласования уровней (собственно, я и без импульсов этим путём пошёл). Сколько пикселей в ленте (каждый до 60-80 мА может отжирать), каким источником запитана, есть ли пульсации напряжения? У Adafruit ещё была рекомендация зашунтировать питание ленты электролитом на 1000 мкФ. Ну и то, что Сергей_Ф посоветовал: чуть снизить напряжение питания ленты, убедиться, что "земли" ленты и контроллера соединены.
(Новая библиотека несёт другую неприятность: не совместима с IR-приёмником. Правда, минимальными правками кода это обходится.)
 

vworld

New member
Друзья сделал проект на нано и светодиодах SK6812 (64 шт. матрица 8*8 светодиодов) - набаловался на примерах из библиотеки Adafruit_NeoPixel.
Приобрел NodeMCU - побаловался с блинком и пришла в голову идея по проекту из этого топика.
NodeMCU+SK6812 (64 шт.) - пользователь открывает страницу web в которой приглашение для ввода текста - например "Hello word!", нажимает кнопку "отправить" и этот текст бегущей строкой идет на матрицу SK6812.
Прошу подсказать в какую сторону смотреть для реализации.
Понятно, что на NodeMCU надо поднять точку доступа, веб сервер и создать html страницу, а дальше уже знаний не хватает
 
Последнее редактирование:

VLT

New member
Занимаюсь тем же самым - есть лента на 32 "пикселя" Рисую через NeoPixelBus
Код:
/*
* ESP8266 SPIFFS HTML Web Page with JPEG, PNG Image
* https://circuits4you.com
*/

#include <NeoPixelBus.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <FS.h>   //Include File System Headers

const uint16_t PixelCount = 32; // make sure to set this to the number of pixels in your strip
const uint16_t PixelPin = 2; // make sure to set this to the correct pin, ignored for Esp8266

const char* htmlfile = "/index.html";

//WiFi Connection configuration
const char *ssid = "RGBW_Ring";
const char *password = "password";

NeoPixelBus<NeoGrbwFeature, NeoEsp8266Uart1800KbpsMethod> strip(PixelCount, PixelPin);

ESP8266WebServer server(80);

RgbwColor color = RgbwColor(10,10,10,10);

void handlePWM(){
  String R = server.arg("R");
  String G = server.arg("G");
  String B = server.arg("B");
  String W = server.arg("W");
//  int p = 1024 - (PWM.toInt())*10;
  Serial.println(R);
  Serial.println(G);
  Serial.println(B);
  Serial.println(W);
  //--my--//analogWrite(LED,p);
  color = RgbwColor(R.toInt(), G.toInt(), B.toInt(), W.toInt());


  server.send(200, "text/plane","");
}

void handleRoot(){
  server.sendHeader("Location", "/index.html",true);   //Redirect to our html web page
  server.send(302, "text/plane","");
}

void handleWebRequests(){
  if(loadFromSpiffs(server.uri())) return;
  String message = "File Not Detected\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET)?"GET":"POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i=0; i<server.args(); i++){
    message += " NAME:"+server.argName(i) + "\n VALUE:" + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
  Serial.println(message);
}

void setup() {
  delay(1000);
  Serial.begin(115200);
  Serial.println();

  strip.Begin();
  strip.Show();

  //Initialize File System
  SPIFFS.begin();
  Serial.println("File System Initialized");

 
  //Connect to wifi Network
  //WiFi.begin(ssid, password);     //Connect to your WiFi router
  WiFi.softAP(ssid, password);
 
  WiFi.begin("AndroidAP79A7", "jrcc4744");     //Connect to your WiFi router
  Serial.println("");
 
  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  //If connection successful show IP address in serial monitor
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());  //IP address assigned to your ESP


  //Initialize Webserver
  server.on("/",handleRoot);
  server.on("/setLED",handlePWM); //Reads ADC function is called from out index.html
  server.onNotFound(handleWebRequests); //Set setver all paths are not found so we can handle as per URI
  server.begin();
}

void loop() {
server.handleClient();
strip.ClearTo(color);
strip.Show();
}

bool loadFromSpiffs(String path){
  String dataType = "text/plain";
  if(path.endsWith("/")) path += "index.htm";

  if(path.endsWith(".src")) path = path.substring(0, path.lastIndexOf("."));
  else if(path.endsWith(".html")) dataType = "text/html";
  else if(path.endsWith(".htm")) dataType = "text/html";
  else if(path.endsWith(".css")) dataType = "text/css";
  else if(path.endsWith(".js")) dataType = "application/javascript";
  File dataFile = SPIFFS.open(path.c_str(), "r");
  if (server.hasArg("download")) dataType = "application/octet-stream";
  if (server.streamFile(dataFile, dataType) != dataFile.size()) {
  }

  dataFile.close();
  return true;
}
Данная библиотека работает на отлично. Питание ленты и ESP раздельное. Есть интересные моменты описанные тут Makuna/NeoPixelBus
 

FatMan

New member
Поборол связку NodeMCU+WS2812.
Не настолько поборол, однако, насколько хотелось.
Зажечь ленту из WS2812B мне удалось на разных Arduino (на Атмегах 168 и 328, 3,3 и 5 В, на Attiny85 в Digispark), а после обновления в конце 2017 года библиотеки Adafruit_NeoPixel и NodeMCU замигала светодиодами на ленте, как я и писал. Заменил Adafruit_NeoPixel на FastLED - никаких проблем.
А далее начинаю реализовывать естественное желание: задействовать web-возможности ESP8266 для реализации пользовательского интерфейса. И снова проблемы: то Wi-Fi у модуля отваливается, то WDT срабатывает, да ещё не всегда модуль заново запустится после этого. Чаще всего сетевизмы отваливались, а огоньки продолжали мигать по установленной программе. Причём, от сети модуль отваливался напрочь, роутер в клиентах его не показывал, но в Serial модуль радостно сообщал при этом, что Wi-Fi.status стабильно равен WL_CONNECTED.
Использовал все версии пакета настроек ESP8266 от 2.3.0 до 2.4.1 - самые стабильные результаты были с 2.4.0-rc1 (Arduino IDE 1.8.5).
Я использовал AJAX, мониторил Heap не только выводом в Serial, но и в web-форму - обычно, держалось в районе 30-32 кБ, но если уменьшалось до 18 кБ - жди срабатывания WDT.
Потом мир, труд, май, июнь, июль - в общем, до новогодних каникул проект был отложен. А потом обновление IDE до 1.8.8 - и снова перебор разных версий пакета настроек, разных параметров в них. Удалось застабилизироваться на версии пакета 2.4.2 - беты 2.5.0 не справились. До 3 суток устойчиво работало, web-интерфейс откликался - думал, победа. Но как-то в ночь раз - и зависло. Впрочем, зависает крайне редко, чаще перегружается по WDT. А если отвалилась сеть, то может неделями работать с лентой без иных сбоев.
Я понимаю, что подробнее описал проблему с сетью, а не с лентой. Но я проверил: заменил в программе вывод в ленту на вывод по i2c на OLED-дисплей 0,96", оставив все сетевизмы прежними от кода процедур до содержимого html-файлов. И запустил параллельно на двух модулях обе версии программы. Так тот модуль, что с лентой, уже несколько раз перегрузился, а с дисплеем - работает без перезагрузок почти неделю. Так что, проблема с совместимостью сетевых функций и работы с лентой из ws2812b. Может, сеть в ESP8266 и с i2c тоже конфликтует - мне встречались в Интернете и такие мнения, но это, по крайней мере, сильно реже проявляется.
Может быть, у кого-то есть опыт приручения сетевых и web-функций ESP8266 с LED-лентой? Принимаются советы, на что обратить внимание, что попробовать.
...Свежевышедший релиз пакета настроек на ESP8266 версии 2.5.0 я не пробовал пока.
...Впору делать проект на Атмеге с прикрученным ESP-01...
 

FatMan

New member
Не совсем так: нестабильный wi-fi при всех обычных вариантах подключения ws2812, если светодиодов больше 2-3. Об этом много где написано и повторено в описании NeoPixelBus. Но основное преимущество этой библиотеки не в поддержке обычных вариантов подключения, а в умении использовать RX и TX для вывода в ленту. Правда, при этом частично теряется функционал uart-интерфейса - он становится однонаправленным.

Я попробовал задействовать режим DMA, подключив ленту к пину RX (он же RDX0 или GPIO3). Вывод в ленту и весь заложенный сетевой функционал работает: в том числе, установка времени по NTP, web-сервер с режимом AJAX. К сожалению, при перезагрузке компьютера ребутится и NodeMCU, подключенная к USB-хабу, потому зафиксированный аптайм не превысил 4 суток. Но иных проблем не возникло: web-сервер уверенно отвечает, лента мигает, как положено. Да, в этом режиме (вывод RX задействован), нет возможности передать что-то в контроллер по UART. Но отладочный вывод в Serial работает.

Напомню, что между ESP8266 (у меня на плате NodeMCU) и управляющим выводом ленты из WS2812 у меня стоит резистор на 300 Ом. Питается всё от 5-вольтового БП. Как правило, ещё есть подключение к USB-хабу (у него внешнее питание, потому 0,5 А по питанию можно ожидать).

@VLT, спасибо за подсказку.

Метод использования DMA для вывода в ленту из WS2812, реализованный в библиотеке NeoPixelBus (см. Neo800KbpsMethod), можно признать удачным программным решением состыковки ESP8266 и WS2812. В библиотеке есть ещё методы, использующие UART1 (GPIO2) и UART0 (GPIO1), но я их не пробовал.
 
Сверху Снизу