ARDUINO Потенциометр, отображение сигнала. Нужна помощь.

Samir Dyuran

✩✩✩✩✩✩✩
3 Сен 2020
7
0
Здравствуйте.
Прошу помощи!

#define potent_pin 4
int val;

void setup () {
Serial.begin(9600);
}

void loop() {
val = analogRead(potent_pin);
val = map(val, 0, 1023, 0, 100);
val = constrain(val, 0, 100);
Serial.println(val);
delay(30);
}

В данном скетче при помощи потенциометра можно выставлять значение от 0 до 100.
Но значение поступает постоянно в строке.
Надо сделать так что бы значение обновлялось только при изменение (поворота ручки потенциометра).

Всем откликнувшимся огромное СПАСИБО!
 

Вложения

b707_2

★★✩✩✩✩✩
22 Июл 2020
182
51
получив значение первый раз - запомнить его в переменной, например val_old.
Тогда получив значение снова, сначала сравниваеим val и val_old. Если совпадают - ничего не делаем. если отличаются - выводим новое значение в строку и снова запоминаем его в val_old для следующего раза
 
  • Лойс +1
Реакции: SashaPetrov

Samir Dyuran

✩✩✩✩✩✩✩
3 Сен 2020
7
0
получив значение первый раз - запомнить его в переменной, например val_old.
Тогда получив значение снова, сначала сравниваеим val и val_old. Если совпадают - ничего не делаем. если отличаются - выводим новое значение в строку и снова запоминаем его в val_old для следующего раза
Не подскажите как это будет выглядеть кодом?
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
Как то так, опечатки не исправлял и не проверял

C++:
void loop() {
static int  old_val=0;
val = analogRead(potent_pin);
if (old_val!=val)   
    {
    int  val2 = map(val, 0, 1023, 0, 100);
    val2 = constrain(val2, 0, 100);
    Serial.println(val2);
    old_val!=val
    }
}
 

Samir Dyuran

✩✩✩✩✩✩✩
3 Сен 2020
7
0
Как то так, опечатки не исправлял и не проверял

C++:
void loop() {
static int  old_val=0;
val = analogRead(potent_pin);
if (old_val!=val)  
    {
    int  val2 = map(val, 0, 1023, 0, 100);
    val2 = constrain(val2, 0, 100);
    Serial.println(val2);
    old_val!=val
    }
}
Увы всё равно бежит строка и выводит значения бесконечно.
 

Samir Dyuran

✩✩✩✩✩✩✩
3 Сен 2020
7
0
вам же написали - опечатки исправить!
в девятой строчке напишите
old_val=val;
#define potent_pin 4
int val;

void setup () {
Serial.begin(9600);
}

void loop() {
static int old_val=0;
val = analogRead(potent_pin);
if (old_val!=val)
{
int val2 = map(val, 0, 1023, 0, 100);
val2 = constrain(val2, 0, 100);
Serial.println(val2);
old_val!=val;
}
}

Я так и сделал.
 

Samir Dyuran

✩✩✩✩✩✩✩
3 Сен 2020
7
0
1)покажите исправленный код (только вставляйте его правильно - с номерами строк)
2) А число на экран выводится все время одно или разные?
1 #define potent_pin 4
2 int val;
3
4 void setup () {
5 Serial.begin(9600);
6 }
7
8 void loop() {
9 static int old_val=0;
10 val = analogRead(potent_pin);
11 if (old_val!=val)
12 {
13 int val2 = map(val, 0, 1023, 0, 100);
14 val2 = constrain(val2, 0, 100);
15 Serial.println(val2);
16 old_val=val;
17 }
18 }

Выводит числа от 0 до 100 как и положено. Но он их выводит постоянно. Поверну потенциометр на 50 так 50 и будет бесконечно отображаться и так любое значение. На фото видно. А надо что бы выводил каждое выбрано значение. Допустим повернул от 34 до 60 так и должно пройти все шаги от 34 до 60 и на значении 60 остановиться, а оно продолжает непрерывно выводить 60.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
Тогда сравнивай уже преобразованные числа
C++:
oid loop() {
static int  old_val=0;
val = analogRead(potent_pin);
val = map(val, 0, 1023, 0, 100);
val = constrain(val, 0, 100);
if (old_val!=val)
    {
    Serial.println(val);
    old_val=val
    }
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
Кстати, вместо этого:

val = map(val, 0, 1023, 0, 100);
val = constrain(val, 0, 100);

гораздо быстрее будет работать такое преобразование:

val=vall>>3;

правда значения будут от 0 до 127
 
  • Лойс +1
Реакции: b707_2

b707_2

★★✩✩✩✩✩
22 Июл 2020
182
51
@Samir Dyuran, опять неправильно код вставили, есть же специальная кнопка для этого!
правила форума читайте, прежде чем постить.

вот так попробуйте:
C++:
void loop() {
static int  old_val=0;
val = analogRead(potent_pin);
int  val2 = map(val, 0, 1023, 0, 100);
val2 = constrain(val2, 0, 100);
if (old_val!=val2)  
    {
    Serial.println(val2);
    old_val=val2;
    }
}
 

b707_2

★★✩✩✩✩✩
22 Июл 2020
182
51
  • Лойс +1
Реакции: Старик Похабыч

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
Выше показал как.

И еще: чем точнее работает ADC преобразование тем выше дребезг, и тем дольше это преобразование длиться.
Точностью можно управлять:
C++:
void SuperFastADC(byte n)
{
  ADCSRA = ADCSRA & B11111000;
  ADCSRA = ADCSRA | n;
}
Подавая на вход процедуры числа от 0 до 7 будет разная точность преобразования. 0 и 1 это одна и та же точность, самая грубая и самая быстрая.:4 мкc, 7 самое точное ,около 120 мкс

Забыл добавить, что код работает только на нано и уно, у них прописан этот регистр. На мегу не читал, на эвери не работает. нам все по другому называется.
 

b707_2

★★✩✩✩✩✩
22 Июл 2020
182
51
Почти работает. Число 100 и 0 когда потенциометр повёрнут в крайнее положение всё равно выводит бесконечно, именно эти два числа.
вообще на обоих концах дребезжать не должно, должно только в одном из крайних положений, в зависимости от того, как потенциометр подключен...