Подключить потенциометр не составит труда. Тем более в интернете очень много примеров. Написать подходящий код для проекта это уже сложнее.
Выводим значения с потенциометра в Serial port.
const int analogInPin = A0; // потенциометр
int sensorValue = 0; // считанное значение
void setup() {
Serial.begin(9600);
}
void loop() {
sensorValue = analogRead(analogInPin);
Serial.print("sensor = " );
Serial.println(sensorValue);
delay(50);
}
Мы получим значения от 0 до 1024. Это потому что у ардуино 10 bit АЦП. Данный вывод можно сгладить
#define analogInPin A0 // потенциометр
const byte averageFactor = 5; // коэффициент сглаживания показаний (0 = не сглаживать)
// чем выше, тем больше "инерционность"
int sensorValue = 0; // считанное значение
void setup()
{
Serial.begin(9600);
}
void loop()
{
int newSensorValue = analogRead(analogInPin);
if (averageFactor > 0) // усреднение показаний для устранения "скачков"
{
sensorValue = (sensorValue * (averageFactor - 1) + newSensorValue) / averageFactor;
// <новое среднее> = (<старое среднее>*4 + <текущее значение>) / 5
} else {
sensorValue=newSensorValue; // не делаем усреднений, что прочитали то и считаем выводом
}
Serial.print("sensor = " );
Serial.println(sensorValue);
delay(50);
}
Чем больше коэффициент сглаживания тем меньше верхний придел. Это видно по формуле. При коэффициенте = 2 максимальное значение будет 1022 при 5 максимум на выходе будет 1019.
sensor = 982 sensor = 990 sensor = 996 sensor = 1001 sensor = 1005 sensor = 1008 sensor = 1011 sensor = 1013 sensor = 1015 sensor = 1016 sensor = 1017 sensor = 1018 sensor = 1019 sensor = 1019 sensor = 1019
Это нужно учитывать при разработке программы. Можете конечно и не использовать сглаживание. Это ваш выбор.
Выводы Arduino 8bit. Как же нам быть? С потенциометра получаем от 0 до 1024 а на вывод можем подать от 0 до 255. Для решение данной задачи нам поможет функция map(value, fromLow, fromHigh, toLow, toHigh)
#define analogInPin A0 // потенциометр
const byte averageFactor = 5; // коэффициент сглаживания показаний (0 = не сглаживать)
// чем выше, тем больше "инерционность"
int sensorValue = 0; // считанное значение
void setup()
{
Serial.begin(9600);
}
void loop()
{
int newSensorValue = analogRead(analogInPin);
if (averageFactor > 0) // усреднение показаний для устранения "скачков"
{
sensorValue = (sensorValue * (averageFactor - 1) + newSensorValue) / averageFactor;
// <новое среднее> = (<старое среднее>*4 + <текущее значение>) / 5
} else {
sensorValue=newSensorValue; // не делаем усреднений, что прочитали то и считаем выводом
}
int val = map(sensorValue, 0, 1023, 0, 255);
Serial.print("sensor = " );
Serial.println(val);
delay(50);
}
С помощью функции map() можно вывести инвертированные значения
int val = map(sensorValue, 0, 1023, 255, 0);
Если у вас есть предложения по реализации подключения потенциометра к Arduino или у вас возник вопрос. Пишите в коментарии.
Понравилась статья? Поделитесь ею с друзьями:
Вернуться в раздел: Уроки Arduino: Подключение датчиков и модулей к Arduino Дата публикации 20 декабря , 2017
Читайте также
Комментарии
Войдите или Зарегистрируйтесь И Вы сможете общаться на форуме и оставлять комментарии без капчи.