Сравнения одной переменной!

Boistik
Offline
Зарегистрирован: 09.06.2020
Привет ребята!
У меня достаточно банальный вопрос на первый взгляд,
но решить я его не могу из-за отсутствия большого опыта с arduino!
Вообщем сама задача, нужно выполнять определенное действия в течении N секунд
только если переменная (потенциометр) изменилась (+ или - ) если нет то продолжать делать другие действия!
Не пойму как сравнить одну переменную с ней же но скажем секундой ранее (предыдущим значением)
Кусок кода отвечающий за это прикладываю, подскажите куда копать! Спасибо
 

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#define potPIN A1
LiquidCrystal_I2C lcd(0x27, 16, 2);
int pot;

void setup() {
  
lcd.begin();
lcd.backlight();

}

void loop() {
pot = analogRead(potPIN);     // запомнить показания с потенциометра
pot = map(pot, 0, 1024, 0, 100);   // перевести в диапазон 0.. 100
pot = constrain(pot, 0, 100);  // ограничить диапазон 0.. 100




  if (pot != pot) 
{  
lcd.setCursor(0, 0);             
lcd.print("DA");
}
else {
lcd.setCursor(0, 0);             
lcd.print("NET");
//Тут другая часть цикла
}
}

 

 

rkit
Offline
Зарегистрирован: 23.11.2016

Завести вторую переменную, в которой хранить предыдущее значение.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

... или читать в две разные переменные «попеременно» с нужным интервалом. Суть та же. 

Boistik
Offline
Зарегистрирован: 09.06.2020

Намекните как это сделать ?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Boistik пишет:

Намекните как это сделать ?

Руками.

Boistik
Offline
Зарегистрирован: 09.06.2020

Остроумно! А я то ногами пытаюсь!
Я так понял это делается с записью в память (eeprom) скажем каждую секунду! и сравнивается значения с ним?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Boistik пишет:

Остроумно! А я то ногами пытаюсь!
Я так понял это делается с записью в память (eeprom) скажем каждую секунду! и сравнивается значения с ним?

Ну зачем eeprom? Заведите вторую переменную точно так же как завели первую.

Boistik
Offline
Зарегистрирован: 09.06.2020

не соображу! Можете показать кодом как это выглядит?
Есть данные с потенциометра если они изменились сделать действие 1, если нет то не делать нечего...
 

b707
Offline
Зарегистрирован: 26.05.2017

Boistik пишет:

не соображу!
 

ну блин, совсем отупели

now = analogRead(A0); // читаем текузее значение
if  (prev != now)    // сравниваем текущее с предыдущим
  { // Значение изменилось!
    // что-то делаем
  }
prev = now;    // сохраняем текущее значение для следующего раза

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Можно проще.

Присобачить туда машину времени и спокойно смотреть, что там раньше было. Никаких дополнительных переменных не надо.

Boistik
Offline
Зарегистрирован: 09.06.2020

А разве в описанном вами случае оба значения не будут равны всегда ?

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#define potPIN A1
LiquidCrystal_I2C lcd(0x27, 16, 2);

int last;
int now;

void setup() {
  
lcd.begin();
lcd.backlight();

}

void loop() {
last = analogRead(potPIN);     // запомнить показания с потенциометра
last = map(last, 0, 1024, 0, 100);   // перевести в диапазон 0.. 100
last = constrain(last, 0, 100);  // ограничить диапазон 0.. 100

now = analogRead(A1); // читаем текузее значение
now = map(now, 0, 1024, 0, 100);   // перевести в диапазон 0.. 100
now = constrain(now, 0, 100);  // ограничить диапазон 0.. 100


  if (last != now) 
{  
lcd.setCursor(0, 0);             
lcd.print(now);
}
else {
lcd.setCursor(0, 1);             
lcd.print(last);
}
last = now;    // сохраняем текущее значение для следующего раза
}

Или я вас не правильно понял ?

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Boistik пишет:

Или я вас не правильно понял ?

В корне неправильно

b707
Offline
Зарегистрирован: 26.05.2017

Зачем вы мой код тупо добавили в скетч, нужно было изменить свой код в соответвии с моим. Хотя бы поменять имя пина в голову не пришло? - так и вставили с пином А0, хотя у вас был совсем другой.

 

 

 

b707
Offline
Зарегистрирован: 26.05.2017

Коллеги, я пас. С таким уровнем тупизма давно не сталкивался, тут я обьяснить не сумею.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

b707 пишет:

Хотя бы поменять имя пина в голову не пришло? - так и вставили с пином А0, хотя у вас был совсем другой.

А чё неправильный пин написал? Вот ведь сам - тролляра написал, а ТС теперь во всём виноват!

Нет, не умеют у нас ещё помогать! Ведь для этого «... нужен базис! Культура нужна, а мы – Азия-с!» :-(

То ли дело в просвещённых европах и америках! Там бы ТС сразу же вежливо подсказали бы: «Put parts in paper bag, shake and throw bag at wall – after it falls to the ground, open. If thrown right, should be fully assembled and programming bits all in full alignment» и он был бы доволен и счастлив!

b707
Offline
Зарегистрирован: 26.05.2017

Ворота пишет:

А чё неправильный пин написал? Вот ведь сам - тролляра написал, а ТС теперь во всём виноват!

а ведь он, уверен, именно так на полном серьезе и думает...

Boistik
Offline
Зарегистрирован: 09.06.2020

b707 пишет:

Зачем вы мой код тупо добавили в скетч, нужно было изменить свой код в соответвии с моим. Хотя бы поменять имя пина в голову не пришло? - так и вставили с пином А0, хотя у вас был совсем другой.

 

 

 

now = analogRead(A1); // читаем текузее значение

Я не понимаю, думаю и вы когда то тоже начинали программировать! и не родились с этим навыком, разве не так ?

И форумы для того и созданы что бы помогать друг другу...

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Смотрите: у вас есть пин, показания с которого читаются в переменную. Вам нужно контролировать изменения в этой переменной. Для этого вы заводите КОНТРОЛЬНУЮ переменную, в которую ничего не читаете, а используете ТОЛЬКО для сравнения с первой переменной и сохранением в ней значения этой первой переменной, если оно изменяется. Только для этого. Никакие другие манипуляции с контрольной переменной не делаются

b707
Offline
Зарегистрирован: 26.05.2017

Boistik пишет:

Я не понимаю, думаю и вы когда то тоже начинали программировать! и не родились с этим навыком, разве не так ?

я вижу, что вы не понимаете. Причем не понимаете настолько, что это как слепому про розовый закат обьяснять. Я так не умею.

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

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

b707 пишет:

 как слепому про розовый закат обьяснять. 

Не, ну есть же религия (одна из ветвей пастафаринства) где люди поклоняются розовому, невидимому единорогу. Как он может быть одновременно розовым и невидимым спрашивать не приняты. Либо ты веришь, либо нет - на то она и религия.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Boistik,

слушай внимательно. 

Представь себе, что твоя переменная - это доска типа школьной, на которой ты пишешь мелом. Каждый раз, когда ты записываешь новое значение, ты стираешь старое и именно этом проблема, так?

Тебе парни предлагают завести ещё одну доску! Допустим это будет доска №2. И действовать так: всегда, прежде, чем считывать новое значение, старое переписать с первой доски на вторую (старое значение со второй стереть).

Если ты будешь так делать всегда, то у тебя всегда на первой доске будет самое последнее значение, а на второй - предпоследнее. так ведь?

Вот именно это тебе и предлагают сделать.

Стало понятнее?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, ладно, B707, может парню лет десять? Помню, внуку было девять - он такие вопросы задавал ... хотя, у него-то блин, наследственность - в четвёртом поколении программист как-никак!

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Ворота пишет:

Boistik,

слушай внимательно. 

Вот никогда не умел объяснять просто и понятно. Для этого нужен особый талант. Жму руку )))

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

Да, ладно, B707, может парню лет десять?

ну так зеленый свет :) Никому не мешаю обьяснять, просто отошел в сторону.

Даже не прорабатываю ТС... почти.

Просто немного обидно, что я ему даже готовый пример написал... а все равно не помогло

Boistik
Offline
Зарегистрирован: 09.06.2020

v258 пишет:

Смотрите: у вас есть пин, показания с которого читаются в переменную. Вам нужно контролировать изменения в этой переменной. Для этого вы заводите КОНТРОЛЬНУЮ переменную, в которую ничего не читаете, а используете ТОЛЬКО для сравнения с первой переменной и сохранением в ней значения этой первой переменной, если оно изменяется. Только для этого. Никакие другие манипуляции с контрольной переменной не делаются

Спасибо за внятное объяснения!

Boistik
Offline
Зарегистрирован: 09.06.2020

Ворота пишет:

Boistik,

слушай внимательно. 

Представь себе, что твоя переменная - это доска типа школьной, на которой ты пишешь мелом. Каждый раз, когда ты записываешь новое значение, ты стираешь старое и именно этом проблема, так?

Тебе парни предлагают завести ещё одну доску! Допустим это будет доска №2. И действовать так: всегда, прежде, чем считывать новое значение, старое переписать с первой доски на вторую (старое значение со второй стереть).

Если ты будешь так делать всегда, то у тебя всегда на первой доске будет самое последнее значение, а на второй - предпоследнее. так ведь?

Вот именно это тебе и предлагают сделать.

Стало понятнее?

Да! свою проблему я решил! Спасибо вам за адекватное пережевывание =)

b707
Offline
Зарегистрирован: 26.05.2017

Boistik пишет:

Да! свою проблему я решил! Спасибо вам за адекватное пережевывание =)

покажите код, что решил проблему...

Boistik
Offline
Зарегистрирован: 09.06.2020
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#define potPIN A1
LiquidCrystal_I2C lcd(0x27, 16, 2);

int last;
int now;

void setup() {
  
lcd.begin();
lcd.backlight();
lcd.clear();
delay (500);
}

void loop() {
  
now = analogRead(potPIN);     // запомнить показания с потенциометра
now = map(now, 0, 1024, 0, 100);   // перевести в диапазон 0.. 100
now = constrain(now, 0, 100);  // ограничить диапазон 0.. 100


  if (now != last) 
{  
lcd.setCursor(0, 0);             
lcd.print(now);
lcd.setCursor(8, 0);             
lcd.print("now");
delay (500);
lcd.clear();
}
else {
lcd.setCursor(0, 1);             
lcd.print(last);
lcd.setCursor(8, 1);             
lcd.print("last");
delay (500);
lcd.clear();
}
last = now;    // сохраняем текущее значение для следующего раза
}

 

b707
Offline
Зарегистрирован: 26.05.2017

Boistik - подумайте над двумя вопросами:

1. Если ничего не изменилось, зачем каждый раз присваивать  last = now ? это нужно только тогда, когда изменение есть.  Догадайтесь, куда нужно переставить строчку 41

2. Аналогично - зачем каждый раз выводить на экран надпись "last' в строке 37 - она же не меняется? - привыкайте обновлять экран только тогда, когда это действительно нужно

Boistik
Offline
Зарегистрирован: 09.06.2020

1) Строка 41 перенесена в if (30я строка)
2) Это взято как для примера мне для другого нужно было понять как сравнивать одну переменную и отслеживать ее изменения.