Могу ли я получить помощь с кодом метронома на моем 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);

 // серийный --------------------


 // сделанный


  }

}

, 👍1

Обсуждение

о нет, где я могу опубликовать код?, @tom

Разместите свой код в своем вопросе. Скопируйте и вставьте его, затем выберите код и нажмите кнопку {}, чтобы отформатировать его., @Majenko

Я явно неправильно форматирую код на этом форуме. Я копирую его, затем нажимаю на двойные волнистые скобки, а затем вставляю?, @tom

Нет. Вы копируете. Потом вставляешь. Затем вы выбираете (выделяете вставленный код). Затем вы нажимаете {}. Он должен отступать во всем вашем коде на 4 пробела., @Majenko

И почему бы вам просто не установить переменную интервала с помощью вашей математической формулы? Что-то вроде interval = <математическая формула>, @chrisl

как в интервале = а? Я пробовал это и много других комбинаций, но они просто не работают, @tom

он говорит, что 'a' не был определен в этой области. Я попытался посмотреть, что это значит, и подумал, что решил проблему, поместив арифметический оператор в начало скетча, чтобы сделать его глобальным значением, но я все еще получаю сообщение об ошибке., @tom

поэтому с помощью других на этом сайте мне удалось сделать то, что я хотел, однако интервал на одну итерацию отстает от фактического значения. поэтому, если я увеличиваю кодировщик до 120, значение 119 равно 504, а значение 120 равно 500 и так далее. проблема в том, что значение, показанное интервалом, отстает на один шаг, поэтому при 120 значение по-прежнему читается как 504, а 121 — как 500 и так далее., @tom


1 ответ


Лучший ответ:

2

Как я уже писал в своем комментарии, вы фактически не устанавливаете новое значение 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