• Система автоматизации с открытым исходным кодом на базе 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.
 
Сверху Снизу