Естественно, я об этом тоже думал, но с учетом того, что:
Пусть об этом думает ТС, если он уверен в том, что можно написать вменяемую программу, не обладая минимально необходимыми знаниями.
А в этом случае, а также учитывая:
Заменить тип на single/double и не морочить себе мозг возможным переполнением.
И еще: при неизменных типах вместо арифметического умножения можно использовать побитовое исключающее ИЛИ. А дальше - все тек же: отрицательное - смена знака. if ((x ^ x_old) < 0)
IMHO он не изменился (т.е. никогда и не был рассчитан на тех, кто называет себя “новичками”).
И - да, это особенность клуба.
Опять же, новички - это те, кто хочет освоить Ардуино, а совсем не те, кто хочет сделать конкретный проект, по возможности не слишком утруждаясь. А для них, мне кажется, рассмотрение различных вариантов решения задачи как раз очень полезно.
Мое ИМХО.
Сделав простой конкретный проект, ощутив радость от “оно работает”, у человека есть шанс стать и новичком, и специалистом. А если сразу отбить руки, то один из двадцати попытается продолжить.
А " освоить Ардуино" вообще звучит как- то не так.
Как правило, сюда пишут не те новички, которые взяли простой проект и сделали его (обычно без обращения на форум), а те “новички”, которые взяли сложный проект, который не подходит для начального обучения, и хотят получить именно его, но при этом “не хотят становиться программистами”. А у таких никаких шансов стать хотя бы новичками нет.
ОГО!!! НЕ ожидал!
Всем неравнодушным огромное спасибо, сейчас буду осмысливать.
Приведенный фрагментик - это только часть программы - функция поворота.
Опишу общую концепцию.
Вот полный алгоритм, как я его вижу:
Полный код написан только частично, но это первый вопрос, ответ на который найти самостоятельно не удается.
Система представляет собой линейный двигатель, поворачивающий панели и датчик положения (угла) - переменный резистор на оси вращения панелей.
В модуле Ардуино часы и две релюшки, которые включают двигатель в нужное направление.
ЧАсы и датчик положения уже функционируют.
Задача перед этой шайтан-машиной такая.
Когда бы я ни включил систему, она должна установить панели на угол, соответствующий ближайшему часу. А затем каждый час менять его положение в соответствии с заранее заданными углами . И так с 7 часов до 17 часов. Далее ночью развернуть панели в положение 7 часов. И так всю оставшуюся жизнь…
Поворот осуществляется двумя релюшками. Включение одной запустит движение по часовой стрелке, другой - в противоположную. Как только угол с датчика сравняется с заданным углом для этого времени ( разница между фактическим и заданным сменит знак), мотор нужно остановить. И ждать следующего часа.
Еще уточнение.
val - это фактический угол, его возможный диапазон от 15 до 165
L - имеет дискретные значенния из таблици в том же диапазоне.
H, M - это часы и минуты (из часов) извиняюсь за тавтологию. Вся работа программы происходит в начале каждого часа (M=0), остальное время простой
Просмотрел все посты.
Отдельное спасибо b707 и andriano. Это именно то, что мне было нужно. Просто и со вкусом.
Сразу два варианта. В таком совете и нуждался.
Пару слов по поводу того, что я не собираюсь становиться программистом. НЕ понял причины такого резонанса, извините, если кого обидел ненароком.
Но и плиточником, электронщиком, сварщиком, баристой, водителем, садоводом, строителем , электриком, продавцом, столяром, …( ну и еще несколько десятков ремесел, освоенных за всю жизнь) я так же становиться не собирался. Но , как говорится “хочешь сделать хорошо - сделай сам”. Я из таких. И Ардуино программировать научусь.
Работаю последнее время в энергетике. От программирования далек. Последний раз занимался подобным лет тридцать назад, когда появились первые Спектрумы. Сейчас большинство людей поди и не слышали об этом далеком предке их компьютеров.
Еще раз спасибо всем за помощь. Теперь я знаю, куда за ней можно обратиться.
И еще вопрос. x_old - это предыдущее значение переменной х, а не новая переменная?
Программа заставила определить ее в начале функции:
‘’‘void MUVE (int X, int X_old)’‘’’
Пока что дошел вот до этого:
‘’'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.
После этого никакую смену знака вы уже не определите.
Весь код - бредятина