Сравнения одной переменной!
- Войдите на сайт для отправки комментариев
Втр, 09/06/2020 - 23:05
Привет ребята!
У меня достаточно банальный вопрос на первый взгляд,
но решить я его не могу из-за отсутствия большого опыта с 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");
//Тут другая часть цикла
}
}
Завести вторую переменную, в которой хранить предыдущее значение.
... или читать в две разные переменные «попеременно» с нужным интервалом. Суть та же.
Намекните как это сделать ?
Намекните как это сделать ?
Руками.
Остроумно! А я то ногами пытаюсь!
Я так понял это делается с записью в память (eeprom) скажем каждую секунду! и сравнивается значения с ним?
Остроумно! А я то ногами пытаюсь!
Я так понял это делается с записью в память (eeprom) скажем каждую секунду! и сравнивается значения с ним?
Ну зачем eeprom? Заведите вторую переменную точно так же как завели первую.
не соображу! Можете показать кодом как это выглядит?
Есть данные с потенциометра если они изменились сделать действие 1, если нет то не делать нечего...
не соображу!
ну блин, совсем отупели
now = analogRead(A0); // читаем текузее значение if (prev != now) // сравниваем текущее с предыдущим { // Значение изменилось! // что-то делаем } prev = now; // сохраняем текущее значение для следующего разаМожно проще.
Присобачить туда машину времени и спокойно смотреть, что там раньше было. Никаких дополнительных переменных не надо.
А разве в описанном вами случае оба значения не будут равны всегда ?
#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; // сохраняем текущее значение для следующего раза }Или я вас не правильно понял ?
Или я вас не правильно понял ?
В корне неправильно
Зачем вы мой код тупо добавили в скетч, нужно было изменить свой код в соответвии с моим. Хотя бы поменять имя пина в голову не пришло? - так и вставили с пином А0, хотя у вас был совсем другой.
Коллеги, я пас. С таким уровнем тупизма давно не сталкивался, тут я обьяснить не сумею.
Хотя бы поменять имя пина в голову не пришло? - так и вставили с пином А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» и он был бы доволен и счастлив!
А чё неправильный пин написал? Вот ведь сам - тролляра написал, а ТС теперь во всём виноват!
а ведь он, уверен, именно так на полном серьезе и думает...
Зачем вы мой код тупо добавили в скетч, нужно было изменить свой код в соответвии с моим. Хотя бы поменять имя пина в голову не пришло? - так и вставили с пином А0, хотя у вас был совсем другой.
now = analogRead(A1);// читаем текузее значениеЯ не понимаю, думаю и вы когда то тоже начинали программировать! и не родились с этим навыком, разве не так ?И форумы для того и созданы что бы помогать друг другу...Смотрите: у вас есть пин, показания с которого читаются в переменную. Вам нужно контролировать изменения в этой переменной. Для этого вы заводите КОНТРОЛЬНУЮ переменную, в которую ничего не читаете, а используете ТОЛЬКО для сравнения с первой переменной и сохранением в ней значения этой первой переменной, если оно изменяется. Только для этого. Никакие другие манипуляции с контрольной переменной не делаются
Я не понимаю, думаю и вы когда то тоже начинали программировать! и не родились с этим навыком, разве не так ?
я вижу, что вы не понимаете. Причем не понимаете настолько, что это как слепому про розовый закат обьяснять. Я так не умею.
Тут можно только написать за вас готовый код. Но я этого делать не стану, если вы сейчас нифига не хотите понимать - то получив готовое вы тем более ни в чем не разберетесь
как слепому про розовый закат обьяснять.
Не, ну есть же религия (одна из ветвей пастафаринства) где люди поклоняются розовому, невидимому единорогу. Как он может быть одновременно розовым и невидимым спрашивать не приняты. Либо ты веришь, либо нет - на то она и религия.
Boistik,
слушай внимательно.
Представь себе, что твоя переменная - это доска типа школьной, на которой ты пишешь мелом. Каждый раз, когда ты записываешь новое значение, ты стираешь старое и именно этом проблема, так?
Тебе парни предлагают завести ещё одну доску! Допустим это будет доска №2. И действовать так: всегда, прежде, чем считывать новое значение, старое переписать с первой доски на вторую (старое значение со второй стереть).
Если ты будешь так делать всегда, то у тебя всегда на первой доске будет самое последнее значение, а на второй - предпоследнее. так ведь?
Вот именно это тебе и предлагают сделать.
Стало понятнее?
Да, ладно, B707, может парню лет десять? Помню, внуку было девять - он такие вопросы задавал ... хотя, у него-то блин, наследственность - в четвёртом поколении программист как-никак!
Boistik,
слушай внимательно.
Вот никогда не умел объяснять просто и понятно. Для этого нужен особый талант. Жму руку )))
Да, ладно, B707, может парню лет десять?
ну так зеленый свет :) Никому не мешаю обьяснять, просто отошел в сторону.
Даже не прорабатываю ТС... почти.
Просто немного обидно, что я ему даже готовый пример написал... а все равно не помогло
Смотрите: у вас есть пин, показания с которого читаются в переменную. Вам нужно контролировать изменения в этой переменной. Для этого вы заводите КОНТРОЛЬНУЮ переменную, в которую ничего не читаете, а используете ТОЛЬКО для сравнения с первой переменной и сохранением в ней значения этой первой переменной, если оно изменяется. Только для этого. Никакие другие манипуляции с контрольной переменной не делаются
Boistik,
слушай внимательно.
Представь себе, что твоя переменная - это доска типа школьной, на которой ты пишешь мелом. Каждый раз, когда ты записываешь новое значение, ты стираешь старое и именно этом проблема, так?
Тебе парни предлагают завести ещё одну доску! Допустим это будет доска №2. И действовать так: всегда, прежде, чем считывать новое значение, старое переписать с первой доски на вторую (старое значение со второй стереть).
Если ты будешь так делать всегда, то у тебя всегда на первой доске будет самое последнее значение, а на второй - предпоследнее. так ведь?
Вот именно это тебе и предлагают сделать.
Стало понятнее?
Да! свою проблему я решил! Спасибо вам за адекватное пережевывание =)
покажите код, что решил проблему...
#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; // сохраняем текущее значение для следующего раза }Boistik - подумайте над двумя вопросами:
1. Если ничего не изменилось, зачем каждый раз присваивать last = now ? это нужно только тогда, когда изменение есть. Догадайтесь, куда нужно переставить строчку 41
2. Аналогично - зачем каждый раз выводить на экран надпись "last' в строке 37 - она же не меняется? - привыкайте обновлять экран только тогда, когда это действительно нужно
1) Строка 41 перенесена в if (30я строка)
2) Это взято как для примера мне для другого нужно было понять как сравнивать одну переменную и отслеживать ее изменения.