Нужна помощь 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)
Я никак не могу к нему подойти. Какой режим выбрать, какую прошивку, как Ардуино будет принимать данные от чипа.
Буду благодарен за любые советы.
Выкиньте Ардуино. А в курсовой приведите обоснование такого решения, функциональную и принципиальную схемы и алгоритм управления и кусок какой-нибудь функции. Для курсовой это "выше крыши". получите- отлично.
 
Сверху Снизу