Детекция смены знака переменной

Естественно, я об этом тоже думал, но с учетом того, что:

Пусть об этом думает ТС, если он уверен в том, что можно написать вменяемую программу, не обладая минимально необходимыми знаниями.

А в этом случае, а также учитывая:

Заменить тип на single/double и не морочить себе мозг возможным переполнением.
И еще: при неизменных типах вместо арифметического умножения можно использовать побитовое исключающее ИЛИ. А дальше - все тек же: отрицательное - смена знака.
if ((x ^ x_old) < 0)

1 лайк

@b707 сразу предложил простое, как гвоздь решение.
А арифметика с учетом типа данных и замысловатые шахматные этюды совсем не для новичков.

П. С. Господа, мне одному кажется, что клуб стал слишком элитарным?

IMHO он не изменился (т.е. никогда и не был рассчитан на тех, кто называет себя “новичками”).
И - да, это особенность клуба.

Опять же, новички - это те, кто хочет освоить Ардуино, а совсем не те, кто хочет сделать конкретный проект, по возможности не слишком утруждаясь. А для них, мне кажется, рассмотрение различных вариантов решения задачи как раз очень полезно.

Мое ИМХО.
Сделав простой конкретный проект, ощутив радость от “оно работает”, у человека есть шанс стать и новичком, и специалистом. А если сразу отбить руки, то один из двадцати попытается продолжить.
А " освоить Ардуино" вообще звучит как- то не так.

2 лайка

От айтишников и так уже спасу нет, скоро простые хорошие люди закончатся напрочь. Этого вы хотите?

2 лайка

Как правило, сюда пишут не те новички, которые взяли простой проект и сделали его (обычно без обращения на форум), а те “новички”, которые взяли сложный проект, который не подходит для начального обучения, и хотят получить именно его, но при этом “не хотят становиться программистами”. А у таких никаких шансов стать хотя бы новичками нет.

ОГО!!! НЕ ожидал!
Всем неравнодушным огромное спасибо, сейчас буду осмысливать.
Приведенный фрагментик - это только часть программы - функция поворота.
Опишу общую концепцию.
Вот полный алгоритм, как я его вижу:

Полный код написан только частично, но это первый вопрос, ответ на который найти самостоятельно не удается.
Система представляет собой линейный двигатель, поворачивающий панели и датчик положения (угла) - переменный резистор на оси вращения панелей.
В модуле Ардуино часы и две релюшки, которые включают двигатель в нужное направление.
ЧАсы и датчик положения уже функционируют.
Задача перед этой шайтан-машиной такая.
Когда бы я ни включил систему, она должна установить панели на угол, соответствующий ближайшему часу. А затем каждый час менять его положение в соответствии с заранее заданными углами . И так с 7 часов до 17 часов. Далее ночью развернуть панели в положение 7 часов. И так всю оставшуюся жизнь…
Поворот осуществляется двумя релюшками. Включение одной запустит движение по часовой стрелке, другой - в противоположную. Как только угол с датчика сравняется с заданным углом для этого времени ( разница между фактическим и заданным сменит знак), мотор нужно остановить. И ждать следующего часа.
Еще уточнение.
val - это фактический угол, его возможный диапазон от 15 до 165
L - имеет дискретные значенния из таблици в том же диапазоне.
H, M - это часы и минуты (из часов) извиняюсь за тавтологию. Вся работа программы происходит в начале каждого часа (M=0), остальное время простой

не совсем уяснил. что значит затираю?

Если что - есть сервомашины, которые сразу поворачивают на нужный угол по команде.
Шаговые с абсолютным энкодером в ту же тему…

Слово “уничтожаешь” более понятно?

За наводку спасибо. Я в курсе. Но

  • у абсолютного енкодера ценник совершенно конский
  • написать такой код мне пока не под силу, а хочу все сделать сам
  • для моей задачи мой вариант дешевле и проще совершенно несопоставимо
  • под этот вариант уже пришли все компоненты, остановка за кодом

Нет.
Очевидно в синтаксисе проблема? Обращу внимание. Спасибо.

Хорошо, тогда наводящий вопрос: зачем нужна переменная X в первом сообщении темы?

Просмотрел все посты.
Отдельное спасибо b707 и andriano. Это именно то, что мне было нужно. Просто и со вкусом.
Сразу два варианта. В таком совете и нуждался.
Пару слов по поводу того, что я не собираюсь становиться программистом. НЕ понял причины такого резонанса, извините, если кого обидел ненароком.
Но и плиточником, электронщиком, сварщиком, баристой, водителем, садоводом, строителем , электриком, продавцом, столяром, …( ну и еще несколько десятков ремесел, освоенных за всю жизнь) я так же становиться не собирался. Но , как говорится “хочешь сделать хорошо - сделай сам”. Я из таких. И Ардуино программировать научусь.
Работаю последнее время в энергетике. От программирования далек. Последний раз занимался подобным лет тридцать назад, когда появились первые Спектрумы. Сейчас большинство людей поди и не слышали об этом далеком предке их компьютеров.
Еще раз спасибо всем за помощь. Теперь я знаю, куда за ней можно обратиться.

Так именно смену знака этой переменной мне и нужно отследить. Как торлько она сменит знак, значит панели заняли нужную позицию. Пора тормозить.

И еще вопрос. x_old - это предыдущее значение переменной х, а не новая переменная?
Программа заставила определить ее в начале функции:
‘’‘void MUVE (int X, int X_old)’‘’’

ОТбой. Разобрался. Это Новая переменная для контроля.

Как ни странно, и то и другое верно.
'Это новая переменная, хранящая старое значение переменной Х

А насчет того, что вы затираете значение X - советую обратить внимание на это замечание. Эта ошибка делает ваш код абсолютно бессмысленным.

Пока что дошел вот до этого:
‘’'void MUVE (int X, int X_old) { //функция поворота
X=val-L; // разница между фактическим углом и требуемым на данный момент
if (X>0){ digitalWrite (rele1, 1);} else {digitalWrite (rele2, 1);} //включаем двигатель
if (X_old !=X) {X_old=X;}; //сравниваем текущее и предыдущее значение, сохраняем текущее значение для следующего раза в случае изменения
Serial.println(X);
Serial.println(X_old);

if (((X < 0) && (X_old > 0)) || ((X > 0) && (X_old < 0))) //контроль смены знака х (продолжить выполнение после смены знака Х)
digitalWrite (rele1, 0); //откл. реле
digitalWrite (rele2, 0); //откл. реле
}‘’’
На счет затирания Х пока ничего не понял. НО разберусь.

Что тут непонятного-то?

Начиная с вот этой строки у вас переменная X потеряна для вычислений. Вы ее просто выкинули в помойку. Что вы там ниже с чем сравниваете - никто не знает.

А начиная с этой строки вы так же выкинули и X_old.

После этого никакую смену знака вы уже не определите.
Весь код - бредятина

И научитесь вставлять код правильно.

2 лайка