Код NodeMCU, который отображает OLED и управляет светодиодным кольцом WS2812.

Я пытаюсь создать проект с использованием NodeMCU, который отображает изображения на небольшом OLED-экране, а также управляет светодиодным кольцом WS2812.

Мне удается сделать каждый из них по отдельности, но я не знаю, как их объединить. Проблема заключается в том, что большинство примеров кода как для экрана, так и для светодиода используют спящий режим, и это, конечно, будет работать только для одного из них, но не для обоих.

Это первый проект, который я рассматривал для отображения растровые изображения с экраном SSD1306 и nodemcu.

Это второй проект, который я рассматривал для управления NeoPixel WS2812. кольцо.

Основной проект заключался в том, что они оба использовали delay как способ ожидания некоторого времени для «прогресса». Но я не мог просто ждать, потому что тогда это испортит и экран, и NeoPixel.

Еще одна вещь: я должен также учитывать вводимые данные при чтении. Я до сих пор не уверен на 100% насчет входа, но, вероятно, это будет потенциометр и, возможно, кнопка.

Думаю, я нашел решение: разбить большие "задачи" чтения ввода, управления экраном и светодиодами на более мелкие части и совместного ожидания.

Я нашел это руководство, которое объясняет, как это сделать, а также предоставляет пример кода.

Я буду рад узнать, есть ли у людей другие способы реализовать это.

, 👍0

Обсуждение

«Я не знаю, как их смешать»... как пить воду во время ужина?, @jsotola

Почему бы вам не опубликовать свой код? Мы можем взглянуть на это и, возможно, предложить что-нибудь для начала., @Fahad

Существует пример под названием «BlinkWithoutDelay» (вы можете найти его в Arduino IDE, перейдя в «Файлы» -> «Примеры» -> «02.Digital»). Это дает вам представление о том, как вы можете делать свои дела без использования delay(). Третья добавленная вами ссылка использует эту концепцию., @Fahad


1 ответ


1

Вам нужно прекратить использовать delay и вместо этого отслеживать прошедшее время. В одном из комментариев под вашим вопросом предлагается посмотреть пример BlinkWithoutDelay, который является частью Arduino IDE.

Шутливый комментарий «как вы пьете воду во время ужина»; предлагает решение. Какое-то время вы делаете одно, а затем делаете другое. Ужиная, вы не ждете, пока съедите всю еду, прежде чем сможете выпить стакан воды.

Вот пример кода, который мигает двумя светодиодами с разной частотой:

// Какие контакты к какому светодиоду подключены
const byte greenLED = 12;
const byte redLED = 13;

// Периоды мигания в миллисекундах (от 1000 до секунды).
const unsigned long greenLEDinterval = 500;
const unsigned long redLEDinterval = 1000;

// Переменная, содержащая значение таймера на данный момент. По одному на каждый «Таймер».
unsigned long greenLEDtimer;
unsigned long redLEDtimer;

void setup () 
  {
  pinMode (greenLED, OUTPUT);
  pinMode (redLED, OUTPUT);
  greenLEDtimer = millis ();
  redLEDtimer = millis ();
  }  // конец настройки

void toggleGreenLED ()
  {
   if (digitalRead (greenLED) == LOW)
      digitalWrite (greenLED, HIGH);
   else
      digitalWrite (greenLED, LOW);

  // помните, когда мы его переключили
  greenLEDtimer = millis ();  
  }  // конец toggleGreenLED

void toggleRedLED ()
  {
   if (digitalRead (redLED) == LOW)
      digitalWrite (redLED, HIGH);
   else
      digitalWrite (redLED, LOW);

  // помните, когда мы его переключили
  redLEDtimer = millis ();  
  }  // конец toggleRedLED

void loop ()
  {

  // Обработка мигания одного светодиода.
  if ( (millis () - greenLEDtimer) >= greenLEDinterval)
     toggleGreenLED ();

  // Другой светодиод управляется таким же образом. Повторите для большего количества светодиодов.
  if ( (millis () - redLEDtimer) >= redLEDinterval) 
    toggleRedLED ();

/* Other code that needs to execute goes here.
   It will be called many thousand times per second because the above code
   does not wait for the LED blink interval to finish. */

}  // конец цикла
,