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

igrushkin

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

Сергей_Ф

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

igrushkin

New 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

New 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), но я их не пробовал.
 
Сверху Снизу