Странное поведение переменных при замене циклов 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, у);
}

, 👍0

Обсуждение

Вошёл в неподписанный не идёт. Если i равно -1, то каким будет y?, @Majenko

y всегда будет 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


2 ответа


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 Цифровой->Мигать без задержки

,

1

Спасибо за помощь, это мой рабочий код. Я изменил вещи на длинные, избавился от некоторых длинных, перестал передавать переменные и заставил число в 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, у);
}
,