#1 Re: Програмування Arduino » Перемикання режимів лед стрічки » 2023-10-06 20:34:14

г0cть пише:

Перепишите функцию, избавьтесь от блокирующих циклов for

ну таке, це я і так розумію, але не розумію як

#2 Програмування Arduino » Перемикання режимів лед стрічки » 2023-10-06 16:38:10

imden10
відповідей: 4

Доброго дня! Маю скетч для управління WS2812.
Потрібно зробити 4 режими і кнопку яка буде переключати між режимами. 1 режим - вся стрічка червоного кольору. 2 режим - вся стрічка зеленого кольору. 3 режим - вся стрічка синього кольору. 4 режим - стрічка плавно переливається з червоного в зелений потім в синій і по кругу.
Проблема в тому, що 4-й режим блокую кнопку, тобто кнопка попросту не реагує, пробував різні бібліотеки для кнопки і без бібліотеки, але нічого не допомага.
Ось скетч:

#include <Adafruit_NeoPixel.h>

#define PIN                   5  // Визначте пін, до якого підключена лента WS2812
#define NUM_LEDS              16 // Кількість світлодіодів у вашій стрічці
#define BUTTON_SWITCH_PIN     23  // Пін, до якого підключена кнопка

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
int mode = 1; // Початковий режим - червоний колір
int num_mode = 4; // Кількість режимів

unsigned long lastButtonPress = 0; // Зберігаємо час останнього натискання кнопки
const unsigned long debounceDelay = 200; // Затримка антидребізга (200 мілісекунд)

void setup() {
  strip.begin();
  strip.show(); // Ініціалізація всіх світлодіодів у виключеному стані
  strip.setBrightness(150);  // указываем яркость (максимум 255)
  Serial.begin(115200);
  
   pinMode(BUTTON_SWITCH_PIN, INPUT_PULLUP);
}

void loop() {
  // Оновлення стану кнопки і перевірка на натискання
  unsigned long currentMillis = millis();
  int buttonState = digitalRead(BUTTON_SWITCH_PIN);
  
  if (buttonState == LOW && currentMillis - lastButtonPress >= debounceDelay) {
    mode++;
    if (mode > num_mode) {
      mode = 1;
    }
    resetStrip();
    lastButtonPress = currentMillis;
  }

  // Виклик різних режимів відображення
  switch (mode) {
    case 1:
      solidColor(strip.Color(255, 0, 0));
      break;
    case 2:
      solidColor(strip.Color(0, 255, 0));
      break;
    case 3:
      solidColor(strip.Color(0, 0, 255));
      break;
    case 4:
      rainbowCycle();
      break;
  }
  
  Serial.println(mode);
}

// Функція для відображення одного кольору на всій стрічці
void solidColor(uint32_t color) {
  for (int i = 0; i < strip.numPixels(); i++) {
    strip.setPixelColor(i, color);
  }
  strip.show();
}

// Функція для скидання кольорів до початкового стану
void resetStrip() {
  for (int i = 0; i < strip.numPixels(); i++) {
    strip.setPixelColor(i, strip.Color(0, 0, 0));
  }
  strip.show();
}

void rainbowCycle() {
  for (int j = 0; j < 256 * 5; j++) {
    for (int i = 0; i < strip.numPixels(); i++) {
      int wheelPos = (i * 256 / strip.numPixels() + j) % 256;
      strip.setPixelColor(i, Wheel(wheelPos));
    }
    strip.show();
    delay(10);
  }
}

uint32_t Wheel(byte WheelPos) {
  if (WheelPos < 85) {
    return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  } else if (WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else {
    WheelPos -= 170;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}

#3 Re: Апаратні питання » Как запитать esp32 (голую) от блока питания 12v 200w (получается 17А) » 2023-03-02 11:19:50

г0cть пише:
imden10 пише:

Але ж все таки ams117 був гарячим, це норма?

Якщо ви подаєте на нього 12В, то так - це "норма". Згадайте фізику за 8 клас і закон Ома.

Напевно я зрозумів чому гріється ams117.
Ось до речі фото мого пристрою https://prnt.sc/DRxU5c7b-u7-
Так ось, на платі є 30 світлодеодів а також стільки ж оптопари, і вони ж теж дають навантаження

#4 Re: Апаратні питання » Как запитать esp32 (голую) от блока питания 12v 200w (получается 17А) » 2023-03-02 10:55:35

rain пише:

> Але сюди прийшов за порадою, а не за тим, що б указували на слабкі місця мої

Но все же...

Ок. Ток на бирке БП - это его "запас прочности". То, сколько он может обеспечить для нагрузки. Это не значит, что с него этот ток обязательно идет по цепи. Так что да, как выше сказали - питаешь реле от 12В, через ключи они управляются от ESP'шки. А сама ESP'шка питается через стабилизатор, подключенный к тем же 12В. И в общей сложности вся эта конструкция должна потреблять не более тех 17А.

Я так собі і думав спочатку, аде коли я запитав свою esp от цього блока живлення, так вона запустилать, але чіп ams117 був гарячим, от я і начав собі крутити в голові і подумав що помилився і такого робити не можна.
Але ж все таки ams117 був гарячим, це норма?

#5 Re: Апаратні питання » Как запитать esp32 (голую) от блока питания 12v 200w (получается 17А) » 2023-03-01 20:06:36

rain пише:

Может для начала подтянуть хотя бы базовые знания по электронике?

Але сюди прийшов за порадою, а не за тим, що б указували на слабкі місця мої

#6 Re: Апаратні питання » Как запитать esp32 (голую) от блока питания 12v 200w (получается 17А) » 2023-03-01 20:03:35

rain пише:

Может для начала подтянуть хотя бы базовые знания по электронике?

Авжеш потрібно. Я веб розробник, програмуванням мікроконтролерів з рік як зацікавився. По електроніці слабо, вчусь на помилках виходить

#7 Re: Апаратні питання » Как запитать esp32 (голую) от блока питания 12v 200w (получается 17А) » 2023-03-01 17:38:05

Roman1984 пише:

Не нужно два источника. Выход 12в идёт на обмотки реле и параллельно на стабилизатор ams117. С выхода стабилизатора запитывается только цифровая логика, esp и mcp.

так стабілізатор ams117 розрахований на потужність максимум 1А, а у мене на блокі живлення 17А

#8 Re: Апаратні питання » Как запитать esp32 (голую) от блока питания 12v 200w (получается 17А) » 2023-03-01 17:35:49

г0cть пише:
imden10 пише:

Виходить потрібно 2 джерела живлення підключати до мого девайсу?

ні
p/s а все ж таки що це за реле які жеруть 5Вт?

Сорі, 0.5 а не 5, але блок брав потужний, думав що буду кучу всякий пристроїв підключати, типу, поставити блок в електро щитову, і до нього підключати купу різних пристроїв, але не подумав зовсім за наслідки

#9 Re: Апаратні питання » Как запитать esp32 (голую) от блока питания 12v 200w (получается 17А) » 2023-03-01 12:26:48

Roman1984 пише:

А зачем 200w контроллеру? Сам esp питайте от стабилизатора AMS117, а обмотки 12-ти вольтовых реле напрямую от источника. Только все минусы в одну шину не забудьте соединить, а то будут последствия.

Виходить потрібно 2 джерела живлення підключати до мого девайсу?

#10 Апаратні питання » Как запитать esp32 (голую) от блока питания 12v 200w (получается 17А) » 2023-02-28 21:58:26

imden10
відповідей: 16

Есть схема с esp32 (не девовский модуль а голая), к esp будет подключено 3 mcp23017 (разширение пинов) от выходов этих пинов будет ити к оптопарам, которые будут питать релешки. Каждая реле 12 вольт 5 ватт.
В общем что бы все запитать нужно 200ватт.
Купил блок питание 12v 200w и думал запитать через стабилизатор AMS117 3.3в. но как оказываеться его пропускная способность 1А.
Теперь нужно какуюто схему что бы запитать esp с блока 12v 200w.
Может кто сталкивался с такими задачами?

#11 Re: Апаратні питання » Перенос з тестового модуля на плату, не баче карту » 2023-02-27 15:38:01

тільки що вдалося загрузити пристрій, я отключив взагалі sd card натомість викосристав внутрішню флеш пам'ять.
Але пристрій перезавантажується з помилкой "Brownout detector was triggered"

#12 Re: Апаратні питання » Перенос з тестового модуля на плату, не баче карту » 2023-02-27 12:00:31

Ще є дещо. Згадую як саме було підключення, коли загрузилося вдачно.
Я давав живлення 12в від акамуляторів (ну на стабілізатор ams117). І коли все запрацювало, то пристрій часно почав сам перезавантажуватись, як виявилось, від малої напруги

#13 Re: Апаратні питання » Перенос з тестового модуля на плату, не баче карту » 2023-02-27 11:39:23

Так все норм там, і сама esp32 працює, і програма починає грузитися, але не баче саму карту пам'яті.
АЛЕ одного разу, воно її побачило і все запрацювало, при наступному перезавантаженню, знову не баче

#14 Апаратні питання » Перенос з тестового модуля на плату, не баче карту » 2023-02-25 22:44:28

imden10
відповідей: 5

Привіт всім. Був у мене тестовий модуль esp32, до якого було підключено карту пам'яті micro SD, на пряму по SPI просто через роз'єм.
І все працювало добре.
Переніс схему в KiCad, але не брав весь девовський модуль esp32 а тільки самп чіп esp32s, замовив плати на pcbway, прийшли вони, почав паяти.
Ось основна частина схеми https://prnt.sc/mQkJRLfVB_l2
припаяв стабілізатор напруги на 3.3в, роз'єм для карти пам'яті, і саму esp32s.
Запускать і глухо.
Почав відладку.

  • стабілізатор напруги видає 3.3в.

  • замикань не обнаружив

  • всі контакти перевірив

  • підключив до консолі за допомогою програматора через контакти tx rx і побачив помилку підключення карти пам'яті.

Короче що не пробував нічого не допомага.

подумав що немає контакта десь до роз'єма карти.

відпаяв його і на його місце підпаяв проводки і до переходніка з microSD на SD, встомив туди карту, і якогось одного разу, мені вдалося запустити пристрій, тобто карту обнаружело.

Купив новій роз'єм, припаяв заново, думав той якийсь поганий, но карту не баче.
Короче вже 2 тижня голова болить, може хтось щось підскаже, буду дуже вдячний, за будь які думки

#15 Апаратні питання » esp32 SD » 2022-12-05 00:35:36

imden10
відповідей: 2

Привет всем. Подскажите можно ли заменить SD карту какой нибуть микросхемой, ну что бі работала также (можно біло сохранять файлы) но не нужно было разъем для SD а просто припоять и все?

#16 Апаратні питання » esp32 with W25q32 » 2022-11-30 23:20:58

imden10
відповідей: 0

Підскажіть як підключить до esp32 чіп w25q32 flash памяті. Хочу використовувати для запису даних. Підключаю по spi як звичайну флешку. Але стандартна бібліотека не баче її. Напевно треба через якусь лібу пдключать або ще щось?

#17 Re: Програмування Arduino » ESP32 проводная сеть » 2022-07-20 16:33:44

Honey пише:

SPI over 1-wire с примером кода для взаимодействия.
1-wire это шина, у нее должен быть один мастер и может быть множество подчиненных устройств.
Модуль расширения портов - это один из видов подчиненных устройств.

Нужно что бы каждое устройство могло отправлять данные всем

#18 Програмування Arduino » ESP32 проводная сеть » 2022-07-19 20:08:45

imden10
відповідей: 3

Подскажите как организовать проводное общение между 2 и более esp. Вроде бы и куча всего есть, но я уже запутался. Нужно что то простое, типа: послать esp_n такое то сообщение и получить ответ

#19 Апаратні питання » MCP23017 и Модульные контакторы » 2022-07-08 10:03:24

imden10
відповідей: 1

Использую MCP23017 - расширитель пинов для esp.
Также хочу на каждый выход поставить модульные контакторы (https://prnt.sc/uRg6HAs6aVnX)
Проблема в том, что катушка модульного контактора, мин 12v а микросхема mcp23017 работает с 5 вольтами.
Есть идея: поставить типа релюшек на каждый контакт микросхемы, только не катушкой, где то видел реле без катушки, просто типа транзистора или че, короче слаб в этом.
Подскажите кто знает, как такие называются

#20 Апаратні питання » Программатор esp32 » 2022-06-30 16:19:05

imden10
відповідей: 1

Подскажите где купить программатор для esp32, что то вроди этого https://prnt.sc/yvqetF5B2sdZ в Украине.
или может самодельный, кто как прошивает esp32 (не девкит)?

#21 Re: Програмування Arduino » Не всегда срабатывает digitalWrite() » 2022-06-10 16:24:08

Ура, я решил, только не понял почему так было, может кто то объяснит, так на будующее для понимания.
В общем https://prnt.sc/amrId5Zi1KEd я закоментировал пару строк вывода в Serial, и все заработало как часики

#22 Re: Програмування Arduino » Не всегда срабатывает digitalWrite() » 2022-05-30 18:53:58

По ходу нашел зацепку
https://prnt.sc/sYOaHVdaC3Z7

Это может быть связано с частотой i2c интерфейса

Но как менять или управлять им пока не нашел

#23 Re: Програмування Arduino » Не всегда срабатывает digitalWrite() » 2022-05-27 14:43:53

Там слишком много всего, сейчас постараюсь кусками выложить, что б не путать.

Adafruit_MCP23X17 mcp1;  // mcp23017 разширение GPIO 
Adafruit_MCP23X17 mcp2;  // mcp23017 разширение GPIO

// Структура кнопок и ламп
struct ButtonLamp {
  Adafruit_MCP23X17 mcp; // Микросхема светодиода
  int lamp_pin; // Контакт n для подключения светодиода
  McpButton btn; // Кнопка
  int lamp_on; // Текущее состояние светодиода (включен/выключен) 
  boolean is_main_btn; // главная ли кнопка 
  int showin_pin; // Отображаемый пин на корпусе устройства
};

ButtonLamp buttonLamps[BUTTON_LAMP_AMOUNT] = { 
{mcp1, 10, BtnLamp1, 0, true, 1},
{mcp1, 11, BtnLamp2, 0, false, 2},
{mcp1, 12, BtnLamp3, 0, false, 3},
{mcp1, 13, BtnLamp4, 0, false, 4},
{mcp1, 14, BtnLamp5, 0, false, 5},
{mcp1, 15, BtnLamp6, 0, false, 6},
{mcp2, 0, BtnLamp7, 0, false, 7},
{mcp2, 1, BtnLamp8, 0, false, 8},
{mcp2, 2, BtnLamp9, 0, false, 9},
{mcp2, 3, BtnLamp10, 0, false, 10}
};

void setup() {
  mcp1.begin_I2C(0x20);
  mcp2.begin_I2C(0x21);

// конфигурация кнопок
  buttonLamps[0].mcp = mcp1;
  buttonLamps[1].mcp = mcp1;
  buttonLamps[2].mcp = mcp1;
  buttonLamps[3].mcp = mcp1;
  buttonLamps[4].mcp = mcp1;
  buttonLamps[5].mcp = mcp1;
  buttonLamps[6].mcp = mcp2;
  buttonLamps[7].mcp = mcp2;
  buttonLamps[8].mcp = mcp2;
  buttonLamps[9].mcp = mcp2;

  // Сконфигурировать контакт лампы как выход
  for(int i = 0; i < BUTTON_LAMP_AMOUNT; i++){
    buttonLamps[i].btn.init(buttonLamps[i].mcp,i);
    buttonLamps[i].mcp.pinMode(buttonLamps[i].lamp_pin, OUTPUT);
    buttonLamps[i].mcp.digitalWrite(buttonLamps[i].lamp_pin, buttonLamps[i].lamp_on); // изменить статус состояния светодиода
  }
  
   client.begin("xxxxxxxxxxxx.cloud.shiftr.io", net);
  // set the callback function for receiving
  client.onMessage(messageReceived);

}

void loop() {
  MQTT_control_run();

  buttonLamps[0].btn.tick();
  if (buttonLamps[0].btn.isClick()) {
    buttonLamps[0].lamp_on = !buttonLamps[0].lamp_on; // инвертировать значение состояния светодиода
    buttonLamps[0].mcp.digitalWrite(buttonLamps[0].lamp_pin, buttonLamps[0].lamp_on); // изменить статус состояния светодиода
    setStatusLampToSever(buttonLamps[0].showin_pin, buttonLamps[0].lamp_on);   
  }
  if (buttonLamps[0].btn.isHolded() && buttonLamps[0].is_main_btn) {
      allLampOff();
  }

  //...
}

void messageReceived(String &topic, String &payload) {
  if (topic.indexOf(MQTTTopicGetLampPin) != -1){ 
    String pin = topic.substring((topic.lastIndexOf("/")+1));
    int keyPin = pin.toInt() - 1;
    buttonLamps[keyPin].lamp_on = payload.toInt(); 
    buttonLamps[keyPin].mcp.digitalWrite(buttonLamps[keyPin].lamp_pin, buttonLamps[keyPin].lamp_on); // изменить статус состояния светодиода 

    setStatusLampToSever(buttonLamps[keyPin].showin_pin,buttonLamps[keyPin].lamp_on);
}

По кнопке на устройтсве срабатывает нормально

messageReceived - слушает топик с сервера и должен устанавливать значение и в принципе устанавливает и работает нормально.

Данные с сервера приходят, выводил.
В buttonLamps[keyPin].lamp_on значение устанавливает
Но вот НЕ ВСЕГДА срабатывает buttonLamps[keyPin].mcp.digitalWrite(buttonLamps[keyPin].lamp_pin, buttonLamps[keyPin].lamp_on);

#24 Програмування Arduino » Не всегда срабатывает digitalWrite() » 2022-05-26 21:54:10

imden10
відповідей: 5

Может кто то объяснить почему не всегда срабатвает digitalWrite()?
Или как проверить, загорелся тот светодиод или нет?

Уточнение: работаю с микросхемой mcp23017 и библиотекой Adafruit_MCP23X17
mcp.pinMode(0, OUTPUT) - установил.

В основном срабатывает, но не всегда.

#25 Програмування Arduino » GButton + mcp23017 » 2022-05-13 21:58:15

imden10
відповідей: 1

Краткая предистория. Переношу с ардуино на esp32. На ардуино стояла библиотека GButton, которая отлично справлялась с нажатием кнопок, нужны были 2 функции:

  • вкл/выкл одной кнопкой;

  • отловить, что кнопка нажата 2 сек.

На esp32 оказалось мало пинов мне. Прикрутил 2 mcp23017 по i2c. Работает отлично, но не умеет работать с GButton.

Вот проблема.
Нужно что то вроде GButton, которая умеет работать с mcp23017
или
может у кого есть НОРМАЛЬНЫЙ пример для работы с кнопками, что бы выполнять те функции, что описывал сверху.

Підвал форуму