/* Эта программка вычисляет напряжение, а также угол в градусах и радианах в зависимости от положения
движка потенциометра при вращении его от нулевого положения до максимального (от 0 градусов до 270).
Вывод на монитор и плоттер происходят только тогда, когда вращаем ось потенциометра. В противном случае
картинка статична, вывода данных нет, и они не убегают за границы экрана и плоттера.
Плата Arduino UNO. Arduino IDE 2.2.1
*/
const int POT = 4; // Назначаем аналоговый pin 4 для чтения изменения напряжения с потенциометра
void setup() {
Serial.begin(9600); // Устанавливаем скорость COM-порта
//Serial.setTimeout(50); // Чтобы быстрее после загрузки был вывод на экран монитора (через 50 мс)
Serial.flush(); // Ждем окончания передачи данных (но эта команда вроде ничем не помогает)
Serial.println("voltage, grad, rad"); // Подписываем графики. ОНИ ПОЧЕМУ-ТО НЕ ПОДПИСЫВАЮТСЯ! И Serial.flush() не помогает. ПОЧЕМУ????????
}
void loop() {
float lastvoltage, currentvoltage, grad, rad = 0.0; // Начальная установка переменных с плавающей запятой: значения напряженй, угол поворота движка в град и радианах
lastvoltage = getVoltage(POT); // Вычисляем предыдущее значение напряжения в функции getVoltage
currentvoltage = getVoltage(POT); // Вычисляем текущее значение напряжения в функции getVoltage
grad = currentvoltage * 270.0 / 5.0; // Вычисление угла поворота движка потенциометра, как функцию от изменения напряжения
rad = (currentvoltage * 270.0 / 5.0) * PI / 180.0; // Вычисление радиан. voltage * 270.0 / 5.0 - это градусы
float cropped_currentvoltage = trunc(currentvoltage * 10) / 10; // Обрезаем float currentvoltage до 1 знака после точки (при большем кол-ве знаков ловятся помехи)
float cropped_lastvoltage = trunc(lastvoltage * 10) / 10; // Обрезаем float lastvoltage до 1 знака после точки (при большем кол-ве знаков ловятся помехи)
if (abs(cropped_currentvoltage - cropped_lastvoltage) > 1e-1) /* Сравниваем два числа с плавающей точкой. Если они не равны,
(а значит есть вращение оси потенциометра и изменение напряжения), то печатаем значения в монитор.
А если равны, то ничего не печатаем и ждем изменения напряжения (ждем вращения потенциометра) */
{
Serial.print(currentvoltage); // Вывод значений в мониторе в столбик
Serial.print(' ');
Serial.print(grad);
Serial.print(' ');
Serial.print(rad);
Serial.print(' ');
Serial.println();
delay(300); // Задержка 300 мс подобрана опытным путем, чтобы успевать все изменения увидеть при вращении оси потенциометра
}
}
float getVoltage(int pot) { // Функция вычисления напряжения в вольтах при чтении с аналогового порта с локальной переменной pot
return (analogRead(pot) / 1023.0 * 5.0);
}
Видимо в 2.x все иначе.
https://docs.arduino.cc/software/ide-v2/tutorials/ide-v2-serial-plotter
Спасибо за ссылку. Поизучаю. Придется перевести с Яндекс.Переводчиком (учил немецкий), хотя по-английски тоже многое понятно (уже привык ко многим словам и выражениям). Быстро просмотрел ссылку. Вроде синтаксис другой предлагается в версии 2.1.1. Попробую завтра днем.
Выдержал синтаксис так, как указано в ссылке, и графики стали подписываться.
Но у меня возникла интересная проблемка.
Если выдерживать синтаксис (например, вот так: Serial.print(“voltage:”);, то на экран монитора данные по трем графикам выводятся без пробелов в одну строку. Это плохо читабельно. Зато графики подписаны и работают.
А если поставить хотя бы пробел после фразы voltage (вот так: Serial.print("voltage: ");, то на экран монитора выводятся данные более читабельно, но этот график вообще пропадает из Serial Plotter.
Может это у меня какой-то частный случай? Я голову сломал.
Подскажите младенцу из песочницы, если знаете.
Забыл вставить новый код, в котором графики подписываются, но возникает проблемка с читабельностью. Вот он:
/* Эта программка вычисляет напряжение, а также угол в градусах и радианах в зависимости от положения
движка потенциометра при вращении его от нулевого положения до максимального (от 0 градусов до 270).
Вывод на монитор и плоттер происходят только тогда, когда вращаем ось потенциометра. В противном случае
картинка статична, вывода данных нет, и они не убегают за границы экрана и плоттера.
После загрузки кода в контроллер на график и в монитор информация не выводится, пока не будет вращения потенциометра.
Плата Arduino UNO. Arduino IDE 2.2.1
*/
const int POT = 4; // Назначаем аналоговый pin 4 для чтения изменения напряжения с потенциометра
void setup() {
Serial.begin(9600); // Устанавливаем скорость COM-порта
}
void loop() {
float lastvoltage, currentvoltage, grad, rad = 0.0; // Начальная установка переменных с плавающей запятой: значения напряженй, угол поворота движка в град и радианах
lastvoltage = getVoltage(POT); // Вычисляем предыдущее значение напряжения в функции getVoltage
currentvoltage = getVoltage(POT); // Вычисляем текущее значение напряжения в функции getVoltage
grad = currentvoltage * 270.0 / 5.0; // Вычисление угла поворота движка потенциометра, как функцию от изменения напряжения
rad = (currentvoltage * 270.0 / 5.0) * PI / 180.0; // Вычисление радиан. voltage * 270.0 / 5.0 - это градусы
float cropped_currentvoltage = trunc(currentvoltage * 10) / 10; // Обрезаем float currentvoltage до 1 знака после точки (при большем кол-ве знаков ловятся помехи)
float cropped_lastvoltage = trunc(lastvoltage * 10) / 10; // Обрезаем float lastvoltage до 1 знака после точки (при большем кол-ве знаков ловятся помехи)
if (abs(cropped_currentvoltage - cropped_lastvoltage) > 1e-1) // Сравниваем два числа с плавающей точкой. Если они не равны,
//(а значит есть вращение оси потенциометра и изменение напряжения), то печатаем значения в монитор.
//А если равны, то ничего не печатаем и ждем изменения напряжения (ждем вращения потенциометра)
{
Serial.print("voltage:"); // Вывод значений в мониторе в столбик
Serial.print(currentvoltage);
Serial.print(",");
Serial.print("grad:");
Serial.print(grad);
Serial.print(",");
Serial.print("rad:");
Serial.print(rad);
Serial.println();
delay(300); // Задержка 300 мс подобрана опытным путем, чтобы успевать все изменения увидеть при вращении оси потенциометра
}
}
float getVoltage(int pot) { // Функция вычисления напряжения в вольтах при чтении с аналогового порта с локальной переменной pot
return (analogRead(pot) / 1023.0 * 5.0);
}