Изменить текст на LCD экране, вращая потенциометр?

Я работаю над проектом на Arduino Uno, в котором я хочу изменять текст на ЖК-дисплее каждый раз, когда потенциометр поворачивается. Чтобы сделать это, я сохранил значения угла в int, постоянно проверяю, был ли угол повернут достаточно, чтобы изменить текст, и если да, распечатайте следующее сообщение. Я не уверен, что мой код или схема неверны, поскольку при вращении потенциометра вообще ничего не происходит.

Вот мой код на данный момент и изображение схемы (самый внутренний потенциометр предназначен для регулировки яркости, тот, что справа, предназначен для изменения текста на ЖК-дисплее. Я думаю, что, возможно, я неправильно подключил второй потенциометр, но я не уверен, как это исправить).

#include <LiquidCrystal.h>

// инициализируйте библиотеку номерами интерфейсных контактов
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // удалено 3
// задайте константу для кнопки
const int buttonPin = 6;
// переменная для хранения значения кнопки
int buttonState = 0;
// переменная для удержания предыдущего значения кнопки
//int prevbuttonState = 0;
// переменная для выбора того, какой ответ будет отображаться
int reply = -1;
int prevReply = -1;
int potPin = A0;
int potVal = 0;
int angle = 0;
int prevAngle = 0;
//int startTime = 0;
//int timeElasped = 0;
//int Время тренировки = 0;

void setup() {
  // настройка количества столбцов и строк на ЖК-дисплее
  lcd.begin(16, 2);

  // настройка контакта переключателя в качестве PIN
  pinMode(buttonPin, INPUT);

  Serial.begin(9600);
  prevAngle = map(potVal,0,1023,0,300); // установите Previangle на исходный угол. позже, закодируйте, что если угол не равен 0, скажите пользователю, чтобы он сбросил его
  // Выведите сообщение на ЖК-дисплей.
  lcd.print("Pick a");
  // установите курсор на столбец 0, строка 1
  // строка 1 - это вторая строка, так как отсчет начинается с 0
  lcd.setCursor(0, 1);
  // печать на вторую строку
  lcd.print("Muscle Group!");
}

void loop() {
  // проверьте состояние коммутатора
  buttonState = digitalRead(buttonPin);
  potVal = analogRead(potPin);
  Serial.print("potVal: ");
  Serial.print(potVal);
  angle=map(potVal,0,1023,0,300);// раньше было 179, изменено на 300, предполагая, что оно равно максимальному углу, доступному в потенциометре
  Serial.print(", angle: ");
  Serial.println(angle);
  if (angle > prevAngle+69){ // если горшок достаточно повернут по часовой стрелке, отобразится следующая группа
    if (reply!=3)
      reply = reply+1;//укажите следующую группу мышц
    else
      reply = 0;//вернуться к первой группе мышц
    /*if (prevReply==-1)
      prevReply=reply;*/
  }
  else if (angle < prevAngle-69){ // если горшок был достаточно повернут против часовой стрелки, отобразится предыдущая группа
    if (reply!=0 && reply!=-1)
      reply = reply-1;//укажите предыдущую группу мышц
    else if (reply==0)// проверьте, по-прежнему ли ответ равен -1, кстати
      reply = 3;//вернуться к последней группе мышц
    else if (reply==-1){
      reply = 0;
      //prevReply=ответить;
    }
  }
  //prevReply = ответить;
  if (buttonState == HIGH) { //если кнопка была нажата, отобразите новое случайное упражнение в выбранной группе мышц
      if (reply == 0)
        reply = random(4,6);
      if (reply == 1)
        reply = random(7,9);
      if (reply == 2)
        reply = random(10,12);
      if (reply == 3)
        reply = random(13,15);
      // очистите экран перед печатью нового ответа
      lcd.clear();
      // установите курсор на столбец 0, строка 0
      lcd.setCursor(0, 0);
      // распечатать какой-нибудь текст
      lcd.print("Time to do some");
      // переместите курсор на вторую строку
      lcd.setCursor(0, 1);
      delay(500);
      lcd.clear();
      lcd.setCursor(0, 0);
      /*if (workoutTime - millis() + startTime==0){
           lcd.clear();
           lcd.setCursor(0, 0);
           lcd.print("You did it!! :]"); // если ответ продолжает повторяться, остановите цикл, как только таймер = 0. если ответ никогда не повторяется, выясните, как сделать его циклическим для таймера*/
      }
      //if (prevReply != ответить) // если мы выбрали новую тренировку, измените время начала
        //startTime = millis(); // запишите функцию millis(), чтобы увидеть, сколько времени проходит между запуском программы и запуском таймера
      if (prevReply != reply){
      switch (reply) { // выберите высказывание для печати на основе значения в ответе
        case 0:
          lcd.print("Arms");
          break;

        case 1:
          lcd.print("Core");
          break;

        case 2:
          lcd.print("Chest");
          break;

        case 3:
          lcd.print("Legs");
          break;

        case 4:
          //Время тренировки = 2400;
          lcd.print("Arm wrkt 1; " /*+ workoutTime - millis() + startTime*/); // временные названия тренировок, которые будут заменены в более позднем черновике
          break;

        case 5:
          // Время тренировки = 1200;
          lcd.print("Arm wrkt 2; " /*+ workoutTime - millis() + startTime*/);
          break;

        case 6:
          // Время тренировки = 1500;
          lcd.print("Arm wrkt 3; " /*+ workoutTime - millis() + startTime*/);
          break;

        case 7:
          //Время тренировки = 1800;
          lcd.print("Core wrkt 1; " /*+ workoutTime - millis() + startTime*/);
          break;

        case 8:
          // Время тренировки = 900;
          lcd.print("Core wrkt 2; " /*+ workoutTime - millis() + startTime*/);
          break;
          
        case 9:
          //Время тренировки = 2400;
          lcd.print("Core wrkt 3; " /*+ workoutTime - millis() + startTime*/);
          break;
         
        case 10:
          //Время тренировки = 2100;
          lcd.print("Chest wrkt1; " /* + workoutTime - millis() + startTime*/);
          break;
          
        case 11:
          // Время тренировки = 1200;
          lcd.print("Chest wrkt2; " /* + workoutTime - millis() + startTime*/);
          break;
          
        case 12:
          // Время тренировки = 1200;
          lcd.print("Chest wrkt3; " /* + workoutTime - millis() + startTime*/);
          break;
          
        case 13:
          // Время тренировки = 1500;
          lcd.print("Leg wrkt 1; " /* + workoutTime - millis() + startTime*/);
          break;

        case 14:
          //Время тренировки = 2400;
          lcd.print("Leg wrkt 2; " /* + workoutTime - millis() + startTime*/);
          break;

        case 15:
          //Время тренировки = 1800;
          lcd.print("Leg wrkt 3; " /*+ workoutTime - millis() + startTime*/);
          break;
        prevReply=reply;
      }
  }
  prevAngle=angle;
}

, 👍-1

Обсуждение

избавьтесь от всего вашего кода ... напишите простой код , который считывает значение потенциометра и выводит его на последовательную консоль ... когда это сработает так, как ожидалось, вернитесь к своему коду, @jsotola

Пожалуйста, включите изображение вашей схемы непосредственно в свой вопрос., @chrisl

Вы печатаете аналоговое значение и результирующий угол в формате Serial. Отображаются ли они на последовательном мониторе, как ожидалось?, @chrisl


1 ответ


2

Вот (сильно) урезанная версия вашего кода:

void loop() {
    potVal = analogRead(potPin);
    angle = map(potVal, 0, 1023, 0, 300);
    if (angle > prevAngle + 69) {
        // вещи...
    } else if (angle < prevAngle - 69) {
        // вещи...
    }
    // еще много чего интересного...
    prevAngle = angle;
}

Представьте, что это выполняется несколько тысяч раз в секунду. Каждый раз он вычисляет угол наклона ручки потенциометра, а затем копирует вычисленный угол в Previangle. Если вы не будете поворачивать кастрюлю очень быстро, угол наклона вряд ли изменится более чем на 69 ° за эту долю миллисекунды.

Я предлагаю не обновлять Previangle на каждой итерации. Вместо этого пусть угол медленно отклоняется от преобладания на протяжении многих итераций цикла. Когда они находятся на расстоянии более 69 ° друг от друга, вы выполняете нужное действие и только после этого обновляете Previangle.

,