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

Нужна помощь В изготовлении цветомузыки

lNavil

New member
4 утра... я всё же решил написать на форум.

Суть такова, нашел видео на ютубе(
) как кто то сделал цветомузыку, проект понравился, тем более давно хотел её сделать. Начал копаться в коде и заметил то, что пины идут 1,2,3 и тд, и нечего не работает на таких пинах, если же вручную написать номер пина (например D3), то всё работает, НО все не так просто, там есть цикл(посмотрите код) и в попытках сделать их D1,D2... у меня ничего не получилось, делал по такому типу
Код:
 for (int i=2; i<12; i++)
  {
    pinMode('D'+i,OUTPUT);
    digitalWrite('D'+i, LOW);
    buf[i]=0;
  }
 

Вложения

tretyakov_sa

Moderator
Команда форума
4 утра... я всё же решил написать на форум.

Суть такова, нашел видео на ютубе(
) как кто то сделал цветомузыку, проект понравился, тем более давно хотел её сделать. Начал копаться в коде и заметил то, что пины идут 1,2,3 и тд, и нечего не работает на таких пинах, если же вручную написать номер пина (например D3), то всё работает, НО все не так просто, там есть цикл(посмотрите код) и в попытках сделать их D1,D2... у меня ничего не получилось, делал по такому типу
Код:
 for (int i=2; i<12; i++)
  {
    pinMode('D'+i,OUTPUT);
    digitalWrite('D'+i, LOW);
    buf[i]=0;
  }
Когда вы пишите pinMode(D1,OUTPUT); компилятор знает, что это просто другое обозначение числа 5. Когда вы подставляете 'D'+i, код символа D который равен 68 прибавляет i и если i=1 получается 69.
Значит pinMode(69,OUTPUT); и что вы хотите получить. Нет такого GPIO!
Так, что забудьте о подписях на ногах и пользуйтесь нормальным способом обращения к GPIO.
Соответствия смотрите здесь:
 

Вложения

lNavil

New member
@tretyakov_sa
Если просто заливаю скетч(который вложен в 1 сообщении), то ничего не работает. Можете помочь?
у меня wemos d1
 

tretyakov_sa

Moderator
Команда форума
@tretyakov_sa
Если просто заливаю скетч(который вложен в 1 сообщении), то ничего не работает. Можете помочь?
у меня wemos d1
У вас нет столько ног на wemos сколько вы пишите в скетче.
Только GPIO 0,2,4,5,12,13,14,15,16
Будет, что то типа этого:
Код:
int buf[10];
int k=0;
int incomingByte;
// Определим соответствие ногам
int gpio[]={0,2,4,5,12,13,14,15,16};
void setup() {
  Serial.begin(115200);
// Инициализируем ноги
  for (int i=0; i<9; i++)
  {
    pinMode(gpio[i],OUTPUT);
    digitalWrite(gpio[i], LOW);
    buf[i]=0;
  }
}
void loop()
{
  while (Serial.available() > 0)
  {
    incomingByte = Serial.read();
  
    if (incomingByte == '#')
    {
      k=0;
      for (int i=0; i<9; i++)
      {
        if (buf[i]!='0')
        {
          digitalWrite(gpio[i+2],HIGH); // не понял почему i+2
        }
        else
        {
          digitalWrite(gpio[i+2],LOW);
        }
      }
  
    }
    else
    {
      buf[k]=incomingByte;
      k++;
    }
  
  
  }
}
 

AndrF

Active member
Про особенность GPIO15 не надо забывать - при старте она должна быть подтянута к нулю. Соответственно, светодиодик если и вешать на нее, то иначе чем на остальные ножки.
 

AndrF

Active member
Это не схема, а шарада.

Отключите провода от GPIO 0,2, 15 и 16. После чего попробуйте. Заработает - подключайте по одному...
 

lNavil

New member
@AndrF отключил все провода, тыкал одним светодиодом, всё рано ничего не работает.

Но если во всем коде заменить
Код:
 pinMode(gpio[i],OUTPUT);
    digitalWrite(gpio[i], LOW);
    buf[i]=0;
на
Код:
 pinMode(D3,OUTPUT);
    digitalWrite(D3, LOW);
    buf[i]=0;
например, то светодиод на D3 будет работать как надо
 
Последнее редактирование:

AndrF

Active member
Попробуйте так:

Код:
byte buf[10];
byte k = 0;
byte incomingByte;
byte n = 9; // Кол-во светодиодов

// Определим соответствие ногам
byte gpio[]={0,2,4,5,12,13,14,15,16};

void setup() {
    Serial.begin(115200);
    // Инициализируем ноги
    for (byte i = 0; i < n; i++) {
        pinMode( gpio[i], OUTPUT);
        digitalWrite( gpio[i], LOW);
        buf[i] = 0;
    }
}

void loop() {
    while (Serial.available()) {
        incomingByte = Serial.read();
        if (incomingByte == '#') {
            k = 0;
            for (byte i = 0; i < n; i++) { digitalWrite(gpio[i], (buf[i] != 0 ? HIGH : LOW)); }
       } else { if (k < n) buf[k++] = incomingByte; }
    }
}
Пины GPIO 0,2, 15 и 16 подключайте в последнюю очередь.

P.S
Если не пойдет, то попробуйте еще в четвертой строке прописать:

Код:
byte n = 8; // Кол-во светодиодов
 
Последнее редактирование:

lNavil

New member
@AndrF залил скетч, тестил не дома, под рукой был только 1 светодиод, нечего не работает :(:(. вот плагин для аимпа USB led.rar он и передает сигнал на Serial
 

AndrF

Active member
Замените одну строчку:

Код:
                digitalWrite(gpio[i], (buf[i] != '0' ? HIGH : LOW));
Работать будет - проверил.

Только еще раз повторяю - GPIO15 при старте надо притягивать к земле, то есть светодиод там должен быть включен через резистор на землю. У остальных ножек - к 3V3.
 
Сверху Снизу