Arduino + ESP8266 + LED лента

Тема в разделе "Проводная и беспроводная связь", создана пользователем mak17, 8 май 2016.

Метки:
  1. mak17

    mak17 Нуб

    Доброго времени суток всем.
    Для написания первой курсовой работы я решил сделать диодную ленту, управляемую с Android или PC.
    Я посылаю сигнал на ESP8266 с смартфона/компа, ESP8266 подключен к Ардуино, далее Ардуино меняет, к примеру, цвет ленты. Моя схема подключения:
    [​IMG]
    Появилась проблема, почему то криво принимаются данные на стороне ардуино. Советы по оптимизации кода очень бы пригодились.
    Код (C++):
    #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();
      }
    }