Могу ли я получить помощь с кодом метронома на моем arduino uno?
Хорошо, значит, я ничего не знаю о программировании или электронике, кроме того, что я электрик. Это то, над чем я работал около месяца. Я могу спросить что-то глупое, но вот оно.
Кроме того, я не знаю, куда поместить свой код, так что я оставлю его в комментариях (извините).
В общем, я хочу визуальный метроном. Я хочу подключить блок управления к стене, подключить лампу к блоку управления, чтобы она мигала с заданным интервалом. коробка будет иметь поворотный энкодер и ЖК-дисплей для контроля количества ударов в минуту. для этого я буду использовать SSR и несколько трансформаторов для достижения различных напряжений для разных светодиодных ламп. но я хочу повлиять на 120v cct, чтобы сделать все это. но я просто хочу получить код перед его сборкой, поэтому сейчас я пытаюсь мигать встроенным светодиодом на моем arduino uno.
У меня есть код, который представляет собой 3 разных скетча Франкенштейна. наверное плохо. Я добавил арифметическое уравнение, чтобы упростить синхронизацию метронома, но я не могу перенести это значение в «интервал» для мигающего света.
В моем серийном просмотрщике уравнение работает и дает мне желаемые значения. Я просто не могу вставить это в интервал.
математическое уравнение простое (60 ударов в минуту) 1000 = предполагаемый интервал
пример: (60/120)1000 = 500 в качестве интервала в миллисекундах для мигающего света. 2 мигания в секунду.
enter code here
// поворотный энкодер ------------------
int val;
int encoder0PinA = 6;
int encoder0PinB = 7;
int encoder0Pos = 59;
int encoder0PinALast = LOW;
int n = LOW;
// ЖК-экран ---------------------
// включаем код библиотеки:
#include <LiquidCrystal.h>
// инициализируем библиотеку номерами выводов интерфейса
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// светодиод мигает ----------------------
// номер вывода светодиода
const int ledPin = LED_BUILTIN;
// ledState используется для установки светодиода
int ledState = LOW;
// запомним время последнего обновления светодиода
unsigned long previousMillis = 0;
// интервал мигания (миллисекунды) -- long interval = ;
// математика -----------------------
float a = (60 / encoder0Pos) * 1000;
// для настройки ------------------------------------------------------------ ----------
void setup() {
// поместите сюда код установки для однократного запуска:
// поворотный энкодер ---------------
pinMode (encoder0PinA, INPUT);
pinMode (encoder0PinB, INPUT);
Serial.begin (9600);
Serial.println ("hi");
// ЖК-экран -------------------
// устанавливаем количество столбцов и строк ЖК-дисплея:
lcd.begin(16, 2);
// Вывести сообщение на ЖК-дисплей.
lcd.print("BeatsPerMinute");
// мигает светодиод -------------------
pinMode(ledPin, OUTPUT);
}
// в цикле ------------------------------------------------------------ -----------
void loop() {
// поместите сюда ваш основной код для многократного запуска:
long interval = (60.00 / encoder0Pos) * 1000;
// поворотный энкодер --------------
n = digitalRead(encoder0PinA);
if ((encoder0PinALast == LOW) && (n == HIGH)) {
if (digitalRead(encoder0PinB) == LOW) {
encoder0Pos--;
} else {
encoder0Pos++;
}
// серийный -------------------------------------------------------------- -----------------------
Serial.println ("BPM");
Serial.println (encoder0Pos);
Serial.println ("interval");
Serial.println (interval);
Serial.println ("intended interval");
Serial.println (60.00 / encoder0Pos * 1000, 8);
Serial.println ("----------------");
// серийный номер готов ---------------------------------------------- --------------------
}
encoder0PinALast = n;
// ЖК-экран ----------------
// устанавливаем курсор в столбец 0, строку 1
// (примечание: строка 1 — это вторая строка, так как отсчет начинается с 0):
lcd.setCursor(0, 1);
// вывести количество секунд с момента сброса:
lcd.print(encoder0Pos);
// мигает светодиод ------------------
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
digitalWrite(ledPin, ledState);
// серийный --------------------
// сделанный
}
}
@tom, 👍1
Обсуждение1 ответ
Лучший ответ:
Как я уже писал в своем комментарии, вы фактически не устанавливаете новое значение interval
при изменении положения энкодера. Так что интервал мигания не меняется. Вам нужно использовать формулу, чтобы установить новое значение interval
. Вставить
interval = 60.00 / encoder0Pos * 1000;
перед операторами Serial.print()
. Кроме того, вам необходимо удалить ключевое слово const
в определении interval
, иначе вы не сможете изменить его значение.
Судя по вашим комментариям, вы неправильно понимаете, как работают переменные. Переменная не сохраняет формулу, только значение. a
определяется в вашем коде в глобальном масштабе (вне какой-либо функции). Это означает, что определение get выполняется в самом начале программы. Поскольку в это время encoder0Pos
имеет значение 59, переменной a
присваивается значение 1016,95
. Это значение всегда изменяется только в том случае, если вы активно присваиваете новое значение этой переменной (чего вы никогда не делаете). Формула выполняется только один раз во время присваивания.
хорошо, я думаю, я понимаю, плохо отредактирую сообщение, чтобы обновить код, но если я правильно вас понимаю, я уже пробовал это, и это все еще не дает желаемого результата. как изменить переменную «а» при чтении энкодера? Кроме того, я попытался добавить интервал = 60,00/encoder0Pos * 1000; выше serial.println, но я получил сообщение об ошибке, @tom
Хорошо, я также добавил формулу над разделом serial.println. это дало мне правильное значение, возвращаемое из интервала в моем последовательном просмотрщике! Замечательно! но это не влияет на скорость мигания светодиода. Я обновил код в ОП., @tom
Ладно, я понял. Большое спасибо за Вашу помощь! математика не остается верной для более высоких значений, после примерно 200 ударов в минуту, но она, безусловно, будет работать для моих целей!, @tom
- Как запустить 4 светодиода последовательно на основе кнопочного входа?
- Несколько условий оператора if
- Светодиоды: разница между общим анодом и общим катодом
- Остановить мигание светодиодов
- Интеграция 2 кнопок для включения и выключения светодиода.
- Управление цифровой адресной светодиодной лентой RGB 12 В с помощью Arduino
- Код Arduino для управления 4 светодиодами с 4 кнопок
- Использовать timer0, не влияя на millis() и micros().
о нет, где я могу опубликовать код?, @tom
Разместите свой код в своем вопросе. Скопируйте и вставьте его, затем выберите код и нажмите кнопку
{}
, чтобы отформатировать его., @MajenkoЯ явно неправильно форматирую код на этом форуме. Я копирую его, затем нажимаю на двойные волнистые скобки, а затем вставляю?, @tom
Нет. Вы копируете. Потом вставляешь. Затем вы выбираете (выделяете вставленный код). Затем вы нажимаете
{}
. Он должен отступать во всем вашем коде на 4 пробела., @MajenkoИ почему бы вам просто не установить переменную интервала с помощью вашей математической формулы? Что-то вроде
interval = <математическая формула>
, @chrislкак в интервале = а? Я пробовал это и много других комбинаций, но они просто не работают, @tom
он говорит, что 'a' не был определен в этой области. Я попытался посмотреть, что это значит, и подумал, что решил проблему, поместив арифметический оператор в начало скетча, чтобы сделать его глобальным значением, но я все еще получаю сообщение об ошибке., @tom
поэтому с помощью других на этом сайте мне удалось сделать то, что я хотел, однако интервал на одну итерацию отстает от фактического значения. поэтому, если я увеличиваю кодировщик до 120, значение 119 равно 504, а значение 120 равно 500 и так далее. проблема в том, что значение, показанное интервалом, отстает на один шаг, поэтому при 120 значение по-прежнему читается как 504, а 121 — как 500 и так далее., @tom