Изменить текст на 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;
}
@Ana, 👍-1
Обсуждение1 ответ
Вот (сильно) урезанная версия вашего кода:
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
.
- ЖК-дисплей странные символы
- ЖК-дисплей не отображает текст
- Потенциометр отображает только аналоговое значение напряжения 1023 в proteus
- Печать string and integer LCD
- Отправка значения с одного Arduino на другой
- Как эмулировать аналоговый потенциометр с помощью ШИМ
- ЖК-дисплей I2C отображает странные символы
- Экран LCD 16*02 I2C показывает только первый напечатанный символ
избавьтесь от всего вашего кода ... напишите простой код , который считывает значение потенциометра и выводит его на последовательную консоль ... когда это сработает так, как ожидалось, вернитесь к своему коду, @jsotola
Пожалуйста, включите изображение вашей схемы непосредственно в свой вопрос., @chrisl
Вы печатаете аналоговое значение и результирующий угол в формате Serial. Отображаются ли они на последовательном мониторе, как ожидалось?, @chrisl