Код NodeMCU, который отображает OLED и управляет светодиодным кольцом WS2812.
Я пытаюсь создать проект с использованием NodeMCU, который отображает изображения на небольшом OLED-экране, а также управляет светодиодным кольцом WS2812.
Мне удается сделать каждый из них по отдельности, но я не знаю, как их объединить. Проблема заключается в том, что большинство примеров кода как для экрана, так и для светодиода используют спящий режим, и это, конечно, будет работать только для одного из них, но не для обоих.
Это первый проект, который я рассматривал для отображения растровые изображения с экраном SSD1306 и nodemcu.
Это второй проект, который я рассматривал для управления NeoPixel WS2812. кольцо.
Основной проект заключался в том, что они оба использовали delay
как способ ожидания некоторого времени для «прогресса». Но я не мог просто ждать, потому что тогда это испортит и экран, и NeoPixel.
Еще одна вещь: я должен также учитывать вводимые данные при чтении. Я до сих пор не уверен на 100% насчет входа, но, вероятно, это будет потенциометр и, возможно, кнопка.
Думаю, я нашел решение: разбить большие "задачи" чтения ввода, управления экраном и светодиодами на более мелкие части и совместного ожидания.
Я нашел это руководство, которое объясняет, как это сделать, а также предоставляет пример кода.
Я буду рад узнать, есть ли у людей другие способы реализовать это.
@Ido Ran, 👍0
Обсуждение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. */
} // конец цикла
- WS2812B работает только пока измеряю напряжение
- Как определить размер Flash?
- WebSocketsServer.h: No such file or directory
- В ESP-12E NodeMCU, какой выход PIN A0?
- Преобразование byte* в int в Arduino
- Каково использование зарезервированных контактов и контактов SDD2, SDD3 NodeMCU?
- Было найдено несколько библиотек для «WiFiClient.h» с помощью nodemcu.
- NodeMCU (Arduino IDE) «DynamicJsonBuffer» не был объявлен в этой области
«Я не знаю, как их смешать»... как пить воду во время ужина?, @jsotola
Почему бы вам не опубликовать свой код? Мы можем взглянуть на это и, возможно, предложить что-нибудь для начала., @Fahad
Существует пример под названием «BlinkWithoutDelay» (вы можете найти его в Arduino IDE, перейдя в «Файлы» -> «Примеры» -> «02.Digital»). Это дает вам представление о том, как вы можете делать свои дела без использования delay(). Третья добавленная вами ссылка использует эту концепцию., @Fahad