Странное поведение переменных при замене циклов for оператором if
Посмотрите на изображение последовательного монитора, показывающее, что я получаю большое число, 4 миллиарда, когда я умножаю две вызванные функции вместе. Это всегда происходит после 53, если я изменяю сумму, на которую рассчитывает оператор if. Я последовательно отслеживал оператор if, и он считает до 600, затем вниз, затем вверх и повторяется хорошо, а значение датчика остается прежним.
Я избавляюсь от деления в y и помещаю все это в цикл for и все равно получаю большое число. Моя цель состоит в том, чтобы сгладить вывод и настроить аналоговую запись одновременно. Приспосабливается, но не тускнеет. Замена цикла for оператором if или вызов многих функций приводит к ошибке.
int аналогInPin = A0; интервал аналогаOutPin3 = 3; целое значение датчика; интервал я = 0; в а; инт у; void sens(int &sensorValue){ SensorValue = (((long)analogRead(analogInPin)*255)/1023); } пустота inOut(int &i){ если (i>-1){ я = я + а; если (я == 0) { а = 1; } если (я == 600) { а = -1; } вернуть я; } } недействительным updateFade () { датчик(значение датчика); входящий выход (я); unsigned long y = ((sensorValue*i)/600); Serial.println (значение датчика); } недействительная установка () { Серийный.начать(9600); pinMode(аналоговыйInPin,ВХОД); pinMode(3,ВЫХОД); } недействительный цикл () { обновитьFade(); delay(100); аналоговая запись (3, у); }
@northershoveler, 👍0
Обсуждение2 ответа
Вы определяете i,y,i как глобальные переменные, поэтому нет необходимости передавать их другим функциям. Доступ к ним и их изменение можно получить во всех частях вашей программы.
определить вместо
int y;
изменить на
long y;
и изменить
void inOut(int &i){
в
void inOut(){
и удалить
return i;// Это глобальная переменная
изменить строку
unsigned long y = ((sensorValue*i)/600);
в
y = ((sensorValue*i)/600);
Старайтесь не использовать одинаковые имена для глобальных и локальных переменных. Может случиться так, что компилятор обработает его как переопределение, что может привести к разного рода проблемам в сложных программах. (Также для вас, если вы посмотрите на плохо задокументированный код несколько месяцев спустя)
И избавьтесь от задержки, когда он прекращает обработку (также ваши подпрограммы) см. Blinkwithoutdelay, как сделать это правильно
ArduinoIDE->file-> примеры->2 Цифровой->Мигать без задержки
Спасибо за помощь, это мой рабочий код. Я изменил вещи на длинные, избавился от некоторых длинных, перестал передавать переменные и заставил число в sensorValue быть длинным. Теперь он считает вверх и вниз, если я устанавливал потенциометр каждую минуту.
int аналогInPin = A0; интервал аналогаOutPin3 = 3; длинное значение датчика; интервал я = 0; в а; длинный у; пустота чувств () { SensorValue = ((analogRead(analogInPin)*255L)/1023); // заставить 255 быть длинным } недействительным inOut () { если (i>-1){ я = я + а; если (я == 0) { а = 1; } если (я == 600) { а = -1; } } } недействительным updateFade () { чувств(); входящий(); y = ((значение датчика*i)/600); Серийный.println(y); } недействительная установка () { Серийный.начать(9600); pinMode(аналоговыйInPin,ВХОД); pinMode(3,ВЫХОД); } недействительный цикл () { обновитьFade(); delay(100); аналоговая запись (3, у); }
- Как устранить сообщение об ошибке "assignment of function 'void digitalWrite (uint8_t, uint_8)"?
- Получить массив символов с помощью модуля SIM900
- Считывание данных нескольких датчиков из текстового файла, расположенного на SD-карте в Arduino/ESP32
- Чтение двоичного файла на SD-карте
- Проблемы с Serial.read()
- Как запрограммировать 2 ультразвуковых датчика, один на серводвигателе и один прикрепленный на передней стороне автомобиля?
- Термистор не работает
- Занимают ли комментарии место в скомпилированном скетче C++? Ардуино / узел микроконтроллера
Вошёл в неподписанный не идёт. Если
i
равно -1, то каким будетy
?, @Majenkoy всегда будет 0, потому что тот, который вычисляется внутри этой функции, является локальным для нее и умирает, когда функция завершается, так и не использованная. Таким образом, y, который используется в цикле AnalogWrite, всегда будет равен 0., @Delta_G
Если я могу сделать еще одно несвязанное предложение, ваша функция sens не должна принимать никаких параметров. Это может быть просто sens(). Поскольку SensorValue является глобальным, вы можете изменить его и получить к нему доступ из любой точки программы. Вам не нужно передавать это как аргумент. Вам нужна только вся передача по ссылке, если вы пытаетесь изменить локальные переменные в одной функции из другой функции. Но это не то, что вы здесь делаете. У вас есть глобальная переменная. То же самое с вашей функцией inOut. i является глобальным, поэтому вы можете просто использовать его. Вам не нужно передавать его по кругу., @Delta_G
это все одно и то же целое число .... двоичное
1111 1111 1111 1111 1111 1111 1100 1010
== шестнадцатеричноеFFFFFFCA
== **беззнаковое** десятичное4294967242
== **знаковое** десятичное-54
, @jsotola