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

Нужна помощь Arduino + ESP8266 + LED лента

Vitaly

Member
Можно поподробнее с примером. Я только учусь до конца не понял как.
что именно подробнее?

для прошивки есп через ардуиноиде инстукции тут http://esp8266.ru/arduino-ide-esp8266/
я только предполагаю что имея, условно, два ардуино скетча

один из которых в есп будет заниматься связью и принимая команды откуда бы ни было (не знаю уж как это предполагается) их обрабатывает и отправляет через сериал порт на ардуину, в любом удобном разработчику виде. хоть ВКЛЮЧИ,Р123,Г11,Б423, почти шутка
второй скетч в ардуине будет заниматься лентами, шимом и прочее что там надо, и в качестве управления останется только распарсить принятую команду в нами придуманном формате и выполнить

также можно от ардуины в есп сливать какую-нибудь информацию, которая ту распарсит и отдаст веб сервером или на смартфон какой, уже неважно

просто схема получается гибче и стабильнее, чем любые издевательства над ат прошивками
а формат обмена придется придумывать своими силами, хоть json, хоть полностью своё
 

mak17

New member
Я делаю пока на том что есть, Vitaly спасибо, появилась еще идея.
Когда закончу, выложу все подробно сюда, и тогда буду ждать критики и делать следующую версию.
 

mak17

New member
Потихоньку пробираюсь дальше. Появилась новая проблема, почему то криво принимаются данные на стороне ардуино. Советы по оптимизации кода очень бы пригодились.
Код:
#include <SoftwareSerial.h>
#include <FastLED.h>//библиотека диодной ленты
#define NUM_LEDS 20
#define DATA_PIN 3
#define CLOCK_PIN 13

CRGB leds[NUM_LEDS];
SoftwareSerial espSerial(10, 11);
const int COM_BAUD = 9600;
int red = 0, green = 0, blue = 0, i = 0,bukva=0;


void setup() {
  espSerial.begin(COM_BAUD);
  Serial.begin(COM_BAUD);
  FastLED.addLeds<WS2811, DATA_PIN, RGB>(leds, NUM_LEDS);
  Serial.println("Setup done");
  delay(1000);
  if ( espSerial.available())//запуск сервера, пока не работает
  {
    espSerial.write("AT+CIPMUX=1");
    delay(1000);
    espSerial.write("AT+CIPSERVER=1,8888");
  }
}
//+IPD, 0, 3: r200g012b000 - формат приходящих данных
void loop() {
  String data="x234567890123456789012000000";//абракадабра для заполнения String
bukva=0;
  if (espSerial.available()) {
    while ( espSerial.available() && i < 30)//считывание
    {
      data[i++] = espSerial.read();
    }
    data[i++] = '\0';//закрытие массива

    if (data[0] != 'x')
      Serial.print(data);//печатает только один раз

    while (data[bukva] != '\0')//обработка полученых данных
    {

      if (data[bukva] = 'r')
      {
        red = (data[bukva+1] - '0') * 100 + (data[bukva+2] - '0') * 10 + (data[bukva+3] - '0');
        bukva=bukva+3;
      }
      else if (data[bukva] = 'g')
      {
        green = (data[bukva+1] - '0') * 100 + (data[bukva+2] - '0') * 10 + (data[bukva+3] - '0');
        bukva=bukva+3;
      }
      else if (data[bukva] = 'b')
      {
        blue = (data[bukva+1] - '0') * 100 + (data[bukva+2] - '0') * 10 + (data[bukva+3] - '0');
        bukva=bukva+3;
      }

      bukva++;
    }

    FastLED.clear();//отправка на диодную ленту
    for (int i = 0; i < NUM_LEDS; i++)
    {
      leds[i].r = red;
      leds[i].g = green;
      leds[i].b = blue;
    }
    FastLED.show();
  }
}
 

planar74

New member
Потихоньку пробираюсь дальше. Появилась новая проблема, почему то криво принимаются данные на стороне ардуино. Советы по оптимизации кода очень бы пригодились.
Код:
#include <SoftwareSerial.h>
#include <FastLED.h>//библиотека диодной ленты
#define NUM_LEDS 20
#define DATA_PIN 3
#define CLOCK_PIN 13

CRGB leds[NUM_LEDS];
SoftwareSerial espSerial(10, 11);
const int COM_BAUD = 9600;
int red = 0, green = 0, blue = 0, i = 0,bukva=0;


void setup() {
  espSerial.begin(COM_BAUD);
  Serial.begin(COM_BAUD);
  FastLED.addLeds<WS2811, DATA_PIN, RGB>(leds, NUM_LEDS);
  Serial.println("Setup done");
  delay(1000);
  if ( espSerial.available())//запуск сервера, пока не работает
  {
    espSerial.write("AT+CIPMUX=1");
    delay(1000);
    espSerial.write("AT+CIPSERVER=1,8888");
  }
}
//+IPD, 0, 3: r200g012b000 - формат приходящих данных
void loop() {
//здесь явно не 30 символов,  
String data="x234567890123456789012000000";//
bukva=0;
  if (espSerial.available()) {
//i инициализировать кто будет? После первого прохода там окажется 30 и на следующий цикл даже при наличии данных не отработает
i=0;
    while ( espSerial.available() && i < 30)//считывание
    {
      data[i++] = espSerial.read();
    }
    data[i++] = '\0';//закрытие массива

    if (data[0] != 'x')
      Serial.print(data);//печатает только один раз
//Читаем документацию
    while (data[bukva] != '\0')//обработка полученых данных
    {

      if (data[bukva] = 'r')
      {
        red = data.substring(bukva+1,bukva+3).toInt();
        bukva+=3;
        continue; //иначе просто прибавим еще 1 и промажем по следующей константе, если они идут без пробелов
      }
      else if (data[bukva] = 'g')
      {
        green = data.substring(bukva+1,bukva+3).toInt();
        bukva+=3;
        continue;
      }
      else if (data[bukva] = 'b')
      {
       blue = data.substring(bukva+1,bukva+3).toInt();
        bukva+=3;
        continue;
      }

      bukva++;
    }

    FastLED.clear();//отправка на диодную ленту
//i и глобальная, и локальная. Странно, что компилятор такое позволил
    for (int led = 0; led < NUM_LEDS; led++)
    {
      leds[led].r = red;
      leds[led].g = green;
      leds[led].b = blue;
    }
    FastLED.show();
  }
}
 
Последнее редактирование:

mak17

New member
planar, огромное спасибо, указали мои ошибки. С i действительно странно получилось. Применив еще немного изменений сейчас все работает.
Ниже код, но это не финальная версия, позже будет еще.
Код:
#include <SoftwareSerial.h>
#include <FastLED.h>//библиотека диодной ленты
#define NUM_LEDS 20
#define DATA_PIN 3
#define CLOCK_PIN 13
CRGB leds[NUM_LEDS];
SoftwareSerial espSerial(10, 11);
const int COM_BAUD = 9600;
int red = 100, green = 0, blue = 0, i = 0,bukva=0;
String data="+IPD, 0, 3: r000g005b000";//вывел String из цикла
void setup() {
  espSerial.begin(COM_BAUD);
  Serial.begin(COM_BAUD);
  FastLED.addLeds< WS2811, DATA_PIN, RGB>(leds, NUM_LEDS);
  Serial.println("Setup done");/*
  if ( espSerial.available())//запуск сервера, пока не работает
  {
    espSerial.write("AT+CIPMUX=1");
    delay(1000);
    espSerial.write("AT+CIPSERVER=1,8888");
  }*/
}
//+IPD, 0, 3: r200g012b000 - формат приходящих данных

void loop() {
//здесь явно не 30 символов, 


  if (espSerial.available()>0) {
i=0;
    while ( espSerial.available()>0 && i < 24)//считывание
    {
      data[i++] = espSerial.read();
    }
    data[i++] = '\0';//закрытие массива

      Serial.print(data);
      Serial.print("-data\n");
      bukva=12;
        red = data.substring(bukva+1,bukva+4).toInt();
        bukva+=4;
        green = data.substring(bukva+1,bukva+4).toInt();
        bukva+=4;
        blue = data.substring(bukva+1,bukva+4).toInt();
       

    Serial.print("\n");
   Serial.print(red);
   Serial.print(" ");
   Serial.print(green);
   Serial.print(" ");
   Serial.print(blue);
   Serial.print("\n");
    FastLED.clear();//отправка на диодную ленту

    for (int led = 0; led < NUM_LEDS; led++)
    {//да, похоже в библиотеке перепутаны переменные. 
      leds[led].r = blue;
      leds[led].g = red;
      leds[led].b = green;
    }
    FastLED.show();

  }
}
Если у кого есть вопросы, помогу чем смогу.
 

Atom

Member
Вангую, что местные проповедники доведут до греха в курсовике:D
 

planar74

New member
@Atom я умолчал, что можно сразу на govnokod отправлять, не стал про оптимизацию говорить, так что - не завалим. Тем более, что человек делает сам, а не требует, что-бы сделали за него. 4 - будет, как минимум.
 

nikolz

Well-known member
Доброго времени суток всем.
Для написания первой курсовой работы я решил сделать диодную ленту, управляемую с Android.
Что я хочу: Посылать сигнал на ESP8266 с смартфона, ESP8266 подключен к Ардуино, далее Ардуино меняет, к примеру, цвет ленты.
Что я сделал: я разобрался с управление диодной лентой из Ардуино.
Что у меня есть:
- TTL конвертор YP-01 (кажется на 5 вольт, что не радует)
- клон Arduino Uno
- Диодная лента на WS2811 чипах
- и главная моя проблема - ESP8266(ESP01)
Я никак не могу к нему подойти. Какой режим выбрать, какую прошивку, как Ардуино будет принимать данные от чипа.
Буду благодарен за любые советы.
Выкиньте Ардуино. А в курсовой приведите обоснование такого решения, функциональную и принципиальную схемы и алгоритм управления и кусок какой-нибудь функции. Для курсовой это "выше крыши". получите- отлично.
 
Сверху Снизу